@iclips/ui 2.0.3 → 3.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 (130) hide show
  1. package/DESIGN.md +246 -0
  2. package/MIGRATION-v3.md +244 -0
  3. package/README.md +4 -0
  4. package/dist/alert-theme.css +20 -79
  5. package/dist/components/ui/charts/donut-chart.cjs +1 -1
  6. package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
  7. package/dist/components/ui/charts/donut-chart.js +39 -60
  8. package/dist/components/ui/charts/donut-chart.js.map +1 -1
  9. package/dist/components/ui/charts/kpi-card.cjs +1 -1
  10. package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
  11. package/dist/components/ui/charts/kpi-card.js +19 -19
  12. package/dist/components/ui/charts/kpi-card.js.map +1 -1
  13. package/dist/components/ui/data/comment-system.cjs +1 -1
  14. package/dist/components/ui/data/comment-system.cjs.map +1 -1
  15. package/dist/components/ui/data/comment-system.js +67 -67
  16. package/dist/components/ui/data/comment-system.js.map +1 -1
  17. package/dist/components/ui/data/data-table.cjs +1 -1
  18. package/dist/components/ui/data/data-table.cjs.map +1 -1
  19. package/dist/components/ui/data/data-table.js +112 -101
  20. package/dist/components/ui/data/data-table.js.map +1 -1
  21. package/dist/components/ui/data/editorial-calendar.cjs +1 -1
  22. package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
  23. package/dist/components/ui/data/editorial-calendar.js +291 -291
  24. package/dist/components/ui/data/editorial-calendar.js.map +1 -1
  25. package/dist/components/ui/data/filter-builder.cjs +1 -1
  26. package/dist/components/ui/data/filter-builder.cjs.map +1 -1
  27. package/dist/components/ui/data/filter-builder.js +1 -1
  28. package/dist/components/ui/data/filter-builder.js.map +1 -1
  29. package/dist/components/ui/feedback/empty-state.cjs +1 -1
  30. package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
  31. package/dist/components/ui/feedback/empty-state.js +14 -14
  32. package/dist/components/ui/feedback/empty-state.js.map +1 -1
  33. package/dist/components/ui/feedback/toast.cjs +1 -1
  34. package/dist/components/ui/feedback/toast.cjs.map +1 -1
  35. package/dist/components/ui/feedback/toast.js +53 -22
  36. package/dist/components/ui/feedback/toast.js.map +1 -1
  37. package/dist/components/ui/forms/calendar.cjs +1 -1
  38. package/dist/components/ui/forms/calendar.cjs.map +1 -1
  39. package/dist/components/ui/forms/calendar.js +16 -16
  40. package/dist/components/ui/forms/calendar.js.map +1 -1
  41. package/dist/components/ui/forms/combobox.cjs +1 -1
  42. package/dist/components/ui/forms/combobox.cjs.map +1 -1
  43. package/dist/components/ui/forms/combobox.js +78 -76
  44. package/dist/components/ui/forms/combobox.js.map +1 -1
  45. package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
  46. package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
  47. package/dist/components/ui/forms/file-attachment-list.js +4 -4
  48. package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
  49. package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
  50. package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
  51. package/dist/components/ui/forms/file-upload-zone.js +55 -49
  52. package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
  53. package/dist/components/ui/forms/form.cjs +1 -1
  54. package/dist/components/ui/forms/form.cjs.map +1 -1
  55. package/dist/components/ui/forms/form.js +11 -11
  56. package/dist/components/ui/forms/form.js.map +1 -1
  57. package/dist/components/ui/forms/input-validation.cjs +1 -1
  58. package/dist/components/ui/forms/input-validation.cjs.map +1 -1
  59. package/dist/components/ui/forms/input-validation.js +20 -20
  60. package/dist/components/ui/forms/input-validation.js.map +1 -1
  61. package/dist/components/ui/forms/multi-select.cjs +1 -1
  62. package/dist/components/ui/forms/multi-select.cjs.map +1 -1
  63. package/dist/components/ui/forms/multi-select.js +69 -67
  64. package/dist/components/ui/forms/multi-select.js.map +1 -1
  65. package/dist/components/ui/forms/radio-group.cjs +1 -1
  66. package/dist/components/ui/forms/radio-group.cjs.map +1 -1
  67. package/dist/components/ui/forms/radio-group.js +19 -19
  68. package/dist/components/ui/forms/radio-group.js.map +1 -1
  69. package/dist/components/ui/forms/social-button.cjs +1 -1
  70. package/dist/components/ui/forms/social-button.cjs.map +1 -1
  71. package/dist/components/ui/forms/social-button.js +6 -6
  72. package/dist/components/ui/forms/social-button.js.map +1 -1
  73. package/dist/components/ui/forms/toggle.cjs +1 -1
  74. package/dist/components/ui/forms/toggle.cjs.map +1 -1
  75. package/dist/components/ui/forms/toggle.js +7 -7
  76. package/dist/components/ui/forms/toggle.js.map +1 -1
  77. package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
  78. package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
  79. package/dist/components/ui/navigation/navigation-menu.js +14 -14
  80. package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
  81. package/dist/components/ui/navigation/sidebar.cjs +1 -1
  82. package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
  83. package/dist/components/ui/navigation/sidebar.js +44 -44
  84. package/dist/components/ui/navigation/sidebar.js.map +1 -1
  85. package/dist/components/ui/overlays/context-menu.cjs +1 -1
  86. package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
  87. package/dist/components/ui/overlays/context-menu.js +1 -1
  88. package/dist/components/ui/overlays/context-menu.js.map +1 -1
  89. package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
  90. package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
  91. package/dist/components/ui/overlays/dropdown-menu.js +5 -5
  92. package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
  93. package/dist/components/ui/overlays/menubar.cjs +1 -1
  94. package/dist/components/ui/overlays/menubar.cjs.map +1 -1
  95. package/dist/components/ui/overlays/menubar.js +29 -29
  96. package/dist/components/ui/overlays/menubar.js.map +1 -1
  97. package/dist/components/ui/overlays/tooltip.cjs +1 -1
  98. package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
  99. package/dist/components/ui/overlays/tooltip.js +12 -12
  100. package/dist/components/ui/overlays/tooltip.js.map +1 -1
  101. package/dist/components/ui/primitives/avatar.cjs +1 -1
  102. package/dist/components/ui/primitives/avatar.cjs.map +1 -1
  103. package/dist/components/ui/primitives/avatar.js +20 -27
  104. package/dist/components/ui/primitives/avatar.js.map +1 -1
  105. package/dist/components/ui/primitives/badge.cjs +1 -1
  106. package/dist/components/ui/primitives/badge.cjs.map +1 -1
  107. package/dist/components/ui/primitives/badge.js +21 -18
  108. package/dist/components/ui/primitives/badge.js.map +1 -1
  109. package/dist/components/ui/primitives/button.cjs +1 -1
  110. package/dist/components/ui/primitives/button.cjs.map +1 -1
  111. package/dist/components/ui/primitives/button.js +11 -8
  112. package/dist/components/ui/primitives/button.js.map +1 -1
  113. package/dist/index.cjs +1 -1
  114. package/dist/index.css +1 -1
  115. package/dist/index.d.cts +6 -6
  116. package/dist/index.d.ts +6 -6
  117. package/dist/index.js +34 -35
  118. package/dist/index.js.map +1 -1
  119. package/dist/preset.css +1 -2
  120. package/dist/toast-theme.css +100 -64
  121. package/dist/tokens.css +59 -159
  122. package/docs/README.md +44 -0
  123. package/docs/acoes.md +103 -0
  124. package/docs/escolha.md +171 -0
  125. package/docs/formularios.md +137 -0
  126. package/docs/mensagens.md +114 -0
  127. package/docs/overlays.md +192 -0
  128. package/docs/status.md +71 -0
  129. package/package.json +7 -3
  130. package/scripts/check-colors.mjs +208 -0
