@rendra-ui/web 2.1.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 (150) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +433 -0
  3. package/bin/rendra.mjs +114 -0
  4. package/dist/base.css +246 -0
  5. package/dist/button-DIcpJwK9.js +143 -0
  6. package/dist/button-DIcpJwK9.js.map +1 -0
  7. package/dist/chart.js +520 -0
  8. package/dist/chart.js.map +1 -0
  9. package/dist/cli/auditar.js +125 -0
  10. package/dist/cli/auditar.js.map +1 -0
  11. package/dist/cli/codigos.js +15 -0
  12. package/dist/cli/codigos.js.map +1 -0
  13. package/dist/cli/help.js +17 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli/trocar.js +242 -0
  16. package/dist/cli/trocar.js.map +1 -0
  17. package/dist/cli/typescript-loader.js +27 -0
  18. package/dist/cli/typescript-loader.js.map +1 -0
  19. package/dist/cn-DVPheE99.js +22 -0
  20. package/dist/cn-DVPheE99.js.map +1 -0
  21. package/dist/components-Cm2ezlPT.js +800 -0
  22. package/dist/components-Cm2ezlPT.js.map +1 -0
  23. package/dist/components.css +3365 -0
  24. package/dist/document-viewer.js +204 -0
  25. package/dist/document-viewer.js.map +1 -0
  26. package/dist/empty-state-DtyZAfYb.js +168 -0
  27. package/dist/empty-state-DtyZAfYb.js.map +1 -0
  28. package/dist/index.js +10530 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/rendra-provider-cCnquOZy.js +88 -0
  31. package/dist/rendra-provider-cCnquOZy.js.map +1 -0
  32. package/dist/rich-text-editor.js +439 -0
  33. package/dist/rich-text-editor.js.map +1 -0
  34. package/dist/router-bridge.js +51 -0
  35. package/dist/router-bridge.js.map +1 -0
  36. package/dist/tokens.css +732 -0
  37. package/dist/tooltip-DyeuGPCc.js +105 -0
  38. package/dist/tooltip-DyeuGPCc.js.map +1 -0
  39. package/dist/types/brand/apply-theme.d.ts +9 -0
  40. package/dist/types/brand/brand-context.d.ts +21 -0
  41. package/dist/types/brand/brand-provider.d.ts +49 -0
  42. package/dist/types/brand/palette.d.ts +63 -0
  43. package/dist/types/brand/public.d.ts +6 -0
  44. package/dist/types/brand/theme.d.ts +80 -0
  45. package/dist/types/brand/types.d.ts +54 -0
  46. package/dist/types/brand/use-brand.d.ts +1 -0
  47. package/dist/types/catalog/components.d.ts +81 -0
  48. package/dist/types/chart.d.ts +1 -0
  49. package/dist/types/components/app-shell/app-shell.d.ts +36 -0
  50. package/dist/types/components/app-shell/command-search.d.ts +1 -0
  51. package/dist/types/components/app-shell/header.d.ts +1 -0
  52. package/dist/types/components/app-shell/layout.d.ts +53 -0
  53. package/dist/types/components/app-shell/mega-menu.d.ts +1 -0
  54. package/dist/types/components/app-shell/navigation-utils.d.ts +18 -0
  55. package/dist/types/components/app-shell/notifications.d.ts +6 -0
  56. package/dist/types/components/app-shell/shell-context.d.ts +48 -0
  57. package/dist/types/components/app-shell/sidebar.d.ts +1 -0
  58. package/dist/types/components/app-shell/types.d.ts +53 -0
  59. package/dist/types/components/layout/index.d.ts +4 -0
  60. package/dist/types/components/layout/page-header.d.ts +38 -0
  61. package/dist/types/components/layout/primitives.d.ts +71 -0
  62. package/dist/types/components/layout/tokens.d.ts +43 -0
  63. package/dist/types/components/rendra-provider.d.ts +48 -0
  64. package/dist/types/components/rendra-router-bridge.d.ts +18 -0
  65. package/dist/types/components/ui/accordion.d.ts +16 -0
  66. package/dist/types/components/ui/action-bar.d.ts +35 -0
  67. package/dist/types/components/ui/alert.d.ts +26 -0
  68. package/dist/types/components/ui/avatar.d.ts +23 -0
  69. package/dist/types/components/ui/badge.d.ts +15 -0
  70. package/dist/types/components/ui/brand-feedback-icon.d.ts +26 -0
  71. package/dist/types/components/ui/brand-logo.d.ts +8 -0
  72. package/dist/types/components/ui/breadcrumb.d.ts +19 -0
  73. package/dist/types/components/ui/button-group.d.ts +27 -0
  74. package/dist/types/components/ui/button.d.ts +30 -0
  75. package/dist/types/components/ui/calendar.d.ts +34 -0
  76. package/dist/types/components/ui/card.d.ts +32 -0
  77. package/dist/types/components/ui/chart.d.ts +57 -0
  78. package/dist/types/components/ui/chat.d.ts +137 -0
  79. package/dist/types/components/ui/checkbox.d.ts +37 -0
  80. package/dist/types/components/ui/checklist.d.ts +16 -0
  81. package/dist/types/components/ui/color-picker.d.ts +13 -0
  82. package/dist/types/components/ui/data-toolbar.d.ts +37 -0
  83. package/dist/types/components/ui/date-picker.d.ts +41 -0
  84. package/dist/types/components/ui/document-viewer.d.ts +19 -0
  85. package/dist/types/components/ui/drawer.d.ts +30 -0
  86. package/dist/types/components/ui/dropdown-menu.d.ts +20 -0
  87. package/dist/types/components/ui/empty-state.d.ts +15 -0
  88. package/dist/types/components/ui/error-page.d.ts +13 -0
  89. package/dist/types/components/ui/field.d.ts +42 -0
  90. package/dist/types/components/ui/form.d.ts +42 -0
  91. package/dist/types/components/ui/image-cropper.d.ts +55 -0
  92. package/dist/types/components/ui/image-viewer.d.ts +14 -0
  93. package/dist/types/components/ui/info-hint.d.ts +9 -0
  94. package/dist/types/components/ui/input.d.ts +91 -0
  95. package/dist/types/components/ui/kanban.d.ts +98 -0
  96. package/dist/types/components/ui/list.d.ts +31 -0
  97. package/dist/types/components/ui/modal.d.ts +27 -0
  98. package/dist/types/components/ui/otp-input.d.ts +17 -0
  99. package/dist/types/components/ui/overlay-shell.d.ts +14 -0
  100. package/dist/types/components/ui/pagination.d.ts +18 -0
  101. package/dist/types/components/ui/picker-panel.d.ts +24 -0
  102. package/dist/types/components/ui/popover.d.ts +12 -0
  103. package/dist/types/components/ui/progress.d.ts +16 -0
  104. package/dist/types/components/ui/qr-code.d.ts +13 -0
  105. package/dist/types/components/ui/radio-group.d.ts +27 -0
  106. package/dist/types/components/ui/rating.d.ts +19 -0
  107. package/dist/types/components/ui/rendra-credit.d.ts +12 -0
  108. package/dist/types/components/ui/repeatable-field.d.ts +22 -0
  109. package/dist/types/components/ui/rich-text-editor.d.ts +21 -0
  110. package/dist/types/components/ui/select.d.ts +65 -0
  111. package/dist/types/components/ui/separator.d.ts +7 -0
  112. package/dist/types/components/ui/skeleton.d.ts +3 -0
  113. package/dist/types/components/ui/slider.d.ts +18 -0
  114. package/dist/types/components/ui/sortable-handle.d.ts +16 -0
  115. package/dist/types/components/ui/spinner.d.ts +7 -0
  116. package/dist/types/components/ui/stat-card.d.ts +20 -0
  117. package/dist/types/components/ui/switch.d.ts +15 -0
  118. package/dist/types/components/ui/table.d.ts +134 -0
  119. package/dist/types/components/ui/tabs.d.ts +25 -0
  120. package/dist/types/components/ui/textarea.d.ts +10 -0
  121. package/dist/types/components/ui/timeline.d.ts +18 -0
  122. package/dist/types/components/ui/toast.d.ts +18 -0
  123. package/dist/types/components/ui/tooltip.d.ts +17 -0
  124. package/dist/types/components/ui/upload.d.ts +50 -0
  125. package/dist/types/components/ui/widget-grid.d.ts +22 -0
  126. package/dist/types/components/ui/wizard.d.ts +38 -0
  127. package/dist/types/document-viewer.d.ts +1 -0
  128. package/dist/types/hooks/use-breakpoint.d.ts +21 -0
  129. package/dist/types/hooks/use-debounced-value.d.ts +5 -0
  130. package/dist/types/hooks/use-fill-height.d.ts +6 -0
  131. package/dist/types/hooks/use-lookup.d.ts +30 -0
  132. package/dist/types/hooks/use-reduced-motion.d.ts +1 -0
  133. package/dist/types/index.d.ts +76 -0
  134. package/dist/types/lib/cn.d.ts +2 -0
  135. package/dist/types/lib/contrast.d.ts +2 -0
  136. package/dist/types/lib/control.d.ts +20 -0
  137. package/dist/types/lib/lookup.d.ts +22 -0
  138. package/dist/types/lib/masks.d.ts +46 -0
  139. package/dist/types/lib/qr-encode.d.ts +48 -0
  140. package/dist/types/lib/shape.d.ts +8 -0
  141. package/dist/types/lib/sortable.d.ts +72 -0
  142. package/dist/types/lib/validators.d.ts +14 -0
  143. package/dist/types/rendra-router-bridge.d.ts +1 -0
  144. package/dist/types/rich-text-editor.d.ts +1 -0
  145. package/dist/types/widget-grid.d.ts +1 -0
  146. package/dist/use-breakpoint-BmXOZtF9.js +49 -0
  147. package/dist/use-breakpoint-BmXOZtF9.js.map +1 -0
  148. package/dist/widget-grid.js +118 -0
  149. package/dist/widget-grid.js.map +1 -0
  150. package/package.json +182 -0
