@snksergio/design-system 0.62.0 → 0.63.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.
Files changed (135) hide show
  1. package/dist-lib/ai/blocos/chart/budget-breakdown.tsx +174 -0
  2. package/dist-lib/ai/blocos/indice.md +43 -0
  3. package/dist-lib/ai/blocos/paneldetail/detalhe-com-tabela.tsx +450 -0
  4. package/dist-lib/ai/blocos/paneldetail/detalhe-de-tarefa-com-abas.tsx +570 -0
  5. package/dist-lib/ai/blocos/paneldetail/detalhe-do-registro.tsx +555 -0
  6. package/dist-lib/ai/exemplos/app-shell/app-shell-example.tsx +140 -0
  7. package/dist-lib/ai/exemplos/app-shell/index.ts +3 -0
  8. package/dist-lib/ai/exemplos/app-shell/nav-data.ts +97 -0
  9. package/dist-lib/ai/exemplos/app-shell/routes.tsx +75 -0
  10. package/dist-lib/ai/exemplos/chat/chat-screen.tsx +152 -0
  11. package/dist-lib/ai/exemplos/chat/chat-v2-mocks.ts +171 -0
  12. package/dist-lib/ai/exemplos/chat/chat-v2.styles.ts +23 -0
  13. package/dist-lib/ai/exemplos/chat/chat-v2.types.ts +81 -0
  14. package/dist-lib/ai/exemplos/chat/components/ChannelDot/channel-dot.tsx +28 -0
  15. package/dist-lib/ai/exemplos/chat/components/ConversationActionsMenu/conversation-actions-menu.tsx +83 -0
  16. package/dist-lib/ai/exemplos/chat/components/ConversationActionsMenu/index.ts +4 -0
  17. package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.styles.ts +22 -0
  18. package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.tsx +203 -0
  19. package/dist-lib/ai/exemplos/chat/components/ConversationColumn/conversation-column.types.ts +10 -0
  20. package/dist-lib/ai/exemplos/chat/components/ConversationColumn/index.ts +2 -0
  21. package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.styles.ts +55 -0
  22. package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.tsx +52 -0
  23. package/dist-lib/ai/exemplos/chat/components/ConversationListItem/conversation-list-item.types.ts +7 -0
  24. package/dist-lib/ai/exemplos/chat/components/ConversationListItem/index.ts +2 -0
  25. package/dist-lib/ai/exemplos/chat/components/DateSeparator/date-separator.tsx +18 -0
  26. package/dist-lib/ai/exemplos/chat/components/DetailField/detail-field.tsx +23 -0
  27. package/dist-lib/ai/exemplos/chat/components/DetailSection/detail-section.tsx +41 -0
  28. package/dist-lib/ai/exemplos/chat/components/DetailSection/index.ts +1 -0
  29. package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.styles.ts +30 -0
  30. package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.tsx +142 -0
  31. package/dist-lib/ai/exemplos/chat/components/DetailsColumn/details-column.types.ts +16 -0
  32. package/dist-lib/ai/exemplos/chat/components/DetailsColumn/index.ts +5 -0
  33. package/dist-lib/ai/exemplos/chat/components/FilterRow/filter-row.styles.ts +37 -0
  34. package/dist-lib/ai/exemplos/chat/components/FilterRow/filter-row.tsx +45 -0
  35. package/dist-lib/ai/exemplos/chat/components/FilterRow/index.ts +1 -0
  36. package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.styles.ts +27 -0
  37. package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.tsx +66 -0
  38. package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-column.types.ts +13 -0
  39. package/dist-lib/ai/exemplos/chat/components/FiltersColumn/filters-rail.tsx +38 -0
  40. package/dist-lib/ai/exemplos/chat/components/FiltersColumn/index.ts +6 -0
  41. package/dist-lib/ai/exemplos/chat/components/MessageBubble/index.ts +2 -0
  42. package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.styles.ts +37 -0
  43. package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.tsx +29 -0
  44. package/dist-lib/ai/exemplos/chat/components/MessageBubble/message-bubble.types.ts +5 -0
  45. package/dist-lib/ai/exemplos/chat/components/PersonAvatar/index.ts +5 -0
  46. package/dist-lib/ai/exemplos/chat/components/PersonAvatar/person-avatar.tsx +31 -0
  47. package/dist-lib/ai/exemplos/chat/components/QueueColumn/index.ts +2 -0
  48. package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.styles.ts +19 -0
  49. package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.tsx +140 -0
  50. package/dist-lib/ai/exemplos/chat/components/QueueColumn/queue-column.types.ts +13 -0
  51. package/dist-lib/ai/exemplos/chat/components/RailItem/index.ts +1 -0
  52. package/dist-lib/ai/exemplos/chat/components/RailItem/rail-item.styles.ts +30 -0
  53. package/dist-lib/ai/exemplos/chat/components/RailItem/rail-item.tsx +42 -0
  54. package/dist-lib/ai/exemplos/chat/hooks/use-resizable.ts +98 -0
  55. package/dist-lib/ai/exemplos/chat/index.ts +1 -0
  56. package/dist-lib/ai/exemplos/clientes/_table-data.ts +59 -0
  57. package/dist-lib/ai/exemplos/clientes/clientes-screen.tsx +505 -0
  58. package/dist-lib/ai/exemplos/clientes/clientes-showcase-mocks.ts +117 -0
  59. package/dist-lib/ai/exemplos/clientes/clientes-showcase.styles.ts +13 -0
  60. package/dist-lib/ai/exemplos/clientes/clientes-showcase.types.ts +16 -0
  61. package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.styles.ts +28 -0
  62. package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.tsx +303 -0
  63. package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/detail-drawer.types.ts +14 -0
  64. package/dist-lib/ai/exemplos/clientes/components/DetailDrawer/index.ts +2 -0
  65. package/dist-lib/ai/exemplos/clientes/components/NovoClienteDrawer/index.ts +2 -0
  66. package/dist-lib/ai/exemplos/clientes/components/NovoClienteDrawer/novo-cliente-drawer.tsx +207 -0
  67. package/dist-lib/ai/exemplos/clientes/index.ts +1 -0
  68. package/dist-lib/ai/exemplos/edit-page/components/StepNav.tsx +81 -0
  69. package/dist-lib/ai/exemplos/edit-page/components/section-card.tsx +85 -0
  70. package/dist-lib/ai/exemplos/edit-page/edit-page-screen.tsx +234 -0
  71. package/dist-lib/ai/exemplos/edit-page/index.ts +1 -0
  72. package/dist-lib/ai/exemplos/finance/_table-data.ts +57 -0
  73. package/dist-lib/ai/exemplos/finance/clientes-financeiro-mocks.ts +227 -0
  74. package/dist-lib/ai/exemplos/finance/clientes-financeiro.types.ts +75 -0
  75. package/dist-lib/ai/exemplos/finance/clientes-showcase-mocks.ts +117 -0
  76. package/dist-lib/ai/exemplos/finance/clientes-showcase.styles.ts +13 -0
  77. package/dist-lib/ai/exemplos/finance/clientes-showcase.types.ts +16 -0
  78. package/dist-lib/ai/exemplos/finance/components/EditarFinanceDrawer/editar-finance-drawer.tsx +241 -0
  79. package/dist-lib/ai/exemplos/finance/components/EditarFinanceDrawer/index.ts +5 -0
  80. package/dist-lib/ai/exemplos/finance/components/ExtratoExpansion/extrato-expansion.tsx +172 -0
  81. package/dist-lib/ai/exemplos/finance/components/ExtratoExpansion/index.ts +1 -0
  82. package/dist-lib/ai/exemplos/finance/components/FinanceDetailPanel/finance-detail-panel.tsx +241 -0
  83. package/dist-lib/ai/exemplos/finance/components/FinanceDetailPanel/index.ts +2 -0
  84. package/dist-lib/ai/exemplos/finance/components/NovoClienteDrawer/index.ts +2 -0
  85. package/dist-lib/ai/exemplos/finance/components/NovoClienteDrawer/novo-cliente-drawer.tsx +207 -0
  86. package/dist-lib/ai/exemplos/finance/components/SacarDialog/index.ts +2 -0
  87. package/dist-lib/ai/exemplos/finance/components/SacarDialog/sacar-dialog.tsx +346 -0
  88. package/dist-lib/ai/exemplos/finance/finance-screen.tsx +821 -0
  89. package/dist-lib/ai/exemplos/finance/index.ts +1 -0
  90. package/dist-lib/ai/exemplos/gantt/_gantt-data.tsx +402 -0
  91. package/dist-lib/ai/exemplos/gantt/gantt-screen.tsx +512 -0
  92. package/dist-lib/ai/exemplos/gantt/index.ts +1 -0
  93. package/dist-lib/ai/exemplos/login/index.ts +1 -0
  94. package/dist-lib/ai/exemplos/login/login-screen.tsx +246 -0
  95. package/dist-lib/ai/exemplos/mapa-rede/components/ConsultorDetailPanel/consultor-detail-panel.tsx +158 -0
  96. package/dist-lib/ai/exemplos/mapa-rede/components/ConsultorDetailPanel/index.ts +2 -0
  97. package/dist-lib/ai/exemplos/mapa-rede/index.ts +1 -0
  98. package/dist-lib/ai/exemplos/mapa-rede/mapa-de-rede-mocks.ts +655 -0
  99. package/dist-lib/ai/exemplos/mapa-rede/mapa-de-rede.types.ts +53 -0
  100. package/dist-lib/ai/exemplos/mapa-rede/mapa-rede-screen.tsx +227 -0
  101. package/dist-lib/ai/exemplos/order-detail/components/ActivityTab.tsx +77 -0
  102. package/dist-lib/ai/exemplos/order-detail/components/AttachmentsTab.tsx +45 -0
  103. package/dist-lib/ai/exemplos/order-detail/components/CommentsTab.tsx +111 -0
  104. package/dist-lib/ai/exemplos/order-detail/components/DetailsTab.tsx +189 -0
  105. package/dist-lib/ai/exemplos/order-detail/components/OverviewTab.tsx +200 -0
  106. package/dist-lib/ai/exemplos/order-detail/components/section-card.tsx +85 -0
  107. package/dist-lib/ai/exemplos/order-detail/index.ts +1 -0
  108. package/dist-lib/ai/exemplos/order-detail/order-detail-screen.tsx +119 -0
  109. package/dist-lib/ai/exemplos/order-detail/order-mocks.ts +186 -0
  110. package/dist-lib/ai/exemplos/order-detail/order.types.ts +118 -0
  111. package/dist-lib/ai/indice.json +30 -15
  112. package/dist-lib/ai/manifest.json +31 -5
  113. package/dist-lib/ai/roteiros/app-builder/roteiro.md +155 -0
  114. package/dist-lib/ai/roteiros/auth-builder/roteiro.md +42 -0
  115. package/dist-lib/ai/roteiros/cards/roteiro.md +34 -0
  116. package/dist-lib/ai/roteiros/charts/roteiro.md +32 -0
  117. package/dist-lib/ai/roteiros/chat/roteiro.md +31 -0
  118. package/dist-lib/ai/roteiros/crud-builder/blueprint.md +63 -0
  119. package/dist-lib/ai/roteiros/crud-builder/entrevista.md +139 -0
  120. package/dist-lib/ai/roteiros/crud-builder/geracao.md +113 -0
  121. package/dist-lib/ai/roteiros/crud-builder/roteiro.md +89 -0
  122. package/dist-lib/ai/roteiros/drawers/roteiro.md +41 -0
  123. package/dist-lib/ai/roteiros/list-builder/blueprint.md +94 -0
  124. package/dist-lib/ai/roteiros/list-builder/entrevista.md +188 -0
  125. package/dist-lib/ai/roteiros/list-builder/geracao.md +63 -0
  126. package/dist-lib/ai/roteiros/list-builder/roteiro.md +91 -0
  127. package/dist-lib/ai/roteiros/module-replicator/roteiro.md +56 -0
  128. package/dist-lib/ai/roteiros/page-detail/roteiro.md +32 -0
  129. package/dist-lib/ai/roteiros/page-edit/roteiro.md +31 -0
  130. package/dist-lib/ai/roteiros/screen-composer/roteiro.md +95 -0
  131. package/package.json +1 -1
  132. /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/blueprint.md +0 -0
  133. /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/entrevista.md +0 -0
  134. /package/dist-lib/ai/roteiros/{dashboard → dashboard-builder}/geracao.md +0 -0
  135. /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
+ }
@@ -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.62.0",
4
- "commit": "7cd6db7",
3
+ "versao": "0.63.0",
4
+ "commit": "d9db4cd",
5
5
  "gerado": "2026-09-15",
6
6
  "conteudo": {
7
7
  "roteiros": [
8
- "dashboard"
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
- "arquivosDeExemplo": 3,
14
- "residuoClaudeCode": 8
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.