@fracui/styleguide 0.0.0-stage → 0.1.1

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 (85) hide show
  1. package/README.md +325 -2
  2. package/dist/components/accordion.d.ts +19 -0
  3. package/dist/components/alert-dialog.d.ts +20 -0
  4. package/dist/components/alert.d.ts +8 -0
  5. package/dist/components/avatar.d.ts +36 -0
  6. package/dist/components/badge.d.ts +19 -0
  7. package/dist/components/breadcrumb.d.ts +35 -0
  8. package/dist/components/button-switch.d.ts +16 -0
  9. package/dist/components/button.d.ts +31 -0
  10. package/dist/components/calendar.d.ts +26 -0
  11. package/dist/components/card.d.ts +23 -0
  12. package/dist/components/checkbox.d.ts +16 -0
  13. package/dist/components/context-menu.d.ts +32 -0
  14. package/dist/components/data-table.d.ts +28 -0
  15. package/dist/components/date-picker.d.ts +16 -0
  16. package/dist/components/dialog.d.ts +36 -0
  17. package/dist/components/dropdown-menu.d.ts +39 -0
  18. package/dist/components/empty.d.ts +25 -0
  19. package/dist/components/fab.d.ts +26 -0
  20. package/dist/components/form-field.d.ts +35 -0
  21. package/dist/components/input.d.ts +29 -0
  22. package/dist/components/label.d.ts +5 -0
  23. package/dist/components/marker.d.ts +42 -0
  24. package/dist/components/model-legend.d.ts +48 -0
  25. package/dist/components/monitoring-status.d.ts +24 -0
  26. package/dist/components/navbar.d.ts +27 -0
  27. package/dist/components/pagination.d.ts +39 -0
  28. package/dist/components/password-input.d.ts +24 -0
  29. package/dist/components/player.d.ts +27 -0
  30. package/dist/components/popover.d.ts +21 -0
  31. package/dist/components/progress.d.ts +10 -0
  32. package/dist/components/radio-group.d.ts +24 -0
  33. package/dist/components/scroll-area.d.ts +11 -0
  34. package/dist/components/search-bar.d.ts +26 -0
  35. package/dist/components/select.d.ts +27 -0
  36. package/dist/components/separator.d.ts +12 -0
  37. package/dist/components/sheet.d.ts +42 -0
  38. package/dist/components/sidebar.d.ts +52 -0
  39. package/dist/components/sonner.d.ts +21 -0
  40. package/dist/components/spinner.d.ts +16 -0
  41. package/dist/components/switch.d.ts +12 -0
  42. package/dist/components/table.d.ts +35 -0
  43. package/dist/components/tabs.d.ts +23 -0
  44. package/dist/components/tag.d.ts +51 -0
  45. package/dist/components/textarea.d.ts +11 -0
  46. package/dist/components/tooltip.d.ts +16 -0
  47. package/dist/fonts.css +33 -0
  48. package/dist/hooks/use-mobile.d.ts +2 -0
  49. package/dist/icons/create-icon.d.ts +21 -0
  50. package/dist/icons/icons.d.ts +401 -0
  51. package/dist/icons/index.d.ts +2 -0
  52. package/dist/icons-DIjjoCNK.js +3646 -0
  53. package/dist/icons-DIjjoCNK.js.map +1 -0
  54. package/dist/icons-DOPTdi6L.cjs +2 -0
  55. package/dist/icons-DOPTdi6L.cjs.map +1 -0
  56. package/dist/icons.cjs +2 -0
  57. package/dist/icons.cjs.map +1 -0
  58. package/dist/icons.js +201 -0
  59. package/dist/icons.js.map +1 -0
  60. package/dist/index.cjs +69 -0
  61. package/dist/index.cjs.map +1 -0
  62. package/dist/index.d.ts +48 -0
  63. package/dist/index.js +15823 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/lib/utils.d.ts +6 -0
  66. package/dist/logos/create-logo.d.ts +27 -0
  67. package/dist/styles.css +3 -0
  68. package/dist/system/jsx-runtime-shim.d.ts +39 -0
  69. package/dist/tailwind-preset.cjs +2 -0
  70. package/dist/tailwind-preset.cjs.map +1 -0
  71. package/dist/tailwind-preset.d.ts +3 -0
  72. package/dist/tailwind-preset.js +318 -0
  73. package/dist/tailwind-preset.js.map +1 -0
  74. package/dist/tokens/colors.d.ts +347 -0
  75. package/dist/tokens/elevation.d.ts +87 -0
  76. package/dist/tokens/grid.d.ts +170 -0
  77. package/dist/tokens/index.d.ts +5 -0
  78. package/dist/tokens/theme.d.ts +129 -0
  79. package/dist/tokens/typography.d.ts +213 -0
  80. package/dist/tokens.cjs +2 -0
  81. package/dist/tokens.cjs.map +1 -0
  82. package/dist/tokens.css +150 -0
  83. package/dist/tokens.js +577 -0
  84. package/dist/tokens.js.map +1 -0
  85. package/package.json +136 -4
