@snksergio/design-system 0.48.0 → 0.50.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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist-lib/chunks/{panel-57Pt_bL9.cjs → panel-Bly-rNP9.cjs} +2 -2
  3. package/dist-lib/chunks/{panel-57Pt_bL9.cjs.map → panel-Bly-rNP9.cjs.map} +1 -1
  4. package/dist-lib/chunks/{panel-DlZeQw7G.mjs → panel-DA6K3a3n.mjs} +2 -2
  5. package/dist-lib/chunks/{panel-DlZeQw7G.mjs.map → panel-DA6K3a3n.mjs.map} +1 -1
  6. package/dist-lib/chunks/{sheet-7v5vamnP.mjs → sheet-DIpYkRYS.mjs} +32 -32
  7. package/dist-lib/chunks/{sheet-7v5vamnP.mjs.map → sheet-DIpYkRYS.mjs.map} +1 -1
  8. package/dist-lib/chunks/{sheet-BZlQ0gKA.cjs → sheet-rg6uupt1.cjs} +33 -33
  9. package/dist-lib/chunks/{sheet-BZlQ0gKA.cjs.map → sheet-rg6uupt1.cjs.map} +1 -1
  10. package/dist-lib/chunks/{toggle-group-DYGba7RP.cjs → toggle-group-C9rrkkmh.cjs} +159 -52
  11. package/dist-lib/chunks/toggle-group-C9rrkkmh.cjs.map +1 -0
  12. package/dist-lib/chunks/{toggle-group-CnAN6ZnT.mjs → toggle-group-mXbG8_Jm.mjs} +237 -130
  13. package/dist-lib/chunks/toggle-group-mXbG8_Jm.mjs.map +1 -0
  14. package/dist-lib/index.cjs +303 -45
  15. package/dist-lib/index.cjs.map +1 -1
  16. package/dist-lib/index.mjs +308 -50
  17. package/dist-lib/index.mjs.map +1 -1
  18. package/dist-lib/preview/clientes.cjs +2 -2
  19. package/dist-lib/preview/clientes.mjs +2 -2
  20. package/dist-lib/shadcn.cjs +3 -2
  21. package/dist-lib/shadcn.cjs.map +1 -1
  22. package/dist-lib/shadcn.mjs +82 -81
  23. package/dist-lib/src/components/index.d.ts +1 -0
  24. package/dist-lib/src/components/index.d.ts.map +1 -1
  25. package/dist-lib/src/components/shadcn/carousel.d.ts +28 -1
  26. package/dist-lib/src/components/shadcn/carousel.d.ts.map +1 -1
  27. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.d.ts +30 -31
  28. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.d.ts.map +1 -1
  29. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.styles.d.ts +5 -0
  30. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.styles.d.ts.map +1 -1
  31. package/dist-lib/src/components/ui/CardOption/card-option.d.ts +27 -0
  32. package/dist-lib/src/components/ui/CardOption/card-option.d.ts.map +1 -0
  33. package/dist-lib/src/components/ui/CardOption/card-option.styles.d.ts +381 -0
  34. package/dist-lib/src/components/ui/CardOption/card-option.styles.d.ts.map +1 -0
  35. package/dist-lib/src/components/ui/CardOption/card-option.types.d.ts +76 -0
  36. package/dist-lib/src/components/ui/CardOption/card-option.types.d.ts.map +1 -0
  37. package/dist-lib/src/components/ui/CardOption/index.d.ts +4 -0
  38. package/dist-lib/src/components/ui/CardOption/index.d.ts.map +1 -0
  39. package/dist-lib/src/components/ui/ColorPicker/color-picker.styles.d.ts +18 -0
  40. package/dist-lib/src/components/ui/ColorPicker/color-picker.styles.d.ts.map +1 -1
  41. package/dist-lib/src/components/ui/ColorPicker/color-picker.types.d.ts +4 -1
  42. package/dist-lib/src/components/ui/ColorPicker/color-picker.types.d.ts.map +1 -1
  43. package/package.json +1 -1
  44. package/dist-lib/chunks/toggle-group-CnAN6ZnT.mjs.map +0 -1
  45. package/dist-lib/chunks/toggle-group-DYGba7RP.cjs.map +0 -1
