@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.
- package/README.md +1 -1
- package/dist-lib/chunks/{panel-57Pt_bL9.cjs → panel-Bly-rNP9.cjs} +2 -2
- package/dist-lib/chunks/{panel-57Pt_bL9.cjs.map → panel-Bly-rNP9.cjs.map} +1 -1
- package/dist-lib/chunks/{panel-DlZeQw7G.mjs → panel-DA6K3a3n.mjs} +2 -2
- package/dist-lib/chunks/{panel-DlZeQw7G.mjs.map → panel-DA6K3a3n.mjs.map} +1 -1
- package/dist-lib/chunks/{sheet-7v5vamnP.mjs → sheet-DIpYkRYS.mjs} +32 -32
- package/dist-lib/chunks/{sheet-7v5vamnP.mjs.map → sheet-DIpYkRYS.mjs.map} +1 -1
- package/dist-lib/chunks/{sheet-BZlQ0gKA.cjs → sheet-rg6uupt1.cjs} +33 -33
- package/dist-lib/chunks/{sheet-BZlQ0gKA.cjs.map → sheet-rg6uupt1.cjs.map} +1 -1
- package/dist-lib/chunks/{toggle-group-DYGba7RP.cjs → toggle-group-C9rrkkmh.cjs} +159 -52
- package/dist-lib/chunks/toggle-group-C9rrkkmh.cjs.map +1 -0
- package/dist-lib/chunks/{toggle-group-CnAN6ZnT.mjs → toggle-group-mXbG8_Jm.mjs} +237 -130
- package/dist-lib/chunks/toggle-group-mXbG8_Jm.mjs.map +1 -0
- package/dist-lib/index.cjs +303 -45
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.mjs +308 -50
- package/dist-lib/index.mjs.map +1 -1
- package/dist-lib/preview/clientes.cjs +2 -2
- package/dist-lib/preview/clientes.mjs +2 -2
- package/dist-lib/shadcn.cjs +3 -2
- package/dist-lib/shadcn.cjs.map +1 -1
- package/dist-lib/shadcn.mjs +82 -81
- package/dist-lib/src/components/index.d.ts +1 -0
- package/dist-lib/src/components/index.d.ts.map +1 -1
- package/dist-lib/src/components/shadcn/carousel.d.ts +28 -1
- package/dist-lib/src/components/shadcn/carousel.d.ts.map +1 -1
- package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.d.ts +30 -31
- package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.d.ts.map +1 -1
- package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.styles.d.ts +5 -0
- package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/CardOption/card-option.d.ts +27 -0
- package/dist-lib/src/components/ui/CardOption/card-option.d.ts.map +1 -0
- package/dist-lib/src/components/ui/CardOption/card-option.styles.d.ts +381 -0
- package/dist-lib/src/components/ui/CardOption/card-option.styles.d.ts.map +1 -0
- package/dist-lib/src/components/ui/CardOption/card-option.types.d.ts +76 -0
- package/dist-lib/src/components/ui/CardOption/card-option.types.d.ts.map +1 -0
- package/dist-lib/src/components/ui/CardOption/index.d.ts +4 -0
- package/dist-lib/src/components/ui/CardOption/index.d.ts.map +1 -0
- package/dist-lib/src/components/ui/ColorPicker/color-picker.styles.d.ts +18 -0
- package/dist-lib/src/components/ui/ColorPicker/color-picker.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/ColorPicker/color-picker.types.d.ts +4 -1
- package/dist-lib/src/components/ui/ColorPicker/color-picker.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist-lib/chunks/toggle-group-CnAN6ZnT.mjs.map +0 -1
- 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
|
|
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
|
-
/**
|
|
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
|
|
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.
|
|
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",
|