package/DESIGN.md ADDED
@@ -0,0 +1,246 @@
1
+ ---
2
+ version: 3.0.0
3
+ name: iClips Design Language
4
+ description: The visual language of @iclips/ui 3.0.0 — one purple for action, a lot of grey for structure, and colour only where it means something, set in Inter.
5
+ source: "@iclips/ui 3.0.0 — tokens/*.json, src/styles/tokens.css and the components under src/components/ui"
6
+ scope: Colour, type, radius, buttons and surfaces. Spacing lives in tokens/spacing.json; elevation and motion live in the component styles.
7
+
8
+ colors:
9
+ # semantic tokens — light theme value (dark theme value in the comment)
10
+ background: "#FFFFFF" # dark #1A1F26
11
+ foreground: "#1A1F26" # dark #F2F6FA
12
+ card: "#FFFFFF" # dark #2F3640
13
+ muted: "#E9EEF5" # dark #464E59
14
+ muted-foreground: "#464E59" # dark #C5CDD9
15
+ accent: "#E9EEF5" # hover — dark #464E59
16
+ border: "#DAE1EB" # dark #464E59
17
+ input: "#DAE1EB" # dark #464E59
18
+ primary: "#7F26BF" # dark #DAA6FF (purple-100: passa AA sobre card/popover gray-700)
19
+ primary-foreground: "#FFFFFF" # dark #000000
20
+ secondary: "#F6E9FF" # selection — dark #420F66
21
+ secondary-foreground: "#420F66" # dark #DAA6FF
22
+ ring: "#7F26BF" # dark #BB6DF2
23
+ destructive: "#AB4A43"
24
+ success: "#427748"
25
+ warning: "#E4BB78" # dark #CFA066
26
+ info: "#315687"
27
+
28
+ typography:
29
+ body:
30
+ fontFamily: Inter
31
+ fontSize: 14px
32
+ fontWeight: 400
33
+ caption:
34
+ fontFamily: Inter
35
+ fontSize: 12px
36
+ fontWeight: 400
37
+ label:
38
+ fontFamily: Inter
39
+ fontSize: 14px
40
+ fontWeight: 500
41
+ button:
42
+ fontFamily: Inter
43
+ fontSize: 14px
44
+ fontWeight: 600
45
+ title:
46
+ fontFamily: Inter
47
+ fontWeight: 600
48
+ lineHeight: 1.2
49
+
50
+ rounded:
51
+ sm: 6px
52
+ md: 8px
53
+ lg: 10px
54
+ xl: 14px
55
+ full: 9999px
56
+
57
+ components:
58
+ button-default:
59
+ backgroundColor: "{colors.primary}"
60
+ textColor: "{colors.primary-foreground}"
61
+ typography: "{typography.button}"
62
+ rounded: "{rounded.md}"
63
+ button-secondary:
64
+ backgroundColor: "{colors.secondary}"
65
+ textColor: "{colors.secondary-foreground}"
66
+ typography: "{typography.button}"
67
+ rounded: "{rounded.md}"
68
+ button-outline:
69
+ backgroundColor: "{colors.background}"
70
+ textColor: "{colors.foreground}"
71
+ borderColor: "{colors.border}"
72
+ typography: "{typography.button}"
73
+ rounded: "{rounded.md}"
74
+ button-ghost:
75
+ textColor: "{colors.foreground}"
76
+ typography: "{typography.button}"
77
+ rounded: "{rounded.md}"
78
+ button-link:
79
+ textColor: "{colors.primary}"
80
+ typography: "{typography.button}"
81
+ button-destructive:
82
+ backgroundColor: "color-mix({colors.destructive} 10%)"
83
+ textColor: "{colors.destructive-emphasis}"
84
+ typography: "{typography.button}"
85
+ rounded: "{rounded.md}"
86
+ button-success:
87
+ backgroundColor: "color-mix({colors.success} 10%)"
88
+ textColor: "{colors.success-emphasis}"
89
+ typography: "{typography.button}"
90
+ rounded: "{rounded.md}"
91
+ card:
92
+ backgroundColor: "{colors.card}"
93
+ borderColor: "{colors.border}"
94
+ textColor: "{colors.foreground}"
95
+ rounded: "{rounded.xl}"
96
+ ---
97
+
98
+ > **Precedência.** Este documento resume o que a `@iclips/ui` 3.0.0 entrega. A
99
+ > fonte de verdade são `tokens/*.json` (e o `src/styles/tokens.css` gerado) e o
100
+ > código dos componentes; se algo aqui divergir deles, o código vence e este
101
+ > arquivo está desatualizado. Os nomes em `colors.*`, `rounded.*` e
102
+ > `components.*` acima correspondem aos tokens semânticos e às variantes reais —
103
+ > no código, escreva `bg-primary`, `rounded-md`, `<Button variant="outline">`.
104
+ > A página Storybook `Fundamentos/Cores` mostra cada par com o contraste medido.
105
+
106
+ ## Overview
107
+
108
+ **Um roxo, muito cinza, e cor só onde ela significa algo.** Roxo é ação — botão
109
+ primário, link, seleção, foco. Cinza é estrutura — fundo, card, borda, texto, onde
110
+ fica a maior parte da tela. Vermelho, verde, amarelo e azul são estado — feedback,
111
+ nunca decoração. Nenhuma outra cor existe na lib: só tokens semânticos viram
112
+ classe, e o `npm run lint` reprova cor crua.
113
+
114
+ **Key characteristics**
115
+
116
+ - Quatro camadas de cor com permissão fechada: estrutura (cinza), ação (roxo),
117
+ estado (feedback), categoria (só em gráfico)
118
+ - Uma cor de ação; a hierarquia entre ações vem do preenchimento
119
+ - Hover é cinza; lavanda significa selecionado
120
+ - Peso 600 marca ação e título; o corpo fica em 400
121
+ - Raios de 6 a 10px no que se clica e no que flutua; 14px nos contêineres
122
+
123
+ ## Colours
124
+
125
+ Só existem tokens semânticos como classe. Os primitivos por trás deles — gray
126
+ 50–900, purple 50–500 e 700, e o preenchimento de cada estado — são custom
127
+ properties de fiação, sem classe. Os valores estão no cabeçalho deste arquivo,
128
+ claro e escuro.
129
+
130
+ ### Estrutura — neutros
131
+
132
+ | Token | Uso |
133
+ | --- | --- |
134
+ | `background` / `foreground` | canvas e texto padrão |
135
+ | `card`, `popover` | superfícies elevadas |
136
+ | `muted` / `muted-foreground` | fundo sutil e texto de apoio |
137
+ | `accent` | hover e realce de item de menu — cinza, sem peso |
138
+ | `border`, `input` | divisória e borda de campo |
139
+
140
+ ### Ação — roxo, exclusivo
141
+
142
+ | Token | Uso |
143
+ | --- | --- |
144
+ | `primary` / `primary-foreground` | botão primário, link, foco, progresso |
145
+ | `secondary` / `secondary-foreground` | item selecionado, ação secundária |
146
+ | `ring` | anel de foco |
147
+ | `sidebar-selected` | item ativo da sidebar |
148
+
149
+ Selecionado > focado > sob o cursor: seleção em `secondary` (matiz, tinta e peso
150
+ 500), foco em anel, hover em `accent` cinza. Fundo lavanda decorativo só em tela
151
+ sem lista, tabela, menu ou calendário — onde há o que selecionar, ele se lê como
152
+ seleção.
153
+
154
+ ### Estado — feedback, nunca decoração
155
+
156
+ Estado é sempre suave: o token cru (`destructive`, `success`, `warning`,
157
+ `info`) nunca é fundo. A receita única é
158
+ `bg-<status>/10 text-<status>-emphasis border-<status>/20`, em Button e Badge de
159
+ estado, Alert e selo. A cor cheia fica só no ícone e na borda de campo inválido.
160
+ Status nunca é roxo e sempre vem com ícone ou rótulo.
161
+
162
+ ### Categoria — só dados
163
+
164
+ `chart-1..8` alternam roxo e cinza em luminância, começando pelo roxo. Nunca em
165
+ botão, link, ícone de navegação ou fundo de seção.
166
+
167
+ ## Typography
168
+
169
+ A lib não embarca fonte: o app instala **Inter**, e o `body` usa
170
+ `var(--font-sans)`. A lib não estiliza elementos soltos (`h1`…`h6`, `p`, `label`)
171
+ — só o `body` e os próprios componentes.
172
+
173
+ | Papel | Tamanho | Peso | Onde |
174
+ | --- | --- | --- | --- |
175
+ | `{typography.body}` | 14px (`text-sm`) | 400 | texto de componente, campos, menus |
176
+ | `{typography.caption}` | 12px (`text-xs`) | 400 | badge, ajuda, metadado |
177
+ | `{typography.label}` | 14px | 500 | rótulo, item selecionado |
178
+ | `{typography.button}` | 14px | 600 | todas as variantes do `Button` |
179
+ | `{typography.title}` | — | 600 | `CardTitle` e títulos de seção |
180
+
181
+ **Peso 600 significa ação ou título.** Negrito no corpo do texto não tem papel.
182
+
183
+ ## Shape
184
+
185
+ Tudo deriva de `--radius` (10px).
186
+
187
+ | Token | Valor | Uso |
188
+ | --- | --- | --- |
189
+ | `{rounded.sm}` | 6px | item de menu, chips, tags |
190
+ | `{rounded.md}` | 8px | botão, input, popover, menu, tooltip |
191
+ | `{rounded.lg}` | 10px | dialog |
192
+ | `{rounded.xl}` | 14px | contêiner — `Card` e painéis grandes |
193
+ | `{rounded.full}` | 9999px | avatar, badge, indicadores |
194
+
195
+ Quanto maior a superfície, maior o raio; não há botão em pílula.
196
+
197
+ ## Buttons
198
+
199
+ Sete variantes, todas em `{typography.button}` e `{rounded.md}`, com altura de
200
+ 32 (`sm`), 36 (`default`) ou 40px (`lg`); `icon` é 36×36.
201
+
202
+ - **`default`** — roxo cheio. A ação principal da tela; uma por tela.
203
+ - **`secondary`** — lavanda com texto roxo. Ação secundária.
204
+ - **`outline`** — fundo neutro com borda; hover cinza.
205
+ - **`ghost`** — sem fundo; hover cinza. Barras de ferramenta e ações densas.
206
+ - **`link`** — texto roxo sublinhado no hover.
207
+ - **`destructive`** — suave: tinta vermelha a 10%, texto `destructive-emphasis`,
208
+ borda leve. Excluir, ação irreversível.
209
+ - **`success`** — suave, mesma receita em verde. Confirmar um estado positivo.
210
+
211
+ Clique: no `default` o preenchimento vai a 90% (hover) e 80% (pressionado); no
212
+ `destructive`/`success` a tinta sobe de 10% para 15% (hover) e 20% (pressionado).
213
+ O foco é um anel de 3px em `ring`.
214
+
215
+ ## Surfaces
216
+
217
+ **`card`** — `bg-card` com borda `border` e `{rounded.xl}`. O contêiner padrão;
218
+ a definição vem da borda, não de sombra.
219
+
220
+ Popover, menus e dialog usam `popover` e sombra; o `Tooltip` é neutro invertido
221
+ (`bg-foreground text-background`).
222
+
223
+ ## Do and don't
224
+
225
+ **Do**
226
+
227
+ - Use roxo para a ação principal, links, seleção e foco — e só para isso.
228
+ - Use `text-<status>-emphasis` para texto de estado, sempre com ícone ou rótulo.
229
+ - Use no máximo dois fundos por tela: `muted` e `background`; o terceiro, quando
230
+ existir, é `secondary`.
231
+ - Mantenha um botão `default` por tela; o segundo vira `secondary` ou `outline`.
232
+
233
+ **Don't**
234
+
235
+ - Não escreva cor crua (`bg-gray-100`, `text-purple-600`): ela não gera CSS e o
236
+ lint reprova. Use o token semântico.
237
+ - Não pinte fundo de seção com cor de estado — o badge carrega o estado, não o card.
238
+ - Não use cor de gráfico (`chart-N`) fora de dados.
239
+ - Não use negrito para dar ênfase no corpo do texto.
240
+
241
+ ## Scope and limits
242
+
243
+ Este arquivo cobre **cor, tipo, raio, botões e superfícies** da lib. Espaçamento
244
+ está em `tokens/spacing.json`; elevação e movimento, nos estilos dos
245
+ componentes. A régua de cada componente (anatomia, variantes, acessibilidade)
246
+ está em `src/components/ui/AGENTS.md`.
@@ -0,0 +1,244 @@
1
+ # Migração para @iclips/ui v3
2
+
3
+ `3.0.0` reduz a paleta à **paleta iClips** — "um roxo, muito cinza, e cor só onde
4
+ ela significa algo" — e junta as mudanças visuais que iam sair na 2.1. Nenhum
5
+ import nem componente foi renomeado; o que quebra é **cor crua** no seu código e
6
+ dois valores de prop (seção 1).
7
+
8
+ **Comece por aqui**, na raiz do app, depois de instalar a 3.0.0:
9
+
10
+ ```bash
11
+ node node_modules/@iclips/ui/scripts/check-colors.mjs src
12
+ ```
13
+
14
+ Ele lista cada cor crua (`arquivo:linha classe → sugestão`) e não altera nada.
15
+ Exit 0 = nada a migrar.
16
+
17
+ ## 1. Paleta iClips enxuta (BREAKING)
18
+
19
+ ### O que existe agora
20
+
21
+ Só tokens semânticos viram classe: `bg-background`, `bg-card`, `bg-muted`,
22
+ `text-foreground`, `text-muted-foreground`, `border-border`, `border-input`,
23
+ `bg-primary`, `bg-secondary`, `bg-accent`, `bg-destructive`/`success`/`warning`/`info`,
24
+ `text-<status>-emphasis`, `bg-chart-1..8`, `bg-sidebar-*` e afins — mais
25
+ `white`, `black`, `transparent` e `current`.
26
+
27
+ Os primitivos que sobraram (gray 50–900; purple 50–500 e 700, com 300 e 400
28
+ novos; red/green/cyan 600; yellow 500/600) existem só como custom property
29
+ (`var(--gray-100)`), para alimentar os semânticos. **Não geram classe.**
30
+
31
+ ### O que saiu
32
+
33
+ - As famílias `pink`, `blue`, `teal` e `orange` inteiras, e os degraus sem
34
+ consumidor das demais (`purple-600`, `red-50`, `green-200`, `cyan-500`…).
35
+ - Toda classe de cor crua: `bg-gray-100`, `text-purple-600`, `border-red-200`…
36
+ - A **paleta padrão do Tailwind** para quem usa o preset (modo B): o `@theme`
37
+ da lib começa com `--color-*: initial`, então `bg-zinc-900`, `text-sky-500`
38
+ etc. deixam de gerar CSS. Classe que não gera CSS não dá erro — ela só não
39
+ pinta. Por isso rode o `check-colors.mjs`.
40
+ - `var(--pink-*)`, `var(--blue-*)`, `var(--teal-*)`, `var(--orange-*)` e os
41
+ degraus removidos.
42
+
43
+ > **Tem cores próprias no `@theme` do app?** Declare-as **depois** do
44
+ > `@import "@iclips/ui/preset.css"` — o `--color-*: initial` da lib zera o que
45
+ > vier antes.
46
+
47
+ ### Tabela de equivalência
48
+
49
+ | Antes | Depois |
50
+ | --- | --- |
51
+ | `bg-gray-50` | `bg-background` ou `bg-muted/40` |
52
+ | `bg-gray-100`, `bg-gray-200` | `bg-muted` |
53
+ | `bg-gray-700`…`bg-zinc-900` (superfície escura) | `bg-card` |
54
+ | `border-gray-100`, `border-gray-200` | `border-border` |
55
+ | `border-gray-300` | `border-input` |
56
+ | `text-gray-400`…`text-gray-600` | `text-muted-foreground` |
57
+ | `text-gray-700`…`text-gray-900` | `text-foreground` |
58
+ | `bg-purple-500`, `bg-purple-600` | `bg-primary` |
59
+ | `bg-purple-50`, `bg-purple-100` | `bg-secondary` (seleção) |
60
+ | `text-purple-500`, `text-purple-600` | `text-primary` |
61
+ | `text-purple-700` | `text-secondary-foreground` |
62
+ | `border-purple-*`, `ring-purple-*` | `border-primary`, `ring-ring` |
63
+ | `text-red-600`, `text-green-600`, `text-yellow-700`, `text-blue-600` | `text-destructive-emphasis`, `text-success-emphasis`, `text-warning-emphasis`, `text-info-emphasis` |
64
+ | `bg-red-600` / `bg-red-50` (idem green, yellow, blue) | `bg-destructive` / `bg-destructive/10` |
65
+ | `border-red-200` (idem) | `border-destructive/20` |
66
+ | `teal`, `orange`, `pink`, `indigo`, `violet`… | sem equivalente: a paleta não tem essas cores. Em dados, `var(--chart-N)`; fora disso, um token semântico |
67
+
68
+ ### Componentes
69
+
70
+ - **`Avatar`** — `colorVariant` aceita só `"gray"` e `"purple"` (roxo =
71
+ `bg-secondary text-secondary-foreground`). `pink`, `blue`, `cyan`, `teal`,
72
+ `green`, `yellow`, `orange` e `red` não compilam mais no TypeScript: troque por
73
+ `purple` ou `gray`. `getColorFromString` passa a devolver um dos dois.
74
+ - **`DonutChart`** — fatia sem `color` usa `var(--chart-N)`, não mais 10 hex
75
+ da paleta padrão do Tailwind.
76
+ - **`<Button variant="cta">`** e `--cta` — não existem (anunciados para a 2.1,
77
+ que não chegou a sair). Use `variant="default"` para a ação principal.
78
+
79
+ ### Gráficos
80
+
81
+ `--chart-1..8` passam a roxo e cinza alternando claro e escuro, começando pelo
82
+ roxo. Quem usa `var(--chart-N)` vê o gráfico mudar de cor. Categoria é só para
83
+ dados — nunca botão, link ou fundo de seção.
84
+
85
+ ## 2. Hover deixa de ser lavanda; lavanda passa a significar "selecionado"
86
+
87
+ `--accent` e `--secondary` tinham o mesmo valor. Como `--accent` é a cor de
88
+ hover e de item realçado em todo o sistema, e `--secondary` é a de item
89
+ selecionado, **selecionado e sob o cursor pintavam o mesmo pixel**: numa lista
90
+ não havia como distinguir a linha escolhida da linha sob o mouse.
91
+
92
+ Hover foi quem cedeu — dura 200ms, não existe em tela de toque e não diz nada
93
+ sobre o dado.
94
+
95
+ | Token | Claro, antes → depois | Escuro, antes → depois |
96
+ | --------------------------- | ----------------------------------- | --------------------------------- |
97
+ | `--accent` | `purple.50` → `gray.100` | `purple.700` → `gray.600` |
98
+ | `--accent-foreground` | `purple.600` → `--foreground` | `purple.100` → `gray.50` |
99
+ | `--secondary` | sem mudança (`purple.50`) | `gray.700` → `purple.700` |
100
+ | `--secondary-foreground` | sem mudança (`purple.700`) | `gray.50` → `purple.100` |
101
+ | `--sidebar-accent` | `purple.50` → `gray.100` | sem mudança (`gray.700`) |
102
+ | `--sidebar-accent-foreground` | `purple.700` → `--sidebar-foreground` | `purple.100` → `gray.50` |
103
+
104
+ No escuro o defeito era o inverso: `--secondary` tinha a mesma cor de `--card`
105
+ e `--popover`, então item selecionado dentro de popover era invisível.
106
+
107
+ ### O que você vai ver mudar
108
+
109
+ | Onde | Antes | Depois |
110
+ | ------------------------------------------------------- | ------- | --------------------------- |
111
+ | `Button` `outline` e `ghost`, sob o cursor | lavanda | cinza |
112
+ | Item realçado em menus, `Select` e `Command` | lavanda | cinza |
113
+ | Dia de hoje e dia sob o cursor no `Calendar` | lavanda | cinza |
114
+ | Item de sidebar sob o cursor | lavanda | cinza |
115
+ | Item **selecionado** em `Combobox`, `MultiSelect`, faixa do `Calendar` | lavanda (ou só ✓) | lavanda + texto roxo + peso 500 |
116
+ | Item **ativo** na sidebar e no `NavigationMenu` | lavanda | lavanda, sem mudança |
117
+ | `Toggle` ligado, status "aprovação", reação ativa, menção | lavanda | lavanda, sem mudança |
118
+ | `Button`/`Badge` `secondary` **no tema escuro** | cinza | roxo escuro |
119
+
120
+ Foco por teclado nas listas passou a ser um anel, não um fundo, para
121
+ sobreviver sobre qualquer um dos dois.
122
+
123
+ Efeito colateral bem-vindo: passar o mouse por uma barra de ferramentas deixa
124
+ de pintar a tela de roxo da marca.
125
+
126
+ ### Se você usou `bg-accent` para decoração
127
+
128
+ `bg-accent` agora renderiza cinza. Se a intenção era o tom da marca, troque por
129
+ `bg-secondary` — **só em tela sem lista, tabela, menu ou calendário**, onde
130
+ lavanda passou a significar "isto está selecionado".
131
+
132
+ ### Se você sobrescreveu `--accent`
133
+
134
+ Nada muda para você. Vale reavaliar: o papel do token mudou de "realce da
135
+ marca" para "hover neutro".
136
+
137
+ ## 3. Novo token: `--sidebar-selected`
138
+
139
+ - `--sidebar-selected` / `--sidebar-selected-foreground` — item ativo da
140
+ sidebar (os valores que `--sidebar-accent` tinha).
141
+
142
+ Adição; nada existente mudou por causa dela.
143
+
144
+ ## 4. Botões um degrau mais pesados
145
+
146
+ `Button` e `SocialButton` passaram de `font-medium` (500) para `font-semibold`
147
+ (600). Peso 600 agora significa uma coisa só no sistema: ação.
148
+
149
+ Botão com rótulo longo em espaço apertado: confira — 600 ocupa um pouco mais de
150
+ largura.
151
+
152
+ ## 5. Tooltip neutro
153
+
154
+ `Tooltip` era roxo da marca; agora é cinza-escuro no claro e claro no escuro.
155
+ Sobreposição informativa não compete mais com os botões primários.
156
+
157
+ ## 6. Contraste de status (sem ação necessária)
158
+
159
+ - Texto e ícone de status passaram de `text-<status>` para
160
+ `text-<status>-emphasis` (`Form`, `EmptyState`, menus, anexos, validação).
161
+ - No escuro, `--*-emphasis` passou a misturar 45% do status (era 80%, que
162
+ ficava entre 2,4 e 4,2:1 sobre `card`/`popover`) e é redeclarado em `.dark`.
163
+ Se o seu app aplica `.dark` numa seção em vez do `<html>`, o `-emphasis`
164
+ agora acompanha o tema — antes herdava a mistura do claro.
165
+ - As iniciais do `Avatar` e os chips do `EditorialCalendar` misturam o token
166
+ com `--foreground` para passar AA. Se você usa `text-chart-N` em texto,
167
+ faça o mesmo: os tokens de gráfico são cor de preenchimento.
168
+
169
+ ## 6b. Roxo de ação mais claro no escuro
170
+
171
+ No tema escuro, `--primary` passou de purple-200 (`#BB6DF2`) para purple-100
172
+ (`#DAA6FF`). O antigo dava 3,8:1 como texto sobre `card`/`popover` (gray-700),
173
+ abaixo de AA; o novo dá ~6,4:1. Botões `default`, checkbox marcado e slider
174
+ ficam lavanda-claro no escuro, com o mesmo texto quase preto. `ring` e
175
+ `chart-1` continuam em purple-200. Se você fixou `#BB6DF2` como "roxo da marca
176
+ no escuro" no seu app, troque por `var(--primary)`.
177
+
178
+ ## 6c. Estado suave: nada de vermelho, verde, amarelo ou azul cheio
179
+
180
+ Cor de estado não é mais fundo sólido em lugar nenhum. `Button`
181
+ `variant="destructive"` e `"success"`, `Badge variant="destructive"` e os
182
+ `Alert` de estado usam a receita suave: fundo `bg-<status>/10`, texto e ícone
183
+ `text-<status>-emphasis`, borda `border-<status>/20` (Alert: tinta de 10%, era
184
+ 22%). Os nomes de variante não mudam.
185
+
186
+ - Se você passou `className="text-white"` (ou similar) para um Button/Badge de
187
+ estado presumindo fundo cheio, remova: o texto agora é escuro no claro e
188
+ claro no escuro.
189
+ - Não escreva `bg-destructive`/`bg-success`/`bg-warning`/`bg-info` sem
190
+ opacidade no seu app; use a receita acima.
191
+
192
+ ## 6d. Tons de estado mais calmos (sem ação necessária)
193
+
194
+ Os primitivos de estado perderam cerca de 40% da saturação, com a mesma
195
+ luminosidade (o contraste não muda):
196
+
197
+ | Primitivo | Antes | Agora |
198
+ | --- | --- | --- |
199
+ | `red-600` (`destructive`) | `#CC0A1A` | `#AB4A43` |
200
+ | `green-600` (`success`) | `#007F2A` | `#427748` |
201
+ | `cyan-600` (`info`) | `#0053A6` | `#315687` |
202
+ | `yellow-500` (`warning` claro) | `#FAB325` | `#E4BB78` |
203
+ | `yellow-600` (`warning` escuro) | `#E6960B` | `#CFA066` |
204
+
205
+ Quem usa os tokens acompanha sozinho. Se o seu app fixou algum desses hex,
206
+ troque pelo token.
207
+
208
+ ## 7. Alvos de toque (sem ação necessária)
209
+
210
+ Quatro botões de ícone de 24px (`CommentSystem` reagir/excluir,
211
+ `EditorialCalendar` agendar/recolher backlog) mantêm o tamanho visual e ganham
212
+ área de toque de 32–36px.
213
+
214
+ ## 8. Toast: superfície neutra e durações por tipo
215
+
216
+ O visual muda sem mudar a API: `toast`, `toast.success/error/warning/info`,
217
+ `toast.promise` e `<Toaster />` continuam iguais.
218
+
219
+ - **Visual:** o toast não é mais um retângulo colorido. Fundo `card`, título
220
+ `foreground`, descrição `muted-foreground`; a cor de estado fica só no ícone,
221
+ dentro de um disco. O toast de processando (`toast.loading` /
222
+ `toast.promise`) é o único roxo. `toast(msg, { action })` **sem tipo** vem em
223
+ superfície invertida (escura no tema claro): é o padrão para "Desfazer".
224
+ - **Durações padrão** (quando você não passa `duration`): sucesso 4s, aviso 6s,
225
+ informação 5s, sem tipo com `action` 8s. **`toast.error` não some mais
226
+ sozinho**: fica até o usuário fechar, com botão de fechar. Se algum fluxo
227
+ depende do erro sumir, passe `duration` explicitamente.
228
+ - Se você estilizava `.toast-variant-*`, essas classes saíram; o estilo agora
229
+ vive em `[data-sonner-toast].toast[data-type=…]`.
230
+
231
+ ---
232
+
233
+ ## Resumo do que conferir
234
+
235
+ 0. **`check-colors.mjs` sem achados** — seção 1. É o único passo que quebra
236
+ em silêncio.
237
+ 1. Telas com **lista, tabela ou calendário selecionável** — seção 2, para
238
+ melhor.
239
+ 2. Uso de `bg-accent` **decorativo** no seu código.
240
+ 3. `Button`/`Badge` `secondary` no tema escuro.
241
+ 4. Botões com rótulo longo (seção 4).
242
+ 5. Fluxos que contam com `toast.error` sumindo sozinho (seção 8).
243
+
244
+ O resto é repintura sem risco.
package/README.md CHANGED
@@ -17,6 +17,10 @@ import { Button, Dialog } from "@iclips/ui";
17
17
  import { DocumentEditor } from "@iclips/ui/editor";
