@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.
- package/DESIGN.md +246 -0
- package/MIGRATION-v3.md +244 -0
- package/README.md +4 -0
- package/dist/alert-theme.css +20 -79
- package/dist/components/ui/charts/donut-chart.cjs +1 -1
- package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
- package/dist/components/ui/charts/donut-chart.js +39 -60
- package/dist/components/ui/charts/donut-chart.js.map +1 -1
- package/dist/components/ui/charts/kpi-card.cjs +1 -1
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
- package/dist/components/ui/charts/kpi-card.js +19 -19
- package/dist/components/ui/charts/kpi-card.js.map +1 -1
- package/dist/components/ui/data/comment-system.cjs +1 -1
- package/dist/components/ui/data/comment-system.cjs.map +1 -1
- package/dist/components/ui/data/comment-system.js +67 -67
- package/dist/components/ui/data/comment-system.js.map +1 -1
- package/dist/components/ui/data/data-table.cjs +1 -1
- package/dist/components/ui/data/data-table.cjs.map +1 -1
- package/dist/components/ui/data/data-table.js +112 -101
- package/dist/components/ui/data/data-table.js.map +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
- package/dist/components/ui/data/editorial-calendar.js +291 -291
- package/dist/components/ui/data/editorial-calendar.js.map +1 -1
- package/dist/components/ui/data/filter-builder.cjs +1 -1
- package/dist/components/ui/data/filter-builder.cjs.map +1 -1
- package/dist/components/ui/data/filter-builder.js +1 -1
- package/dist/components/ui/data/filter-builder.js.map +1 -1
- package/dist/components/ui/feedback/empty-state.cjs +1 -1
- package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
- package/dist/components/ui/feedback/empty-state.js +14 -14
- package/dist/components/ui/feedback/empty-state.js.map +1 -1
- package/dist/components/ui/feedback/toast.cjs +1 -1
- package/dist/components/ui/feedback/toast.cjs.map +1 -1
- package/dist/components/ui/feedback/toast.js +53 -22
- package/dist/components/ui/feedback/toast.js.map +1 -1
- package/dist/components/ui/forms/calendar.cjs +1 -1
- package/dist/components/ui/forms/calendar.cjs.map +1 -1
- package/dist/components/ui/forms/calendar.js +16 -16
- package/dist/components/ui/forms/calendar.js.map +1 -1
- package/dist/components/ui/forms/combobox.cjs +1 -1
- package/dist/components/ui/forms/combobox.cjs.map +1 -1
- package/dist/components/ui/forms/combobox.js +78 -76
- package/dist/components/ui/forms/combobox.js.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.js +4 -4
- package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
- package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.js +55 -49
- package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
- package/dist/components/ui/forms/form.cjs +1 -1
- package/dist/components/ui/forms/form.cjs.map +1 -1
- package/dist/components/ui/forms/form.js +11 -11
- package/dist/components/ui/forms/form.js.map +1 -1
- package/dist/components/ui/forms/input-validation.cjs +1 -1
- package/dist/components/ui/forms/input-validation.cjs.map +1 -1
- package/dist/components/ui/forms/input-validation.js +20 -20
- package/dist/components/ui/forms/input-validation.js.map +1 -1
- package/dist/components/ui/forms/multi-select.cjs +1 -1
- package/dist/components/ui/forms/multi-select.cjs.map +1 -1
- package/dist/components/ui/forms/multi-select.js +69 -67
- package/dist/components/ui/forms/multi-select.js.map +1 -1
- package/dist/components/ui/forms/radio-group.cjs +1 -1
- package/dist/components/ui/forms/radio-group.cjs.map +1 -1
- package/dist/components/ui/forms/radio-group.js +19 -19
- package/dist/components/ui/forms/radio-group.js.map +1 -1
- package/dist/components/ui/forms/social-button.cjs +1 -1
- package/dist/components/ui/forms/social-button.cjs.map +1 -1
- package/dist/components/ui/forms/social-button.js +6 -6
- package/dist/components/ui/forms/social-button.js.map +1 -1
- package/dist/components/ui/forms/toggle.cjs +1 -1
- package/dist/components/ui/forms/toggle.cjs.map +1 -1
- package/dist/components/ui/forms/toggle.js +7 -7
- package/dist/components/ui/forms/toggle.js.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.js +14 -14
- package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation/sidebar.cjs +1 -1
- package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
- package/dist/components/ui/navigation/sidebar.js +44 -44
- package/dist/components/ui/navigation/sidebar.js.map +1 -1
- package/dist/components/ui/overlays/context-menu.cjs +1 -1
- package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/context-menu.js +1 -1
- package/dist/components/ui/overlays/context-menu.js.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.js +5 -5
- package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
- package/dist/components/ui/overlays/menubar.cjs +1 -1
- package/dist/components/ui/overlays/menubar.cjs.map +1 -1
- package/dist/components/ui/overlays/menubar.js +29 -29
- package/dist/components/ui/overlays/menubar.js.map +1 -1
- package/dist/components/ui/overlays/tooltip.cjs +1 -1
- package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
- package/dist/components/ui/overlays/tooltip.js +12 -12
- package/dist/components/ui/overlays/tooltip.js.map +1 -1
- package/dist/components/ui/primitives/avatar.cjs +1 -1
- package/dist/components/ui/primitives/avatar.cjs.map +1 -1
- package/dist/components/ui/primitives/avatar.js +20 -27
- package/dist/components/ui/primitives/avatar.js.map +1 -1
- package/dist/components/ui/primitives/badge.cjs +1 -1
- package/dist/components/ui/primitives/badge.cjs.map +1 -1
- package/dist/components/ui/primitives/badge.js +21 -18
- package/dist/components/ui/primitives/badge.js.map +1 -1
- package/dist/components/ui/primitives/button.cjs +1 -1
- package/dist/components/ui/primitives/button.cjs.map +1 -1
- package/dist/components/ui/primitives/button.js +11 -8
- package/dist/components/ui/primitives/button.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/dist/preset.css +1 -2
- package/dist/toast-theme.css +100 -64
- package/dist/tokens.css +59 -159
- package/docs/README.md +44 -0
- package/docs/acoes.md +103 -0
- package/docs/escolha.md +171 -0
- package/docs/formularios.md +137 -0
- package/docs/mensagens.md +114 -0
- package/docs/overlays.md +192 -0
- package/docs/status.md +71 -0
- package/package.json +7 -3
- 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`.
|
package/MIGRATION-v3.md
ADDED
|
@@ -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)
|
package/dist/alert-theme.css
CHANGED
|
@@ -1,94 +1,35 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Alert
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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"]
|
|
89
|
-
color:
|
|
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"]
|
|
93
|
-
|
|
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
|
|
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
|