@@ -0,0 +1,800 @@
1
+ /*! Rendra Design System v2.1.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ //#region src/catalog/components.ts
3
+ /** Formato do código: de 3 a 4 letras maiúsculas, hífen, três dígitos. */
4
+ var COMPONENT_CODE_PATTERN = /^[A-Z]{3,4}-\d{3}$/;
5
+ /**
6
+ * Arquivos de `src/components/ui` que não entram no catálogo: são peças internas, sem uso
7
+ * direto em tela (nunca aparecem sozinhos numa tela, só dentro de outro componente).
8
+ */
9
+ var CATALOG_EXCLUDED_FILES = [
10
+ "components/ui/overlay-shell.tsx",
11
+ "components/ui/picker-panel.tsx",
12
+ "components/ui/sortable-handle.tsx"
13
+ ];
14
+ var CATALOG = [
15
+ {
16
+ code: "ACRN-001",
17
+ name: "Acordeão",
18
+ component: "Accordion",
19
+ file: "components/ui/accordion.tsx",
20
+ variantProps: {},
21
+ whenToUse: "Para agrupar conteúdo que a pessoa abre um de cada vez, como perguntas frequentes."
22
+ },
23
+ {
24
+ code: "ACB-001",
25
+ name: "Barra de ação",
26
+ component: "ActionBar",
27
+ file: "components/ui/action-bar.tsx",
28
+ variantProps: {},
29
+ whenToUse: "Para os botões de salvar, cancelar e ações extras de um formulário, drawer ou modal."
30
+ },
31
+ {
32
+ code: "ALRT-001",
33
+ name: "Alerta",
34
+ component: "Alert",
35
+ file: "components/ui/alert.tsx",
36
+ variantProps: {},
37
+ whenToUse: "Para um aviso de sucesso, erro, atenção ou informação dentro do corpo da tela."
38
+ },
39
+ {
40
+ code: "AVT-001",
41
+ name: "Avatar",
42
+ component: "Avatar",
43
+ file: "components/ui/avatar.tsx",
44
+ variantProps: {},
45
+ whenToUse: "Para a foto ou as iniciais de uma pessoa."
46
+ },
47
+ {
48
+ code: "AVT-002",
49
+ name: "Avatar em grupo",
50
+ component: "AvatarGroup",
51
+ file: "components/ui/avatar.tsx",
52
+ variantProps: {},
53
+ whenToUse: "Para mostrar várias pessoas sobrepostas, com contador do excedente."
54
+ },
55
+ {
56
+ code: "BDG-001",
57
+ name: "Selo",
58
+ component: "Badge",
59
+ file: "components/ui/badge.tsx",
60
+ variantProps: {},
61
+ whenToUse: "Para marcar situação, categoria ou contagem curta ao lado de um texto."
62
+ },
63
+ {
64
+ code: "BFI-001",
65
+ name: "Ícone de feedback da marca",
66
+ component: "BrandFeedbackIcon",
67
+ file: "components/ui/brand-feedback-icon.tsx",
68
+ variantProps: {},
69
+ whenToUse: "Para o símbolo da marca tingido pela cor semântica em toast, alerta e telas de status."
70
+ },
71
+ {
72
+ code: "LOGO-001",
73
+ name: "Logotipo",
74
+ component: "BrandLogo",
75
+ file: "components/ui/brand-logo.tsx",
76
+ variantProps: {},
77
+ whenToUse: "Para o logotipo da marca na sidebar, no header ou no painel do login."
78
+ },
79
+ {
80
+ code: "BRD-001",
81
+ name: "Trilha responsiva",
82
+ component: "Breadcrumb",
83
+ file: "components/ui/breadcrumb.tsx",
84
+ variantProps: { variant: "responsive" },
85
+ whenToUse: "Dentro do corpo da página: trilha no desktop e botão voltar no celular.",
86
+ isDefault: true
87
+ },
88
+ {
89
+ code: "BRD-002",
90
+ name: "Trilha em texto",
91
+ component: "Breadcrumb",
92
+ file: "components/ui/breadcrumb.tsx",
93
+ variantProps: { variant: "trail" },
94
+ whenToUse: "No header do AppShell, abaixo do título, sempre em texto pequeno."
95
+ },
96
+ {
97
+ code: "BTN-001",
98
+ name: "Botão primário",
99
+ component: "Button",
100
+ file: "components/ui/button.tsx",
101
+ variantProps: { variant: "primary" },
102
+ whenToUse: "Para a ação principal da tela, do formulário ou da barra de ações.",
103
+ isDefault: true
104
+ },
105
+ {
106
+ code: "BTN-002",
107
+ name: "Botão secundário",
108
+ component: "Button",
109
+ file: "components/ui/button.tsx",
110
+ variantProps: { variant: "secondary" },
111
+ whenToUse: "Para uma segunda cor de destaque da marca, quando a primária já está em uso na tela."
112
+ },
113
+ {
114
+ code: "BTN-003",
115
+ name: "Botão contornado",
116
+ component: "Button",
117
+ file: "components/ui/button.tsx",
118
+ variantProps: { variant: "outline" },
119
+ whenToUse: "Para a ação de cancelar ou para ações secundárias ao lado de um botão primário."
120
+ },
121
+ {
122
+ code: "BTN-004",
123
+ name: "Botão fantasma",
124
+ component: "Button",
125
+ file: "components/ui/button.tsx",
126
+ variantProps: { variant: "ghost" },
127
+ whenToUse: "Para ações discretas dentro de cards, linhas de tabela e barras de ferramenta."
128
+ },
129
+ {
130
+ code: "BTN-005",
131
+ name: "Botão destrutivo",
132
+ component: "Button",
133
+ file: "components/ui/button.tsx",
134
+ variantProps: { variant: "destructive" },
135
+ whenToUse: "Para uma ação irreversível, como excluir ou encerrar."
136
+ },
137
+ {
138
+ code: "BTN-006",
139
+ name: "Botão link",
140
+ component: "Button",
141
+ file: "components/ui/button.tsx",
142
+ variantProps: { variant: "link" },
143
+ whenToUse: "Para uma ação com aparência de link de texto, dentro de uma frase ou de um rodapé."
144
+ },
145
+ {
146
+ code: "BTNG-001",
147
+ name: "Grupo de botões",
148
+ component: "ButtonGroup",
149
+ file: "components/ui/button-group.tsx",
150
+ variantProps: {},
151
+ whenToUse: "Para botões encostados ou um controle segmentado de escolha única."
152
+ },
153
+ {
154
+ code: "CAL-001",
155
+ name: "Calendário",
156
+ component: "Calendar",
157
+ file: "components/ui/calendar.tsx",
158
+ variantProps: {},
159
+ whenToUse: "Para agenda com visão de mês, semana, dia ou lista de eventos."
160
+ },
161
+ {
162
+ code: "CARD-001",
163
+ name: "Card",
164
+ component: "Card",
165
+ file: "components/ui/card.tsx",
166
+ variantProps: {},
167
+ whenToUse: "Para agrupar conteúdo de página com borda e sem sombra pesada."
168
+ },
169
+ {
170
+ code: "CHT-001",
171
+ name: "Gráfico de linha",
172
+ component: "Chart",
173
+ file: "components/ui/chart.tsx",
174
+ variantProps: { type: "line" },
175
+ whenToUse: "Para mostrar a evolução de um valor ao longo do tempo.",
176
+ isDefault: true
177
+ },
178
+ {
179
+ code: "CHT-002",
180
+ name: "Gráfico de barras",
181
+ component: "Chart",
182
+ file: "components/ui/chart.tsx",
183
+ variantProps: { type: "bar" },
184
+ whenToUse: "Para comparar valores entre categorias."
185
+ },
186
+ {
187
+ code: "CHT-003",
188
+ name: "Gráfico de área",
189
+ component: "Chart",
190
+ file: "components/ui/chart.tsx",
191
+ variantProps: { type: "area" },
192
+ whenToUse: "Para mostrar volume acumulado ao longo do tempo."
193
+ },
194
+ {
195
+ code: "CHT-004",
196
+ name: "Gráfico de pizza",
197
+ component: "Chart",
198
+ file: "components/ui/chart.tsx",
199
+ variantProps: { type: "pie" },
200
+ whenToUse: "Para mostrar a proporção de poucas categorias dentro de um total."
201
+ },
202
+ {
203
+ code: "CHT-005",
204
+ name: "Gráfico combinado",
205
+ component: "Chart",
206
+ file: "components/ui/chart.tsx",
207
+ variantProps: { type: "combo" },
208
+ whenToUse: "Para juntar barras e linha no mesmo gráfico, como receita e meta."
209
+ },
210
+ {
211
+ code: "CHT-006",
212
+ name: "Velocímetro de meta",
213
+ component: "Chart",
214
+ file: "components/ui/chart.tsx",
215
+ variantProps: { type: "gauge" },
216
+ whenToUse: "Para o percentual de uma meta batida, com faixas de cor."
217
+ },
218
+ {
219
+ code: "CHT-007",
220
+ name: "Funil",
221
+ component: "Chart",
222
+ file: "components/ui/chart.tsx",
223
+ variantProps: { type: "funnel" },
224
+ whenToUse: "Para etapas que afunilam, com a conversão entre elas."
225
+ },
226
+ {
227
+ code: "CHAT-001",
228
+ name: "Lista de conversas",
229
+ component: "ConversationList",
230
+ file: "components/ui/chat.tsx",
231
+ variantProps: {},
232
+ whenToUse: "Para a coluna de conversas do atendimento."
233
+ },
234
+ {
235
+ code: "CHAT-002",
236
+ name: "Linha do tempo da conversa",
237
+ component: "ChatThread",
238
+ file: "components/ui/chat.tsx",
239
+ variantProps: {},
240
+ whenToUse: "Para o histórico de mensagens de uma conversa aberta."
241
+ },
242
+ {
243
+ code: "CHAT-003",
244
+ name: "Campo de mensagem",
245
+ component: "ChatComposer",
246
+ file: "components/ui/chat.tsx",
247
+ variantProps: {},
248
+ whenToUse: "Para escrever, anexar e enviar uma mensagem no atendimento."
249
+ },
250
+ {
251
+ code: "CHK-001",
252
+ name: "Caixa de seleção",
253
+ component: "Checkbox",
254
+ file: "components/ui/checkbox.tsx",
255
+ variantProps: {},
256
+ whenToUse: "Para uma escolha independente, ligada ou desligada (inclusive indeterminada)."
257
+ },
258
+ {
259
+ code: "CHK-002",
260
+ name: "Grupo de caixas de seleção",
261
+ component: "CheckboxGroup",
262
+ file: "components/ui/checkbox.tsx",
263
+ variantProps: {},
264
+ whenToUse: "Para uma lista de opções fixas com \"selecionar todos\"."
265
+ },
266
+ {
267
+ code: "CKLT-001",
268
+ name: "Lista de verificação",
269
+ component: "Checklist",
270
+ file: "components/ui/checklist.tsx",
271
+ variantProps: {},
272
+ whenToUse: "Para uma lista de itens que a pessoa cria, renomeia, marca e remove, tudo por teclado."
273
+ },
274
+ {
275
+ code: "COR-001",
276
+ name: "Seletor de cor",
277
+ component: "ColorPicker",
278
+ file: "components/ui/color-picker.tsx",
279
+ variantProps: {},
280
+ whenToUse: "Para escolher uma cor entre amostras da marca ou uma cor livre por hexadecimal."
281
+ },
282
+ {
283
+ code: "DTB-001",
284
+ name: "Barra de ferramentas da listagem",
285
+ component: "DataToolbar",
286
+ file: "components/ui/data-toolbar.tsx",
287
+ variantProps: {},
288
+ whenToUse: "Para busca, filtros, colunas e a ação Novo, sempre dentro do card da tabela."
289
+ },
290
+ {
291
+ code: "DTP-001",
292
+ name: "Seletor de data",
293
+ component: "DatePicker",
294
+ file: "components/ui/date-picker.tsx",
295
+ variantProps: {},
296
+ whenToUse: "Para escolher uma data, um período ou um horário."
297
+ },
298
+ {
299
+ code: "DOC-001",
300
+ name: "Visualizador de documentos",
301
+ component: "DocumentViewer",
302
+ file: "components/ui/document-viewer.tsx",
303
+ variantProps: {},
304
+ whenToUse: "Para abrir um PDF (contrato, nota fiscal, comprovante) sem sair da tela."
305
+ },
306
+ {
307
+ code: "GAV-001",
308
+ name: "Gaveta",
309
+ component: "Drawer",
310
+ file: "components/ui/drawer.tsx",
311
+ variantProps: {},
312
+ whenToUse: "Para formulário ou detalhe de volume médio, até cerca de 12 campos."
313
+ },
314
+ {
315
+ code: "DDM-001",
316
+ name: "Menu suspenso",
317
+ component: "DropdownMenuContent",
318
+ file: "components/ui/dropdown-menu.tsx",
319
+ variantProps: {},
320
+ whenToUse: "Para uma lista de ações ou opções que abre a partir de um botão ou de um item."
321
+ },
322
+ {
323
+ code: "VAZ-001",
324
+ name: "Estado vazio",
325
+ component: "EmptyState",
326
+ file: "components/ui/empty-state.tsx",
327
+ variantProps: {},
328
+ whenToUse: "Para quando uma lista, busca ou seção não tem nenhum dado ainda."
329
+ },
330
+ {
331
+ code: "ERRO-001",
332
+ name: "Tela de erro",
333
+ component: "ErrorPage",
334
+ file: "components/ui/error-page.tsx",
335
+ variantProps: {},
336
+ whenToUse: "Para página não encontrada (404) ou falha do lado do servidor (500)."
337
+ },
338
+ {
339
+ code: "FLD-001",
340
+ name: "Campo com rótulo e ajuda",
341
+ component: "Field",
342
+ file: "components/ui/field.tsx",
343
+ variantProps: {},
344
+ whenToUse: "Para envolver qualquer controle de formulário com rótulo, ajuda e erro."
345
+ },
346
+ {
347
+ code: "FLD-002",
348
+ name: "Rótulo",
349
+ component: "Label",
350
+ file: "components/ui/field.tsx",
351
+ variantProps: {},
352
+ whenToUse: "Para um rótulo avulso, quando o Field completo não se aplica."
353
+ },
354
+ {
355
+ code: "FORM-001",
356
+ name: "Formulário",
357
+ component: "Form",
358
+ file: "components/ui/form.tsx",
359
+ variantProps: {},
360
+ whenToUse: "Para envolver um formulário inteiro, ligado ao React Hook Form."
361
+ },
362
+ {
363
+ code: "FORM-002",
364
+ name: "Seção de formulário",
365
+ component: "FormSection",
366
+ file: "components/ui/form.tsx",
367
+ variantProps: {},
368
+ whenToUse: "Para agrupar campos relacionados dentro de um card com título."
369
+ },
370
+ {
371
+ code: "CROP-001",
372
+ name: "Recorte de imagem",
373
+ component: "ImageCropper",
374
+ file: "components/ui/image-cropper.tsx",
375
+ variantProps: {},
376
+ whenToUse: "Para recortar uma imagem numa proporção fixa antes de enviar (foto de perfil, capa)."
377
+ },
378
+ {
379
+ code: "IMG-001",
380
+ name: "Visualizador de imagens",
381
+ component: "ImageViewer",
382
+ file: "components/ui/image-viewer.tsx",
383
+ variantProps: {},
384
+ whenToUse: "Para abrir uma ou mais imagens em tela cheia, com legenda e navegação."
385
+ },
386
+ {
387
+ code: "INFO-001",
388
+ name: "Dica de informação",
389
+ component: "InfoHint",
390
+ file: "components/ui/info-hint.tsx",
391
+ variantProps: {},
392
+ whenToUse: "Para texto orientativo que não tem um título de tela, card ou seção ao lado."
393
+ },
394
+ {
395
+ code: "CAMP-001",
396
+ name: "Campo de texto",
397
+ component: "Input",
398
+ file: "components/ui/input.tsx",
399
+ variantProps: {},
400
+ whenToUse: "Para texto, número, senha, telefone, moeda ou qualquer valor de uma linha."
401
+ },
402
+ {
403
+ code: "KANB-001",
404
+ name: "Quadro kanban",
405
+ component: "Kanban",
406
+ file: "components/ui/kanban.tsx",
407
+ variantProps: {},
408
+ whenToUse: "Para um funil de etapas com cartões que se movem entre colunas.",
409
+ isDefault: true
410
+ },
411
+ {
412
+ code: "KANB-002",
413
+ name: "Quadro kanban com destinos de arraste",
414
+ component: "Kanban",
415
+ file: "components/ui/kanban.tsx",
416
+ variantProps: { hasDropTargets: true },
417
+ whenToUse: "Quando o card pode ir para uma ação além de outra coluna (ex.: \"Marcar como ganho\"), mostrada numa barra durante o arraste e no menu \"Mover para\"."
418
+ },
419
+ {
420
+ code: "LIST-001",
421
+ name: "Lista",
422
+ component: "List",
423
+ file: "components/ui/list.tsx",
424
+ variantProps: {},
425
+ whenToUse: "Para linhas simples com início, título, descrição e fim, navegáveis ou não.",
426
+ isDefault: true
427
+ },
428
+ {
429
+ code: "LIST-002",
430
+ name: "Lista reordenável",
431
+ component: "List",
432
+ file: "components/ui/list.tsx",
433
+ variantProps: { sortable: true },
434
+ whenToUse: "Quando a pessoa pode mudar a ordem das linhas, por arraste ou pelas setas da alça."
435
+ },
436
+ {
437
+ code: "MOD-001",
438
+ name: "Modal de confirmação",
439
+ component: "Modal",
440
+ file: "components/ui/modal.tsx",
441
+ variantProps: { type: "confirm" },
442
+ whenToUse: "Para confirmar uma ação com uma principal e uma de cancelar; type=\"destructive\" usa o mesmo código, porque só muda a cor.",
443
+ isDefault: true
444
+ },
445
+ {
446
+ code: "MOD-002",
447
+ name: "Modal de formulário",
448
+ component: "Modal",
449
+ file: "components/ui/modal.tsx",
450
+ variantProps: { type: "form" },
451
+ whenToUse: "Para um formulário de até 3 campos simples, sem sair da tela atual."
452
+ },
453
+ {
454
+ code: "MOD-003",
455
+ name: "Modal informativo",
456
+ component: "Modal",
457
+ file: "components/ui/modal.tsx",
458
+ variantProps: { type: "info" },
459
+ whenToUse: "Para só informar algo, sem decisão a tomar: um botão só, de largura total, que fecha o modal."
460
+ },
461
+ {
462
+ code: "OTP-001",
463
+ name: "Código de verificação",
464
+ component: "OtpInput",
465
+ file: "components/ui/otp-input.tsx",
466
+ variantProps: {},
467
+ whenToUse: "Para confirmar um código enviado por SMS ou e-mail (2FA)."
468
+ },
469
+ {
470
+ code: "PAG-001",
471
+ name: "Paginação",
472
+ component: "Pagination",
473
+ file: "components/ui/pagination.tsx",
474
+ variantProps: {},
475
+ whenToUse: "Para navegar entre páginas de uma listagem."
476
+ },
477
+ {
478
+ code: "POP-001",
479
+ name: "Popover",
480
+ component: "PopoverContent",
481
+ file: "components/ui/popover.tsx",
482
+ variantProps: {},
483
+ whenToUse: "Para um painel curto que abre perto de um botão, como um filtro."
484
+ },
485
+ {
486
+ code: "PROG-001",
487
+ name: "Barra de progresso",
488
+ component: "Progress",
489
+ file: "components/ui/progress.tsx",
490
+ variantProps: {},
491
+ whenToUse: "Para o andamento de uma tarefa ou de um envio."
492
+ },
493
+ {
494
+ code: "QRC-001",
495
+ name: "Código QR",
496
+ component: "QrCode",
497
+ file: "components/ui/qr-code.tsx",
498
+ variantProps: {},
499
+ whenToUse: "Para gerar um código QR (link, código de acesso) sem depender de serviço externo."
500
+ },
501
+ {
502
+ code: "RDO-001",
503
+ name: "Opções em lista",
504
+ component: "RadioGroup",
505
+ file: "components/ui/radio-group.tsx",
506
+ variantProps: { variant: "list" },
507
+ whenToUse: "Para poucas opções simples, uma escolha só, em lista com bolinha e texto.",
508
+ isDefault: true
509
+ },
510
+ {
511
+ code: "RDO-002",
512
+ name: "Opções em cartões",
513
+ component: "RadioGroup",
514
+ file: "components/ui/radio-group.tsx",
515
+ variantProps: { variant: "cards" },
516
+ whenToUse: "Para opções com ícone e descrição, quando cada uma merece mais destaque."
517
+ },
518
+ {
519
+ code: "RTG-001",
520
+ name: "Avaliação em estrelas",
521
+ component: "Rating",
522
+ file: "components/ui/rating.tsx",
523
+ variantProps: { variant: "stars" },
524
+ whenToUse: "Para uma nota rápida de satisfação, em estrelas.",
525
+ isDefault: true
526
+ },
527
+ {
528
+ code: "RTG-002",
529
+ name: "Avaliação em escala",
530
+ component: "Rating",
531
+ file: "components/ui/rating.tsx",
532
+ variantProps: { variant: "scale" },
533
+ whenToUse: "Para uma nota de 0 a 10 (NPS e pesquisas parecidas), com rótulo nas pontas."
534
+ },
535
+ {
536
+ code: "CRED-001",
537
+ name: "Crédito Feito com Rendra",
538
+ component: "RendraCredit",
539
+ file: "components/ui/rendra-credit.tsx",
540
+ variantProps: {},
541
+ whenToUse: "No rodapé da tela de login, discreto; pode ser removido (credit={false}) ou levado para outro lugar visível, como uma tela Sobre."
542
+ },
543
+ {
544
+ code: "REP-001",
545
+ name: "Campo repetível",
546
+ component: "RepeatableField",
547
+ file: "components/ui/repeatable-field.tsx",
548
+ variantProps: {},
549
+ whenToUse: "Para uma lista de campos do mesmo tipo (telefones, e-mails, endereços), com um principal."
550
+ },
551
+ {
552
+ code: "RTE-001",
553
+ name: "Editor de texto rico",
554
+ component: "RichTextEditor",
555
+ file: "components/ui/rich-text-editor.tsx",
556
+ variantProps: {},
557
+ whenToUse: "Para conteúdo com formatação, listas e imagens, como a descrição de um artigo."
558
+ },
559
+ {
560
+ code: "SEL-001",
561
+ name: "Select",
562
+ component: "Select",
563
+ file: "components/ui/select.tsx",
564
+ variantProps: {},
565
+ whenToUse: "Para escolher uma ou mais opções de uma lista, com ou sem busca."
566
+ },
567
+ {
568
+ code: "SEP-001",
569
+ name: "Separador",
570
+ component: "Separator",
571
+ file: "components/ui/separator.tsx",
572
+ variantProps: {},
573
+ whenToUse: "Para dividir conteúdo dentro de um card, no lugar de um card dentro de card."
574
+ },
575
+ {
576
+ code: "SKEL-001",
577
+ name: "Esqueleto de carregamento",
578
+ component: "Skeleton",
579
+ file: "components/ui/skeleton.tsx",
580
+ variantProps: {},
581
+ whenToUse: "Para o estado de carregamento, com a mesma estrutura do conteúdo final."
582
+ },
583
+ {
584
+ code: "SLD-001",
585
+ name: "Slider",
586
+ component: "Slider",
587
+ file: "components/ui/slider.tsx",
588
+ variantProps: {},
589
+ whenToUse: "Para escolher um número ou uma faixa dentro de um intervalo, arrastando."
590
+ },
591
+ {
592
+ code: "SPIN-001",
593
+ name: "Indicador de carregamento",
594
+ component: "Spinner",
595
+ file: "components/ui/spinner.tsx",
596
+ variantProps: {},
597
+ whenToUse: "Para um carregamento breve dentro de um botão, campo ou lista, sem barra de progresso."
598
+ },
599
+ {
600
+ code: "STAT-001",
601
+ name: "Card de indicador",
602
+ component: "StatCard",
603
+ file: "components/ui/stat-card.tsx",
604
+ variantProps: {},
605
+ whenToUse: "Para um número de destaque com variação, num painel ou dashboard."
606
+ },
607
+ {
608
+ code: "SWT-001",
609
+ name: "Switch",
610
+ component: "Switch",
611
+ file: "components/ui/switch.tsx",
612
+ variantProps: {},
613
+ whenToUse: "Para ligar ou desligar uma opção com efeito imediato."
614
+ },
615
+ {
616
+ code: "TAB-001",
617
+ name: "Tabela",
618
+ component: "Table",
619
+ file: "components/ui/table.tsx",
620
+ variantProps: {},
621
+ whenToUse: "Para qualquer listagem de registros, com busca, filtros e paginação."
622
+ },
623
+ {
624
+ code: "ABA-001",
625
+ name: "Abas em linha",
626
+ component: "Tabs",
627
+ file: "components/ui/tabs.tsx",
628
+ variantProps: { variant: "line" },
629
+ whenToUse: "Padrão para dividir o conteúdo de uma tela em seções, com sublinhado na aba ativa.",
630
+ isDefault: true
631
+ },
632
+ {
633
+ code: "ABA-002",
634
+ name: "Abas em pílula",
635
+ component: "Tabs",
636
+ file: "components/ui/tabs.tsx",
637
+ variantProps: { variant: "pill" },
638
+ whenToUse: "Quando as abas precisam de mais destaque visual, como pílulas sobre fundo suave."
639
+ },
640
+ {
641
+ code: "TXT-001",
642
+ name: "Área de texto",
643
+ component: "Textarea",
644
+ file: "components/ui/textarea.tsx",
645
+ variantProps: {},
646
+ whenToUse: "Para texto longo, com contador de caracteres opcional."
647
+ },
648
+ {
649
+ code: "TLN-001",
650
+ name: "Linha do tempo",
651
+ component: "Timeline",
652
+ file: "components/ui/timeline.tsx",
653
+ variantProps: {},
654
+ whenToUse: "Para uma sequência de eventos em ordem, cada um com um tom semântico."
655
+ },
656
+ {
657
+ code: "TST-001",
658
+ name: "Toast",
659
+ component: "toast",
660
+ file: "components/ui/toast.tsx",
661
+ variantProps: {},
662
+ whenToUse: "Para uma confirmação rápida depois de uma ação, sem interromper a tela."
663
+ },
664
+ {
665
+ code: "TIP-001",
666
+ name: "Tooltip",
667
+ component: "Tooltip",
668
+ file: "components/ui/tooltip.tsx",
669
+ variantProps: {},
670
+ whenToUse: "Para informação complementar, nunca essencial, que aparece ao passar o mouse."
671
+ },
672
+ {
673
+ code: "UPL-001",
674
+ name: "Upload",
675
+ component: "Upload",
676
+ file: "components/ui/upload.tsx",
677
+ variantProps: { layout: "list" },
678
+ whenToUse: "Para arrastar e soltar ou escolher arquivos, com lista e progresso por arquivo.",
679
+ isDefault: true
680
+ },
681
+ {
682
+ code: "UPL-002",
683
+ name: "Upload em galeria",
684
+ component: "Upload",
685
+ file: "components/ui/upload.tsx",
686
+ variantProps: { layout: "gallery" },
687
+ whenToUse: "Para upload de fotos e vídeos, com miniatura em vez de linha de lista."
688
+ },
689
+ {
690
+ code: "WDG-001",
691
+ name: "Grade de widgets",
692
+ component: "WidgetGrid",
693
+ file: "components/ui/widget-grid.tsx",
694
+ variantProps: {},
695
+ whenToUse: "Para um painel com blocos que a pessoa pode arrastar e redimensionar."
696
+ },
697
+ {
698
+ code: "WIZ-001",
699
+ name: "Wizard",
700
+ component: "Wizard",
701
+ file: "components/ui/wizard.tsx",
702
+ variantProps: {},
703
+ whenToUse: "Para um cadastro longo dividido em etapas, com validação por etapa."
704
+ },
705
+ {
706
+ code: "WIZ-002",
707
+ name: "Indicador de etapas",
708
+ component: "Stepper",
709
+ file: "components/ui/wizard.tsx",
710
+ variantProps: {},
711
+ whenToUse: "Para mostrar o progresso em etapas por conta própria, sem o Wizard inteiro."
712
+ }
713
+ ];
714
+ /** Um código específico do catálogo (ex.: para montar a vitrine ou o registry). */
715
+ function getCatalogEntry(code) {
716
+ return CATALOG.find((entry) => entry.code === code);
717
+ }
718
+ /** Todos os códigos de um componente (ex.: as duas variantes do Tabs), na ordem cadastrada. */
719
+ function catalogByComponent(component) {
720
+ return CATALOG.filter((entry) => entry.component === component);
721
+ }
722
+ /**
723
+ * Resolve o código de catálogo de um componente a partir das props que definem a variante.
724
+ * Sem variante (um código só, ou nenhuma prop bate), devolve o primeiro código cadastrado
725
+ * para o componente. Usado pelos próprios componentes para calcular o `data-rendra`, sem
726
+ * duplicar a tabela de variantes.
727
+ */
728
+ function resolveCatalogCode(component, props = {}) {
729
+ const entries = catalogByComponent(component);
730
+ if (entries.length === 0) throw new Error(`Catálogo: nenhum código cadastrado para o componente "${component}".`);
731
+ return (entries.find((entry) => Object.keys(entry.variantProps).length > 0 && Object.entries(entry.variantProps).every(([key, value]) => props[key] === value)) ?? entries[0]).code;
732
+ }
733
+ /** Código que aparece mais de uma vez na lista. */
734
+ function findDuplicateCodes(entries) {
735
+ const seen = /* @__PURE__ */ new Set();
736
+ const duplicates = /* @__PURE__ */ new Set();
737
+ for (const entry of entries) {
738
+ if (seen.has(entry.code)) duplicates.add(entry.code);
739
+ seen.add(entry.code);
740
+ }
741
+ return [...duplicates];
742
+ }
743
+ /** Código fora do formato ^[A-Z]{3,4}-\d{3}$. */
744
+ function findInvalidFormatCodes(entries) {
745
+ return entries.filter((entry) => !COMPONENT_CODE_PATTERN.test(entry.code)).map((entry) => entry.code);
746
+ }
747
+ /**
748
+ * Código que colidiria com um código de modelo (T1, C4, M5...) de src/config/presets.ts,
749
+ * cujo padrão é /[TCM]\d+/ (uma letra T, C ou M seguida direto de dígitos, sem hífen).
750
+ */
751
+ function findPresetCollisions(entries) {
752
+ return entries.filter((entry) => /[TCM]\d+/.test(entry.code)).map((entry) => entry.code);
753
+ }
754
+ /** Arquivo (caminho relativo a src/) que não tem nenhuma entrada no catálogo. */
755
+ function filesMissingCatalogEntry(files, entries) {
756
+ const covered = new Set(entries.map((entry) => entry.file));
757
+ return files.filter((file) => !covered.has(file));
758
+ }
759
+ /** Componente (nome) com mais de uma variante no catálogo, agrupadas na ordem cadastrada. */
760
+ function groupByComponentWithMultipleVariants(entries) {
761
+ const byComponent = /* @__PURE__ */ new Map();
762
+ for (const entry of entries) {
763
+ const list = byComponent.get(entry.component) ?? [];
764
+ list.push(entry);
765
+ byComponent.set(entry.component, list);
766
+ }
767
+ for (const [component, list] of byComponent) if (list.length <= 1) byComponent.delete(component);
768
+ return byComponent;
769
+ }
770
+ /**
771
+ * Componente com mais de uma variante que não tem nenhuma marcada `isDefault` (fase 3, Lote
772
+ * B: `rendra trocar` precisa saber qual variante um elemento sem a prop representa).
773
+ */
774
+ function findComponentsWithoutDefault(entries) {
775
+ return [...groupByComponentWithMultipleVariants(entries)].filter(([, list]) => !list.some((entry) => entry.isDefault)).map(([component]) => component);
776
+ }
777
+ /** Componente com mais de uma variante marcada `isDefault` ao mesmo tempo (só pode uma). */
778
+ function findComponentsWithMultipleDefaults(entries) {
779
+ return [...groupByComponentWithMultipleVariants(entries)].filter(([, list]) => list.filter((entry) => entry.isDefault).length > 1).map(([component]) => component);
780
+ }
781
+ /**
782
+ * Lança se houver código duplicado, fora do formato, colidindo com um código de modelo, ou
783
+ * componente com mais de uma variante sem exatamente uma marcada `isDefault`.
784
+ */
785
+ function assertCatalogIntegrity() {
786
+ const duplicates = findDuplicateCodes(CATALOG);
787
+ if (duplicates.length > 0) throw new Error(`Catálogo: código duplicado: ${duplicates.join(", ")}.`);
788
+ const invalid = findInvalidFormatCodes(CATALOG);
789
+ if (invalid.length > 0) throw new Error(`Catálogo: código fora do formato ^[A-Z]{3,4}-\\d{3}$: ${invalid.join(", ")}.`);
790
+ const collisions = findPresetCollisions(CATALOG);
791
+ if (collisions.length > 0) throw new Error(`Catálogo: código colide com um código de modelo (T/C/M): ${collisions.join(", ")}.`);
792
+ const semPadrao = findComponentsWithoutDefault(CATALOG);
793
+ if (semPadrao.length > 0) throw new Error(`Catálogo: componente com mais de uma variante sem nenhuma marcada isDefault: ${semPadrao.join(", ")}.`);
794
+ const padraoDuplicado = findComponentsWithMultipleDefaults(CATALOG);
795
+ if (padraoDuplicado.length > 0) throw new Error(`Catálogo: componente com mais de uma variante marcada isDefault: ${padraoDuplicado.join(", ")}.`);
796
+ }
797
+ //#endregion
798
+ export { catalogByComponent as a, findComponentsWithoutDefault as c, findPresetCollisions as d, getCatalogEntry as f, assertCatalogIntegrity as i, findDuplicateCodes as l, CATALOG_EXCLUDED_FILES as n, filesMissingCatalogEntry as o, resolveCatalogCode as p, COMPONENT_CODE_PATTERN as r, findComponentsWithMultipleDefaults as s, CATALOG as t, findInvalidFormatCodes as u };
799
+
800
+ //# sourceMappingURL=components-Cm2ezlPT.js.map