@snksergio/design-system 0.62.0 → 0.64.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/blocos/chart/budget-breakdown.tsx +174 -0
- package/dist-lib/ai/blocos/indice.md +43 -0
- package/dist-lib/ai/blocos/paneldetail/detalhe-com-tabela.tsx +450 -0
- package/dist-lib/ai/blocos/paneldetail/detalhe-de-tarefa-com-abas.tsx +570 -0
- package/dist-lib/ai/blocos/paneldetail/detalhe-do-registro.tsx +555 -0
- package/dist-lib/ai/componentes/DataTable.md +2 -1
- package/dist-lib/ai/componentes/TableToolbar.md +1 -1
- package/dist-lib/ai/exemplos/app-shell/app-shell-example.tsx +140 -0
- package/dist-lib/ai/exemplos/app-shell/index.ts +3 -0
- package/dist-lib/ai/exemplos/app-shell/nav-data.ts +97 -0
- package/dist-lib/ai/exemplos/app-shell/routes.tsx +75 -0
- package/dist-lib/ai/exemplos/chat/chat-screen.tsx +152 -0
- package/dist-lib/ai/exemplos/chat/chat-v2-mocks.ts +171 -0
- package/dist-lib/ai/exemplos/chat/chat-v2.styles.ts +23 -0
- package/dist-lib/ai/exemplos/chat/chat-v2.types.ts +81 -0
- package/dist-lib/ai/exemplos/chat/components/ChannelDot/channel-dot.tsx +28 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationActionsMenu/conversation-actions-menu.tsx +83 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationActionsMenu/index.ts +4 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.styles.ts +22 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.tsx +203 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.types.ts +10 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationColumn/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.styles.ts +55 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.tsx +52 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.types.ts +7 -0
- package/dist-lib/ai/exemplos/chat/components/ConversationListItem/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/DateSeparator/date-separator.tsx +18 -0
- package/dist-lib/ai/exemplos/chat/components/DetailField/detail-field.tsx +23 -0
- package/dist-lib/ai/exemplos/chat/components/DetailSection/detail-section.tsx +41 -0
- package/dist-lib/ai/exemplos/chat/components/DetailSection/index.ts +1 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.styles.ts +30 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.tsx +142 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.types.ts +16 -0
- package/dist-lib/ai/exemplos/chat/components/DetailsColumn/index.ts +5 -0
- package/dist-lib/ai/exemplos/chat/components/FilterRow/filter-row.styles.ts +37 -0
- package/dist-lib/ai/exemplos/chat/components/FilterRow/filter-row.tsx +45 -0
- package/dist-lib/ai/exemplos/chat/components/FilterRow/index.ts +1 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.styles.ts +27 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.tsx +66 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.types.ts +13 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-rail.tsx +38 -0
- package/dist-lib/ai/exemplos/chat/components/FiltersColumn/index.ts +6 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.styles.ts +37 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.tsx +29 -0
- package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.types.ts +5 -0
- package/dist-lib/ai/exemplos/chat/components/PersonAvatar/index.ts +5 -0
- package/dist-lib/ai/exemplos/chat/components/PersonAvatar/person-avatar.tsx +31 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/index.ts +2 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.styles.ts +19 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.tsx +140 -0
- package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.types.ts +13 -0
- package/dist-lib/ai/exemplos/chat/components/RailItem/index.ts +1 -0
- package/dist-lib/ai/exemplos/chat/components/RailItem/rail-item.styles.ts +30 -0
- package/dist-lib/ai/exemplos/chat/components/RailItem/rail-item.tsx +42 -0
- package/dist-lib/ai/exemplos/chat/hooks/use-resizable.ts +98 -0
- package/dist-lib/ai/exemplos/chat/index.ts +1 -0
- package/dist-lib/ai/exemplos/clientes/_table-data.ts +59 -0
- package/dist-lib/ai/exemplos/clientes/clientes-screen.tsx +505 -0
- package/dist-lib/ai/exemplos/clientes/clientes-showcase-mocks.ts +117 -0
- package/dist-lib/ai/exemplos/clientes/clientes-showcase.styles.ts +13 -0
- package/dist-lib/ai/exemplos/clientes/clientes-showcase.types.ts +16 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.styles.ts +28 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.tsx +303 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.types.ts +14 -0
- package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/index.ts +2 -0
- package/dist-lib/ai/exemplos/clientes/components/NovoClienteDrawer/index.ts +2 -0
- package/dist-lib/ai/exemplos/clientes/components/NovoClienteDrawer/novo-cliente-drawer.tsx +207 -0
- package/dist-lib/ai/exemplos/clientes/index.ts +1 -0
- package/dist-lib/ai/exemplos/edit-page/components/StepNav.tsx +81 -0
- package/dist-lib/ai/exemplos/edit-page/components/section-card.tsx +85 -0
- package/dist-lib/ai/exemplos/edit-page/edit-page-screen.tsx +234 -0
- package/dist-lib/ai/exemplos/edit-page/index.ts +1 -0
- package/dist-lib/ai/exemplos/finance/_table-data.ts +57 -0
- package/dist-lib/ai/exemplos/finance/clientes-financeiro-mocks.ts +227 -0
- package/dist-lib/ai/exemplos/finance/clientes-financeiro.types.ts +75 -0
- package/dist-lib/ai/exemplos/finance/clientes-showcase-mocks.ts +117 -0
- package/dist-lib/ai/exemplos/finance/clientes-showcase.styles.ts +13 -0
- package/dist-lib/ai/exemplos/finance/clientes-showcase.types.ts +16 -0
- package/dist-lib/ai/exemplos/finance/components/EditarFinanceDrawer/editar-finance-drawer.tsx +241 -0
- package/dist-lib/ai/exemplos/finance/components/EditarFinanceDrawer/index.ts +5 -0
- package/dist-lib/ai/exemplos/finance/components/ExtratoExpansion/extrato-expansion.tsx +172 -0
- package/dist-lib/ai/exemplos/finance/components/ExtratoExpansion/index.ts +1 -0
- package/dist-lib/ai/exemplos/finance/components/FinanceDetailPanel/finance-detail-panel.tsx +241 -0
- package/dist-lib/ai/exemplos/finance/components/FinanceDetailPanel/index.ts +2 -0
- package/dist-lib/ai/exemplos/finance/components/NovoClienteDrawer/index.ts +2 -0
- package/dist-lib/ai/exemplos/finance/components/NovoClienteDrawer/novo-cliente-drawer.tsx +207 -0
- package/dist-lib/ai/exemplos/finance/components/SacarDialog/index.ts +2 -0
- package/dist-lib/ai/exemplos/finance/components/SacarDialog/sacar-dialog.tsx +346 -0
- package/dist-lib/ai/exemplos/finance/finance-screen.tsx +821 -0
- package/dist-lib/ai/exemplos/finance/index.ts +1 -0
- package/dist-lib/ai/exemplos/gantt/_gantt-data.tsx +402 -0
- package/dist-lib/ai/exemplos/gantt/gantt-screen.tsx +512 -0
- package/dist-lib/ai/exemplos/gantt/index.ts +1 -0
- package/dist-lib/ai/exemplos/login/index.ts +1 -0
- package/dist-lib/ai/exemplos/login/login-screen.tsx +246 -0
- package/dist-lib/ai/exemplos/mapa-rede/components/ConsultorDetailPanel/consultor-detail-panel.tsx +158 -0
- package/dist-lib/ai/exemplos/mapa-rede/components/ConsultorDetailPanel/index.ts +2 -0
- package/dist-lib/ai/exemplos/mapa-rede/index.ts +1 -0
- package/dist-lib/ai/exemplos/mapa-rede/mapa-de-rede-mocks.ts +655 -0
- package/dist-lib/ai/exemplos/mapa-rede/mapa-de-rede.types.ts +53 -0
- package/dist-lib/ai/exemplos/mapa-rede/mapa-rede-screen.tsx +227 -0
- package/dist-lib/ai/exemplos/order-detail/components/ActivityTab.tsx +77 -0
- package/dist-lib/ai/exemplos/order-detail/components/AttachmentsTab.tsx +45 -0
- package/dist-lib/ai/exemplos/order-detail/components/CommentsTab.tsx +111 -0
- package/dist-lib/ai/exemplos/order-detail/components/DetailsTab.tsx +189 -0
- package/dist-lib/ai/exemplos/order-detail/components/OverviewTab.tsx +200 -0
- package/dist-lib/ai/exemplos/order-detail/components/section-card.tsx +85 -0
- package/dist-lib/ai/exemplos/order-detail/index.ts +1 -0
- package/dist-lib/ai/exemplos/order-detail/order-detail-screen.tsx +119 -0
- package/dist-lib/ai/exemplos/order-detail/order-mocks.ts +186 -0
- package/dist-lib/ai/exemplos/order-detail/order.types.ts +118 -0
- package/dist-lib/ai/global/componentes.md +7 -0
- package/dist-lib/ai/indice.json +30 -15
- package/dist-lib/ai/manifest.json +32 -6
- package/dist-lib/ai/roteiros/app-builder/roteiro.md +155 -0
- package/dist-lib/ai/roteiros/auth-builder/roteiro.md +42 -0
- package/dist-lib/ai/roteiros/cards/roteiro.md +34 -0
- package/dist-lib/ai/roteiros/charts/roteiro.md +32 -0
- package/dist-lib/ai/roteiros/chat/roteiro.md +31 -0
- package/dist-lib/ai/roteiros/crud-builder/blueprint.md +63 -0
- package/dist-lib/ai/roteiros/crud-builder/entrevista.md +146 -0
- package/dist-lib/ai/roteiros/crud-builder/geracao.md +113 -0
- package/dist-lib/ai/roteiros/crud-builder/roteiro.md +89 -0
- package/dist-lib/ai/roteiros/drawers/roteiro.md +41 -0
- package/dist-lib/ai/roteiros/list-builder/blueprint.md +94 -0
- package/dist-lib/ai/roteiros/list-builder/entrevista.md +193 -0
- package/dist-lib/ai/roteiros/list-builder/geracao.md +63 -0
- package/dist-lib/ai/roteiros/list-builder/roteiro.md +91 -0
- package/dist-lib/ai/roteiros/module-replicator/roteiro.md +56 -0
- package/dist-lib/ai/roteiros/page-detail/roteiro.md +32 -0
- package/dist-lib/ai/roteiros/page-edit/roteiro.md +31 -0
- package/dist-lib/ai/roteiros/screen-composer/roteiro.md +95 -0
- package/dist-lib/chunks/{panel-B-liPlxr.mjs → panel-CN0ChoHM.mjs} +5 -2
- package/dist-lib/chunks/{panel-B-liPlxr.mjs.map → panel-CN0ChoHM.mjs.map} +1 -1
- package/dist-lib/chunks/{panel-DoNbjeqX.cjs → panel-Cpq1xHck.cjs} +5 -2
- package/dist-lib/chunks/{panel-DoNbjeqX.cjs.map → panel-Cpq1xHck.cjs.map} +1 -1
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/index.mjs +2 -2
- package/dist-lib/preview/clientes.cjs +1 -1
- package/dist-lib/preview/clientes.mjs +1 -1
- package/dist-lib/src/components/ui/DataTable/data-table.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DataTable/data-table.types.d.ts +20 -2
- package/dist-lib/src/components/ui/DataTable/data-table.types.d.ts.map +1 -1
- package/package.json +1 -1
- /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/blueprint.md +0 -0
- /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/entrevista.md +0 -0
- /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/geracao.md +0 -0
- /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/roteiro.md +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/** Tipos da tela de detalhe de pedido (showcase OrderDetail). */
|
|
2
|
+
|
|
3
|
+
export type OrderStatus = "paid" | "pending" | "refunded";
|
|
4
|
+
export type FulfillmentStatus = "fulfilled" | "unfulfilled" | "partial";
|
|
5
|
+
|
|
6
|
+
export interface OrderItem {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
sku: string;
|
|
10
|
+
/** Preço unitário em centavos? Não — em reais (number) pra simplicidade do mock. */
|
|
11
|
+
price: number;
|
|
12
|
+
qty: number;
|
|
13
|
+
/** Cor do thumb placeholder (hex). */
|
|
14
|
+
thumb: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface OrderActivity {
|
|
18
|
+
id: string;
|
|
19
|
+
/** Cabeçalho do grupo de data (ex: "Domingo, 06 de março"). */
|
|
20
|
+
dateGroup: string;
|
|
21
|
+
title: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
time: string;
|
|
24
|
+
/** true = evento concluído (verde); false = etapa do fluxo (brand). */
|
|
25
|
+
done?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface OrderComment {
|
|
29
|
+
id: string;
|
|
30
|
+
author: string;
|
|
31
|
+
initials: string;
|
|
32
|
+
colorHex?: string;
|
|
33
|
+
when: string;
|
|
34
|
+
text: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface OrderAttachment {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
kind: "pdf" | "image";
|
|
41
|
+
size: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type OrderTagColor =
|
|
45
|
+
| "success"
|
|
46
|
+
| "primary"
|
|
47
|
+
| "warning"
|
|
48
|
+
| "neutral"
|
|
49
|
+
| "danger"
|
|
50
|
+
| "info";
|
|
51
|
+
|
|
52
|
+
export interface OrderTag {
|
|
53
|
+
label: string;
|
|
54
|
+
color: OrderTagColor;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface OrderCustomer {
|
|
58
|
+
firstName: string;
|
|
59
|
+
middleName?: string;
|
|
60
|
+
lastName: string;
|
|
61
|
+
initials: string;
|
|
62
|
+
colorHex?: string;
|
|
63
|
+
email: string;
|
|
64
|
+
phone: string;
|
|
65
|
+
customerId: string;
|
|
66
|
+
accountType: string;
|
|
67
|
+
registeredAt: string;
|
|
68
|
+
active: boolean;
|
|
69
|
+
previousOrders: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface Order {
|
|
73
|
+
id: string;
|
|
74
|
+
status: OrderStatus;
|
|
75
|
+
fulfillment: FulfillmentStatus;
|
|
76
|
+
placedAt: string;
|
|
77
|
+
source: string;
|
|
78
|
+
|
|
79
|
+
items: OrderItem[];
|
|
80
|
+
subtotal: number;
|
|
81
|
+
shipping: number;
|
|
82
|
+
tax: number;
|
|
83
|
+
discountCode?: string;
|
|
84
|
+
discountLabel?: string;
|
|
85
|
+
discountValue?: number;
|
|
86
|
+
total: number;
|
|
87
|
+
|
|
88
|
+
customer: OrderCustomer;
|
|
89
|
+
|
|
90
|
+
shippingAddress: {
|
|
91
|
+
line1: string;
|
|
92
|
+
line2?: string;
|
|
93
|
+
city: string;
|
|
94
|
+
state: string;
|
|
95
|
+
zip: string;
|
|
96
|
+
country: string;
|
|
97
|
+
carrier: string;
|
|
98
|
+
tracking: string;
|
|
99
|
+
eta: string;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
billing: {
|
|
103
|
+
address: string;
|
|
104
|
+
cityState: string;
|
|
105
|
+
country: string;
|
|
106
|
+
method: string;
|
|
107
|
+
transactionId: string;
|
|
108
|
+
paymentDate: string;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
note: string;
|
|
112
|
+
internalNote: string;
|
|
113
|
+
tags: OrderTag[];
|
|
114
|
+
|
|
115
|
+
activity: OrderActivity[];
|
|
116
|
+
comments: OrderComment[];
|
|
117
|
+
attachments: OrderAttachment[];
|
|
118
|
+
}
|
|
@@ -131,6 +131,13 @@ sem passar pela entrevista guiada** (é justamente aí que o erro aparece):
|
|
|
131
131
|
(`defaultViews`, ex.: "Ativos", "Pendentes"; `allowCreateView={false}` se forem fixas).
|
|
132
132
|
2. **X não é coluna, pequeno e simples** (período/mês, um toggle) → `toolbar.actions`
|
|
133
133
|
(máx ~2, label curta). Período que afeta a página toda → `PageHeader.actions` (dropdown).
|
|
134
|
+
**Precisa de um COMPONENTE na barra** (um `DatePicker mode="range"` de período)? →
|
|
135
|
+
`toolbar.customLeft` do `data-table`, que renderiza entre o refresh e a busca —
|
|
136
|
+
`toolbar.actions` não serve, seus kinds são `button/dropdown/input` e nenhum recebe
|
|
137
|
+
componente. ⚠️ **Exige o DS `0.64.0` ou mais novo**: em `0.63.0` e anteriores a
|
|
138
|
+
prop existe no tipo, o TS aceita e **nada renderiza** (era declarada e lida por nada).
|
|
139
|
+
Confira sua versão antes de prometer o controle — e note que o `data-list` **não tem**
|
|
140
|
+
esse slot, só `toolbarActions`.
|
|
134
141
|
3. **Muitos filtros, ou muito grandes** → drawer "Filtros" **nativo** do `data-table` + chips
|
|
135
142
|
pré-aplicados. Nunca empilhar selects soltos.
|
|
136
143
|
|
package/dist-lib/ai/indice.json
CHANGED
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"planilha",
|
|
11
11
|
"colunas"
|
|
12
12
|
],
|
|
13
|
-
"rota": "skill `crud-builder` (`/ds-create-crud`) — entrevista guiada"
|
|
13
|
+
"rota": "skill `crud-builder` (`/ds-create-crud`) — entrevista guiada",
|
|
14
|
+
"roteiro": "crud-builder"
|
|
14
15
|
},
|
|
15
16
|
{
|
|
16
17
|
"sinais": [
|
|
@@ -20,7 +21,8 @@
|
|
|
20
21
|
"pipeline de vendas",
|
|
21
22
|
"quadro por status/etapa"
|
|
22
23
|
],
|
|
23
|
-
"rota": "skill `crud-builder` (`/ds-create-crud`) — kanban é `viewMode` do DataTable; ref. `example-finance` (kanban por situação)"
|
|
24
|
+
"rota": "skill `crud-builder` (`/ds-create-crud`) — kanban é `viewMode` do DataTable; ref. `example-finance` (kanban por situação)",
|
|
25
|
+
"roteiro": "crud-builder"
|
|
24
26
|
},
|
|
25
27
|
{
|
|
26
28
|
"sinais": [
|
|
@@ -28,7 +30,8 @@
|
|
|
28
30
|
"alternar tabela/lista",
|
|
29
31
|
"toggle de visão tabela↔lista"
|
|
30
32
|
],
|
|
31
|
-
"rota": "skill `crud-builder` (`/ds-create-crud`) — é `viewMode:\"list\"` + `listConfig` do DataTable (não DataList paralelo)"
|
|
33
|
+
"rota": "skill `crud-builder` (`/ds-create-crud`) — é `viewMode:\"list\"` + `listConfig` do DataTable (não DataList paralelo)",
|
|
34
|
+
"roteiro": "crud-builder"
|
|
32
35
|
},
|
|
33
36
|
{
|
|
34
37
|
"sinais": [
|
|
@@ -40,7 +43,8 @@
|
|
|
40
43
|
"treeview",
|
|
41
44
|
"feed de cards"
|
|
42
45
|
],
|
|
43
|
-
"rota": "skill `list-builder` (`/ds-create-list`) — entrevista guiada"
|
|
46
|
+
"rota": "skill `list-builder` (`/ds-create-list`) — entrevista guiada",
|
|
47
|
+
"roteiro": "list-builder"
|
|
44
48
|
},
|
|
45
49
|
{
|
|
46
50
|
"sinais": [
|
|
@@ -58,7 +62,8 @@
|
|
|
58
62
|
"novo x",
|
|
59
63
|
"multi-step"
|
|
60
64
|
],
|
|
61
|
-
"rota": "skill `page-edit` → `example-edit-page`"
|
|
65
|
+
"rota": "skill `page-edit` → `example-edit-page`",
|
|
66
|
+
"roteiro": "page-edit"
|
|
62
67
|
},
|
|
63
68
|
{
|
|
64
69
|
"sinais": [
|
|
@@ -68,7 +73,8 @@
|
|
|
68
73
|
"página de x com abas",
|
|
69
74
|
"visão geral do pedido"
|
|
70
75
|
],
|
|
71
|
-
"rota": "skill `page-detail` → `example-order-detail`"
|
|
76
|
+
"rota": "skill `page-detail` → `example-order-detail`",
|
|
77
|
+
"roteiro": "page-detail"
|
|
72
78
|
},
|
|
73
79
|
{
|
|
74
80
|
"sinais": [
|
|
@@ -80,7 +86,8 @@
|
|
|
80
86
|
"esqueci a senha",
|
|
81
87
|
"tela de login"
|
|
82
88
|
],
|
|
83
|
-
"rota": "skill `auth-builder` (`/ds-create-login`) → `example-login` (fullscreen, painel por tokens)"
|
|
89
|
+
"rota": "skill `auth-builder` (`/ds-create-login`) → `example-login` (fullscreen, painel por tokens)",
|
|
90
|
+
"roteiro": "auth-builder"
|
|
84
91
|
},
|
|
85
92
|
{
|
|
86
93
|
"sinais": [
|
|
@@ -89,7 +96,8 @@
|
|
|
89
96
|
"visão geral",
|
|
90
97
|
"indicadores"
|
|
91
98
|
],
|
|
92
|
-
"rota": "skill `dashboard-builder` (`/ds-create-dashboard`) — entrevista → gate → geração ancorada no `example-dashboard`"
|
|
99
|
+
"rota": "skill `dashboard-builder` (`/ds-create-dashboard`) — entrevista → gate → geração ancorada no `example-dashboard`",
|
|
100
|
+
"roteiro": "dashboard-builder"
|
|
93
101
|
},
|
|
94
102
|
{
|
|
95
103
|
"sinais": [
|
|
@@ -97,7 +105,8 @@
|
|
|
97
105
|
"clicar abre o detalhe",
|
|
98
106
|
"filtro no topo que muda tudo"
|
|
99
107
|
],
|
|
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)"
|
|
108
|
+
"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)",
|
|
109
|
+
"roteiro": "screen-composer"
|
|
101
110
|
},
|
|
102
111
|
{
|
|
103
112
|
"sinais": [
|
|
@@ -105,7 +114,8 @@
|
|
|
105
114
|
"chart",
|
|
106
115
|
"barras/linha/área/pizza"
|
|
107
116
|
],
|
|
108
|
-
"rota": "skill `charts` → `Chart/USAGE.md` + `example-dashboard`"
|
|
117
|
+
"rota": "skill `charts` → `Chart/USAGE.md` + `example-dashboard`",
|
|
118
|
+
"roteiro": "charts"
|
|
109
119
|
},
|
|
110
120
|
{
|
|
111
121
|
"sinais": [
|
|
@@ -123,13 +133,15 @@
|
|
|
123
133
|
"conversas",
|
|
124
134
|
"atendimento"
|
|
125
135
|
],
|
|
126
|
-
"rota": "skill `chat` → `example-chat`"
|
|
136
|
+
"rota": "skill `chat` → `example-chat`",
|
|
137
|
+
"roteiro": "chat"
|
|
127
138
|
},
|
|
128
139
|
{
|
|
129
140
|
"sinais": [
|
|
130
141
|
"drawer/painel de criar/editar/ver detalhe"
|
|
131
142
|
],
|
|
132
|
-
"rota": "skill `drawers` → drawers do `example-finance`"
|
|
143
|
+
"rota": "skill `drawers` → drawers do `example-finance`",
|
|
144
|
+
"roteiro": "drawers"
|
|
133
145
|
},
|
|
134
146
|
{
|
|
135
147
|
"sinais": [
|
|
@@ -138,7 +150,8 @@
|
|
|
138
150
|
"painéis soltos",
|
|
139
151
|
"seções"
|
|
140
152
|
],
|
|
141
|
-
"rota": "skill `cards` → `Card`/`Panel` + showcase"
|
|
153
|
+
"rota": "skill `cards` → `Card`/`Panel` + showcase",
|
|
154
|
+
"roteiro": "cards"
|
|
142
155
|
},
|
|
143
156
|
{
|
|
144
157
|
"sinais": [
|
|
@@ -154,7 +167,8 @@
|
|
|
154
167
|
"shell + navegação + rotas",
|
|
155
168
|
"montar o app do zero"
|
|
156
169
|
],
|
|
157
|
-
"rota": "skill `app-builder` (`/ds-create-app`) → `example-app-shell` (AppShell + nav-data + mapa de rotas declarativo)"
|
|
170
|
+
"rota": "skill `app-builder` (`/ds-create-app`) → `example-app-shell` (AppShell + nav-data + mapa de rotas declarativo)",
|
|
171
|
+
"roteiro": "app-builder"
|
|
158
172
|
},
|
|
159
173
|
{
|
|
160
174
|
"sinais": [
|
|
@@ -162,7 +176,8 @@
|
|
|
162
176
|
"mesma estrutura pra outro segmento/vertical",
|
|
163
177
|
"clonar telas"
|
|
164
178
|
],
|
|
165
|
-
"rota": "skill `module-replicator` (`/ds-replicate-module`) — avalia copiar × parametrizar; troca dados/rótulos, mantém estrutura"
|
|
179
|
+
"rota": "skill `module-replicator` (`/ds-replicate-module`) — avalia copiar × parametrizar; troca dados/rótulos, mantém estrutura",
|
|
180
|
+
"roteiro": "module-replicator"
|
|
166
181
|
},
|
|
167
182
|
{
|
|
168
183
|
"sinais": [
|
|
@@ -1,16 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"pacote": "@snksergio/design-system",
|
|
3
|
-
"versao": "0.
|
|
4
|
-
"commit": "
|
|
5
|
-
"gerado": "2026-09-
|
|
3
|
+
"versao": "0.64.0",
|
|
4
|
+
"commit": "cb0a1bf",
|
|
5
|
+
"gerado": "2026-09-16",
|
|
6
6
|
"conteudo": {
|
|
7
7
|
"roteiros": [
|
|
8
|
-
"
|
|
8
|
+
"app-builder",
|
|
9
|
+
"auth-builder",
|
|
10
|
+
"cards",
|
|
11
|
+
"charts",
|
|
12
|
+
"chat",
|
|
13
|
+
"crud-builder",
|
|
14
|
+
"dashboard-builder",
|
|
15
|
+
"drawers",
|
|
16
|
+
"list-builder",
|
|
17
|
+
"module-replicator",
|
|
18
|
+
"page-detail",
|
|
19
|
+
"page-edit",
|
|
20
|
+
"screen-composer"
|
|
21
|
+
],
|
|
22
|
+
"exemplos": [
|
|
23
|
+
"app-shell",
|
|
24
|
+
"chat",
|
|
25
|
+
"clientes",
|
|
26
|
+
"dashboard",
|
|
27
|
+
"edit-page",
|
|
28
|
+
"finance",
|
|
29
|
+
"gantt",
|
|
30
|
+
"login",
|
|
31
|
+
"mapa-rede",
|
|
32
|
+
"order-detail"
|
|
9
33
|
],
|
|
10
34
|
"componentes": 47,
|
|
11
35
|
"componentesComRegra": 19,
|
|
12
36
|
"rotas": 19,
|
|
13
|
-
"
|
|
14
|
-
"
|
|
37
|
+
"rotasComRoteiro": 15,
|
|
38
|
+
"arquivosDeExemplo": 108,
|
|
39
|
+
"arquivosDeBloco": 4,
|
|
40
|
+
"residuoClaudeCode": 42
|
|
15
41
|
}
|
|
16
42
|
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
> **Nota de portabilidade.** Este roteiro foi extraído do pipeline do iGreen DS
|
|
2
|
+
> para Claude Code. Menções a slash command (`/ds-create-…`), a `.claude/` e a
|
|
3
|
+
> ferramentas daquele ambiente descrevem **como ele é acionado lá** — aqui o
|
|
4
|
+
> equivalente é carregar este roteiro pelo `indice.json`. O conteúdo de decisão
|
|
5
|
+
> (entrevista, blueprint, regras de composição) vale igual.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# app-builder — Esqueleto de aplicação (AppShell + navegação + rotas)
|
|
9
|
+
|
|
10
|
+
O "chassi" onde as telas moram. Não é uma tela de conteúdo — é o shell + nav +
|
|
11
|
+
roteamento. Conteúdo de cada tela vem depois dos builders (crud/list/dashboard).
|
|
12
|
+
Não gere de memória: puxe e adapte o exemplo.
|
|
13
|
+
|
|
14
|
+
## Passo 0 — duas perguntas ao usuário, nesta ordem
|
|
15
|
+
|
|
16
|
+
### 1. Como o projeto se chama?
|
|
17
|
+
|
|
18
|
+
Vai **à direita da logo** na sidebar (`sidebarTitle`), na raiz do breadcrumb e no título da
|
|
19
|
+
aba. É a única coisa deste passo que o DS não adivinha — e `sidebarTitle` é obrigatória de
|
|
20
|
+
propósito, pra o TS cobrar a pergunta.
|
|
21
|
+
|
|
22
|
+
### 2. O app tem módulos?
|
|
23
|
+
|
|
24
|
+
⚠️ **Vocabulário — leia ANTES de formular a pergunta.** A mesma coisa tem três nomes na boca
|
|
25
|
+
do usuário: **módulo**, **workspace** e, às vezes, **categoria**. E "categoria" é armadilha:
|
|
26
|
+
na API da sidebar única, `categories` são os **grupos do menu**, não os módulos — a palavra
|
|
27
|
+
nomeia os dois lados da escolha. Então **não** use "categoria" na pergunta, e **não** use
|
|
28
|
+
nome de componente (`MenuSidebar`/`SingleMenuSidebar`): descreva **o que aparece na tela**.
|
|
29
|
+
|
|
30
|
+
**Espelhe a palavra do usuário** — se ele disse "módulo" ou "workspace", use a dele. **Exceto
|
|
31
|
+
"categoria"**: essa é ambígua e você **não pode** adivinhar. Se ele disse "categorias",
|
|
32
|
+
desambigue antes de qualquer coisa:
|
|
33
|
+
|
|
34
|
+
> *"Quando você fala 'categorias', são **áreas grandes**, cada uma com o menu dela — tipo
|
|
35
|
+
> Comercial, Financeiro, Suporte? Ou são os **grupos dentro de um menu só** — tipo Cadastros,
|
|
36
|
+
> Relatórios, Configurações?"*
|
|
37
|
+
|
|
38
|
+
**Se ele JÁ listou as áreas** ("tenho Comercial, Financeiro e Suporte"), **não pergunte do
|
|
39
|
+
zero** — recomende e confirme numa linha: *"Como você tem 3 áreas separadas, vou de menu com
|
|
40
|
+
a coluna de módulos à esquerda (é o link X). Confirma?"*.
|
|
41
|
+
|
|
42
|
+
Fora isso, ofereça **duas** opções, e só essas duas — **com recomendação**, não neutro:
|
|
43
|
+
|
|
44
|
+
> *"Seu sistema é dividido em áreas grandes e separadas — tipo Comercial, Financeiro,
|
|
45
|
+
> Suporte — cada uma com o menu dela? Ou é um sistema só, com um menu único?*
|
|
46
|
+
>
|
|
47
|
+
> *1. **Tem áreas separadas** — cada área vira um ícone numa coluna estreita à esquerda, e o
|
|
48
|
+
> menu dela (com submenus) abre ao lado:
|
|
49
|
+
> https://igreen-desingsystem-admin.vercel.app/#/menu-sidebar*
|
|
50
|
+
>
|
|
51
|
+
> *2. **É um sistema só** — sem a coluna de ícones: só o nome do projeto no topo e, abaixo, os
|
|
52
|
+
> grupos do menu com seus submenus:
|
|
53
|
+
> https://igreen-desingsystem-admin.vercel.app/#/single-menu-sidebar*
|
|
54
|
+
>
|
|
55
|
+
> *Pelo que você me contou, eu iria de **<a que você inferiu>** — mas abra os dois links e me
|
|
56
|
+
> diga."*
|
|
57
|
+
|
|
58
|
+
⚠️ **Recomende sempre uma das duas**, com o motivo em meia linha ("porque você tem 3 áreas
|
|
59
|
+
distintas" / "porque é um sistema só"). Pergunta neutra devolve a decisão pra quem não conhece
|
|
60
|
+
os componentes — e foi assim que um consumidor escolheu errado sem querer (2026-08-22).
|
|
61
|
+
|
|
62
|
+
| resposta | `sidebar` | dados | o que NÃO passar |
|
|
63
|
+
|---|---|---|---|
|
|
64
|
+
| **tem áreas/módulos** | `"menu"` (default) | `contexts` | — |
|
|
65
|
+
| **é um sistema só** | `"single"` | `categories` | `sidebarModules` e `sidebarShowSearch` — é a variação **"Sem módulo / sem busca"** |
|
|
66
|
+
|
|
67
|
+
**Regra de tendência:** existe divisão → `"menu"`. Não existe → `"single"` enxuta. A sidebar
|
|
68
|
+
única **também** aceita módulos (`sidebarModules`), e é justamente o que não oferecer: quando
|
|
69
|
+
existe divisão, o rail da `"menu"` mostra as áreas todas de uma vez, enquanto na única elas
|
|
70
|
+
ficam atrás de um botão acima da busca. Quer conhecer as outras variações? Mande a página do
|
|
71
|
+
componente — ampliar o leque na entrevista é o que produz escolha errada.
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
<AppShell
|
|
75
|
+
sidebar="single"
|
|
76
|
+
categories={CATEGORIES}
|
|
77
|
+
sidebarTitle="Meu Sistema" {/* ← o nome do projeto, à direita da logo */}
|
|
78
|
+
activeItemId={ativo}
|
|
79
|
+
onSidebarItemClick={setAtivo}
|
|
80
|
+
breadcrumb={[{ label: "Meu Sistema" }]}
|
|
81
|
+
>…</AppShell>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Logo e nome — aplique, não pergunte
|
|
85
|
+
|
|
86
|
+
- **A logo é a da iGreen, sempre.** **Não passe `sidebarLogo`** — o default já é a marca
|
|
87
|
+
(lib 0.46.0+; antes a prop era obrigatória, e trocar pra sidebar única fazia a logo da
|
|
88
|
+
iGreen desaparecer, porque a API pedia outra). Só troque se o usuário pedir marca própria
|
|
89
|
+
**explicitamente**, e aí ele fornece o arquivo. **Nunca pergunte "qual logo?"**.
|
|
90
|
+
- **O nome do projeto vai à direita dela** — é a resposta da pergunta 1.
|
|
91
|
+
- Numa lib anterior a essa a prop é obrigatória: passe
|
|
92
|
+
`sidebarLogo={<SidebarBrandMark />}` (de `@/components/ui/MenuSidebar/sidebar-brand`) em
|
|
93
|
+
vez de inventar uma.
|
|
94
|
+
|
|
95
|
+
**O AppShell monta as DUAS** (lib ≥ 0.41.0). O tipo é união discriminada: o TS cobra o
|
|
96
|
+
conjunto certo pra cada escolha. O toggle do Header funciona nos dois sem cabeamento — e na
|
|
97
|
+
variante `single` ele **sai** do Header no desktop, porque a sidebar tem o próprio botão (no
|
|
98
|
+
mobile volta, senão não haveria como abrir).
|
|
99
|
+
|
|
100
|
+
⚠️ **Não ligue `sidebarShowSearch`** se o Header já tem `commandGroups` — seriam duas buscas
|
|
101
|
+
na mesma tela. O shell entrega a busca da sidebar **desligada** por default.
|
|
102
|
+
|
|
103
|
+
> ⚠️ **Até o CLI 0.25.0 esta seção dizia o contrário** — que o AppShell só montava com
|
|
104
|
+
> `menu-sidebar`, porque o `single-menu-sidebar` "não tem colapso nem drawer mobile". **Era
|
|
105
|
+
> falso**: ele tem colapso controlado (`expanded`) e tem mobile. Se você montou layout na mão
|
|
106
|
+
> por causa dessa instrução, agora dá pra usar o AppShell.
|
|
107
|
+
|
|
108
|
+
**Item de menu com destino → declare `href`** (as duas sidebars emitem `<a>`: ctrl+clique e
|
|
109
|
+
nova aba funcionam). Com router próprio, passe
|
|
110
|
+
`renderLink={({ href, ...rest }) => <Link to={href} {...rest} />}`.
|
|
111
|
+
|
|
112
|
+
**AppShell dentro de container com altura** (layout com footer seu, aba, preview) →
|
|
113
|
+
`fillHeight`. Sem isso ele mede 100vh, transborda e o conteúdo fica cortado na base.
|
|
114
|
+
|
|
115
|
+
## Fluxo
|
|
116
|
+
|
|
117
|
+
1. `npm run igreen:add -- example-app-shell` (traz o esqueleto + AppShell, MenuSidebar, Header, PageHeader).
|
|
118
|
+
2. **Leia** `src/examples/app-shell/` — 3 arquivos:
|
|
119
|
+
- `nav-data.ts` — contextos (módulos do rail) + itens/subitens + helpers.
|
|
120
|
+
- `routes.tsx` — **mapa de rotas declarativo** (href → tela) + resolveRoute.
|
|
121
|
+
- `app-shell-example.tsx` — o cabeamento do AppShell (não costuma mexer).
|
|
122
|
+
+ `src/components/ui/AppShell/USAGE.md`.
|
|
123
|
+
3. Adapte: **`nav-data.ts`** (os módulos/telas do app do usuário) e **`routes.tsx`**
|
|
124
|
+
(uma linha por tela; troque `<StubPage/>` pela tela real conforme for criando).
|
|
125
|
+
4. Ligue ao seu app (renderize `<AppShellExample/>` na raiz, ou copie o cabeamento).
|
|
126
|
+
`npx tsc --noEmit` limpo.
|
|
127
|
+
|
|
128
|
+
> **Modo submódulo (ds-link).** Se existe `.claude/ds-config.json` com `"mode": "submodule"`,
|
|
129
|
+
> componentes/exemplos JÁ estão em `<dsPath>/src` — **não** rode `igreen:add`. Use `importBase`
|
|
130
|
+
> do config e leia o exemplo em `<dsPath>/src/examples/app-shell/`.
|
|
131
|
+
|
|
132
|
+
## Gotchas do tipo
|
|
133
|
+
|
|
134
|
+
- **Rota é um MAPA declarativo, não `if/else`**: registrar tela = 1 linha em
|
|
135
|
+
`ROUTES` (`"#/path": () => <Screen/>`). Nunca reintroduza a cadeia de `if`.
|
|
136
|
+
- **AppShell é controlled pra navegação real**: ligue `activeContextId`/`onContextChange`
|
|
137
|
+
+ `activeItemHref`/`onItemClick` ao seu router; `href` = path. Os `default*` são só
|
|
138
|
+
pro modo uncontrolled/preview.
|
|
139
|
+
- **breadcrumb + ⌘K + notificações derivam da nav** (não hardcode): veja como o
|
|
140
|
+
exemplo mapeia `NAV_ENTRIES` → commandGroups e a entry ativa → breadcrumb.
|
|
141
|
+
- **Tema**: o exemplo usa state local que alterna `.dark` no `<html>`. Se o app já
|
|
142
|
+
tem provider de tema, ligue nele (`theme` + `onThemeChange`).
|
|
143
|
+
- **Conteúdo NÃO vai aqui**: cada tela é um builder (crud/list/dashboard). O shell
|
|
144
|
+
só navega e resolve a rota.
|
|
145
|
+
- Fullscreen sem outro shell por volta. Body do AppShell já tem padding próprio —
|
|
146
|
+
**responsivo**: 18px (<768) · 24px (768–1535) · 32px (≥1536). Não adicione padding
|
|
147
|
+
por fora nem por dentro do slot.
|
|
148
|
+
- **O menu NASCE COLAPSADO abaixo de 1536px.** Notebook (1366/1440) abre com o rail,
|
|
149
|
+
ganhando ~264px de largura útil. Se o app precisa do menu sempre aberto, passe
|
|
150
|
+
**`defaultMenuCollapsed={false}` explícito** — o default responsivo só vale quando a
|
|
151
|
+
prop é omitida. É aplicado **só no mount**: não reage a resize, de propósito (senão
|
|
152
|
+
brigaria com quem abriu o menu na mão). Abaixo de 768px o menu vira drawer e ignora
|
|
153
|
+
isso.
|
|
154
|
+
|
|
155
|
+
Aplique `DESIGN.md` + `.claude/rules/ds-design.md`. Handoff: `APP_PRONTO: <app>` + rotas.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
> **Nota de portabilidade.** Este roteiro foi extraído do pipeline do iGreen DS
|
|
2
|
+
> para Claude Code. Menções a slash command (`/ds-create-…`), a `.claude/` e a
|
|
3
|
+
> ferramentas daquele ambiente descrevem **como ele é acionado lá** — aqui o
|
|
4
|
+
> equivalente é carregar este roteiro pelo `indice.json`. O conteúdo de decisão
|
|
5
|
+
> (entrevista, blueprint, regras de composição) vale igual.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# auth-builder — Tela de login / autenticação
|
|
9
|
+
|
|
10
|
+
Tela de login split (form + painel de marca) usando o padrão do DS. Não gere de
|
|
11
|
+
memória — puxe e adapte o exemplo.
|
|
12
|
+
|
|
13
|
+
## Fluxo
|
|
14
|
+
|
|
15
|
+
1. `npm run igreen:add -- example-login` (traz a tela + `Button`, `FormField`).
|
|
16
|
+
2. **Leia** `src/examples/login/login-screen.tsx` + `src/components/ui/FormField/USAGE.md`.
|
|
17
|
+
3. Adapte ao caso: marca/copy do painel direito, campos do form (email/senha,
|
|
18
|
+
ou telefone/código, SSO…), e o handler `entrar` (plugue a auth real).
|
|
19
|
+
4. Registre a rota onde o usuário indicar (login é fullscreen, sem AppShell).
|
|
20
|
+
`npx tsc --noEmit` limpo.
|
|
21
|
+
|
|
22
|
+
> **Modo submódulo (ds-link).** Se existe `.claude/ds-config.json` com `"mode": "submodule"`,
|
|
23
|
+
> o DS é consumido como **submódulo** (não copy-in): componentes/exemplos JÁ estão no disco
|
|
24
|
+
> em `<dsPath>/src` e **não** há registry. Use `importBase` do config (ex.: `@ds/components/ui/FormField`)
|
|
25
|
+
> e leia o exemplo direto em `<dsPath>/src/examples/login/login-screen.tsx` — **NÃO** rode `igreen:add`.
|
|
26
|
+
|
|
27
|
+
## Gotchas do tipo
|
|
28
|
+
|
|
29
|
+
- **Login é fullscreen SEM chrome de app** — não embrulhe em `AppShell`/`MenuSidebar`.
|
|
30
|
+
Root = `flex min-h-screen ... items-center justify-center bg-bg-canvas`.
|
|
31
|
+
- **Sempre `<FormField>`** (FormFieldInput/Checkbox) — nunca `<label>` cru (L-023).
|
|
32
|
+
Spacing do form = `gap-form-gap` (L-024). Inputs `min-h-form-xl` (44px, WCAG mobile).
|
|
33
|
+
- **Painel de marca = 100% tokens, sem imagem externa** (evita "imagem quebrada"):
|
|
34
|
+
`bg-bg-brand` + camadas decorativas via `var(--color-fg-on-brand)` + texto
|
|
35
|
+
`text-fg-on-brand`. Some no mobile (`hidden lg:flex`). Se PRECISAR de foto, use
|
|
36
|
+
caminho base-aware (`import.meta.env.BASE_URL`), nunca `/arquivo.png` absoluto.
|
|
37
|
+
- **Botão Entrar** = `<Button color="primary" variant="filled" size="lg" className="w-full">`.
|
|
38
|
+
Toggle de senha = `<button type="button">` no `endAddon` do FormFieldInput.
|
|
39
|
+
- Ring/focus por token (`focus-visible:ring-4 focus-visible:ring-ring-brand`), nunca
|
|
40
|
+
`outline-none` sozinho.
|
|
41
|
+
|
|
42
|
+
Aplique `DESIGN.md` + `.claude/rules/ds-design.md`. Handoff: `LOGIN_PRONTO: <marca>` + rota.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
> **Nota de portabilidade.** Este roteiro foi extraído do pipeline do iGreen DS
|
|
2
|
+
> para Claude Code. Menções a slash command (`/ds-create-…`), a `.claude/` e a
|
|
3
|
+
> ferramentas daquele ambiente descrevem **como ele é acionado lá** — aqui o
|
|
4
|
+
> equivalente é carregar este roteiro pelo `indice.json`. O conteúdo de decisão
|
|
5
|
+
> (entrevista, blueprint, regras de composição) vale igual.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# cards — Composição de cards/painéis
|
|
9
|
+
|
|
10
|
+
**(Guia de composição, não puxa example.)** Cards são blocos; a tela ao redor
|
|
11
|
+
segue `DESIGN.md`. Para uma TELA inteira baseada em cards (dashboard), use a skill `dashboard-builder` (`/ds-create-dashboard`).
|
|
12
|
+
|
|
13
|
+
## Fluxo
|
|
14
|
+
1. `npm run igreen:add -- card` (shadcn Card: `Card`/`CardHeader`/`CardTitle`/`CardContent`/`CardFooter`) — bloco simples.
|
|
15
|
+
2. `npm run igreen:add -- panel` (iGreen `Panel` + `CardHead`) — card com cabeçalho título+subtítulo+ação, usado em dashboards.
|
|
16
|
+
3. **Leia** os respectivos `USAGE.md`. Para ver variações montadas, consulte o **showcase hospedado**: https://igreen-desingsystem-admin.vercel.app
|
|
17
|
+
4. Componha os cards na tela do usuário; `npx tsc --noEmit` limpo.
|
|
18
|
+
|
|
19
|
+
> **Modo submódulo (ds-link).** Se existe `.claude/ds-config.json` com `"mode": "submodule"`,
|
|
20
|
+
> o DS é consumido como **submódulo** (não copy-in): os componentes/exemplos JÁ estão no disco
|
|
21
|
+
> em `<dsPath>/src` e **não** há registry. Use `importBase` do config (ex.: `@ds/components/ui/Panel`)
|
|
22
|
+
> e leia os `USAGE.md`/exemplos direto em `<dsPath>/src` — **NÃO** rode `igreen:add`.
|
|
23
|
+
|
|
24
|
+
## Gotchas do tipo
|
|
25
|
+
- Card: use o componente **`<Card>`** (não replique a superfície na unha — a lista de classes que estava aqui divergia do componente real em 3 itens). Densidade pela prop **`size`**: `sm` 16px · **`md` 20px (default)** · `lg` 24px, e ela vale pro `CardHeader`/`CardContent`/`CardFooter` juntos (declare só no `<Card>`).
|
|
26
|
+
- Header em faixa: **`<CardHeader variant="banded">`** — fundo `bg-bg-subtle` + divisória embaixo, encostado nas bordas. Aceita qualquer estrutura dentro e acompanha o `size`. Use quando a seção precisa de cabeçalho destacado (ficha, detalhe, formulário por etapas).
|
|
27
|
+
- Título de card: **não passe `font-*`** — `text-title-md` já é semibold (600) por preset.
|
|
28
|
+
- Grid de cards: `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-gp-md`.
|
|
29
|
+
- KPI card: label `caption-md`/`uppercase` em `fg-muted` + valor grande **`text-stat-lg`/`text-stat-md` + `tabular-nums`** (nunca `display-*`/`heading-*`) + opcional `Chip` de tendência. (Ver `example-dashboard`.)
|
|
30
|
+
- Card de seção (label/valor): título da seção `title`, linhas rótulo (`fg-muted`) + valor.
|
|
31
|
+
- Dark mode: sombra vira borda hairline (automático via token).
|
|
32
|
+
- **Don't:** não invente padding/gap avulso — no `<Card>` a densidade é a prop `size`, e fora dele use `p-pad-card-*` e `gap-gp-*`; não use hex (cor por token); não empilhe cards "grudados" (`gap-gp-md` entre eles).
|
|
33
|
+
|
|
34
|
+
Aplique `DESIGN.md`. Handoff: `CARDS_PRONTO`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
> **Nota de portabilidade.** Este roteiro foi extraído do pipeline do iGreen DS
|
|
2
|
+
> para Claude Code. Menções a slash command (`/ds-create-…`), a `.claude/` e a
|
|
3
|
+
> ferramentas daquele ambiente descrevem **como ele é acionado lá** — aqui o
|
|
4
|
+
> equivalente é carregar este roteiro pelo `indice.json`. O conteúdo de decisão
|
|
5
|
+
> (entrevista, blueprint, regras de composição) vale igual.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# charts — Gráficos (Chart / Recharts 3)
|
|
9
|
+
|
|
10
|
+
## Fluxo
|
|
11
|
+
1. `npm run igreen:add -- chart` (e `example-dashboard` se quiser gráfico em contexto de painel).
|
|
12
|
+
2. **Leia** `src/components/ui/Chart/USAGE.md` (API: `ChartContainer` + `ChartConfig`) + os gráficos em `src/examples/dashboard/dashboard-screen.tsx`.
|
|
13
|
+
3. Monte o gráfico dentro de `<ChartContainer config={...}>`; cor só por token.
|
|
14
|
+
4. Registre a rota/local onde o usuário indicar. `npx tsc --noEmit` limpo.
|
|
15
|
+
|
|
16
|
+
> **Modo submódulo (ds-link).** Se existe `.claude/ds-config.json` com `"mode": "submodule"`,
|
|
17
|
+
> o DS é consumido como **submódulo** (não copy-in): os componentes/exemplos JÁ estão no disco
|
|
18
|
+
> em `<dsPath>/src` e **não** há registry. Use `importBase` do config (ex.: `@ds/components/ui/Chart`)
|
|
19
|
+
> e leia `<dsPath>/src/components/ui/Chart/USAGE.md` + `<dsPath>/src/examples/dashboard/dashboard-screen.tsx`
|
|
20
|
+
> direto — **NÃO** rode `igreen:add`.
|
|
21
|
+
|
|
22
|
+
## Gotchas do tipo
|
|
23
|
+
- Gráfico SEMPRE em `<ChartContainer config={...}>`; cor só por token (`chart-1..5` / chaves do config). 2 séries = verde (`chart-1`) + âmbar (`chart-4`); pizza = rampa monocromática da marca.
|
|
24
|
+
- Grid: `<CartesianGrid vertical={false} strokeDasharray="4 4" />` (token `chart-grid`, **sem** passar `stroke` — o `ChartContainer` reescreve via token).
|
|
25
|
+
- Card do gráfico: `Panel`/`Card` + título (`title`/`heading`).
|
|
26
|
+
- **Caveats do Recharts 3 (quebram mudo):**
|
|
27
|
+
1. `text-display-sm`/`display-xs` **não existem** → valor de KPI usa **`text-stat-{sm,md,lg,xl}`** (20/24/30/34px, bold, com `tabular-nums`). Nunca `display-*`/`heading-*` pra número de indicador.
|
|
28
|
+
2. Pizza: sem `activeIndex`/`activeShape` → use `shape={(props,index)=><Sector/>}`.
|
|
29
|
+
3. Radial empilhado/gauge parcial → `<PolarAngleAxis type="number" domain={[0,total]} />`.
|
|
30
|
+
4. Eixo Y omite tick de borda (ex.: `0`) → `interval={0}`; `domain` máximo = maior tick (senão linha-guia duplicada no topo).
|
|
31
|
+
|
|
32
|
+
Aplique `DESIGN.md`. Para uma TELA inteira de painel, use a skill `dashboard-builder` (`/ds-create-dashboard`). Handoff: `CHART_PRONTO: <tipo>`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
> **Nota de portabilidade.** Este roteiro foi extraído do pipeline do iGreen DS
|
|
2
|
+
> para Claude Code. Menções a slash command (`/ds-create-…`), a `.claude/` e a
|
|
3
|
+
> ferramentas daquele ambiente descrevem **como ele é acionado lá** — aqui o
|
|
4
|
+
> equivalente é carregar este roteiro pelo `indice.json`. O conteúdo de decisão
|
|
5
|
+
> (entrevista, blueprint, regras de composição) vale igual.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# chat — Inbox / conversas
|
|
9
|
+
|
|
10
|
+
Tela de chat: coluna de conversas + thread de mensagens + composer.
|
|
11
|
+
|
|
12
|
+
## Fluxo
|
|
13
|
+
1. `npm run igreen:add -- example-chat` (traz a tela + componentes).
|
|
14
|
+
2. **Leia** `src/examples/chat/chat-screen.tsx` + os sub-componentes (ConversationColumn, etc) + USAGE dos componentes DS usados.
|
|
15
|
+
3. Adapte canais, conversas e mensagens aos dados do usuário.
|
|
16
|
+
4. Registre a rota. `npx tsc --noEmit` limpo.
|
|
17
|
+
|
|
18
|
+
> **Modo submódulo (ds-link).** Se existe `.claude/ds-config.json` com `"mode": "submodule"`,
|
|
19
|
+
> o DS é consumido como **submódulo** (não copy-in): os componentes/exemplos JÁ estão no disco
|
|
20
|
+
> em `<dsPath>/src` e **não** há registry. Use `importBase` do config (ex.: `@ds/components/ui/avatar-ig`)
|
|
21
|
+
> e leia o exemplo direto em `<dsPath>/src/examples/chat/chat-screen.tsx` —
|
|
22
|
+
> **NÃO** rode `igreen:add`.
|
|
23
|
+
|
|
24
|
+
## Gotchas do tipo
|
|
25
|
+
- Chat ocupa 100% da altura disponível: wrapper `flex flex-col h-full min-h-0` (sem o gap-2xl de página comum — a tela é edge-to-edge).
|
|
26
|
+
- Layout em colunas: lista de conversas (largura fixa) + thread (flex-1) + opcional painel de detalhe.
|
|
27
|
+
- Avatares de pessoa via **`avatar-ig`** (`@/components/ui/avatar-ig`) — cor por `colorHex` quando custom, com contraste WCAG automático. O item `avatar` do registry é o Radix puro e **não** tem `colorHex`.
|
|
28
|
+
- Status de canal/online via dot/`Chip`.
|
|
29
|
+
- Scroll independente por coluna; composer fixo no rodapé da thread.
|
|
30
|
+
|
|
31
|
+
Aplique `DESIGN.md` + regras. Handoff: `CHAT_PRONTO` + rota.
|