package/README.md CHANGED
@@ -1,3 +1,326 @@
1
- # Temporary Holding Version
1
+ # @fracui/styleguide
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Biblioteca de componentes da Fractal: componentes React sobre Radix UI,
4
+ tokens de design e um preset do Tailwind, para uso compartilhado entre os
5
+ aplicativos do SIGA (`siga-app`, `dams-app`, `siga-app-resop`) em uma
6
+ arquitetura single-spa.
7
+
8
+ Os tokens e os componentes vêm do arquivo do Figma **Design System —
9
+ 2026**. Onde algo foi derivado em vez de extraído, isso está anotado no
10
+ comentário do próprio componente ou token.
11
+
12
+ ## Instalação
13
+
14
+ ```bash
15
+ yarn add @fracui/styleguide
16
+ ```
17
+
18
+ Este repositório usa **yarn** (yarn.lock é o único lockfile versionado).
19
+ Instalar com outro gerenciador gera uma árvore de dependências diferente
20
+ da que o CI valida.
21
+
22
+ Dependências de par (o app precisa tê-las):
23
+
24
+ | Pacote | Versão |
25
+ | ------------- | --------------------- |
26
+ | `react` | `^18.0.0 \|\| ^19.0.0` |
27
+ | `react-dom` | `^18.0.0 \|\| ^19.0.0` |
28
+ | `tailwindcss` | `^3.4.0` |
29
+
30
+ ## Configuração
31
+
32
+ São três passos, e pular qualquer um deles quebra de um jeito específico
33
+ — a tabela no fim desta seção diz qual.
34
+
35
+ **1. Estenda o preset** no `tailwind.config.ts` do app:
36
+
37
+ ```ts
38
+ import fracuiPreset from "@fracui/styleguide/tailwind-preset";
39
+
40
+ export default {
41
+ presets: [fracuiPreset],
42
+ content: [
43
+ "./index.html",
44
+ "./src/**/*.{ts,tsx}",
45
+ // Sem esta linha, o Tailwind remove as classes usadas DENTRO dos
46
+ // componentes da biblioteca, porque não as vê no seu código.
47
+ "./node_modules/@fracui/styleguide/dist/**/*.js",
48
+ ],
49
+ };
50
+ ```
51
+
52
+ **2. Importe as variáveis de tema** uma única vez, na raiz do app:
53
+
54
+ ```ts
55
+ import "@fracui/styleguide/tokens.css";
56
+ ```
57
+
58
+ Ele declara as variáveis CSS que o preset referencia, e só elas. O preset
59
+ sozinho gera classes como `bg-primary`, mas elas apontam para
60
+ `hsl(var(--primary))` — sem o CSS, a variável não existe.
61
+
62
+ `styles.css` não é o que um app com Tailwind próprio quer. Ele é gerado no
63
+ `yarn build` (a partir de `src/styles/globals.css`, não existe no
64
+ repositório) e traz, além das variáveis, o **preflight** do Tailwind — um
65
+ reset global de `body`, `h1`–`h6`, botões e campos — e as classes dos
66
+ componentes já compiladas, que o Tailwind do app gera de novo pelo
67
+ `content`. Use `styles.css` só em app sem Tailwind.
68
+
69
+ Como os apps single-spa ficam montados na mesma página, basta um
70
+ `tokens.css` carregado: as variáveis são globais em `:root` e `.dark`.
71
+
72
+ **3. Importe as fontes** (opcional):
73
+
74
+ ```ts
75
+ import "@fracui/styleguide/fonts.css";
76
+ ```
77
+
78
+ Roboto e Rubik auto-hospedadas, subset latino. É import separado porque
79
+ parte dos apps já serve as fontes pelo shell do single-spa e receberia uma
80
+ segunda cópia.
81
+
82
+ | Passo esquecido | Sintoma |
83
+ | --------------- | ---------------------------------------------------- |
84
+ | Preset | `bg-primary` e afins não existem |
85
+ | `content` | Componentes renderizam sem estilo nenhum |
86
+ | `tokens.css` | Componentes renderizam sem cor (variáveis indefinidas) |
87
+ | `fonts.css` | Tipografia cai para a fonte do sistema |
88
+
89
+ ## Uso
90
+
91
+ ```tsx
92
+ import { Button, Input, Label, WaterDropIcon } from "@fracui/styleguide";
93
+
94
+ export function Filtro() {
95
+ return (
96
+ <form className="flex items-end gap-3">
97
+ <div className="space-y-1.5">
98
+ <Label htmlFor="estacao">Estação</Label>
99
+ <Input id="estacao" placeholder="Buscar por nome" />
100
+ </div>
101
+ <Button>
102
+ <WaterDropIcon />
103
+ Filtrar
104
+ </Button>
105
+ </form>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ### Pontos de entrada
111
+
112
+ | Import | Conteúdo |
113
+ | ----------------------------------- | ---------------------------------------- |
114
+ | `@fracui/styleguide` | Componentes, ícones e utilitários |
115
+ | `@fracui/styleguide/icons` | Só os 195 ícones |
116
+ | `@fracui/styleguide/tokens` | Tokens em TypeScript (cores, tipografia, elevação, malha) |
117
+ | `@fracui/styleguide/tailwind-preset` | Preset do Tailwind |
118
+ | `@fracui/styleguide/tokens.css` | Só as variáveis CSS dos temas (para app com Tailwind) |
119
+ | `@fracui/styleguide/styles.css` | Variáveis + preflight + classes compiladas (para app sem Tailwind) |
120
+ | `@fracui/styleguide/fonts.css` | Roboto e Rubik auto-hospedadas |
121
+
122
+ ## Tokens
123
+
124
+ Use sempre o token semântico, não a escala primitiva: é ele que troca
125
+ entre os temas. `bg-blue-dark` fica azul-escuro no tema escuro também;
126
+ `bg-primary` se adapta.
127
+
128
+ **Semânticos** — `background`, `foreground`, `card`, `popover`, `primary`,
129
+ `secondary`, `muted`, `accent`, `destructive`, `border`, `input`, `ring`,
130
+ `disabled`. Cada um com o par `-foreground` onde faz sentido.
131
+
132
+ **Marca** — `brand`, `brand-medium`, `brand-light` (azul institucional) e
133
+ `brand-secondary` e variações (verde). Separados de `primary` porque o
134
+ `primary` do contrato shadcn é o azul *interativo* (`#3D76CC`), enquanto o
135
+ institucional é o `#142C50`.
136
+
137
+ **Feedback** — cada estado tem um trio coordenado, como no Figma:
138
+
139
+ ```tsx
140
+ <div className="bg-error-bg text-error-text">
141
+ <WarningIcon className="text-error-icon" />
142
+ Falha ao sincronizar
143
+ </div>
144
+ ```
145
+
146
+ Disponíveis para `error`, `alert`, `warning`, `success` e `info`.
147
+
148
+ **Escalas primitivas** — `blue-1..5`, `blue-{light,medium,dark}`, o mesmo
149
+ para `green`, mais `gray-*`, `subtitle-*` (legendas de mapa) e `alpha-*`
150
+ (pretos transparentes). Não mudam com o tema.
151
+
152
+ **Tipografia** — `text-h1` a `text-h5`, `text-subtitle-1/2`,
153
+ `text-body-1/2`, `text-body-allcaps`, `text-button`, `text-caption`,
154
+ `text-link`. Cada uma já traz tamanho, entrelinha e tracking do Figma.
155
+
156
+ **Elevação** — `shadow-{down,up,left,right}-{1,4,8}` e as variantes azuis
157
+ `shadow-blue-*`. A direção importa: um painel que entra pela direita
158
+ projeta sombra para a esquerda.
159
+
160
+ **Raios** — `rounded-xs` (4px), `sm`/`md`/`lg` derivados de `--radius`,
161
+ `rounded-xl` (12px), `2xl` (16px), `3xl` (30px), `4xl` (40px) e
162
+ `rounded-pill`.
163
+
164
+ ## Tema escuro
165
+
166
+ Aplique a classe `dark` em um ancestral — normalmente `<html>`:
167
+
168
+ ```ts
169
+ document.documentElement.classList.toggle("dark", escuro);
170
+ ```
171
+
172
+ Todos os tokens semânticos trocam sozinhos. Os valores de feedback no tema
173
+ escuro são **derivados**, não especificados pelo design: trocam os papéis
174
+ de texto e fundo mantendo o ícone. Ver `darkBrand` em
175
+ `src/tokens/theme.ts`.
176
+
177
+ ## Ícones
178
+
179
+ 195 ícones exportados do Figma. Herdam a cor do texto e aceitam `size` em
180
+ pixels:
181
+
182
+ ```tsx
183
+ <WaterDropIcon size={20} className="text-info-icon" />
184
+ ```
185
+
186
+ Sem `title`, o ícone é decorativo e fica `aria-hidden` — o correto quando
187
+ há texto ao lado. Com `title`, vira `role="img"` e é anunciado por leitores
188
+ de tela:
189
+
190
+ ```tsx
191
+ <WaterDropIcon title="Precipitação acumulada" />
192
+ ```
193
+
194
+ Para reexportar depois de atualizar os SVGs em `src/icons/svg`:
195
+
196
+ ```bash
197
+ yarn icons:build
198
+ ```
199
+
200
+ ## Desenvolvimento
201
+
202
+ ```bash
203
+ yarn storybook # catálogo em localhost:6006
204
+ yarn dev # playground em localhost:5173
205
+ yarn build # gera dist/
206
+ yarn typecheck
207
+ yarn lint
208
+ ```
209
+
210
+ ## Regressão visual
211
+
212
+ Cada story vira duas imagens de referência — tema claro e escuro — em
213
+ `__snapshots__/`. Elas são versionadas: são a fonte da verdade da
214
+ comparação, e o CI falha se qualquer componente mudar de aparência sem
215
+ que a referência tenha sido atualizada de propósito.
216
+
217
+ ```bash
218
+ yarn test:visual # compara com as referências
219
+ yarn test:visual:update # aceita as mudanças e regrava
220
+ ```
221
+
222
+ Os testes rodam dentro do container oficial do Playwright, a mesma imagem
223
+ usada no CI. **Isso não é conveniência:** a renderização de fonte difere
224
+ entre macOS e Linux, e uma referência gerada direto na máquina falharia no
225
+ CI por antialiasing, não por regressão real. Por isso não existe caminho
226
+ que rode fora do Docker.
227
+
228
+ Quando um teste falha, as imagens de diferença ficam em
229
+ `__snapshots__/<tema>/__diff_output__/` (e viram artefato do workflow no
230
+ CI). Elas não são versionadas.
231
+
232
+ Ao adicionar um componente, basta criar a story: a cobertura visual vem
233
+ junto, sem configuração adicional.
234
+
235
+ A mesma suíte roda o **axe** em cada story, verificando rótulos, papéis e
236
+ nomes acessíveis. As regras de contraste ficam desligadas ali porque têm
237
+ verificação própria (ver abaixo). Quando uma regra precisa ser desligada
238
+ para um caso específico, declare junto da story, com o motivo:
239
+
240
+ ```ts
241
+ export const MinhaStory: Story = {
242
+ parameters: { a11y: { disabledRules: ["aria-hidden-focus"] } },
243
+ // ...
244
+ };
245
+ ```
246
+
247
+ Duas regras para as stories não ficarem instáveis: nada de recurso
248
+ externo (imagem por URL faz o snapshot depender da rede) e nada de valor
249
+ que mude entre execuções (data de hoje, número aleatório).
250
+
251
+ ## Contraste
252
+
253
+ ```bash
254
+ yarn test:contrast
255
+ ```
256
+
257
+ Compara todos os pares de token que os componentes usam com o WCAG 2.1 AA
258
+ — 4.5:1 para texto, 3:1 para limites de componentes de interface.
259
+
260
+ Existe porque contraste é a única propriedade visual que a regressão
261
+ visual **não** pega: um snapshot só acusa mudança, e um par ilegível que
262
+ nasceu ilegível continua passando para sempre.
263
+
264
+ As falhas conhecidas estão em `EXCECOES`, dentro de
265
+ `scripts/check-contrast.mjs`, cada uma com o motivo. O teste falha nos dois
266
+ sentidos: quando aparece uma falha nova, e quando uma exceção deixa de ser
267
+ necessária — assim a lista não vira depósito de dívida esquecida.
268
+
269
+ ## API pública
270
+
271
+ ```bash
272
+ yarn test:exports
273
+ ```
274
+
275
+ Verifica que todo componente em `src/components` chega a `src/index.ts`.
276
+
277
+ Existe porque nada mais pega essa falha: as stories importam de
278
+ `@/components/x`, não do pacote, então um componente pode ficar de fora do
279
+ índice e ainda assim passar por build, tipos, lint, regressão visual e
280
+ axe — funcionando no Storybook e invisível para quem instala a
281
+ biblioteca.
282
+
283
+ ## Integração contínua
284
+
285
+ `bitbucket-pipelines.yml` roda em todo pull request e em push na `master`,
286
+ em dois passos paralelos:
287
+
288
+ - **Verificação** — tipos, lint, build, contraste dos tokens e API pública.
289
+ - **Regressão visual** — Storybook compilado e comparado com as 236
290
+ imagens de referência, na imagem oficial do Playwright.
291
+
292
+ A tag da imagem do Playwright é fixa no YAML, porque o Bitbucket não
293
+ aceita imagem dinâmica. O primeiro comando do passo confere a tag contra a
294
+ versão de `playwright-core` no `yarn.lock`: se divergirem, a falha diz o
295
+ que atualizar, em vez de aparecer como diferença de antialiasing nas
296
+ imagens.
297
+
298
+ ## Migração
299
+
300
+ São dois documentos, para dois problemas diferentes:
301
+
302
+ - [MIGRATION.md](MIGRATION.md) — para um app que **já consome**
303
+ `@fracui/styleguide` e vai atualizar. Trata da mudança incompatível dos
304
+ tokens: o que muda é a aparência, mais um punhado de exports.
305
+ - [MIGRACAO-SIGA-UTIL.md](MIGRACAO-SIGA-UTIL.md) — para trocar o
306
+ `@fractal-mfe/styleguide` (repositório `siga-util-styleguide`) por esta
307
+ biblioteca. Inventário dos 594 arquivos consumidores, mapa dos 49
308
+ componentes antigos, o problema dos ícones e o que o React 19 exige.
309
+ - [PLANO-IMPLEMENTACAO.md](PLANO-IMPLEMENTACAO.md) — a sequência de
310
+ execução dessa troca: 6 fases por classe de símbolo, ordem entre os
311
+ apps e estimativa.
312
+
313
+ ## Limitações conhecidas
314
+
315
+ - **Logos e cursores** não estão na biblioteca: o export dos 16 logos de
316
+ produto e dos 4 cursores esbarrou no rate limit da API do Figma.
317
+ - **`empty` e `scroll-area`** não têm contraparte no Figma; usam a
318
+ tipografia e os tokens do sistema, mas o desenho é do shadcn.
319
+ - **`combo box`** não foi extraído: os nós ficaram além da profundidade
320
+ que a API do Figma aceitou antes do rate limit. É o único componente do
321
+ `siga-util-styleguide` (`input-autocomplete`) sem substituto aqui — ver
322
+ [MIGRACAO-SIGA-UTIL.md](MIGRACAO-SIGA-UTIL.md).
323
+ - **Limites de componentes** não atingem os 3:1 do WCAG 1.4.11 em nenhum
324
+ dos dois temas — a paleta do Figma não tem um tom intermediário que
325
+ alcance. Pendente de decisão do design; ver as exceções em
326
+ `scripts/check-contrast.mjs`.
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
+ /**
4
+ * Acordeão, conforme o conjunto de acordeões do Figma
5
+ * "Design System - 2026" (página "↳ Acordeões").
6
+ *
7
+ * O gatilho tem 56px de altura, 16px de padding, raio de 8px e 16px de
8
+ * gap até a seta. A borda de 2px é transparente em repouso e aparece nos
9
+ * estados — `blue.1` no hover e `blue.2` quando aberto — pelo mesmo
10
+ * motivo dos campos: se ela só existisse no hover, a linha saltaria.
11
+ *
12
+ * O conjunto está nomeado como `Component 1` no Figma, um dos 15 sem nome
13
+ * próprio no arquivo.
14
+ */
15
+ declare const Accordion: React.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & React.RefAttributes<HTMLDivElement>>;
16
+ declare const AccordionItem: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
17
+ declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
18
+ declare const AccordionContent: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
19
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
3
+ declare const AlertDialog: React.FC<AlertDialogPrimitive.AlertDialogProps>;
4
+ declare const AlertDialogTrigger: React.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
+ declare const AlertDialogPortal: React.FC<AlertDialogPrimitive.AlertDialogPortalProps>;
6
+ declare const AlertDialogOverlay: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ declare const AlertDialogContent: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
+ declare const AlertDialogHeader: {
9
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
10
+ displayName: string;
11
+ };
12
+ declare const AlertDialogFooter: {
13
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
14
+ displayName: string;
15
+ };
16
+ declare const AlertDialogTitle: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
17
+ declare const AlertDialogDescription: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
18
+ declare const AlertDialogAction: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
19
+ declare const AlertDialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
20
+ export { AlertDialog, AlertDialogPortal, AlertDialogOverlay, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogDescription, AlertDialogAction, AlertDialogCancel, };
@@ -0,0 +1,8 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import * as React from "react";
3
+ declare const Alert: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
4
+ variant?: "default" | "destructive" | "success" | "warning" | "info" | null | undefined;
5
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
6
+ declare const AlertTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
7
+ declare const AlertDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
8
+ export { Alert, AlertTitle, AlertDescription };
@@ -0,0 +1,36 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import * as React from "react";
3
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
4
+ /**
5
+ * Avatar, conforme os conjuntos `Image avatars`, `Letter avatars` e
6
+ * `Icon avatars` do Figma "Design System - 2026" (página "↳ Avatar").
7
+ *
8
+ * Os três conjuntos compartilham as mesmas três medidas — 24, 40 e 56px —
9
+ * e mudam só o conteúdo, então aqui é um componente com a prop `size` em
10
+ * vez de três componentes.
11
+ *
12
+ * A tipografia das iniciais acompanha o tamanho:
13
+ *
14
+ * | Tamanho | Estilo do Figma |
15
+ * | ------- | ------------------------ |
16
+ * | 24px | `roboto/medium/caption` |
17
+ * | 40px | `roboto/medium/subtitle 1` |
18
+ * | 56px | `roboto/medium/h5` |
19
+ *
20
+ * As cores de fundo vêm da paleta de legendas (`subtitle`/`subtitleLight`
21
+ * em `colors.ts`) — o Figma usa tons diferentes por avatar para
22
+ * diferenciar pessoas, e não uma cor fixa. Passe a cor via `className`.
23
+ *
24
+ * ATENÇÃO: há mais dois conjuntos chamados `Image avatars` no arquivo que
25
+ * não são avatares — são etiquetas de modelo (ECMWF, GFS, CFS). Colisão
26
+ * de nome no Figma; não estão implementados aqui.
27
+ */
28
+ declare const avatarVariants: (props?: ({
29
+ size?: "sm" | "lg" | "md" | null | undefined;
30
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
31
+ declare const Avatar: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarProps & React.RefAttributes<HTMLSpanElement>, "ref"> & VariantProps<(props?: ({
32
+ size?: "sm" | "lg" | "md" | null | undefined;
33
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string> & React.RefAttributes<HTMLSpanElement>>;
34
+ declare const AvatarImage: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & React.RefAttributes<HTMLImageElement>, "ref"> & React.RefAttributes<HTMLImageElement>>;
35
+ declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
36
+ export { Avatar, AvatarImage, AvatarFallback, avatarVariants };
@@ -0,0 +1,19 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import * as React from "react";
3
+ /**
4
+ * Etiqueta, conforme o conjunto `Tags` do Figma "Design System - 2026"
5
+ * (página "↳ Tags").
6
+ *
7
+ * O conjunto do Figma tem 44 variantes em quatro eixos (Category, Degree,
8
+ * State, Type). Aqui está coberto o eixo Category no tipo `Filled` e
9
+ * `Outline`; os eixos Degree e State, mais o botão de remover, entram com
10
+ * o componente `Tag` dedicado na próxima fase — o `Badge` existe para o
11
+ * contrato do shadcn e não comporta todos os eixos.
12
+ */
13
+ declare const badgeVariants: (props?: ({
14
+ variant?: "default" | "outline" | "destructive" | "secondary" | "success" | "warning" | null | undefined;
15
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
16
+ export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
17
+ }
18
+ declare function Badge({ className, variant, ...props }: BadgeProps): React.JSX.Element;
19
+ export { Badge, badgeVariants };
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Trilha de navegação, conforme o conjunto `Breadcrumbs` do Figma
4
+ * "Design System - 2026" (página "↳ Breadcrumbs e Paginação").
5
+ *
6
+ * Tipografia `roboto/regular/body 1` com 4px de gap. Os níveis anteriores
7
+ * usam `gray` e a página atual usa `primary` — é a cor que marca onde
8
+ * você está, já que não há diferença de peso.
9
+ *
10
+ * O separador é o caractere `/`, e não um ícone: é assim no design.
11
+ *
12
+ * ATENÇÃO: o `#999999` dos níveis anteriores atinge 2.85:1 sobre branco,
13
+ * abaixo dos 4.5:1 do WCAG para texto. Como são links, a falha é mais
14
+ * séria do que em texto decorativo. Mantido fiel ao Figma; a correção
15
+ * depende de decisão do design, junto das outras registradas em
16
+ * `scripts/check-contrast.mjs`.
17
+ */
18
+ declare const Breadcrumb: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
19
+ declare const BreadcrumbList: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.OlHTMLAttributes<HTMLOListElement>, HTMLOListElement>, "ref"> & React.RefAttributes<HTMLOListElement>>;
20
+ declare const BreadcrumbItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & React.RefAttributes<HTMLLIElement>>;
21
+ declare const BreadcrumbLink: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref"> & {
22
+ asChild?: boolean;
23
+ } & React.RefAttributes<HTMLAnchorElement>>;
24
+ /** Último item da trilha: é a página atual, então não é link. */
25
+ declare const BreadcrumbPage: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
26
+ declare const BreadcrumbSeparator: {
27
+ ({ children, className, ...props }: React.ComponentProps<"li">): React.JSX.Element;
28
+ displayName: string;
29
+ };
30
+ /** Para trilhas longas, no lugar dos níveis omitidos. */
31
+ declare const BreadcrumbEllipsis: {
32
+ ({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
33
+ displayName: string;
34
+ };
35
+ export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, };
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ import * as TogglePrimitive from "@radix-ui/react-toggle";
3
+ /**
4
+ * Botão alternador, conforme o conjunto `Button Switch` do Figma
5
+ * "Design System - 2026" (página "↳ Botões").
6
+ *
7
+ * 32px com raio de 8px. Desligado é branco com ícone `gray.medium`;
8
+ * ligado inverte para o azul interativo com ícone branco.
9
+ *
10
+ * Diferente do `Switch`, que representa uma preferência ligada ou
11
+ * desligada, este alterna uma ferramenta — a camada do mapa que está
12
+ * ativa, o modo de desenho. Por isso é um botão de ícone com estado, e
13
+ * não um controle deslizante.
14
+ */
15
+ declare const ButtonSwitch: React.ForwardRefExoticComponent<Omit<TogglePrimitive.ToggleProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
16
+ export { ButtonSwitch };
@@ -0,0 +1,31 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import * as React from "react";
3
+ /**
4
+ * Botão, conforme o conjunto `ButtonFlat` do Figma "Design System - 2026"
5
+ * (página "↳ Botões").
6
+ *
7
+ * O design nomeia as variantes por cor — `primary`, `secundary`,
8
+ * `terciário` — mas os nomes do shadcn (`default`, `outline`, `ghost`)
9
+ * foram mantidos porque já são consumidos pelos apps e por outros
10
+ * componentes desta biblioteca. O mapeamento é:
11
+ *
12
+ * | Figma | Aqui |
13
+ * | ----------- | ----------- |
14
+ * | primary | `default` |
15
+ * | secundary | `outline` |
16
+ * | terciário | `ghost` |
17
+ * | Link | `link` |
18
+ *
19
+ * As três cores do azul institucional formam a progressão de estados do
20
+ * botão primário: `blue.light` em repouso, `blue.medium` no hover e
21
+ * `blue.dark` no foco.
22
+ */
23
+ declare const buttonVariants: (props?: ({
24
+ variant?: "default" | "link" | "outline" | "ghost" | "destructive" | "secondary" | null | undefined;
25
+ size?: "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
26
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
27
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
28
+ asChild?: boolean;
29
+ }
30
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
31
+ export { Button, buttonVariants };
@@ -0,0 +1,26 @@
1
+ import { DayPicker } from 'react-day-picker';
2
+ import * as React from "react";
3
+ export type CalendarProps = React.ComponentProps<typeof DayPicker>;
4
+ /**
5
+ * Calendário, conforme o conjunto `Elementos data picker` do Figma
6
+ * "Design System - 2026" (página "↳ Seletor de data").
7
+ *
8
+ * A célula de dia tem 38×30px, padding 8/12, raio de 8px e tipografia
9
+ * `roboto/regular/caption`. Os cinco estados especificados:
10
+ *
11
+ * | Figma | Aqui | Visual |
12
+ * | -------- | ---------------- | ----------------------------- |
13
+ * | Default | dia do mês | transparente, `gray.mediumDark` |
14
+ * | Hover | `:hover` | fundo `blue.1` |
15
+ * | Selected | `day_selected` | fundo `blue.dark`, texto branco |
16
+ * | Ghost | `day_outside` | texto `gray` |
17
+ * | Disabled | `day_disabled` | texto desabilitado |
18
+ *
19
+ * O dia selecionado usa `blue.dark` (#142C50), e não o `primary`
20
+ * interativo — é a única superfície de seleção do design que faz isso.
21
+ */
22
+ declare function Calendar({ className, classNames, showOutsideDays, ...props }: CalendarProps): React.JSX.Element;
23
+ declare namespace Calendar {
24
+ var displayName: string;
25
+ }
26
+ export { Calendar };
@@ -0,0 +1,23 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Cartão, conforme os frames da página "↳ Cards" do Figma
4
+ * "Design System - 2026".
5
+ *
6
+ * ATENÇÃO: essa página não tem componentes — são frames estáticos. A
7
+ * geometria abaixo foi extraída da assinatura que se repete 8 vezes
8
+ * (fundo do card, raio 12px, padding 20px, empilhamento vertical com 20px
9
+ * de gap, sombra `azul/centralizado 2 - light`), o que é consistente o
10
+ * bastante para tratar como especificação. Os estados de interação, esses
11
+ * o design não define — o cartão aqui é estático por isso.
12
+ *
13
+ * O padding de 20px vive no `Card`, e não em cada sub-bloco como no
14
+ * shadcn: no Figma o container é um auto-layout único com gap, então
15
+ * `CardHeader`/`CardContent`/`CardFooter` não repetem padding.
16
+ */
17
+ declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
18
+ declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
19
+ declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
20
+ declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
21
+ declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
22
+ declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
23
+ export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
3
+ /**
4
+ * Caixa de seleção, conforme o conjunto `Basics_checkboxes` do Figma
5
+ * "Design System - 2026" (página "↳ Checkbox - Radio - Switch").
6
+ *
7
+ * O design desenha uma caixa de 18px dentro de uma área de 24px, e usa o
8
+ * espaço restante como halo nos estados hover e focused. Aqui o halo é um
9
+ * `ring` com offset, o que evita um elemento extra só para decoração.
10
+ *
11
+ * As três variações do Figma — `deselected`, `selected` e `indeterminate`
12
+ * — correspondem aos três estados do Radix (`unchecked`, `checked`,
13
+ * `indeterminate`).
14
+ */
15
+ declare const Checkbox: React.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
16
+ export { Checkbox };
@@ -0,0 +1,32 @@
1
+ import * as React from "react";
2
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
3
+ /**
4
+ * Menu de contexto. Compartilha o visual do `DropdownMenu` — no Figma os
5
+ * dois saem dos mesmos conjuntos `Select_dropdown` (painel) e
6
+ * `Dropdown frames` (itens), mudando apenas o gatilho.
7
+ */
8
+ declare const ContextMenu: React.FC<ContextMenuPrimitive.ContextMenuProps>;
9
+ declare const ContextMenuTrigger: React.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuTriggerProps & React.RefAttributes<HTMLSpanElement>>;
10
+ declare const ContextMenuGroup: React.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuGroupProps & React.RefAttributes<HTMLDivElement>>;
11
+ declare const ContextMenuPortal: React.FC<ContextMenuPrimitive.ContextMenuPortalProps>;
12
+ declare const ContextMenuSub: React.FC<ContextMenuPrimitive.ContextMenuSubProps>;
13
+ declare const ContextMenuRadioGroup: React.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
14
+ declare const ContextMenuSubTrigger: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
15
+ inset?: boolean;
16
+ } & React.RefAttributes<HTMLDivElement>>;
17
+ declare const ContextMenuSubContent: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSubContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
+ declare const ContextMenuContent: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
19
+ declare const ContextMenuItem: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
20
+ inset?: boolean;
21
+ } & React.RefAttributes<HTMLDivElement>>;
22
+ declare const ContextMenuCheckboxItem: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
+ declare const ContextMenuRadioItem: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuRadioItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
24
+ declare const ContextMenuLabel: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
25
+ inset?: boolean;
26
+ } & React.RefAttributes<HTMLDivElement>>;
27
+ declare const ContextMenuSeparator: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
28
+ declare const ContextMenuShortcut: {
29
+ ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element;
30
+ displayName: string;
31
+ };
32
+ export { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuCheckboxItem, ContextMenuRadioItem, ContextMenuLabel, ContextMenuSeparator, ContextMenuShortcut, ContextMenuGroup, ContextMenuPortal, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuRadioGroup, };
@@ -0,0 +1,28 @@
1
+ import { Column, ColumnDef } from '@tanstack/react-table';
2
+ import * as React from "react";
3
+ export interface DataTableProps<TData, TValue> {
4
+ columns: ColumnDef<TData, TValue>[];
5
+ data: TData[];
6
+ /** Coluna usada para o campo de busca/filtro exibido acima da tabela. */
7
+ searchKey?: string;
8
+ searchPlaceholder?: string;
9
+ }
10
+ /**
11
+ * DataTable: wrapper genérico sobre @tanstack/react-table com Table,
12
+ * ordenação por coluna, filtro simples e paginação embutida.
13
+ * Não é um primitivo do Radix — é o padrão de "data table" do shadcn/ui.
14
+ */
15
+ declare function DataTable<TData, TValue>({ columns, data, searchKey, searchPlaceholder, }: DataTableProps<TData, TValue>): React.JSX.Element;
16
+ declare namespace DataTable {
17
+ var displayName: string;
18
+ }
19
+ /** Cabeçalho de coluna clicável para ordenar (usar em `ColumnDef.header`). */
20
+ declare function DataTableColumnHeader<TData, TValue>({ column, title, className, }: {
21
+ column: Column<TData, TValue>;
22
+ title: string;
23
+ className?: string;
24
+ }): React.JSX.Element;
25
+ declare namespace DataTableColumnHeader {
26
+ var displayName: string;
27
+ }
28
+ export { DataTable, DataTableColumnHeader };