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 @@ + + + + + + {{ titulo }} + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Oportunidade #204 + + + Cliente: Empresa X + + + Abrir + Editar + + +``` + +## 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 @@ + + + EliCartao (pipeline) + + + + + Novo card + + + + + + {{ coluna.titulo }} + + + + + + Cliente: {{ item.cliente }} + Valor: {{ item.valor }} + Vencimento: {{ item.vencimento }} + + + Abrir + + Editar + + + + + + + + + + + + + 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"; -