@fracui/styleguide 0.0.0-stage → 0.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 (84) hide show
  1. package/README.md +314 -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 +1 -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.js +577 -0
  83. package/dist/tokens.js.map +1 -0
  84. package/package.json +135 -4
package/README.md CHANGED
@@ -1,3 +1,315 @@
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 o CSS** uma única vez, na raiz do app:
53
+
54
+ ```ts
55
+ import "@fracui/styleguide/styles.css";
56
+ ```
57
+
58
+ Ele declara as variáveis CSS que o preset referencia. O preset sozinho
59
+ gera classes como `bg-primary`, mas elas apontam para `hsl(var(--primary))`
60
+ — sem o CSS, a variável não existe.
61
+
62
+ **3. Importe as fontes** (opcional):
63
+
64
+ ```ts
65
+ import "@fracui/styleguide/fonts.css";
66
+ ```
67
+
68
+ Roboto e Rubik auto-hospedadas, subset latino. É import separado porque
69
+ parte dos apps já serve as fontes pelo shell do single-spa e receberia uma
70
+ segunda cópia.
71
+
72
+ | Passo esquecido | Sintoma |
73
+ | --------------- | ---------------------------------------------------- |
74
+ | Preset | `bg-primary` e afins não existem |
75
+ | `content` | Componentes renderizam sem estilo nenhum |
76
+ | `styles.css` | Componentes renderizam sem cor (variáveis indefinidas) |
77
+ | `fonts.css` | Tipografia cai para a fonte do sistema |
78
+
79
+ ## Uso
80
+
81
+ ```tsx
82
+ import { Button, Input, Label, WaterDropIcon } from "@fracui/styleguide";
83
+
84
+ export function Filtro() {
85
+ return (
86
+ <form className="flex items-end gap-3">
87
+ <div className="space-y-1.5">
88
+ <Label htmlFor="estacao">Estação</Label>
89
+ <Input id="estacao" placeholder="Buscar por nome" />
90
+ </div>
91
+ <Button>
92
+ <WaterDropIcon />
93
+ Filtrar
94
+ </Button>
95
+ </form>
96
+ );
97
+ }
98
+ ```
99
+
100
+ ### Pontos de entrada
101
+
102
+ | Import | Conteúdo |
103
+ | ----------------------------------- | ---------------------------------------- |
104
+ | `@fracui/styleguide` | Componentes, ícones e utilitários |
105
+ | `@fracui/styleguide/icons` | Só os 195 ícones |
106
+ | `@fracui/styleguide/tokens` | Tokens em TypeScript (cores, tipografia, elevação, malha) |
107
+ | `@fracui/styleguide/tailwind-preset` | Preset do Tailwind |
108
+ | `@fracui/styleguide/styles.css` | Variáveis CSS dos temas |
109
+ | `@fracui/styleguide/fonts.css` | Roboto e Rubik auto-hospedadas |
110
+
111
+ ## Tokens
112
+
113
+ Use sempre o token semântico, não a escala primitiva: é ele que troca
114
+ entre os temas. `bg-blue-dark` fica azul-escuro no tema escuro também;
115
+ `bg-primary` se adapta.
116
+
117
+ **Semânticos** — `background`, `foreground`, `card`, `popover`, `primary`,
118
+ `secondary`, `muted`, `accent`, `destructive`, `border`, `input`, `ring`,
119
+ `disabled`. Cada um com o par `-foreground` onde faz sentido.
120
+
121
+ **Marca** — `brand`, `brand-medium`, `brand-light` (azul institucional) e
122
+ `brand-secondary` e variações (verde). Separados de `primary` porque o
123
+ `primary` do contrato shadcn é o azul *interativo* (`#3D76CC`), enquanto o
124
+ institucional é o `#142C50`.
125
+
126
+ **Feedback** — cada estado tem um trio coordenado, como no Figma:
127
+
128
+ ```tsx
129
+ <div className="bg-error-bg text-error-text">
130
+ <WarningIcon className="text-error-icon" />
131
+ Falha ao sincronizar
132
+ </div>
133
+ ```
134
+
135
+ Disponíveis para `error`, `alert`, `warning`, `success` e `info`.
136
+
137
+ **Escalas primitivas** — `blue-1..5`, `blue-{light,medium,dark}`, o mesmo
138
+ para `green`, mais `gray-*`, `subtitle-*` (legendas de mapa) e `alpha-*`
139
+ (pretos transparentes). Não mudam com o tema.
140
+
141
+ **Tipografia** — `text-h1` a `text-h5`, `text-subtitle-1/2`,
142
+ `text-body-1/2`, `text-body-allcaps`, `text-button`, `text-caption`,
143
+ `text-link`. Cada uma já traz tamanho, entrelinha e tracking do Figma.
144
+
145
+ **Elevação** — `shadow-{down,up,left,right}-{1,4,8}` e as variantes azuis
146
+ `shadow-blue-*`. A direção importa: um painel que entra pela direita
147
+ projeta sombra para a esquerda.
148
+
149
+ **Raios** — `rounded-xs` (4px), `sm`/`md`/`lg` derivados de `--radius`,
150
+ `rounded-xl` (12px), `2xl` (16px), `3xl` (30px), `4xl` (40px) e
151
+ `rounded-pill`.
152
+
153
+ ## Tema escuro
154
+
155
+ Aplique a classe `dark` em um ancestral — normalmente `<html>`:
156
+
157
+ ```ts
158
+ document.documentElement.classList.toggle("dark", escuro);
159
+ ```
160
+
161
+ Todos os tokens semânticos trocam sozinhos. Os valores de feedback no tema
162
+ escuro são **derivados**, não especificados pelo design: trocam os papéis
163
+ de texto e fundo mantendo o ícone. Ver `darkBrand` em
164
+ `src/tokens/theme.ts`.
165
+
166
+ ## Ícones
167
+
168
+ 195 ícones exportados do Figma. Herdam a cor do texto e aceitam `size` em
169
+ pixels:
170
+
171
+ ```tsx
172
+ <WaterDropIcon size={20} className="text-info-icon" />
173
+ ```
174
+
175
+ Sem `title`, o ícone é decorativo e fica `aria-hidden` — o correto quando
176
+ há texto ao lado. Com `title`, vira `role="img"` e é anunciado por leitores
177
+ de tela:
178
+
179
+ ```tsx
180
+ <WaterDropIcon title="Precipitação acumulada" />
181
+ ```
182
+
183
+ Para reexportar depois de atualizar os SVGs em `src/icons/svg`:
184
+
185
+ ```bash
186
+ yarn icons:build
187
+ ```
188
+
189
+ ## Desenvolvimento
190
+
191
+ ```bash
192
+ yarn storybook # catálogo em localhost:6006
193
+ yarn dev # playground em localhost:5173
194
+ yarn build # gera dist/
195
+ yarn typecheck
196
+ yarn lint
197
+ ```
198
+
199
+ ## Regressão visual
200
+
201
+ Cada story vira duas imagens de referência — tema claro e escuro — em
202
+ `__snapshots__/`. Elas são versionadas: são a fonte da verdade da
203
+ comparação, e o CI falha se qualquer componente mudar de aparência sem
204
+ que a referência tenha sido atualizada de propósito.
205
+
206
+ ```bash
207
+ yarn test:visual # compara com as referências
208
+ yarn test:visual:update # aceita as mudanças e regrava
209
+ ```
210
+
211
+ Os testes rodam dentro do container oficial do Playwright, a mesma imagem
212
+ usada no CI. **Isso não é conveniência:** a renderização de fonte difere
213
+ entre macOS e Linux, e uma referência gerada direto na máquina falharia no
214
+ CI por antialiasing, não por regressão real. Por isso não existe caminho
215
+ que rode fora do Docker.
216
+
217
+ Quando um teste falha, as imagens de diferença ficam em
218
+ `__snapshots__/<tema>/__diff_output__/` (e viram artefato do workflow no
219
+ CI). Elas não são versionadas.
220
+
221
+ Ao adicionar um componente, basta criar a story: a cobertura visual vem
222
+ junto, sem configuração adicional.
223
+
224
+ A mesma suíte roda o **axe** em cada story, verificando rótulos, papéis e
225
+ nomes acessíveis. As regras de contraste ficam desligadas ali porque têm
226
+ verificação própria (ver abaixo). Quando uma regra precisa ser desligada
227
+ para um caso específico, declare junto da story, com o motivo:
228
+
229
+ ```ts
230
+ export const MinhaStory: Story = {
231
+ parameters: { a11y: { disabledRules: ["aria-hidden-focus"] } },
232
+ // ...
233
+ };
234
+ ```
235
+
236
+ Duas regras para as stories não ficarem instáveis: nada de recurso
237
+ externo (imagem por URL faz o snapshot depender da rede) e nada de valor
238
+ que mude entre execuções (data de hoje, número aleatório).
239
+
240
+ ## Contraste
241
+
242
+ ```bash
243
+ yarn test:contrast
244
+ ```
245
+
246
+ Compara todos os pares de token que os componentes usam com o WCAG 2.1 AA
247
+ — 4.5:1 para texto, 3:1 para limites de componentes de interface.
248
+
249
+ Existe porque contraste é a única propriedade visual que a regressão
250
+ visual **não** pega: um snapshot só acusa mudança, e um par ilegível que
251
+ nasceu ilegível continua passando para sempre.
252
+
253
+ As falhas conhecidas estão em `EXCECOES`, dentro de
254
+ `scripts/check-contrast.mjs`, cada uma com o motivo. O teste falha nos dois
255
+ sentidos: quando aparece uma falha nova, e quando uma exceção deixa de ser
256
+ necessária — assim a lista não vira depósito de dívida esquecida.
257
+
258
+ ## API pública
259
+
260
+ ```bash
261
+ yarn test:exports
262
+ ```
263
+
264
+ Verifica que todo componente em `src/components` chega a `src/index.ts`.
265
+
266
+ Existe porque nada mais pega essa falha: as stories importam de
267
+ `@/components/x`, não do pacote, então um componente pode ficar de fora do
268
+ índice e ainda assim passar por build, tipos, lint, regressão visual e
269
+ axe — funcionando no Storybook e invisível para quem instala a
270
+ biblioteca.
271
+
272
+ ## Integração contínua
273
+
274
+ `bitbucket-pipelines.yml` roda em todo pull request e em push na `master`,
275
+ em dois passos paralelos:
276
+
277
+ - **Verificação** — tipos, lint, build, contraste dos tokens e API pública.
278
+ - **Regressão visual** — Storybook compilado e comparado com as 236
279
+ imagens de referência, na imagem oficial do Playwright.
280
+
281
+ A tag da imagem do Playwright é fixa no YAML, porque o Bitbucket não
282
+ aceita imagem dinâmica. O primeiro comando do passo confere a tag contra a
283
+ versão de `playwright-core` no `yarn.lock`: se divergirem, a falha diz o
284
+ que atualizar, em vez de aparecer como diferença de antialiasing nas
285
+ imagens.
286
+
287
+ ## Migração
288
+
289
+ São dois documentos, para dois problemas diferentes:
290
+
291
+ - [MIGRATION.md](MIGRATION.md) — para um app que **já consome**
292
+ `@fracui/styleguide` e vai atualizar. Trata da mudança incompatível dos
293
+ tokens: o que muda é a aparência, mais um punhado de exports.
294
+ - [MIGRACAO-SIGA-UTIL.md](MIGRACAO-SIGA-UTIL.md) — para trocar o
295
+ `@fractal-mfe/styleguide` (repositório `siga-util-styleguide`) por esta
296
+ biblioteca. Inventário dos 594 arquivos consumidores, mapa dos 49
297
+ componentes antigos, o problema dos ícones e o que o React 19 exige.
298
+ - [PLANO-IMPLEMENTACAO.md](PLANO-IMPLEMENTACAO.md) — a sequência de
299
+ execução dessa troca: 6 fases por classe de símbolo, ordem entre os
300
+ apps e estimativa.
301
+
302
+ ## Limitações conhecidas
303
+
304
+ - **Logos e cursores** não estão na biblioteca: o export dos 16 logos de
305
+ produto e dos 4 cursores esbarrou no rate limit da API do Figma.
306
+ - **`empty` e `scroll-area`** não têm contraparte no Figma; usam a
307
+ tipografia e os tokens do sistema, mas o desenho é do shadcn.
308
+ - **`combo box`** não foi extraído: os nós ficaram além da profundidade
309
+ que a API do Figma aceitou antes do rate limit. É o único componente do
310
+ `siga-util-styleguide` (`input-autocomplete`) sem substituto aqui — ver
311
+ [MIGRACAO-SIGA-UTIL.md](MIGRACAO-SIGA-UTIL.md).
312
+ - **Limites de componentes** não atingem os 3:1 do WCAG 1.4.11 em nenhum
313
+ dos dois temas — a paleta do Figma não tem um tom intermediário que
314
+ alcance. Pendente de decisão do design; ver as exceções em
315
+ `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 };