@@ -0,0 +1,381 @@
1
+ import { VariantProps } from '../../../utils/tv';
2
+ /**
3
+ * CardOption — controle de formulário apresentado como card clicável, com o controle
4
+ * (checkbox, radio ou switch) trocável por prop.
5
+ *
6
+ * ## Por que um componente e não três
7
+ *
8
+ * Medido em 2026-08-27: dos três padrões de "card com controle" que o DS mostrava, **só um
9
+ * era componente** (`CardCheckbox`). O "Card Selection" do radio e o "Card Toggle" do switch
10
+ * eram markup solto dentro das páginas de doc — e por isso divergiam em 11 dimensões:
11
+ * alinhamento (`items-start` vs `items-center`), padding (20px vs 12px), radius, preset do
12
+ * label (`body-md medium` vs `body-sm semibold`), preset da descrição (`body-md` onde devia
13
+ * ser `caption`), cor do selecionado, lado do input, e por aí.
14
+ *
15
+ * O que produziu a divergência foi a ausência de componente, não falta de disciplina: cada
16
+ * exemplo foi escrito à mão, em momentos diferentes, e quem copiasse da doc levava a versão
17
+ * daquele dia. `has-[[data-state=checked]]` aparecia 5× no repo, **todas** em página de doc e
18
+ * nenhuma em tela real — ou seja, a janela pra unificar era esta, sem migração.
19
+ *
20
+ * ## As duas assimetrias que o `type` carrega
21
+ *
22
+ * Não é "o mesmo card com controle diferente" em tudo:
23
+ *
24
+ * 1. **Lado do controle.** Checkbox/radio à esquerda, switch à direita — convenção de linha
25
+ * de configuração. Um default único erraria metade dos casos, então o default deriva do
26
+ * `type` (ver `card-option.tsx`).
27
+ * 2. **Destaque de selecionado.** Radio/checkbox SELECIONAM uma opção e ganham o destaque
28
+ * (`bg-success-muted` + `border-brand`). Switch é ESTADO, não seleção: uma lista de
29
+ * settings toda verde é ruído, e é exatamente por isso que o exemplo antigo do switch
30
+ * não tinha estado nenhum. Daí `highlightSelected` derivar do `type`.
31
+ *
32
+ * ## Foco — corrige defeito do CardCheckbox
33
+ *
34
+ * O anel vai no card por **`has-[:focus-visible]`**, não por `focus-visible:` no root. O
35
+ * `CardCheckbox` declarava `focus-visible:ring-4` no `<label>`, e **label não recebe foco**:
36
+ * era CSS morto (verificado no browser em 2026-08-27 — o anel que aparecia era só o do
37
+ * controle de 16px, do `shadcn/checkbox`). Com `has-`, o card inteiro reage ao foco do
38
+ * controle interno, que é o que a área clicável grande promete.
39
+ */
40
+ export declare const cardOption: import('tailwind-variants').TVReturnType<{
41
+ size: {
42
+ sm: {
43
+ root: string;
44
+ label: string;
45
+ description: string;
46
+ };
47
+ md: {
48
+ root: string;
49
+ label: string;
50
+ description: string;
51
+ };
52
+ lg: {
53
+ root: string;
54
+ label: string;
55
+ description: string;
56
+ };
57
+ };
58
+ /**
59
+ * Onde o CONTROLE fica — e só ele.
60
+ *
61
+ * ⚠️ Era `flex-row-reverse` no root, que invertia TODOS os filhos e levava o ícone pra
62
+ * direita junto. O ícone tem de ficar sempre à esquerda: ele identifica a opção (junto do
63
+ * texto), enquanto o controle é a ação. `order-last` move apenas o controle, mantendo
64
+ * ícone → texto na ordem de leitura em qualquer orientação.
65
+ */
66
+ orientation: {
67
+ left: {};
68
+ right: {
69
+ control: string;
70
+ };
71
+ };
72
+ /**
73
+ * O destaque de selecionado vem do **data attribute do controle**, não de prop.
74
+ *
75
+ * ⚠️ A 1ª versão derivava de `checked === true` em JS e o card de **radio nunca
76
+ * destacava** — a seleção do radio mora no `value` do grupo, não numa prop do item, então
77
+ * a condição era falsa por construção. Pego no browser: o item com
78
+ * `data-state="checked"` seguia branco.
79
+ *
80
+ * `has-[[data-state=checked]]` resolve os três tipos de uma vez e funciona também em uso
81
+ * NÃO-CONTROLADO (`defaultValue`/`defaultChecked`), onde nenhuma prop diz o estado. É a
82
+ * L-012: Radix marca estado por data attribute, não por atributo HTML.
83
+ *
84
+ * ⚠️ Quem decide se esta variante entra é o `card-option.tsx`, e o default DEPENDE DO
85
+ * CONTEXTO: em card solto vem do `type`; **em lista vem desligado**, porque a única borda
86
+ * do item ali é a de baixo — a divisória — e pintá-la colore a linha que separa o
87
+ * selecionado do vizinho, não o contorno dele.
88
+ */
89
+ highlight: {
90
+ true: {
91
+ root: string[];
92
+ };
93
+ false: {
94
+ root: string;
95
+ };
96
+ };
97
+ /**
98
+ * Dentro de um grupo `layout="list"`: sem cantos e sem borda em volta — quem desenha o
99
+ * contorno é o grupo. O que sobra é a **linha divisória**, feita pela borda de baixo de
100
+ * cada item, com o último suprimido.
101
+ *
102
+ * ⚠️ A 1ª versão era `border-0` no item + `divide-y` no grupo, e **não desenhava divisória
103
+ * nenhuma**: o `divide-y` funciona pondo `border-top` nos filhos a partir do 2º, e o
104
+ * `border-0` do item zerava justamente essa borda. Medido no browser — `border-top: 0px`
105
+ * nos três itens. Desenhar a borda no próprio item não depende dessa ordem de cascata.
106
+ */
107
+ inList: {
108
+ true: {
109
+ root: string;
110
+ };
111
+ };
112
+ disabled: {
113
+ true: {
114
+ root: string;
115
+ };
116
+ };
117
+ }, {
118
+ root: string[];
119
+ control: string;
120
+ iconWrap: string;
121
+ body: string;
122
+ label: string;
123
+ description: string;
124
+ }, undefined, {
125
+ size: {
126
+ sm: {
127
+ root: string;
128
+ label: string;
129
+ description: string;
130
+ };
131
+ md: {
132
+ root: string;
133
+ label: string;
134
+ description: string;
135
+ };
136
+ lg: {
137
+ root: string;
138
+ label: string;
139
+ description: string;
140
+ };
141
+ };
142
+ /**
143
+ * Onde o CONTROLE fica — e só ele.
144
+ *
145
+ * ⚠️ Era `flex-row-reverse` no root, que invertia TODOS os filhos e levava o ícone pra
146
+ * direita junto. O ícone tem de ficar sempre à esquerda: ele identifica a opção (junto do
147
+ * texto), enquanto o controle é a ação. `order-last` move apenas o controle, mantendo
148
+ * ícone → texto na ordem de leitura em qualquer orientação.
149
+ */
150
+ orientation: {
151
+ left: {};
152
+ right: {
153
+ control: string;
154
+ };
155
+ };
156
+ /**
157
+ * O destaque de selecionado vem do **data attribute do controle**, não de prop.
158
+ *
159
+ * ⚠️ A 1ª versão derivava de `checked === true` em JS e o card de **radio nunca
160
+ * destacava** — a seleção do radio mora no `value` do grupo, não numa prop do item, então
161
+ * a condição era falsa por construção. Pego no browser: o item com
162
+ * `data-state="checked"` seguia branco.
163
+ *
164
+ * `has-[[data-state=checked]]` resolve os três tipos de uma vez e funciona também em uso
165
+ * NÃO-CONTROLADO (`defaultValue`/`defaultChecked`), onde nenhuma prop diz o estado. É a
166
+ * L-012: Radix marca estado por data attribute, não por atributo HTML.
167
+ *
168
+ * ⚠️ Quem decide se esta variante entra é o `card-option.tsx`, e o default DEPENDE DO
169
+ * CONTEXTO: em card solto vem do `type`; **em lista vem desligado**, porque a única borda
170
+ * do item ali é a de baixo — a divisória — e pintá-la colore a linha que separa o
171
+ * selecionado do vizinho, não o contorno dele.
172
+ */
173
+ highlight: {
174
+ true: {
175
+ root: string[];
176
+ };
177
+ false: {
178
+ root: string;
179
+ };
180
+ };
181
+ /**
182
+ * Dentro de um grupo `layout="list"`: sem cantos e sem borda em volta — quem desenha o
183
+ * contorno é o grupo. O que sobra é a **linha divisória**, feita pela borda de baixo de
184
+ * cada item, com o último suprimido.
185
+ *
186
+ * ⚠️ A 1ª versão era `border-0` no item + `divide-y` no grupo, e **não desenhava divisória
187
+ * nenhuma**: o `divide-y` funciona pondo `border-top` nos filhos a partir do 2º, e o
188
+ * `border-0` do item zerava justamente essa borda. Medido no browser — `border-top: 0px`
189
+ * nos três itens. Desenhar a borda no próprio item não depende dessa ordem de cascata.
190
+ */
191
+ inList: {
192
+ true: {
193
+ root: string;
194
+ };
195
+ };
196
+ disabled: {
197
+ true: {
198
+ root: string;
199
+ };
200
+ };
201
+ }, {
202
+ root: string[];
203
+ control: string;
204
+ iconWrap: string;
205
+ body: string;
206
+ label: string;
207
+ description: string;
208
+ }, import('tailwind-variants').TVReturnType<{
209
+ size: {
210
+ sm: {
211
+ root: string;
212
+ label: string;
213
+ description: string;
214
+ };
215
+ md: {
216
+ root: string;
217
+ label: string;
218
+ description: string;
219
+ };
220
+ lg: {
221
+ root: string;
222
+ label: string;
223
+ description: string;
224
+ };
225
+ };
226
+ /**
227
+ * Onde o CONTROLE fica — e só ele.
228
+ *
229
+ * ⚠️ Era `flex-row-reverse` no root, que invertia TODOS os filhos e levava o ícone pra
230
+ * direita junto. O ícone tem de ficar sempre à esquerda: ele identifica a opção (junto do
231
+ * texto), enquanto o controle é a ação. `order-last` move apenas o controle, mantendo
232
+ * ícone → texto na ordem de leitura em qualquer orientação.
233
+ */
234
+ orientation: {
235
+ left: {};
236
+ right: {
237
+ control: string;
238
+ };
239
+ };
240
+ /**
241
+ * O destaque de selecionado vem do **data attribute do controle**, não de prop.
242
+ *
243
+ * ⚠️ A 1ª versão derivava de `checked === true` em JS e o card de **radio nunca
244
+ * destacava** — a seleção do radio mora no `value` do grupo, não numa prop do item, então
245
+ * a condição era falsa por construção. Pego no browser: o item com
246
+ * `data-state="checked"` seguia branco.
247
+ *
248
+ * `has-[[data-state=checked]]` resolve os três tipos de uma vez e funciona também em uso
249
+ * NÃO-CONTROLADO (`defaultValue`/`defaultChecked`), onde nenhuma prop diz o estado. É a
250
+ * L-012: Radix marca estado por data attribute, não por atributo HTML.
251
+ *
252
+ * ⚠️ Quem decide se esta variante entra é o `card-option.tsx`, e o default DEPENDE DO
253
+ * CONTEXTO: em card solto vem do `type`; **em lista vem desligado**, porque a única borda
254
+ * do item ali é a de baixo — a divisória — e pintá-la colore a linha que separa o
255
+ * selecionado do vizinho, não o contorno dele.
256
+ */
257
+ highlight: {
258
+ true: {
259
+ root: string[];
260
+ };
261
+ false: {
262
+ root: string;
263
+ };
264
+ };
265
+ /**
266
+ * Dentro de um grupo `layout="list"`: sem cantos e sem borda em volta — quem desenha o
267
+ * contorno é o grupo. O que sobra é a **linha divisória**, feita pela borda de baixo de
268
+ * cada item, com o último suprimido.
269
+ *
270
+ * ⚠️ A 1ª versão era `border-0` no item + `divide-y` no grupo, e **não desenhava divisória
271
+ * nenhuma**: o `divide-y` funciona pondo `border-top` nos filhos a partir do 2º, e o
272
+ * `border-0` do item zerava justamente essa borda. Medido no browser — `border-top: 0px`
273
+ * nos três itens. Desenhar a borda no próprio item não depende dessa ordem de cascata.
274
+ */
275
+ inList: {
276
+ true: {
277
+ root: string;
278
+ };
279
+ };
280
+ disabled: {
281
+ true: {
282
+ root: string;
283
+ };
284
+ };
285
+ }, {
286
+ root: string[];
287
+ control: string;
288
+ iconWrap: string;
289
+ body: string;
290
+ label: string;
291
+ description: string;
292
+ }, undefined, unknown, unknown, undefined>>;
293
+ /**
294
+ * O container. Guarda a borda e o arredondamento quando `layout="list"`, porque nesse modo
295
+ * os itens não têm os seus.
296
+ */
297
+ export declare const cardOptionGroup: import('tailwind-variants').TVReturnType<{
298
+ layout: {
299
+ spaced: string;
300
+ /**
301
+ * O grupo desenha só o contorno; a divisória entre linhas é a borda de baixo de cada
302
+ * item (ver `inList`). Não usa `divide-y`: ele põe `border-top` nos filhos e brigava
303
+ * com o reset de borda do item.
304
+ *
305
+ * Vale pros TRÊS tipos, não só switch — radio em lista é um seletor de linha única, e
306
+ * checkbox em lista é uma lista de permissões.
307
+ *
308
+ * ⚠️ O `gap-0` é obrigatório e não é redundante: com `type="radio"` o grupo É o
309
+ * `RadioGroup` do DS, que traz `grid w-full gap-gp-xl` no base. Sem declarar gap aqui,
310
+ * o `gap-gp-xl` (12px) sobrevivia e a lista de radio saía com 12px entre as linhas —
311
+ * medido. (A 1ª tentativa foi um `grid-none` que eu inventei; classe inexistente é
312
+ * inerte e não zera nada.)
313
+ */
314
+ list: string;
315
+ };
316
+ size: {
317
+ sm: string;
318
+ md: string;
319
+ lg: string;
320
+ };
321
+ disabled: {
322
+ true: string;
323
+ };
324
+ }, undefined, "flex w-full flex-col", {
325
+ layout: {
326
+ spaced: string;
327
+ /**
328
+ * O grupo desenha só o contorno; a divisória entre linhas é a borda de baixo de cada
329
+ * item (ver `inList`). Não usa `divide-y`: ele põe `border-top` nos filhos e brigava
330
+ * com o reset de borda do item.
331
+ *
332
+ * Vale pros TRÊS tipos, não só switch — radio em lista é um seletor de linha única, e
333
+ * checkbox em lista é uma lista de permissões.
334
+ *
335
+ * ⚠️ O `gap-0` é obrigatório e não é redundante: com `type="radio"` o grupo É o
336
+ * `RadioGroup` do DS, que traz `grid w-full gap-gp-xl` no base. Sem declarar gap aqui,
337
+ * o `gap-gp-xl` (12px) sobrevivia e a lista de radio saía com 12px entre as linhas —
338
+ * medido. (A 1ª tentativa foi um `grid-none` que eu inventei; classe inexistente é
339
+ * inerte e não zera nada.)
340
+ */
341
+ list: string;
342
+ };
343
+ size: {
344
+ sm: string;
345
+ md: string;
346
+ lg: string;
347
+ };
348
+ disabled: {
349
+ true: string;
350
+ };
351
+ }, undefined, import('tailwind-variants').TVReturnType<{
352
+ layout: {
353
+ spaced: string;
354
+ /**
355
+ * O grupo desenha só o contorno; a divisória entre linhas é a borda de baixo de cada
356
+ * item (ver `inList`). Não usa `divide-y`: ele põe `border-top` nos filhos e brigava
357
+ * com o reset de borda do item.
358
+ *
359
+ * Vale pros TRÊS tipos, não só switch — radio em lista é um seletor de linha única, e
360
+ * checkbox em lista é uma lista de permissões.
361
+ *
362
+ * ⚠️ O `gap-0` é obrigatório e não é redundante: com `type="radio"` o grupo É o
363
+ * `RadioGroup` do DS, que traz `grid w-full gap-gp-xl` no base. Sem declarar gap aqui,
364
+ * o `gap-gp-xl` (12px) sobrevivia e a lista de radio saía com 12px entre as linhas —
365
+ * medido. (A 1ª tentativa foi um `grid-none` que eu inventei; classe inexistente é
366
+ * inerte e não zera nada.)
367
+ */
368
+ list: string;
369
+ };
370
+ size: {
371
+ sm: string;
372
+ md: string;
373
+ lg: string;
374
+ };
375
+ disabled: {
376
+ true: string;
377
+ };
378
+ }, undefined, "flex w-full flex-col", unknown, unknown, undefined>>;
379
+ export type CardOptionVariants = VariantProps<typeof cardOption>;
380
+ export type CardOptionGroupVariants = VariantProps<typeof cardOptionGroup>;
381
+ //# sourceMappingURL=card-option.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-option.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/CardOption/card-option.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;IAmCnB;;;;;;;OAOG;;;;;;;IAKH;;;;;;;;;;;;;;;;OAgBG;;;;;;;;;IAcH;;;;;;;;;OASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAnDH;;;;;;;OAOG;;;;;;;IAKH;;;;;;;;;;;;;;;;OAgBG;;;;;;;;;IAcH;;;;;;;;;OASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAnDH;;;;;;;OAOG;;;;;;;IAKH;;;;;;;;;;;;;;;;OAgBG;;;;;;;;;IAcH;;;;;;;;;OASG;;;;;;;;;;;;;;;;;;2CAoCL,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe;;;QAKtB;;;;;;;;;;;;;WAaG;;;;;;;;;;;;;;QAbH;;;;;;;;;;;;;WAaG;;;;;;;;;;;;;;QAbH;;;;;;;;;;;;;WAaG;;;;;;;;;;;mEAsBP,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;AACjE,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { ReactNode } from 'react';
2
+ import { CardOptionVariants } from './card-option.styles';
3
+ /** Qual controle o card embrulha. Ponto de extensão pra tipos futuros. */
4
+ export type CardOptionType = "checkbox" | "radio" | "switch";
5
+ export type CardOptionSize = NonNullable<CardOptionVariants["size"]>;
6
+ /** Lado em que o controle fica. Omitido → derivado do `type`. */
7
+ export type CardOptionOrientation = NonNullable<CardOptionVariants["orientation"]>;
8
+ /** `spaced` = cards separados · `list` = uma lista com divisórias, sem gap. */
9
+ export type CardOptionLayout = "spaced" | "list";
10
+ export interface CardOptionProps {
11
+ /**
12
+ * Controle embrulhado pelo card. Default: herda do grupo, ou `"checkbox"`.
13
+ *
14
+ * ⚠️ `"radio"` exige um `CardOptionGroup` em volta — é ele que vira o `RadioGroup` do
15
+ * Radix e dá navegação por seta + agrupamento por `name`. Checkbox e switch funcionam
16
+ * soltos.
17
+ */
18
+ type?: CardOptionType;
19
+ /** Obrigatório quando `type="radio"` — é o valor que o grupo seleciona. */
20
+ value?: string;
21
+ size?: CardOptionSize;
22
+ /**
23
+ * Lado do controle. **Omita**: o default deriva do `type` — `left` pra checkbox/radio,
24
+ * `right` pro switch (convenção de linha de configuração).
25
+ */
26
+ orientation?: CardOptionOrientation;
27
+ /**
28
+ * Pinta o card quando selecionado — fundo (`bg-success-muted`) + borda (`border-brand`).
29
+ *
30
+ * **Omita**: o default deriva do contexto.
31
+ * - card solto → do `type`: ligado em checkbox/radio, desligado no switch (switch é estado,
32
+ * não seleção — lista de settings toda verde é ruído);
33
+ * - dentro de `layout="list"` → **desligado**, inclusive pra checkbox e radio: em lista a
34
+ * única borda do item é a de baixo, a **divisória**, então a cor não contorna o
35
+ * selecionado, pinta a linha que o separa do vizinho.
36
+ *
37
+ * Ligue explicitamente (aqui ou no grupo) se quiser a linha pintada em lista.
38
+ */
39
+ highlightSelected?: boolean;
40
+ label: ReactNode;
41
+ description?: ReactNode;
42
+ /** Ícone entre o controle e o texto. */
43
+ icon?: ReactNode;
44
+ /** Controlado. No `radio`, quem manda é o `value` do grupo. */
45
+ checked?: boolean;
46
+ /** Não-controlado. Funciona com o destaque, porque ele vem do data-state e não de prop. */
47
+ defaultChecked?: boolean;
48
+ onCheckedChange?: (checked: boolean) => void;
49
+ disabled?: boolean;
50
+ /** id do controle — gerado se omitido (o `<label htmlFor>` precisa dele). */
51
+ id?: string;
52
+ className?: string;
53
+ }
54
+ export interface CardOptionGroupProps {
55
+ /** Aplicado a todos os filhos. `radio` faz o grupo virar `RadioGroup` do Radix. */
56
+ type?: CardOptionType;
57
+ size?: CardOptionSize;
58
+ orientation?: CardOptionOrientation;
59
+ layout?: CardOptionLayout;
60
+ /**
61
+ * Liga/desliga o destaque de selecionado (fundo + cor de borda) em todos os filhos de uma
62
+ * vez. Omitido → cada item usa o default do contexto (ver `CardOptionProps`); em
63
+ * `layout="list"` esse default é **desligado**, e é aqui que se liga.
64
+ */
65
+ highlightSelected?: boolean;
66
+ /** Só `type="radio"`: valor selecionado (controlado). */
67
+ value?: string;
68
+ defaultValue?: string;
69
+ onValueChange?: (value: string) => void;
70
+ /** Só `type="radio"`: nome do campo no submit nativo. */
71
+ name?: string;
72
+ disabled?: boolean;
73
+ children?: ReactNode;
74
+ className?: string;
75
+ }
76
+ //# sourceMappingURL=card-option.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-option.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/CardOption/card-option.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAErE,iEAAiE;AACjE,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC;AAEnF,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wCAAwC;IACxC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2FAA2F;IAC3F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,mFAAmF;IACnF,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,4 @@
1
+ export { CardOption, CardOptionGroup } from './card-option';
2
+ export { cardOption, cardOptionGroup } from './card-option.styles';
3
+ export type { CardOptionProps, CardOptionGroupProps, CardOptionType, CardOptionSize, CardOptionOrientation, CardOptionLayout, } from './card-option.types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/CardOption/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACnE,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC"}
@@ -21,6 +21,12 @@ import { VariantProps } from '../../../utils/tv';
21
21
  */