18
18
  ```
19
19
 
20
+ **Para agentes de IA (e para quem monta tela):** o guia de uso — qual componente
21
+ em cada situação, com código pronto — vem no pacote, na versão instalada, em
22
+ `node_modules/@iclips/ui/docs/`. Comece por `docs/README.md`.
23
+
20
24
  O JS já é tree-shakeable (um módulo por componente). Falta só o CSS — dois modos:
21
25
 
22
26
  ### Modo A — CSS pré-compilado (qualquer stack, sem Tailwind)
@@ -1,94 +1,35 @@
1
1
  /*
2
- * Alert Variant Theme Styles
3
- * Uses CSS variables for automatic dark/light mode adaptation.
4
- * These classes are referenced by alert.tsx CVA variants.
5
- *
6
- * Variables used (defined in globals.css, change between modes):
7
- * --info → cyan-500 (light) / cyan-600 (dark)
8
- * --success → green-500 (light) / green-600 (dark)
9
- * --warning → yellow-500 (light) / yellow-600 (dark)
10
- * --destructive → red-500 (light) / red-600 (dark)
11
- * --foreground → gray-800 (light) / gray-50 (dark)
12
- * --card → white (light) / gray-700 (dark)
13
- * --border → gray-200 (light) / gray-600 (dark)
2
+ * Alert de estado — mesma receita suave do resto da lib: tinta de 10% da cor
3
+ * de estado sobre o card, borda levemente tingida, texto e ícone na camada
4
+ * -emphasis (que passa AA nos dois temas). Estado nunca é fundo sólido nem
5
+ * tinta forte: a cor identifica, a superfície não grita.
14
6
  */
15
7
 
16
- /* ── Info ─────────────────────────────────────────────────── */
17
8
  [data-slot="alert"].alert-variant-info {
18
- color: color-mix(in oklab, var(--info) 80%, var(--foreground));
19
- background-color: color-mix(in oklab, var(--info) 22%, var(--card));
20
- border-color: color-mix(in oklab, var(--info) 50%, var(--border));
9
+ --alert-state: var(--info);
10
+ --alert-text: var(--info-emphasis);
21
11
  }
22
-
23
- [data-slot="alert"].alert-variant-info > svg {
24
- color: var(--info);
25
- }
26
-
27
- [data-slot="alert"].alert-variant-info *[data-slot="alert-description"] {
28
- color: color-mix(in oklab, var(--info) 65%, var(--foreground));
29
- }
30
-
31
- [data-slot="alert"].alert-variant-info *[data-slot="alert-title"] {
32
- color: color-mix(in oklab, var(--info) 80%, var(--foreground));
33
- }
34
-
35
- /* ── Success ──────────────────────────────────────────────── */
36
12
  [data-slot="alert"].alert-variant-success {
37
- color: color-mix(in oklab, var(--success) 80%, var(--foreground));
38
- background-color: color-mix(in oklab, var(--success) 22%, var(--card));
39
- border-color: color-mix(in oklab, var(--success) 50%, var(--border));
40
- }
41
-
42
- [data-slot="alert"].alert-variant-success > svg {
43
- color: var(--success);
13
+ --alert-state: var(--success);
14
+ --alert-text: var(--success-emphasis);
44
15
  }
45
-
46
- [data-slot="alert"].alert-variant-success *[data-slot="alert-description"] {
47
- color: color-mix(in oklab, var(--success) 65%, var(--foreground));
48
- }
49
-
50
- [data-slot="alert"].alert-variant-success *[data-slot="alert-title"] {
51
- color: color-mix(in oklab, var(--success) 80%, var(--foreground));
52
- }
53
-
54
- /* ── Warning ──────────────────────────────────────────────── */
55
- /* --warning é o único token de status "claro" (yellow-500). Derivar texto
56
- com o mesmo 80/65% dos outros deixaria ~2,4:1 sobre o fundo pálido — abaixo
57
- de AA. O texto do warning mistura muito mais --foreground (fica âmbar
58
- escuro); o ícone continua no amarelo cheio. */
59
16
  [data-slot="alert"].alert-variant-warning {
60
- color: color-mix(in oklab, var(--warning) 32%, var(--foreground));
61
- background-color: color-mix(in oklab, var(--warning) 22%, var(--card));
62
- border-color: color-mix(in oklab, var(--warning) 50%, var(--border));
63
- }
64
-
65
- [data-slot="alert"].alert-variant-warning > svg {
66
- color: color-mix(in oklab, var(--warning) 80%, var(--foreground));
67
- }
68
-
69
- [data-slot="alert"].alert-variant-warning *[data-slot="alert-description"] {
70
- color: color-mix(in oklab, var(--warning) 26%, var(--foreground));
17
+ --alert-state: var(--warning);
18
+ --alert-text: var(--warning-emphasis);
71
19
  }
72
-
73
- [data-slot="alert"].alert-variant-warning *[data-slot="alert-title"] {
74
- color: color-mix(in oklab, var(--warning) 32%, var(--foreground));
75
- }
76
-
77
- /* ── Destructive ──────────────────────────────────────────── */
78
20
  [data-slot="alert"].alert-variant-destructive {
79
- color: color-mix(in oklab, var(--destructive) 80%, var(--foreground));
80
- background-color: color-mix(in oklab, var(--destructive) 22%, var(--card));
81
- border-color: color-mix(in oklab, var(--destructive) 50%, var(--border));
82
- }
83
-
84
- [data-slot="alert"].alert-variant-destructive > svg {
85
- color: var(--destructive);
21
+ --alert-state: var(--destructive);
22
+ --alert-text: var(--destructive-emphasis);
86
23
  }
87
24
 
88
- [data-slot="alert"].alert-variant-destructive *[data-slot="alert-description"] {
89
- color: color-mix(in oklab, var(--destructive) 65%, var(--foreground));
25
+ [data-slot="alert"][class*="alert-variant-"] {
26
+ color: var(--alert-text);
27
+ background-color: color-mix(in oklab, var(--alert-state) 10%, var(--card));
28
+ border-color: color-mix(in oklab, var(--alert-state) 20%, var(--border));
90
29
  }
91
30
 
92
- [data-slot="alert"].alert-variant-destructive *[data-slot="alert-title"] {
93
- color: color-mix(in oklab, var(--destructive) 80%, var(--foreground));
31
+ [data-slot="alert"][class*="alert-variant-"] > svg,
32
+ [data-slot="alert"][class*="alert-variant-"] *[data-slot="alert-title"],
33
+ [data-slot="alert"][class*="alert-variant-"] *[data-slot="alert-description"] {
34
+ color: var(--alert-text);
94
35
  }
@@ -1,2 +1,2 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),w=require("react"),h=require("recharts"),p=require("../utils.cjs");function z(n){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const s in n)if(s!=="default"){const l=Object.getOwnPropertyDescriptor(n,s);Object.defineProperty(t,s,l.get?l:{enumerable:!0,get:()=>n[s]})}}return t.default=n,Object.freeze(t)}const b=z(w),v=["#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#f97316","#14b8a6","#ec4899","#6366f1"];function D(n){return new Intl.NumberFormat("pt-BR",{style:"currency",currency:"BRL"}).format(n)}function M({layout:n,chartSize:t}){const s=[1,2,3].map(l=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-muted shrink-0"}),e.jsx("div",{className:"h-3 bg-muted rounded flex-1"})]},l));return n==="horizontal"?e.jsxs("div",{className:"flex items-center gap-6 w-full animate-pulse",children:[e.jsx("div",{className:"rounded-full bg-muted shrink-0",style:{width:t,height:t}}),e.jsx("div",{className:"flex flex-col gap-2 flex-1",children:s})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center w-full animate-pulse gap-4",children:[e.jsx("div",{className:"rounded-full bg-muted",style:{width:140,height:140}}),e.jsx("div",{className:"flex flex-col gap-2 w-full max-w-50",children:s})]})}function R(){return e.jsxs("div",{className:"flex flex-col items-center justify-center w-full h-full text-muted-foreground gap-2",children:[e.jsx("div",{className:"rounded-full border-4 border-dashed border-muted",style:{width:100,height:100}}),e.jsx("span",{className:"text-sm",children:"Sem dados para exibir"})]})}function k({active:n,payload:t,formatValue:s,total:l}){if(!n||!(t!=null&&t.length))return null;const c=t[0],r=l>0?(c.value/l*100).toFixed(1):"0.0";return e.jsxs("div",{className:"bg-popover border border-border rounded shadow-lg p-2 text-xs min-w-35",children:[e.jsx("div",{className:"font-medium mb-1",children:c.name}),e.jsxs("div",{className:"flex justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:"Valor"}),e.jsx("span",{className:"font-mono",children:s(c.value)})]}),e.jsxs("div",{className:"flex justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:"%"}),e.jsxs("span",{className:"font-mono",children:[r,"%"]})]})]})}function A({viewBox:n,activeIndex:t,chartData:s,formatValue:l,total:c}){const r=(n==null?void 0:n.cx)??0,i=(n==null?void 0:n.cy)??0,o=t!==null&&t>=0?s[t]:null;if(o){const a=c>0?(o.value/c*100).toFixed(1):"0.0",d=13,j=o.name.length>d?o.name.substring(0,d-1)+"…":o.name;return e.jsxs("g",{children:[e.jsx("text",{x:r,y:i-14,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:10,fill:"var(--muted-foreground)"},children:j}),e.jsx("text",{x:r,y:i+2,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:11,fontWeight:700,fill:o.color},children:l(o.value)}),e.jsxs("text",{x:r,y:i+18,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:11,fill:"var(--muted-foreground)"},children:[a,"%"]})]})}return e.jsxs("g",{children:[e.jsx("text",{x:r,y:i-8,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:10,fill:"var(--muted-foreground)"},children:"Total"}),e.jsx("text",{x:r,y:i+8,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:13,fontWeight:700,fill:"currentColor"},children:l(c)})]})}function C({chartData:n,total:t,formatValue:s,activeIndex:l,onHover:c}){return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[n.map((r,i)=>{const o=t>0?(r.value/t*100).toFixed(1):"0.0",a=l===i,d=l!==null&&!a;return e.jsxs("div",{className:"flex items-center gap-2 text-xs cursor-default rounded px-1 py-0.5 transition-opacity",style:{opacity:d?.4:1},onMouseEnter:()=>c(i),onMouseLeave:()=>c(null),children:[e.jsx("span",{className:"inline-block w-2.5 h-2.5 rounded-full shrink-0 transition-transform",style:{background:r.color,transform:a?"scale(1.3)":"scale(1)"}}),e.jsx("span",{className:"flex-1 truncate text-muted-foreground",children:r.name}),e.jsx("span",{className:"font-mono text-foreground",children:s(r.value)}),e.jsxs("span",{className:"text-muted-foreground w-10.5 text-right",children:[o,"%"]})]},i)}),e.jsxs("div",{className:"flex items-center gap-2 text-xs border-t border-border pt-1.5 mt-0.5",children:[e.jsx("span",{className:"flex-1 font-medium",children:"Total"}),e.jsx("span",{className:"font-mono font-semibold",children:s(t)})]})]})}function L({data:n,title:t,formatValue:s=D,className:l,isLoading:c=!1,layout:r="vertical",activeLabel:i=!1,chartSize:o}){const[a,d]=b.useState(null),j=b.useMemo(()=>n.reduce((u,m)=>u+m.value,0),[n]),g=b.useMemo(()=>n.map((u,m)=>({name:u.label,value:u.value,color:u.color??v[m%v.length]})),[n]),x=r==="horizontal",f=o??(x?140:220),y=x?Math.round(f*.34):55,S=x?Math.round(f*.51):85;return e.jsxs("div",{className:p.cn("flex flex-col gap-4 w-full",l),children:[t&&e.jsx("div",{className:"text-sm font-semibold text-foreground",children:t}),c?e.jsx(M,{layout:r,chartSize:f}):n.length===0?e.jsx(R,{}):e.jsxs("div",{className:p.cn(x?"flex items-center gap-4":"flex flex-col gap-4"),children:[e.jsx("div",{className:"shrink-0",style:x?{width:f,height:f}:{width:"100%",height:f},children:e.jsx(h.ResponsiveContainer,{width:"100%",height:"100%",children:e.jsxs(h.PieChart,{children:[e.jsx(h.Pie,{data:g,cx:"50%",cy:"50%",innerRadius:y,outerRadius:S,paddingAngle:2,dataKey:"value",nameKey:"name",onMouseEnter:(u,m)=>d(m),onMouseLeave:()=>d(null),shape:(u,m)=>{var N;return e.jsx(h.Sector,{...u,fill:(N=g[m])==null?void 0:N.color,stroke:"transparent",opacity:a!==null&&a!==m?.4:1})},children:i&&e.jsx(h.Label,{content:e.jsx(A,{activeIndex:a,chartData:g,formatValue:s,total:j})})}),!i&&e.jsx(h.Tooltip,{content:e.jsx(k,{formatValue:s,total:j})})]})})}),e.jsx("div",{className:p.cn(x?"flex-1 min-w-0":""),children:e.jsx(C,{chartData:g,total:j,formatValue:s,activeIndex:a,onHover:d})})]})]})}exports.DonutChart=L;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),w=require("react"),h=require("recharts"),p=require("../utils.cjs");function z(n){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const s in n)if(s!=="default"){const l=Object.getOwnPropertyDescriptor(n,s);Object.defineProperty(t,s,l.get?l:{enumerable:!0,get:()=>n[s]})}}return t.default=n,Object.freeze(t)}const N=z(w),b=Array.from({length:8},(n,t)=>`var(--chart-${t+1})`);function A(n){return new Intl.NumberFormat("pt-BR",{style:"currency",currency:"BRL"}).format(n)}function D({layout:n,chartSize:t}){const s=[1,2,3].map(l=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-muted shrink-0"}),e.jsx("div",{className:"h-3 bg-muted rounded flex-1"})]},l));return n==="horizontal"?e.jsxs("div",{className:"flex items-center gap-6 w-full animate-pulse",children:[e.jsx("div",{className:"rounded-full bg-muted shrink-0",style:{width:t,height:t}}),e.jsx("div",{className:"flex flex-col gap-2 flex-1",children:s})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center w-full animate-pulse gap-4",children:[e.jsx("div",{className:"rounded-full bg-muted",style:{width:140,height:140}}),e.jsx("div",{className:"flex flex-col gap-2 w-full max-w-50",children:s})]})}function M(){return e.jsxs("div",{className:"flex flex-col items-center justify-center w-full h-full text-muted-foreground gap-2",children:[e.jsx("div",{className:"rounded-full border-4 border-dashed border-muted",style:{width:100,height:100}}),e.jsx("span",{className:"text-sm",children:"Sem dados para exibir"})]})}function R({active:n,payload:t,formatValue:s,total:l}){if(!n||!(t!=null&&t.length))return null;const c=t[0],r=l>0?(c.value/l*100).toFixed(1):"0.0";return e.jsxs("div",{className:"bg-popover border border-border rounded shadow-lg p-2 text-xs min-w-35",children:[e.jsx("div",{className:"font-medium mb-1",children:c.name}),e.jsxs("div",{className:"flex justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:"Valor"}),e.jsx("span",{className:"font-mono",children:s(c.value)})]}),e.jsxs("div",{className:"flex justify-between gap-4",children:[e.jsx("span",{className:"text-muted-foreground",children:"%"}),e.jsxs("span",{className:"font-mono",children:[r,"%"]})]})]})}function k({viewBox:n,activeIndex:t,chartData:s,formatValue:l,total:c}){const r=(n==null?void 0:n.cx)??0,i=(n==null?void 0:n.cy)??0,o=t!==null&&t>=0?s[t]:null;if(o){const a=c>0?(o.value/c*100).toFixed(1):"0.0",d=13,j=o.name.length>d?o.name.substring(0,d-1)+"…":o.name;return e.jsxs("g",{children:[e.jsx("text",{x:r,y:i-14,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:10,fill:"var(--muted-foreground)"},children:j}),e.jsx("text",{x:r,y:i+2,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:11,fontWeight:700,fill:o.color},children:l(o.value)}),e.jsxs("text",{x:r,y:i+18,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:11,fill:"var(--muted-foreground)"},children:[a,"%"]})]})}return e.jsxs("g",{children:[e.jsx("text",{x:r,y:i-8,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:10,fill:"var(--muted-foreground)"},children:"Total"}),e.jsx("text",{x:r,y:i+8,textAnchor:"middle",dominantBaseline:"middle",style:{fontSize:13,fontWeight:700,fill:"currentColor"},children:l(c)})]})}function C({chartData:n,total:t,formatValue:s,activeIndex:l,onHover:c}){return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[n.map((r,i)=>{const o=t>0?(r.value/t*100).toFixed(1):"0.0",a=l===i,d=l!==null&&!a;return e.jsxs("div",{className:"flex items-center gap-2 text-xs cursor-default rounded px-1 py-0.5 transition-opacity",style:{opacity:d?.4:1},onMouseEnter:()=>c(i),onMouseLeave:()=>c(null),children:[e.jsx("span",{className:"inline-block w-2.5 h-2.5 rounded-full shrink-0 transition-transform",style:{background:r.color,transform:a?"scale(1.3)":"scale(1)"}}),e.jsx("span",{className:"flex-1 truncate text-muted-foreground",children:r.name}),e.jsx("span",{className:"font-mono text-foreground",children:s(r.value)}),e.jsxs("span",{className:"text-muted-foreground w-10.5 text-right",children:[o,"%"]})]},i)}),e.jsxs("div",{className:"flex items-center gap-2 text-xs border-t border-border pt-1.5 mt-0.5",children:[e.jsx("span",{className:"flex-1 font-medium",children:"Total"}),e.jsx("span",{className:"font-mono font-semibold",children:s(t)})]})]})}function L({data:n,title:t,formatValue:s=A,className:l,isLoading:c=!1,layout:r="vertical",activeLabel:i=!1,chartSize:o}){const[a,d]=N.useState(null),j=N.useMemo(()=>n.reduce((u,m)=>u+m.value,0),[n]),g=N.useMemo(()=>n.map((u,m)=>({name:u.label,value:u.value,color:u.color??b[m%b.length]})),[n]),x=r==="horizontal",f=o??(x?140:220),y=x?Math.round(f*.34):55,S=x?Math.round(f*.51):85;return e.jsxs("div",{className:p.cn("flex flex-col gap-4 w-full",l),children:[t&&e.jsx("div",{className:"text-sm font-semibold text-foreground",children:t}),c?e.jsx(D,{layout:r,chartSize:f}):n.length===0?e.jsx(M,{}):e.jsxs("div",{className:p.cn(x?"flex items-center gap-4":"flex flex-col gap-4"),children:[e.jsx("div",{className:"shrink-0",style:x?{width:f,height:f}:{width:"100%",height:f},children:e.jsx(h.ResponsiveContainer,{width:"100%",height:"100%",children:e.jsxs(h.PieChart,{children:[e.jsx(h.Pie,{data:g,cx:"50%",cy:"50%",innerRadius:y,outerRadius:S,paddingAngle:2,dataKey:"value",nameKey:"name",onMouseEnter:(u,m)=>d(m),onMouseLeave:()=>d(null),shape:(u,m)=>{var v;return e.jsx(h.Sector,{...u,fill:(v=g[m])==null?void 0:v.color,stroke:"transparent",opacity:a!==null&&a!==m?.4:1})},children:i&&e.jsx(h.Label,{content:e.jsx(k,{activeIndex:a,chartData:g,formatValue:s,total:j})})}),!i&&e.jsx(h.Tooltip,{content:e.jsx(R,{formatValue:s,total:j})})]})})}),e.jsx("div",{className:p.cn(x?"flex-1 min-w-0":""),children:e.jsx(C,{chartData:g,total:j,formatValue:s,activeIndex:a,onHover:d})})]})]})}exports.DonutChart=L;
2
2
  //# sourceMappingURL=donut-chart.cjs.map