@snksergio/design-system 0.60.0 → 0.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/ai/componentes/AlertModal.md +47 -0
- package/dist-lib/ai/componentes/AppShell.md +117 -0
- package/dist-lib/ai/componentes/Breadcrumb.md +187 -0
- package/dist-lib/ai/componentes/Button.md +116 -0
- package/dist-lib/ai/componentes/ButtonGroup.md +162 -0
- package/dist-lib/ai/componentes/CardCheckbox.md +99 -0
- package/dist-lib/ai/componentes/CardOption.md +133 -0
- package/dist-lib/ai/componentes/Chart.md +93 -0
- package/dist-lib/ai/componentes/Chip.md +68 -0
- package/dist-lib/ai/componentes/ChoroplethMap.md +118 -0
- package/dist-lib/ai/componentes/ColorPicker.md +70 -0
- package/dist-lib/ai/componentes/Combobox.md +51 -0
- package/dist-lib/ai/componentes/ConversationListItem.md +90 -0
- package/dist-lib/ai/componentes/DataList.md +111 -0
- package/dist-lib/ai/componentes/DataTable.md +867 -0
- package/dist-lib/ai/componentes/DatePicker.md +84 -0
- package/dist-lib/ai/componentes/DateSeparatorChip.md +59 -0
- package/dist-lib/ai/componentes/EmptyState.md +72 -0
- package/dist-lib/ai/componentes/FileUploadField.md +95 -0
- package/dist-lib/ai/componentes/FloatingPanel.md +118 -0
- package/dist-lib/ai/componentes/FooterTable.md +62 -0
- package/dist-lib/ai/componentes/FormField.md +110 -0
- package/dist-lib/ai/componentes/Gantt.md +552 -0
- package/dist-lib/ai/componentes/Header.md +98 -0
- package/dist-lib/ai/componentes/Icon.md +65 -0
- package/dist-lib/ai/componentes/Kanban.md +343 -0
- package/dist-lib/ai/componentes/Kpi.md +103 -0
- package/dist-lib/ai/componentes/List.md +61 -0
- package/dist-lib/ai/componentes/MarkdownText.md +59 -0
- package/dist-lib/ai/componentes/MenuSidebar.md +128 -0
- package/dist-lib/ai/componentes/MessageAck.md +53 -0
- package/dist-lib/ai/componentes/MessageBubble.md +115 -0
- package/dist-lib/ai/componentes/MessageComposer.md +80 -0
- package/dist-lib/ai/componentes/MessageVariablesPicker.md +104 -0
- package/dist-lib/ai/componentes/Modal.md +88 -0
- package/dist-lib/ai/componentes/MonthYearPicker.md +49 -0
- package/dist-lib/ai/componentes/PageHeader.md +129 -0
- package/dist-lib/ai/componentes/Panel.md +84 -0
- package/dist-lib/ai/componentes/Scheduler.md +421 -0
- package/dist-lib/ai/componentes/ScreenLoader.md +60 -0
- package/dist-lib/ai/componentes/SingleMenuSidebar.md +171 -0
- package/dist-lib/ai/componentes/Spinner.md +52 -0
- package/dist-lib/ai/componentes/Table.md +192 -0
- package/dist-lib/ai/componentes/TableToolbar.md +87 -0
- package/dist-lib/ai/componentes/TabsNavigation.md +152 -0
- package/dist-lib/ai/componentes/Toast.md +49 -0
- package/dist-lib/ai/componentes/_primitivos.md +74 -0
- package/dist-lib/ai/componentes/avatar-ig.md +181 -0
- package/dist-lib/ai/componentes/indice.json +49 -0
- package/dist-lib/ai/exemplos/dashboard/dashboard-brazil-map.ts +33 -0
- package/dist-lib/ai/exemplos/dashboard/dashboard-screen.tsx +1110 -0
- package/dist-lib/ai/exemplos/dashboard/index.ts +1 -0
- package/dist-lib/ai/global/componentes.md +217 -0
- package/dist-lib/ai/global/composicao.md +182 -0
- package/dist-lib/ai/indice.json +177 -0
- package/dist-lib/ai/lint/ds-lint-patterns.mjs +115 -0
- package/dist-lib/ai/manifest.json +16 -0
- package/dist-lib/ai/regras/design.md +88 -0
- package/dist-lib/ai/regras/temas.md +192 -0
- package/dist-lib/ai/regras-por-componente.json +103 -0
- package/dist-lib/ai/roteiros/dashboard/blueprint.md +47 -0
- package/dist-lib/ai/roteiros/dashboard/entrevista.md +62 -0
- package/dist-lib/ai/roteiros/dashboard/geracao.md +88 -0
- package/dist-lib/ai/roteiros/dashboard/roteiro.md +88 -0
- package/package.json +4 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DashboardScreen, default } from "./dashboard-screen";
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
|
|
2
|
+
# Que componente usar (iGreen DS)
|
|
3
|
+
|
|
4
|
+
Os nomes abaixo são os **ids do registry**. Para trazer um: `npm run igreen:add -- <id>`
|
|
5
|
+
— exceto em **modo submódulo** (existe `.claude/ds-config.json` com `"mode": "submodule"`),
|
|
6
|
+
onde tudo já está no disco em `<dsPath>/src` e você só importa pelo `importBase`.
|
|
7
|
+
|
|
8
|
+
**Onde está a API** (não invente props — nenhuma das duas fontes é sua memória):
|
|
9
|
+
|
|
10
|
+
- **Compostos do iGreen** (`components/ui/<Nome>/`) vêm com **`USAGE.md` ao lado** — props,
|
|
11
|
+
variants, gotchas. Leia antes de compor.
|
|
12
|
+
- **Primitivos** não têm USAGE por arquivo (a API é a padrão shadcn/Radix, e eles já chegam
|
|
13
|
+
re-estilizados nos tokens do DS) — mas **têm índice de pegadinhas**:
|
|
14
|
+
**`.claude/skills/ds-kit/shadcn-gotchas.md`**. Leia antes de montar `select`, `sonner`,
|
|
15
|
+
`tabs`, `tooltip` e os flutuantes: são gotchas que não dão erro, só resultado errado.
|
|
16
|
+
⚠️ No copy-in eles caem em **`components/ui/` como arquivo solto** (`ui/badge.tsx`,
|
|
17
|
+
`ui/input.tsx`, `ui/avatar.tsx`), não numa pasta `components/shadcn/` — os itens de
|
|
18
|
+
COMPONENTE do registry apontam para `components/ui/` (os demais vão pra `src/lib`,
|
|
19
|
+
`src/utils`, `src/styles/theme` e `examples/`). Importe `@/components/ui/badge`.
|
|
20
|
+
⚠️ Em **modo submódulo** o layout é OUTRO: você lê o repo do DS, onde os primitivos ficam
|
|
21
|
+
em `<importBase-irmão>/components/shadcn/<nome>` (kebab) e só os compostos em
|
|
22
|
+
`components/ui/<Nome>`. O `ds-config.json` traz os dois caminhos (`importBase` e
|
|
23
|
+
`primitivesBase`).
|
|
24
|
+
|
|
25
|
+
Catálogo visual: **https://igreen-desingsystem-admin.vercel.app**.
|
|
26
|
+
|
|
27
|
+
> Não existe "componente shadcn" vs "componente iGreen" pra você: todos chegam por
|
|
28
|
+
> `@igreen/<nome>` e todos já seguem os tokens do DS. Escolha pela tarefa, não pela origem.
|
|
29
|
+
|
|
30
|
+
> **Escopo desta regra: QUAL componente.** Como estilizar (tokens, spacing, foco, cor,
|
|
31
|
+
> tipografia) está em `ds-design.md` — deliberadamente não repetido aqui, pra as duas
|
|
32
|
+
> regras não divergirem.
|
|
33
|
+
|
|
34
|
+
## Formulário
|
|
35
|
+
|
|
36
|
+
`form-field` é wrapper **obrigatório** de todo campo — nunca `<label>` cru (ele cuida de
|
|
37
|
+
label, helper, erro e do `htmlFor`).
|
|
38
|
+
|
|
39
|
+
| Precisa de | Use |
|
|
40
|
+
|---|---|
|
|
41
|
+
| texto curto / longo | `input` · `textarea` |
|
|
42
|
+
| escolher de uma lista | `select` — muitas opções + busca → `combobox` |
|
|
43
|
+
| liga/desliga | `switch` (aplica na hora) · `checkbox` (confirma no submit) |
|
|
44
|
+
| **escolha em CARD** (área grande, label + descrição) — plano, frete, permissão, lista de settings | **`card-option`** — o controle é prop: type = checkbox \| radio \| switch. **switch = efeito IMEDIATO, sem Salvar, e só com layout=list (Apple HIG: switch mora em linha de lista); tela com botão Salvar → type=checkbox.** Opções que se COMPARAM (plano, tier, preço, descrição longa) → cards espaçados; itens do mesmo tipo com rótulo curto (settings, permissões, meio de pagamento, endereço) → layout=list. On/off de UMA coisa nunca são 2 radios: é switch (imediato) ou 1 checkbox (com submit). Mais de ~5 opções → não é card-option: `select` ou `combobox`. type=radio exige CardOptionGroup em volta. Em lista o selecionado NÃO pinta por default (ali a borda do item é a divisória) — queira o pintado, ligue highlightSelected no grupo. Omita orientation, highlightSelected e size (derivam do type; md é o padrão) |
|
|
45
|
+
| escolha em bloco visual, só checkbox | `card-checkbox` — atalho de `card-option` com `type="checkbox"`; componente novo usa `card-option` |
|
|
46
|
+
| uma entre várias | `radio-group` (campo compacto) — em card, `card-option` com `type="radio"` |
|
|
47
|
+
| data | `date-picker` — `mode`: `single` (default) · `range` · `multiple` |
|
|
48
|
+
| só mês/ano | `month-year-picker` |
|
|
49
|
+
| agenda de EVENTOS (não é campo de data) | `scheduler` — ver o grupo de dados |
|
|
50
|
+
| CRONOGRAMA com dependência entre tarefas | `gantt` — ver o grupo de dados |
|
|
51
|
+
| arquivo | `file-upload-field` |
|
|
52
|
+
| código / OTP | `input-otp` — mesmos `size` (`xxs`/`xs`/`sm`/`md`) e `state` do `input`, então num form misto use o MESMO size dos dois. `variant`: `connected` (default) · `outlined` · `filled` · `underline` |
|
|
53
|
+
| cor | `color-picker` |
|
|
54
|
+
| faixa numérica | `slider` |
|
|
55
|
+
| prefixo, sufixo, ícone ou botão **dentro** do campo | `input-group` — não componha na mão |
|
|
56
|
+
|
|
57
|
+
## Abas e alternância de visão
|
|
58
|
+
|
|
59
|
+
- `tabs` — seções de conteúdo. Duas props no `<Tabs>` (propagadas por contexto, nunca no
|
|
60
|
+
List/Trigger): **`variant`** `"segmented"` (default) dentro de superfície — card, bloco,
|
|
61
|
+
Panel, FloatingPanel, Modal, drawer · `"line"` para seções de página. **`fullWidth`** em
|
|
62
|
+
superfície compacta; hug em toolbar/página. ⛔ nunca `w-full`/`flex-1` na mão.
|
|
63
|
+
- `tabs-navigation` — **abas de NAVEGADOR**, não de conteúdo: cada aba é uma **sessão aberta**
|
|
64
|
+
(conversa, chamado, registro) que o usuário abre, troca e fecha, com avatar/ícone, status e
|
|
65
|
+
ações próprias. Critério: se o usuário **abre e fecha** as abas → `tabs-navigation`; se as seções
|
|
66
|
+
são fixas dentro da tela → `tabs`. É controlado (`value`/`onValueChange`) e **não hospeda o
|
|
67
|
+
conteúdo** — o painel pode morar em outra coluna ou rota (aí a aba leva `panelId`). ⛔ nunca
|
|
68
|
+
monte a tira na mão com margem negativa: a união da aba ativa com o conteúdo é o componente.
|
|
69
|
+
- `button-group` — ações relacionadas lado a lado; uma dispara, **não guarda estado**.
|
|
70
|
+
- `toggle-group` — modo ou filtro que **persiste** · `toggle` para um só, on/off.
|
|
71
|
+
- ⚠️ Alternar tabela ↔ cards dos **mesmos dados** não é nenhum dos três: é `viewMode`
|
|
72
|
+
do `data-table` (com `listConfig`). Não monte duas telas paralelas.
|
|
73
|
+
|
|
74
|
+
## Feedback e estado
|
|
75
|
+
|
|
76
|
+
| Situação | Use |
|
|
77
|
+
|---|---|
|
|
78
|
+
| notificação rica (title, description, ação) | `toast` — **prefira este** |
|
|
79
|
+
| toaster cru | `sonner` — monte `<Toaster/>` 1× no root; o `toast` roda sobre ele |
|
|
80
|
+
| aviso fixo dentro da página | `alert` |
|
|
81
|
+
| confirmar ação destrutiva | `alert-modal` — **obrigatório** antes de excluir, nunca delete direto |
|
|
82
|
+
| sem dados / primeira vez | `empty-state` |
|
|
83
|
+
| **página/área inteira carregando** (slot de conteúdo, card, section) | `screen-loader` — spinner centrado + título/subtítulo (default) ou `variant="skeleton"` genérico (skeletonLayout: page default · dashboard · kpis). Preenche o PAI (que precisa ter altura); omita size (md é o padrão). NÃO é overlay nem loading inline |
|
|
84
|
+
| carregando pedaço com layout conhecido / ação pontual | `skeleton` (silhueta custom composta na mão) · `spinner` (pontual, inline em botão) |
|
|
85
|
+
| progresso conhecido | `progress` |
|
|
86
|
+
|
|
87
|
+
## Sobreposição (o que cobre a tela)
|
|
88
|
+
|
|
89
|
+
| Quando | Use |
|
|
90
|
+
|---|---|
|
|
91
|
+
| clique, ancorado, conteúdo curto | `popover` |
|
|
92
|
+
| lista de ações a partir de um gatilho | `dropdown-menu` |
|
|
93
|
+
| clique com o botão direito | `context-menu` |
|
|
94
|
+
| hover: dica de 1 linha / prévia rica | `tooltip` · `hover-card` |
|
|
95
|
+
| **bloqueia** a página, centralizado | `modal` (body já rola sozinho — não trate scroll no children) |
|
|
96
|
+
| **bloqueia**, lateral, mais espaço que o modal | `panel` (560px default) · `sheet` · `drawer` (mobile, gesto) |
|
|
97
|
+
| **não** bloqueia — coexiste com a lista atrás, resizável | `floating-panel` |
|
|
98
|
+
| **painel de DETALHE** (o que abre ao clicar na linha da tabela ou no card) | **use o bloco `dsgreen-paneldetail-1` — ele é o PADRÃO.** A estrutura já está resolvida ali: identidade no header, métricas em cards compactos, campos em seções colapsáveis por assunto, ação primária no footer, e sem aba (o colapso já é o mecanismo de esconder). Precisa de avatar/chip/ação no header → é `floating-panel`, porque no `panel` o header é só string.<br><br>**Variações são opt-in — só monte se o usuário citar o ID:** `dsgreen-paneldetail-2` (detalhe de TAREFA: título grande no corpo, propriedades em lista plana, abas pra anexo/comentário/log) · `dsgreen-paneldetail-3` (com TABELA dentro: ficha em 2 colunas + métricas + tabela compacta, e aí o painel vai a `xl` 720px). Não escolha entre as três por conta própria: sem o ID citado, o padrão é o `-1` |
|
|
99
|
+
| diálogo cru, sem o chrome do DS | `dialog` · `alert-dialog` |
|
|
100
|
+
|
|
101
|
+
Todo flutuante já segue a mesma receita visual (superfície frosted, radius 12,
|
|
102
|
+
`shadow-sh-lg`). Não re-estilize.
|
|
103
|
+
|
|
104
|
+
## Dados em grade e lista
|
|
105
|
+
|
|
106
|
+
| Precisa de | Use |
|
|
107
|
+
|---|---|
|
|
108
|
+
| grade com colunas: filtros, visões, seleção, kanban, virtualização | `data-table` — o completo |
|
|
109
|
+
| tabela simples, sem inteligência | `table` |
|
|
110
|
+
| rodapé de paginação/page-size/contagem | `footer-table` — já embutido no `data-table` |
|
|
111
|
+
| lista de **cards** com filtros, visões, hierarquia/árvore | `data-list` |
|
|
112
|
+
| lista de cards simples | `list` |
|
|
113
|
+
| quadro por status/etapa | `kanban` — ou `viewMode: "kanban"` do `data-table` |
|
|
114
|
+
| **eventos ao longo do TEMPO** (agenda, compromissos, reservas) | **`scheduler`** — 4 views numa prop só: `month` · `week` · `day` · `list`. Toolbar embutida (período, busca, filtros, seletor de view). **Não confundir com `calendar`/`date-picker`, que escolhem uma DATA num campo** — aqui o assunto são eventos. Dumb sobre mutação: arrastar emite `onEventMove`/`onEventResize` e QUEM APLICA é você (mesma gramática do `onCardMove` do kanban). Filtro é declarativo (`filterFields`) e abre num painel-COLUNA à direita, não em overlay. **O pai precisa ter altura** — o componente é `h-full`, e é a altura dele que decide quantos eventos cabem na célula do mês. Detalhe do evento é SEU: o componente só emite `onEventClick` e devolve `event.meta` intacto; monte o painel com o bloco `dsgreen-paneldetail-2`. `draggable`/`resizable` nascem `false` de propósito: ligados sem handler, o usuário arrasta e vê o evento voltar |
|
|
115
|
+
| **cronograma de PROJETO** (o que depende do quê, prazo, caminho crítico) | **`gantt`** — hierarquia com collapse à esquerda, eixo de tempo à direita, e **setas de dependência** entre as barras. É a seta que distingue: sem ela isto seria uma timeline, e timeline é o `scheduler`. Quatro tipos de vínculo (finish-to-start, start-to-start, finish-to-finish, start-to-finish) com espera/antecipação em dias. Linha agrupadora deriva o intervalo dos filhos; marco vira losango. **Dumb sobre mutação como o kanban**: arrastar emite evento e QUEM APLICA é você — o componente detecta conflito de prazo e sinaliza, mas nunca reagenda. **O pai precisa ter altura** (é `h-full`), e um cronograma legível pede ~900px de largura. A cor da barra diz CATEGORIA (qual frente), não status — status vai no slot livre da linha como `chip`. Detalhe da tarefa é SEU: o componente emite o clique e devolve o payload intacto. ⭐ **Antes de montar a tela, rode `igreen:add example-gantt`** — é a extração 1:1 do showcase do DS (20 linhas em 4 níveis, 16 vínculos, 2 conflitos, os 4 gestos APLICANDO, as 3 visões, filtro nos 6 kind, painel de detalhe e drawer). O `USAGE.md` descreve a API; o exemplo mostra o COMPORTAMENTO junto, que é onde a composição erra. Troque `_gantt-data.tsx` primeiro |
|
|
116
|
+
| paginar algo que não é tabela | `pagination` |
|
|
117
|
+
|
|
118
|
+
### ⛔ Filtro em tabela/lista → SEMPRE nativo, nunca form/select acima
|
|
119
|
+
|
|
120
|
+
"Filtrar por X" numa grade/lista **não** é montar select ou form acima da tabela — isso
|
|
121
|
+
empilha UI na unha, come espaço e foge do padrão. Filtro é **recurso reativo** do
|
|
122
|
+
`data-table`/`data-list`. Aplique esta hierarquia **sempre — inclusive em pedido em lote e
|
|
123
|
+
sem passar pela entrevista guiada** (é justamente aí que o erro aparece):
|
|
124
|
+
|
|
125
|
+
1. **X é uma coluna** (status, categoria, tipo, graduação… — o caso normal, ~90%):
|
|
126
|
+
- Na coluna: `enableColumnFilter: true` + `filterType` + `filterOptions`.
|
|
127
|
+
- **Deixe o filtro visível na tabela**: `showEmptyFilterChips={["status", …]}` — o chip
|
|
128
|
+
nasce **vazio e clicável** já no load, o usuário vê a afordância sem abrir menu nenhum.
|
|
129
|
+
- Abrir **já filtrado** → `defaultViews`/`presetView` com filtros pré-aplicados (`filterModel`) → chip aplicado.
|
|
130
|
+
- Status é o **eixo de navegação** (poucos valores, muito usado) → **uma visão por valor**
|
|
131
|
+
(`defaultViews`, ex.: "Ativos", "Pendentes"; `allowCreateView={false}` se forem fixas).
|
|
132
|
+
2. **X não é coluna, pequeno e simples** (período/mês, um toggle) → `toolbar.actions`
|
|
133
|
+
(máx ~2, label curta). Período que afeta a página toda → `PageHeader.actions` (dropdown).
|
|
134
|
+
3. **Muitos filtros, ou muito grandes** → drawer "Filtros" **nativo** do `data-table` + chips
|
|
135
|
+
pré-aplicados. Nunca empilhar selects soltos.
|
|
136
|
+
|
|
137
|
+
> As exceções (2 e 3) são raras. Sempre que a informação já está numa coluna: **chip nativo
|
|
138
|
+
> primeiro**. Exemplo vivo do padrão: `example-clientes` (status/categoria pré-aplicados +
|
|
139
|
+
> chip vazio de "Atribuído"). Entrevista guiada completa em `/ds-create-crud`.
|
|
140
|
+
|
|
141
|
+
## Layout e chrome do app
|
|
142
|
+
|
|
143
|
+
- `app-shell` — a casca (rail de módulos + header + área de conteúdo). **Embutido em container com altura** (layout com footer, aba, preview) → passe `fillHeight`; sem isso ele mede 100vh, transborda e o conteúdo fica cortado na base.
|
|
144
|
+
- `header` — barra superior de 60px (breadcrumb, busca, tema, usuário) dentro do shell.
|
|
145
|
+
- **Menu lateral — a escolha depende de o app ter módulos, então PERGUNTE:**
|
|
146
|
+
- **tem áreas separadas** (Comercial, Financeiro…), cada uma com menu próprio → `menu-sidebar` (rail + contextos). É o que o `app-shell` usa.
|
|
147
|
+
- **sistema único**, um menu só → `single-menu-sidebar` (nível único). No `app-shell` passe `sidebar="single"` + `categories` + `sidebarLogo` + `sidebarTitle`. ⚠️ **Não** ligue `sidebarShowSearch` se o header já tem busca — o shell já entrega a da sidebar desligada. (Até o CLI 0.25.0 esta linha dizia que o `single-menu-sidebar` não encaixava no `app-shell`: era **falso**, ele tem colapso e mobile.)
|
|
148
|
+
- Nas duas: item com destino declara `href` (vira `<a>`, então ctrl+clique e nova aba funcionam). Router próprio → `renderLink`.
|
|
149
|
+
|
|
150
|
+
> 🧭 **O app tem router (react-router, Next, TanStack)? Passe `renderLink`.**
|
|
151
|
+
> `<AppShell renderLink={(p) => <Link {...p} to={p.href} />} … />`
|
|
152
|
+
>
|
|
153
|
+
> O menu renderiza `<a href={item.href}>`. Sem `renderLink`, um `item.href` de **path**
|
|
154
|
+
> (`/clientes`) fazia o browser **recarregar a página inteira** a cada clique — bug
|
|
155
|
+
> reportado por consumidor e corrigido na v0.38.0. Alternativa: passar `onItemClick`
|
|
156
|
+
> (aí o menu cancela a navegação nativa sozinho, preservando ctrl+clique, link externo
|
|
157
|
+
> e `item.href` de hash). Detalhe: `MenuSidebar/USAGE.md` §Integração com router.
|
|
158
|
+
- `page-header` — título + ações + breadcrumb **dentro** do body.
|
|
159
|
+
- `card` — container de conteúdo · `separator` · `scroll-area` (scroll estilizado) ·
|
|
160
|
+
`aspect-ratio`.
|
|
161
|
+
- Esconder/mostrar conteúdo: `accordion` (várias seções abrindo) · `collapsible` (uma) ·
|
|
162
|
+
`carousel` (deslizar horizontal).
|
|
163
|
+
|
|
164
|
+
## Métrica e gráfico
|
|
165
|
+
|
|
166
|
+
- `kpi` — `Kpi` / `KpiGroup` / `KpiDelta` para cards de métrica e faixas de indicadores.
|
|
167
|
+
- `chart` — wrapper do Recharts (barras, linha, área, pizza, radar, radial).
|
|
168
|
+
- `choropleth-map` — mapa por região colorido por valor (traz `d3-geo` como dependência).
|
|
169
|
+
|
|
170
|
+
## Blocos — composições de referência (não são componentes)
|
|
171
|
+
|
|
172
|
+
Um **bloco** é um arranjo pronto, feito só com os componentes acima, que existe porque o arranjo é
|
|
173
|
+
o que a IA não inventa: você sabe as peças e os tokens, mas não a disposição que um designer
|
|
174
|
+
escolheu. Ele **não tem props nem versão própria** — você lê a estrutura e reconstrói com os dados
|
|
175
|
+
do usuário.
|
|
176
|
+
|
|
177
|
+
Cada bloco tem um código no formato `dsgreen-<categoria>-<n>`. **Quando o usuário citar um código,
|
|
178
|
+
não classifique intenção** — resolva o código (é o Passo 0 da skill ds-kit).
|
|
179
|
+
|
|
180
|
+
**A lista dos blocos NÃO está aqui**, de propósito: ela vive em
|
|
181
|
+
`.claude/skills/ds-kit/blocks-index.md`, que é **gerado** a partir dos arquivos e carregado **só
|
|
182
|
+
quando um código é citado**. Esta regra é `alwaysApply` — listar cada bloco aqui faria o custo de
|
|
183
|
+
contexto crescer a cada bloco novo, e o catálogo é feito pra crescer. Bloco só entra em jogo quando
|
|
184
|
+
o humano cita um ID, então não há caso em que você precise descobrir blocos sem ser provocada.
|
|
185
|
+
|
|
186
|
+
O catálogo **visual** fica na seção **Blocks** do showcase do DS — é de lá que o usuário tira o
|
|
187
|
+
código.
|
|
188
|
+
|
|
189
|
+
## Identidade, status e navegação
|
|
190
|
+
|
|
191
|
+
- `avatar` — compound Radix, pra fallback que NÃO é iniciais (ícone, skeleton) · `avatar-ig` — o avatar do DS: iniciais com presets de cor **e foto** (`src`, com as iniciais de `children` como fallback da URL que falha). Foto de pessoa → `avatar-ig`. **Vários avatares juntos → `AvatarGroup` (do mesmo item `avatar-ig`), nunca `-ml-*`+`ring` na mão:** ele resolve sobreposição por tamanho, cor do anel (`surface` = o que está ATRÁS) e excedente (`max`+`total`, sendo `total` a contagem do servidor)
|
|
192
|
+
(escolhe preto/branco por contraste WCAG quando recebe hex).
|
|
193
|
+
- `badge` — rótulo estático · `chip` — pílula de status/tag/filtro, pode ser interativa.
|
|
194
|
+
- `icon` — ícones do DS, incluindo o set de marca `igreen-*`.
|
|
195
|
+
- `breadcrumb` — caminho de navegação. Em página de **detalhe**, o item do registro aberto
|
|
196
|
+
pode virar seletor: `<BreadcrumbSwitcher>` (vem no mesmo item) transforma o nome do que está
|
|
197
|
+
aberto em gatilho de uma lista com busca — quem está numa ficha quer pular pra outra, não
|
|
198
|
+
voltar à lista. É controlado e **não navega** (`onValueChange` devolve o valor; rota é sua),
|
|
199
|
+
e no `header` o item do breadcrumb vira seletor com `switcher`+`value`+`onValueChange`
|
|
200
|
+
juntos. ⛔ escolher valor de formulário não é isto: é `combobox`.
|
|
201
|
+
- `menubar` (barra de menus estilo desktop) · `navigation-menu` (mega-menu).
|
|
202
|
+
- `label` — só fora de formulário; **dentro** de form quem cuida é o `form-field`.
|
|
203
|
+
|
|
204
|
+
## Comando e texto
|
|
205
|
+
|
|
206
|
+
- `command` — paleta de comandos / busca com teclado (⌘K).
|
|
207
|
+
- `markdown-text` — renderizar markdown (chat, descrições vindas de API).
|
|
208
|
+
- `calendar` — calendário inline; para **campo** de data use `date-picker`, para exibir EVENTOS use `scheduler`, e para CRONOGRAMA com dependência entre tarefas use `gantt`.
|
|
209
|
+
- `button` — ação. Variações (cor, tamanho, ícone, loading) na própria API; ver o USAGE.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
**Não achou o que precisa?** Antes de compor na unha, confira o catálogo visual. E para
|
|
214
|
+
**telas inteiras** não escolha componente a componente: use `/ds-create-crud` (tabela),
|
|
215
|
+
`/ds-create-list` (cards) ou `/ds-create-dashboard` (painel) — eles entrevistam e montam a
|
|
216
|
+
tela no padrão, e existem `example-*` prontos pra adaptar. Adaptar sempre ganha de escrever
|
|
217
|
+
do zero.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# DESIGN.md — guia de construção de telas (iGreen DS)
|
|
2
|
+
|
|
3
|
+
> Guia **enxuto** pra montar telas no padrão dos showcases do iGreen DS. Você
|
|
4
|
+
> (consumidor) **já tem os componentes** em `src/components/ui/` — então este
|
|
5
|
+
> arquivo NÃO re-documenta API de componente (isso é o `USAGE.md` ao lado de cada
|
|
6
|
+
> um). Aqui ficam as decisões de **composição, espaçamento, cor e
|
|
7
|
+
> responsividade** que não cabem num USAGE isolado.
|
|
8
|
+
>
|
|
9
|
+
> **Para a IA:** ao montar qualquer tela → siga este arquivo + o `USAGE.md` do
|
|
10
|
+
> componente + o **exemplo** mais próximo. O orquestrador `.claude/skills/ds-kit`
|
|
11
|
+
> escolhe a rota. Nunca invente API, cor ou espaçamento.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Regra de ouro
|
|
16
|
+
|
|
17
|
+
1. **Não comece do zero.** Puxe o exemplo mais próximo (`npm run igreen:add -- example-<x>`) e adapte — são extrações 1:1 dos showcases de produção.
|
|
18
|
+
2. **Leia o `USAGE.md`** do componente antes de usar (variantes, props, gotchas).
|
|
19
|
+
3. **Classe DS antes de Tailwind literal** (ver Do/Don't).
|
|
20
|
+
4. **Não edite tokens** — consuma via classe semântica (`bg-bg-brand`, `text-fg-default`, `gap-gp-md`).
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 1. Atmosfera
|
|
25
|
+
|
|
26
|
+
CRM/operações vestindo uniforme de energia sustentável: telas **densas** (tabelas, forms, kanban), canvas branco, **verde de marca** `#00803C` como acento que sinaliza "ação" (usado com parcimônia — o sistema é majoritariamente cinza). Fonte **Geist**; corpo interativo **13px/500** (`body-sm`) — lê mais "encorpado" que texto de leitura, é o que dá a densidade confiante. Radius padrão 10px. **Sem gradiente, sem glass, sem animação decorativa, sem `scale()` no clique.** Workspace, não landing page.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. Anatomia de uma tela (o que mais importa)
|
|
31
|
+
|
|
32
|
+
Toda página segue este esqueleto (veja `FinanceScreen`/`ClientesScreen`):
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
// Conteúdo da página vive dentro do seu AppShell/layout, que dá a altura.
|
|
36
|
+
<div className="flex flex-col h-full min-h-0 gap-gp-2xl">
|
|
37
|
+
<PageHeader title="..." description="..." badge={...} actions={...} />
|
|
38
|
+
{/* 16px (gap-gp-2xl) entre o PageHeader e o próximo bloco — NUNCA grudado */}
|
|
39
|
+
<DataTable ... className="flex-1 min-h-0" /> {/* ou Card / Tabs / grid de KPIs */}
|
|
40
|
+
</div>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Ritmo de espaçamento (decorar):**
|
|
44
|
+
|
|
45
|
+
| Onde | Classe | Valor |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| PageHeader → conteúdo | `gap-gp-2xl` | 16px |
|
|
48
|
+
| Entre fields de um form | `gap-form-gap` | 20px |
|
|
49
|
+
| Entre cards / KPIs | `gap-gp-md` / `gap-gp-lg` | 8–10px |
|
|
50
|
+
| Padding interno de card | Prop `size` do `<Card>`: `sm` 16 · **`md` 20 (default)** · `lg` 24 — tokens `p-pad-card-sm/md/base`. Card montado na unha usa os mesmos tokens. | — |
|
|
51
|
+
| Seção major | `gap-gp-6xl` | 32px |
|
|
52
|
+
| Ícone → texto | `gap-gp-xs` / `gap-gp-sm` | 4–6px |
|
|
53
|
+
|
|
54
|
+
> Densa, **não apertada**: 16px (`gap-gp-2xl`) é o respiro padrão entre blocos; 8px entre label e input. Espaçamento sempre via token, nunca px avulso. Divisória (`border-border-subtle`) entre seções heterogêneas (toolbar/tabela/footer); whitespace puro entre homogêneas (lista de cards).
|
|
55
|
+
|
|
56
|
+
### Tokens de componente (use o ESPECÍFICO, não valor genérico)
|
|
57
|
+
|
|
58
|
+
O DS tem tokens orientados a composição — prefira-os a `h-10`/`gap-4`/`size-5`. Caia no genérico (`gp`/`sp`/`pad`) só pro que não tem token de componente.
|
|
59
|
+
|
|
60
|
+
| Família | Classes | Quando usar |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| **Altura de form** | `min-h-form-xs`(28) `sm`(32) `md`(36) `lg`(40 ⭐) `xl`(44) | Botões, inputs, selects, chips. `lg`=desktop default · `xl`=touch WCAG mobile. Nunca `h-9`/`h-10`. |
|
|
63
|
+
| **Gap de form** | `gap-form-gap`(20) | Entre fields de um formulário (vertical ou grid). Nunca `gap-gp-*` em form. |
|
|
64
|
+
| **Ícone** | `size-icon-2xs`(8) `xs`(12) `sm`(16) `md`(20 ⭐) `lg`(24) `xl`(32) `2xl`(40) | Tamanho de ícone. Nunca `size-5`/`w-4 h-4`. |
|
|
65
|
+
| **Padding de card** | `p-pad-card-sm`(16) `p-pad-card-md`(20 ⭐) `p-pad-card-lg`(24) | Padding interno de Card/Panel/Modal/Drawer. No `<Card>` vem pela prop `size` (sm/md/lg) — não escreva a classe na mão ali. ⚠️ `p-pad-card-base` existe e é **alias de `md`** (20px) só por compatibilidade — era 24 até 2026-08-19. Não usar em código novo. |
|
|
66
|
+
| **Gutter de página** | `px-pad-page-sm`(16, mobile) `base`(24) `lg`(40, wide) | Margem lateral do conteúdo (o AppShell normalmente já aplica). |
|
|
67
|
+
| **Altura de chrome** | `h-layout-navbar`(64) `h-layout-toolbar`(48) `h-layout-tab-bar`(56) `h-layout-header-{sm,md,lg}` | Topbar, toolbar de tabela, tab-bar mobile, hero de página. |
|
|
68
|
+
| **Largura/container** | `max-w-{lg,xl,2xl}`(1024/1280/1440) · `max-w-drawer-{sm,md,lg}` · `max-w-dropdown-*` · `max-w-modal-*` · `max-w-tooltip-*` | Cap de conteúdo / largura de drawer/dropdown. ⚠️ **`container` é o ÚNICO namespace que NÃO dobra o prefixo** — `max-w-container-*` **não existe** e não emite CSS. O transform emite `--container-md`, que **sobrescreve** a escala nativa do Tailwind: `max-w-md` já é os **768px do DS**, não os 448px do Tailwind. |
|
|
69
|
+
| **Genéricos** | `gap-gp-*` (gaps) · `p-sp-*` (margin/offset) · `px-pad-*` (padding) | Só quando não há token de componente acima. |
|
|
70
|
+
|
|
71
|
+
Regra: **se existe token de componente pra aquilo (form/icon/padCard/padPage/layout/container), use ele**; o genérico é fallback.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 3. Cores e tokens
|
|
76
|
+
|
|
77
|
+
Tokens já vivem em `src/styles/theme/tailwind-theme.css`. Use pelos nomes semânticos — **nunca hex**. Dark mode é automático (tokens trocam sob `.dark`; sem lógica condicional de tema).
|
|
78
|
+
|
|
79
|
+
**Contrato de 4 papéis** (marca e cada status seguem o mesmo): `{cor}` · `{cor}-subtle` · `{cor}-hover` · `{cor}-subtle-hover`. Não invente tinta intermediária.
|
|
80
|
+
|
|
81
|
+
| Intenção | Classe |
|
|
82
|
+
|---|---|
|
|
83
|
+
| Ação principal / CTA | `bg-bg-brand text-fg-on-brand` (hover `bg-bg-brand-hover`) |
|
|
84
|
+
| Texto de marca / ghost | `text-fg-brand` · ativo/seleção `bg-bg-brand-subtle` |
|
|
85
|
+
| Texto | padrão `text-fg-default` · secundário `text-fg-muted` · sutil `text-fg-subtle` |
|
|
86
|
+
| Superfície | card `bg-bg-surface` · página `bg-bg-canvas` (separação por borda+sombra, não por bg) |
|
|
87
|
+
| Borda | `border-border-default` · sutil `border-border-subtle` · input `border-border-input` |
|
|
88
|
+
| Destrutivo | `bg-bg-danger`/`text-fg-danger` — **na API de componentes a cor chama `critical`** |
|
|
89
|
+
| Sucesso / aviso / info | `*-success` / `*-warning` / `*-info` |
|
|
90
|
+
| Foco | `focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-{color}` (ring já tem alpha) |
|
|
91
|
+
|
|
92
|
+
- **Sem azul no sistema.** `info` é **roxo** de propósito (mensagens informativas) — não use azul pra nada.
|
|
93
|
+
- `warning` é claro → texto sobre ele é preto (`fg-on-warning`).
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 4. Tipografia
|
|
98
|
+
|
|
99
|
+
- **`text-body-sm` (13/500) é o default interativo** — botões, inputs, células, dropdowns.
|
|
100
|
+
- 7 papéis: `display-*` / `heading-*` / `title-*` / `body-*` / `caption-*` / `stat-*` / `code-*`. `stat-{sm,md,lg,xl}` (20/24/30/34px) é o valor de KPI/métrica — estático, bold, com `tabular-nums`; nunca `text-[Npx]` na unha. Title default = 600; body de leitura = 400; interativo = 500.
|
|
101
|
+
- Tracking sempre negativo/zero. Override de peso via Tailwind (`text-title-md font-bold`). **Nunca** invente preset nem use `text-xs font-semibold` avulso → use o preset (`text-body-xs`, `text-caption-md`).
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 5. Profundidade
|
|
106
|
+
|
|
107
|
+
- Sombras em **2 camadas** (ambiente + chave); `shadow-sh-{sm,md,lg,xl,2xl}`. Modal = `2xl`. Drawer lateral = `sh-aside` (direcional).
|
|
108
|
+
- **Dark mode troca sombra por borda hairline** — não force sombra no escuro.
|
|
109
|
+
- Foco é `ring` (box-shadow), não muda layout. Ring já vem com alpha — nunca `/30`, nunca `ring-3`.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 6. Mapa intenção → o que puxar / qual skill
|
|
114
|
+
|
|
115
|
+
A IA roteia isso automaticamente via `.claude/skills/ds-kit`. Resumo:
|
|
116
|
+
|
|
117
|
+
| O usuário quer… | Rota | Âncora |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| tabela / lista / crud / grid de dados | **skill `crud-builder`** (`/ds-create-crud`, entrevista guiada) | `example-clientes` |
|
|
120
|
+
| tela de edição / cadastro / formulário | skill `page-edit` | `example-edit-page` + `FormField` |
|
|
121
|
+
| detalhe / detalhamento / ficha (abas) | skill `page-detail` | `example-order-detail` |
|
|
122
|
+
| dashboard / painel / KPIs | skill `dashboard-builder` (`/ds-create-dashboard`) | `example-dashboard` |
|
|
123
|
+
| gráfico (barras/linha/área/pizza) | skill `charts` | `Chart/USAGE.md` + `example-dashboard` |
|
|
124
|
+
| financeiro / extrato / saldo | (exemplo direto) | `example-finance` |
|
|
125
|
+
| chat / inbox / conversas | skill `chat` | `example-chat` |
|
|
126
|
+
| drawer de criar/editar/detalhe | skill `drawers` | drawers do `example-finance` |
|
|
127
|
+
| cards / blocos / painéis soltos | skill `cards` | `Card`/`Panel` + showcase hospedado |
|
|
128
|
+
| lista de cards / árvore / hierarquia / rede | **skill `list-builder`** (`/ds-create-list`) | `example-mapa-rede` + `DataList` |
|
|
129
|
+
| app inteiro (shell + navegação + rotas) | **skill `app-builder`** (`/ds-create-app`) | `example-app-shell` |
|
|
130
|
+
| login / autenticação | **skill `auth-builder`** (`/ds-create-login`) | `example-login` |
|
|
131
|
+
| 2+ peças que conversam (master-detail, cross-filter) | **skill `screen-composer`** (`/ds-create-screen`) | receita na própria skill |
|
|
132
|
+
| replicar módulo existente pra outro domínio | **skill `module-replicator`** (`/ds-replicate-module`) | o módulo de origem |
|
|
133
|
+
| mapa do Brasil por estado/município (coroplético) | componente | `ChoroplethMap` |
|
|
134
|
+
| cabeçalho de página | componente | `PageHeader` |
|
|
135
|
+
| shell / menu lateral / topbar (só a casca) | componentes | `app-shell` / `menu-sidebar` / `header` |
|
|
136
|
+
|
|
137
|
+
Puxe com `npm run igreen:add -- <item>`. Catálogo visual: **https://igreen-desingsystem-admin.vercel.app**.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 7. ✅ Do / ❌ Don't
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
❌ gap-4 → ✅ gap-gp-md ❌ p-4 → ✅ p-sp-md / p-pad-2xl
|
|
145
|
+
❌ rounded-lg → ✅ rounded-radius-lg ❌ shadow-md→ ✅ shadow-sh-md
|
|
146
|
+
❌ h-9 / h-10 → ✅ min-h-form-md / min-h-form-lg (36/40px) · 44px = min-h-form-xl (WCAG mobile)
|
|
147
|
+
❌ ring-3 / ring-ring-brand/30 → ✅ ring-4 / ring-ring-brand (alpha já embutido)
|
|
148
|
+
❌ outline-none → ✅ focus-visible:outline-none
|
|
149
|
+
❌ text-[14px] / text-sm font-medium → ✅ text-body-md font-medium (preset)
|
|
150
|
+
❌ <label> cru em form → ✅ <FormField> (label + erro + helper + dark-mode corretos)
|
|
151
|
+
❌ scale(0.95) no clique → ✅ feedback por mudança de bg/border
|
|
152
|
+
❌ cor hex / #fff em className → ✅ token semântico
|
|
153
|
+
❌ segunda cor de marca / azul → ✅ verde é a marca; info é roxo
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- Form 2+ campos → `<FormField>` + `gap-form-gap`.
|
|
157
|
+
- CTA único por contexto = único `filled`; destrutivo = `<Button color="critical">`.
|
|
158
|
+
- Pai que precisa de altura (tabela `flex-1`) → wrapper `flex flex-col h-full min-h-0`.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 8. Responsividade
|
|
163
|
+
|
|
164
|
+
- Mobile <640px: gutter 16px; FloatingPanel/Sheet vira sheet full; PageHeader empilha ações em overflow; DataTable rola horizontal; CTA primário = `min-h-form-xl` (44px, WCAG).
|
|
165
|
+
- Desktop default = `min-h-form-lg` (40px). Containers: `max-w-lg`(1024)/`max-w-xl`(1280) conforme densidade — **sem** o prefixo `container`, que não existe (ver tabela acima).
|
|
166
|
+
- **AppShell**: o body tem 3 patamares de padding — 18px (<768) · 24px (768–1535) · **32px (≥1536)**, corte no breakpoint `2xl`. E o **menu nasce COLAPSADO abaixo de 1536px**: notebook 1366/1440 abre com o rail, ganhando ~264px de largura útil. Quer sempre aberto? passe **`defaultMenuCollapsed={false}` explícito** — o default responsivo só vale quando a prop é omitida, e é aplicado **só no mount** (não reage a resize, pra não brigar com quem abriu o menu na mão).
|
|
167
|
+
- Os exemplos já são responsivos — herde o comportamento ao adaptar.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 9. Filosofia (decisões por intenção, não por omissão)
|
|
172
|
+
|
|
173
|
+
- **Flat por escolha** — sem gradiente/glass/neumorfismo. Profundidade = sombra 2-camadas (light) ou borda (dark).
|
|
174
|
+
- **Verde é carga, não decoração** — acento de ação, com restraint. Cinza domina.
|
|
175
|
+
- **Densidade confiante** — `body-sm` 13/500, 16px entre blocos, sem transform no clique.
|
|
176
|
+
- **Tokens, sempre** — zero hex em código; cor por papel semântico; derivação por `color-mix` já está nos tokens.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Como crescer este guia
|
|
181
|
+
|
|
182
|
+
Novo padrão de tela recorrente → seção curta aqui + (se for fluxo guiado) skill em `.claude/skills/` + 1 linha no mapa (seção 6) e no `ds-kit`. Mantenha cada peça pequena: **este arquivo = composição · `USAGE.md` = API · exemplo = referência viva.**
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rotas": [
|
|
3
|
+
{
|
|
4
|
+
"sinais": [
|
|
5
|
+
"tabela",
|
|
6
|
+
"grade",
|
|
7
|
+
"grid de dados",
|
|
8
|
+
"crud",
|
|
9
|
+
"datatable",
|
|
10
|
+
"planilha",
|
|
11
|
+
"colunas"
|
|
12
|
+
],
|
|
13
|
+
"rota": "skill `crud-builder` (`/ds-create-crud`) — entrevista guiada"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"sinais": [
|
|
17
|
+
"kanban",
|
|
18
|
+
"board",
|
|
19
|
+
"funil",
|
|
20
|
+
"pipeline de vendas",
|
|
21
|
+
"quadro por status/etapa"
|
|
22
|
+
],
|
|
23
|
+
"rota": "skill `crud-builder` (`/ds-create-crud`) — kanban é `viewMode` do DataTable; ref. `example-finance` (kanban por situação)"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"sinais": [
|
|
27
|
+
"tabela e lista no mesmo lugar",
|
|
28
|
+
"alternar tabela/lista",
|
|
29
|
+
"toggle de visão tabela↔lista"
|
|
30
|
+
],
|
|
31
|
+
"rota": "skill `crud-builder` (`/ds-create-crud`) — é `viewMode:\"list\"` + `listConfig` do DataTable (não DataList paralelo)"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"sinais": [
|
|
35
|
+
"lista de cards",
|
|
36
|
+
"árvore",
|
|
37
|
+
"hierarquia",
|
|
38
|
+
"rede/organograma",
|
|
39
|
+
"níveis",
|
|
40
|
+
"treeview",
|
|
41
|
+
"feed de cards"
|
|
42
|
+
],
|
|
43
|
+
"rota": "skill `list-builder` (`/ds-create-list`) — entrevista guiada"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"sinais": [
|
|
47
|
+
"lista",
|
|
48
|
+
"listagem de x"
|
|
49
|
+
],
|
|
50
|
+
"rota": "PERGUNTE \"grade de colunas ou cards?\" → `crud-builder` ou `list-builder` (ou front-door `/ds-create-screen`)"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"sinais": [
|
|
54
|
+
"formulário",
|
|
55
|
+
"cadastro",
|
|
56
|
+
"tela de edição",
|
|
57
|
+
"editar x",
|
|
58
|
+
"novo x",
|
|
59
|
+
"multi-step"
|
|
60
|
+
],
|
|
61
|
+
"rota": "skill `page-edit` → `example-edit-page`"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"sinais": [
|
|
65
|
+
"detalhe",
|
|
66
|
+
"detalhamento",
|
|
67
|
+
"ficha",
|
|
68
|
+
"página de x com abas",
|
|
69
|
+
"visão geral do pedido"
|
|
70
|
+
],
|
|
71
|
+
"rota": "skill `page-detail` → `example-order-detail`"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"sinais": [
|
|
75
|
+
"login",
|
|
76
|
+
"entrar",
|
|
77
|
+
"acesso",
|
|
78
|
+
"autenticação",
|
|
79
|
+
"sign in",
|
|
80
|
+
"esqueci a senha",
|
|
81
|
+
"tela de login"
|
|
82
|
+
],
|
|
83
|
+
"rota": "skill `auth-builder` (`/ds-create-login`) → `example-login` (fullscreen, painel por tokens)"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"sinais": [
|
|
87
|
+
"dashboard",
|
|
88
|
+
"painel",
|
|
89
|
+
"visão geral",
|
|
90
|
+
"indicadores"
|
|
91
|
+
],
|
|
92
|
+
"rota": "skill `dashboard-builder` (`/ds-create-dashboard`) — entrevista → gate → geração ancorada no `example-dashboard`"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"sinais": [
|
|
96
|
+
"tabela + detalhe ao lado",
|
|
97
|
+
"clicar abre o detalhe",
|
|
98
|
+
"filtro no topo que muda tudo"
|
|
99
|
+
],
|
|
100
|
+
"rota": "skill `screen-composer` — master-detail / cross-filter; monta as peças pelos builders + cabeia o estado compartilhado (a receita está na própria skill)"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"sinais": [
|
|
104
|
+
"gráfico",
|
|
105
|
+
"chart",
|
|
106
|
+
"barras/linha/área/pizza"
|
|
107
|
+
],
|
|
108
|
+
"rota": "skill `charts` → `Chart/USAGE.md` + `example-dashboard`"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"sinais": [
|
|
112
|
+
"financeiro",
|
|
113
|
+
"extrato",
|
|
114
|
+
"saldo",
|
|
115
|
+
"transações"
|
|
116
|
+
],
|
|
117
|
+
"rota": "`example-finance` (puxar + adaptar)"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"sinais": [
|
|
121
|
+
"chat",
|
|
122
|
+
"inbox",
|
|
123
|
+
"conversas",
|
|
124
|
+
"atendimento"
|
|
125
|
+
],
|
|
126
|
+
"rota": "skill `chat` → `example-chat`"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"sinais": [
|
|
130
|
+
"drawer/painel de criar/editar/ver detalhe"
|
|
131
|
+
],
|
|
132
|
+
"rota": "skill `drawers` → drawers do `example-finance`"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"sinais": [
|
|
136
|
+
"cards",
|
|
137
|
+
"blocos",
|
|
138
|
+
"painéis soltos",
|
|
139
|
+
"seções"
|
|
140
|
+
],
|
|
141
|
+
"rota": "skill `cards` → `Card`/`Panel` + showcase"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"sinais": [
|
|
145
|
+
"igual ao exemplo de <x>",
|
|
146
|
+
"estrutura do <x>"
|
|
147
|
+
],
|
|
148
|
+
"rota": "puxar `example-<X>` e adaptar"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"sinais": [
|
|
152
|
+
"esqueleto do app",
|
|
153
|
+
"estrutura/base do app",
|
|
154
|
+
"shell + navegação + rotas",
|
|
155
|
+
"montar o app do zero"
|
|
156
|
+
],
|
|
157
|
+
"rota": "skill `app-builder` (`/ds-create-app`) → `example-app-shell` (AppShell + nav-data + mapa de rotas declarativo)"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"sinais": [
|
|
161
|
+
"replica o módulo x igual ao y",
|
|
162
|
+
"mesma estrutura pra outro segmento/vertical",
|
|
163
|
+
"clonar telas"
|
|
164
|
+
],
|
|
165
|
+
"rota": "skill `module-replicator` (`/ds-replicate-module`) — avalia copiar × parametrizar; troca dados/rótulos, mantém estrutura"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"sinais": [
|
|
169
|
+
"que componente uso pra x",
|
|
170
|
+
"tem componente de y?",
|
|
171
|
+
"quais opções pra abas / filtro / data",
|
|
172
|
+
"o que o ds tem pra formulário"
|
|
173
|
+
],
|
|
174
|
+
"rota": "rule `.claude/rules/ds-components.md` — vocabulário dos componentes por tarefa, com o critério de escolha. Não é pedido de tela: responda pela rule, não abra builder"
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
}
|