22
22
  export declare const colorPickerStyles: import('tailwind-variants').TVReturnType<{
23
23
  size: {
24
+ xxs: {
25
+ swatch: string;
26
+ };
27
+ xs: {
28
+ swatch: string;
29
+ };
24
30
  sm: {
25
31
  swatch: string;
26
32
  };
@@ -58,6 +64,12 @@ export declare const colorPickerStyles: import('tailwind-variants').TVReturnType
58
64
  customRow: string;
59
65
  }, undefined, {
60
66
  size: {
67
+ xxs: {
68
+ swatch: string;
69
+ };
70
+ xs: {
71
+ swatch: string;
72
+ };
61
73
  sm: {
62
74
  swatch: string;
63
75
  };
@@ -95,6 +107,12 @@ export declare const colorPickerStyles: import('tailwind-variants').TVReturnType
95
107
  customRow: string;
96
108
  }, import('tailwind-variants').TVReturnType<{
97
109
  size: {
110
+ xxs: {
111
+ swatch: string;
112
+ };
113
+ xs: {
114
+ swatch: string;
115
+ };
98
116
  sm: {
99
117
  swatch: string;
100
118
  };
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/ColorPicker/color-picker.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAmD5B,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"color-picker.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/ColorPicker/color-picker.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAwD5B,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -17,7 +17,10 @@ export interface ColorPickerProps {
17
17
  id?: string;
18
18
  /** Estado semântico — colore SÓ a borda do trigger swatch. Default `"default"`. */
19
19
  state?: ColorPickerState;
20
- /** Tamanho do trigger. `sm` = form-md (36px) · `md` = form-lg (40px, default). */
20
+ /**
21
+ * Tamanho do trigger — **mesma escala do `Input`**, e repassado a ele:
22
+ * `xxs` 28px · `xs` 32px · `sm` 36px · `md` 40px (default).
23
+ */
21
24
  size?: ColorPickerSize;
22
25
  /** Desabilita o seletor inteiro. */
23
26
  disabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/ColorPicker/color-picker.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7E,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6DAA6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,kFAAkF;IAClF,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"color-picker.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/ColorPicker/color-picker.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7E,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6DAA6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snksergio/design-system",
3
- "version": "0.48.0",
3
+ "version": "0.50.0",
4
4
  "//distribuicao": "Canal PRIMARIO = registry shadcn (copy-in) + CLI @snksergio/create-design-system; sobe sozinho no merge (Vercel). Canal SECUNDARIO = este pacote npm (@snksergio/design-system), publicado por passo MANUAL do mantenedor, entao costuma ficar atras do registry. SECUNDARIO descreve a ORDEM DE PUBLICACAO, nao o nivel de suporte: NAO e depreciado, e desde a 0.37.0 entrega 41 dos 42 componentes ui/ no barrel raiz + os 41 primitivos shadcn no subpath ./shadcn (so TabelaTeste, demo interno, fica de fora). Publish so pelo Passo 7 do .claude/skills/ds-dev/release.md (valida com `npm run lib:verify`, pede o token, publica, revoga). Ver DISTRIBUICAO.md.",
5
5
  "description": "iGreen Design System — internal library for SaaS CRM, admin panels and dashboards. React 19 + Tailwind v4 + Shadcn + Radix.",
6
6
  "license": "UNLICENSED",