From 5bb6732b818687982fffd4b1817e70b317711e88 Mon Sep 17 00:00:00 2001 From: Luiz Silva Date: Fri, 2 Jan 2026 21:48:24 -0300 Subject: [PATCH] feat(cartao): adicionar cards com status e playground tipo trello --- src/componentes/cartao/EliCartao.vue | 148 ++++++++++++++++++++ src/componentes/cartao/README.md | 71 ++++++++++ src/componentes/cartao/index.ts | 2 + src/index.ts | 3 + src/playground/App.vue | 6 +- src/playground/cartao.playground.vue | 202 +++++++++++++++++++++++++++ src/tipos/cartao.ts | 6 + src/tipos/index.ts | 2 +- 8 files changed, 438 insertions(+), 2 deletions(-) create mode 100644 src/componentes/cartao/EliCartao.vue create mode 100644 src/componentes/cartao/README.md create mode 100644 src/componentes/cartao/index.ts create mode 100644 src/playground/cartao.playground.vue create mode 100644 src/tipos/cartao.ts diff --git a/src/componentes/cartao/EliCartao.vue b/src/componentes/cartao/EliCartao.vue new file mode 100644 index 0000000..84de292 --- /dev/null +++ b/src/componentes/cartao/EliCartao.vue @@ -0,0 +1,148 @@ + + + + + + diff --git a/src/componentes/cartao/README.md b/src/componentes/cartao/README.md new file mode 100644 index 0000000..69b9374 --- /dev/null +++ b/src/componentes/cartao/README.md @@ -0,0 +1,71 @@ +# EliCartao + +O `EliCartao` é um componente de cartão focado em **listas/pipelines** (ex.: oportunidades e propostas comerciais), com um **status semântico** padronizado. + +Ele encapsula o `v-card` (Vuetify) e adiciona: + +- Área de **título** +- **Badge de status** padronizado (`novo`, `rascunho`, `vendido`, `cancelado`) +- Slot de **conteúdo** +- Slot opcional de **ações** + +## API + +### Props + +| Prop | Tipo | Padrão | Descrição | +|----------|--------------------------------------------------|--------------|-----------| +| `titulo` | `string` | `""` | Título de fallback (se o slot `titulo` não for usado). | +| `status` | `"novo" \| "rascunho" \| "vendido" \| "cancelado"` | *(obrigatório)* | Status semântico do cartão. Controla label/cor do badge e classes. | +| `variant`| `"outlined" \| "flat" \| "elevated" \| "tonal"` | `"outlined"` | Variante do `v-card` (Vuetify). | + +### Emits + +| Evento | Payload | Quando dispara | +|----------|-------------------------|----------------| +| `clicar` | `(status: CartaoStatus)`| Quando o cartão for clicado (opcional; útil para padronizar navegação). | + +> Observação: o componente deixa `v-bind="$attrs"` para você passar `class`, `style`, `to`, `href`, etc. + +## Slots + +| Slot | Objetivo | +|----------|----------| +| `titulo` | Conteúdo customizado do título (override do `titulo`). | +| `default`| Corpo do cartão. | +| `acoes` | Rodapé de ações (botões/links). | + +## Exemplos + +### 1) Cartão simples + +```vue + +
Cliente: ACME Ltda
+
Valor: R$ 12.500,00
+
+``` + +### 2) Título via slot + ações + +```vue + + + +
Cliente: Empresa X
+ + +
+``` + +## Casos de borda / comportamento esperado + +- `status` é obrigatório e sempre deve ser um valor suportado. +- Status `cancelado` aplica leve redução de opacidade via classe CSS. +- A renderização de ações só ocorre se o slot `acoes` existir. + diff --git a/src/componentes/cartao/index.ts b/src/componentes/cartao/index.ts new file mode 100644 index 0000000..bcfc2d3 --- /dev/null +++ b/src/componentes/cartao/index.ts @@ -0,0 +1,2 @@ +export { default as EliCartao } from "./EliCartao.vue"; + diff --git a/src/index.ts b/src/index.ts index 79864d1..626f4be 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,11 +3,13 @@ import { EliOlaMundo } from "./componentes/ola_mundo"; import { EliBotao } from "./componentes/botao"; import { EliBadge } from "./componentes/indicador"; import { EliInput } from "./componentes/campo"; +import { EliCartao } from "./componentes/cartao"; export { EliOlaMundo }; export { EliBotao }; export { EliBadge }; export { EliInput }; +export { EliCartao }; const EliVue: Plugin = { install(app: App) { @@ -15,6 +17,7 @@ const EliVue: Plugin = { app.component("EliBotao", EliBotao); app.component("EliBadge", EliBadge); app.component("EliInput", EliInput); + app.component("EliCartao", EliCartao); }, }; diff --git a/src/playground/App.vue b/src/playground/App.vue index b4463e7..a35d589 100644 --- a/src/playground/App.vue +++ b/src/playground/App.vue @@ -5,6 +5,7 @@ Botão Indicador + Cartão Campo Demo @@ -13,6 +14,7 @@ + @@ -22,6 +24,7 @@ import { defineComponent } from 'vue' import BotaoPlayground from "./botao.playground.vue"; import IndicadorPlayground from "./indicador.playground.vue"; +import CartaoPlayground from "./cartao.playground.vue"; import CampoPlayground from "./campo.playground.vue"; import OlaMundoPlayground from "./ola_mundo.playground.vue"; @@ -30,12 +33,13 @@ export default defineComponent({ components: { BotaoPlayground, IndicadorPlayground, + CartaoPlayground, CampoPlayground, OlaMundoPlayground, }, data() { return { - aba: "botao" as "botao" | "indicador" | "campo" | "ola_mundo", + aba: "botao" as "botao" | "indicador" | "cartao" | "campo" | "ola_mundo", }; } }) diff --git a/src/playground/cartao.playground.vue b/src/playground/cartao.playground.vue new file mode 100644 index 0000000..3a9cb17 --- /dev/null +++ b/src/playground/cartao.playground.vue @@ -0,0 +1,202 @@ + + + + + + diff --git a/src/tipos/cartao.ts b/src/tipos/cartao.ts new file mode 100644 index 0000000..77d2349 --- /dev/null +++ b/src/tipos/cartao.ts @@ -0,0 +1,6 @@ +/** + * Tipos do componente EliCartao. + */ + +export type CartaoStatus = "novo" | "rascunho" | "vendido" | "cancelado"; + diff --git a/src/tipos/index.ts b/src/tipos/index.ts index e274731..36c849e 100644 --- a/src/tipos/index.ts +++ b/src/tipos/index.ts @@ -1,4 +1,4 @@ export * from "./botao"; +export * from "./cartao"; export * from "./campo"; export * from "./indicador"; -