@snksergio/design-system 0.49.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 (38) 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-DkCrzjfE.cjs → toggle-group-C9rrkkmh.cjs} +38 -38
  11. package/dist-lib/chunks/toggle-group-C9rrkkmh.cjs.map +1 -0
  12. package/dist-lib/chunks/{toggle-group-C3srOzNZ.mjs → toggle-group-mXbG8_Jm.mjs} +37 -37
  13. package/dist-lib/chunks/toggle-group-mXbG8_Jm.mjs.map +1 -0
  14. package/dist-lib/index.cjs +298 -45
  15. package/dist-lib/index.cjs.map +1 -1
  16. package/dist-lib/index.mjs +302 -49
  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 +2 -2
  21. package/dist-lib/shadcn.mjs +2 -2
  22. package/dist-lib/src/components/index.d.ts +1 -0
  23. package/dist-lib/src/components/index.d.ts.map +1 -1
  24. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.d.ts +30 -31
  25. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.d.ts.map +1 -1
  26. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.styles.d.ts +5 -0
  27. package/dist-lib/src/components/ui/CardCheckbox/card-checkbox.styles.d.ts.map +1 -1
  28. package/dist-lib/src/components/ui/CardOption/card-option.d.ts +27 -0
  29. package/dist-lib/src/components/ui/CardOption/card-option.d.ts.map +1 -0
  30. package/dist-lib/src/components/ui/CardOption/card-option.styles.d.ts +381 -0
  31. package/dist-lib/src/components/ui/CardOption/card-option.styles.d.ts.map +1 -0
  32. package/dist-lib/src/components/ui/CardOption/card-option.types.d.ts +76 -0
  33. package/dist-lib/src/components/ui/CardOption/card-option.types.d.ts.map +1 -0
  34. package/dist-lib/src/components/ui/CardOption/index.d.ts +4 -0
  35. package/dist-lib/src/components/ui/CardOption/index.d.ts.map +1 -0
  36. package/package.json +1 -1
  37. package/dist-lib/chunks/toggle-group-C3srOzNZ.mjs.map +0 -1
  38. package/dist-lib/chunks/toggle-group-DkCrzjfE.cjs.map +0 -1
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const panel = require("./chunks/panel-57Pt_bL9.cjs");
3
+ const panel = require("./chunks/panel-Bly-rNP9.cjs");
4
4
  const useTheme = require("./chunks/useTheme-Dh3POjCr.cjs");
5
5
  const avatar = require("./chunks/avatar-DAmZ7fBZ.cjs");
6
6
  const jsxRuntime = require("react/jsx-runtime");
7
7
  const React = require("react");
8
- const sheet = require("./chunks/sheet-BZlQ0gKA.cjs");
8
+ const sheet = require("./chunks/sheet-rg6uupt1.cjs");
9
+ const toggleGroup = require("./chunks/toggle-group-C9rrkkmh.cjs");
9
10
  const lucideReact = require("lucide-react");
10
- const toggleGroup = require("./chunks/toggle-group-DkCrzjfE.cjs");
11
11
  const input = require("./chunks/input-Ci_2-5Te.cjs");
12
12
  const kpiDelta = require("./chunks/kpi-delta-1-gsPFvU.cjs");
13
13
  const pageHeader = require("./chunks/page-header-DrKDiVFN.cjs");
@@ -36,76 +36,325 @@ function _interopNamespaceDefault(e) {
36
36
  }
37
37
  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
38
38
  const RechartsPrimitive__namespace = /* @__PURE__ */ _interopNamespaceDefault(RechartsPrimitive);
39
- const cardCheckbox = avatar.tv({
39
+ const cardOption = avatar.tv({
40
40
  slots: {
41
41
  root: [
42
- "flex items-center gap-gp-lg w-full",
43
- "p-pad-xl rounded-radius-lg border text-left cursor-pointer",
42
+ "flex w-full items-center",
43
+ "border text-left cursor-pointer",
44
44
  "transition-[border-color,background-color,box-shadow] duration-150",
45
- "focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-brand"
45
+ // O anel é do CARD, disparado pelo foco do controle dentro dele.
46
+ "has-[:focus-visible]:ring-4 has-[:focus-visible]:ring-ring-brand"
46
47
  ],
47
- body: "flex flex-col flex-1 min-w-0 gap-gp-2xs",
48
- label: "text-body-sm font-semibold text-fg-default leading-tight truncate",
49
- description: "text-caption-md text-fg-muted"
48
+ control: "shrink-0",
49
+ // Piso de 20px nos dois eixos: ícone menor que isso não se lê ao lado de um texto de
50
+ // 13px, e o `place-items-center` mantém centrado quando o conteúdo é menor que a caixa.
51
+ iconWrap: "grid shrink-0 place-items-center min-h-comp-2xs min-w-comp-2xs",
52
+ body: "flex min-w-0 flex-1 flex-col gap-gp-2xs",
53
+ label: "truncate font-semibold leading-tight text-fg-default",
54
+ description: "text-fg-muted"
50
55
  },
51
56
  variants: {
52
- selected: {
53
- true: { root: "border-border-brand bg-bg-success-muted shadow-sh-sm" },
57
+ size: {
58
+ sm: {
59
+ root: "p-pad-md gap-gp-md rounded-radius-md",
60
+ label: "text-body-sm",
61
+ description: "text-caption-sm"
62
+ },
63
+ md: {
64
+ root: "p-pad-xl gap-gp-lg rounded-radius-lg",
65
+ label: "text-body-sm",
66
+ description: "text-caption-md"
67
+ },
68
+ lg: {
69
+ root: "p-pad-2xl gap-gp-xl rounded-radius-xl",
70
+ label: "text-body-md",
71
+ description: "text-caption-md"
72
+ }
73
+ },
74
+ /**
75
+ * Onde o CONTROLE fica — e só ele.
76
+ *
77
+ * ⚠️ Era `flex-row-reverse` no root, que invertia TODOS os filhos e levava o ícone pra
78
+ * direita junto. O ícone tem de ficar sempre à esquerda: ele identifica a opção (junto do
79
+ * texto), enquanto o controle é a ação. `order-last` move apenas o controle, mantendo
80
+ * ícone → texto na ordem de leitura em qualquer orientação.
81
+ */
82
+ orientation: {
83
+ left: {},
84
+ right: { control: "order-last" }
85
+ },
86
+ /**
87
+ * O destaque de selecionado vem do **data attribute do controle**, não de prop.
88
+ *
89
+ * ⚠️ A 1ª versão derivava de `checked === true` em JS e o card de **radio nunca
90
+ * destacava** — a seleção do radio mora no `value` do grupo, não numa prop do item, então
91
+ * a condição era falsa por construção. Pego no browser: o item com
92
+ * `data-state="checked"` seguia branco.
93
+ *
94
+ * `has-[[data-state=checked]]` resolve os três tipos de uma vez e funciona também em uso
95
+ * NÃO-CONTROLADO (`defaultValue`/`defaultChecked`), onde nenhuma prop diz o estado. É a
96
+ * L-012: Radix marca estado por data attribute, não por atributo HTML.
97
+ *
98
+ * ⚠️ Quem decide se esta variante entra é o `card-option.tsx`, e o default DEPENDE DO
99
+ * CONTEXTO: em card solto vem do `type`; **em lista vem desligado**, porque a única borda
100
+ * do item ali é a de baixo — a divisória — e pintá-la colore a linha que separa o
101
+ * selecionado do vizinho, não o contorno dele.
102
+ */
103
+ highlight: {
104
+ true: {
105
+ root: [
106
+ "border-border-default bg-bg-surface hover:border-border-input hover:bg-bg-muted",
107
+ "has-[[data-state=checked]]:border-border-brand",
108
+ "has-[[data-state=checked]]:bg-bg-success-muted",
109
+ "has-[[data-state=checked]]:shadow-sh-sm"
110
+ ]
111
+ },
54
112
  false: {
55
113
  root: "border-border-default bg-bg-surface hover:border-border-input hover:bg-bg-muted"
56
114
  }
57
115
  },
116
+ /**
117
+ * Dentro de um grupo `layout="list"`: sem cantos e sem borda em volta — quem desenha o
118
+ * contorno é o grupo. O que sobra é a **linha divisória**, feita pela borda de baixo de
119
+ * cada item, com o último suprimido.
120
+ *
121
+ * ⚠️ A 1ª versão era `border-0` no item + `divide-y` no grupo, e **não desenhava divisória
122
+ * nenhuma**: o `divide-y` funciona pondo `border-top` nos filhos a partir do 2º, e o
123
+ * `border-0` do item zerava justamente essa borda. Medido no browser — `border-top: 0px`
124
+ * nos três itens. Desenhar a borda no próprio item não depende dessa ordem de cascata.
125
+ */
126
+ inList: {
127
+ true: {
128
+ root: "rounded-radius-none border-x-0 border-t-0 border-b last:border-b-0"
129
+ }
130
+ },
58
131
  disabled: {
132
+ // Não existe token bg/border de disabled no DS — o padrão é opacidade.
59
133
  true: { root: "opacity-50 cursor-not-allowed pointer-events-none" }
60
134
  }
61
135
  },
136
+ compoundVariants: [
137
+ /**
138
+ * Em LISTA com destaque ligado, a sombra sai.
139
+ *
140
+ * `shadow-sh-sm` num card solto o levanta da página; numa linha de lista ele vaza por
141
+ * cima da linha vizinha e some atrás do `overflow-hidden` do grupo — sombra dentro de
142
+ * caixa cortada é ruído, não elevação. Fundo e cor de borda continuam (é justamente o que
143
+ * o `highlightSelected` promete); só a elevação não faz sentido aqui.
144
+ */
145
+ {
146
+ inList: true,
147
+ highlight: true,
148
+ class: { root: "has-[[data-state=checked]]:shadow-sh-none" }
149
+ },
150
+ // disabled SEMPRE por último (L-006), senão as classes de selected/hover o sobrescrevem
151
+ {
152
+ disabled: true,
153
+ class: { root: "border-border-default bg-bg-surface hover:bg-bg-surface" }
154
+ }
155
+ ],
62
156
  defaultVariants: {
63
- selected: false
157
+ size: "md",
158
+ orientation: "left",
159
+ highlight: true
64
160
  }
65
161
  });
66
- const CardCheckbox = React.forwardRef(
67
- ({
162
+ const cardOptionGroup = avatar.tv({
163
+ base: "flex w-full flex-col",
164
+ variants: {
165
+ layout: {
166
+ spaced: "gap-gp-lg",
167
+ /**
168
+ * O grupo desenha só o contorno; a divisória entre linhas é a borda de baixo de cada
169
+ * item (ver `inList`). Não usa `divide-y`: ele põe `border-top` nos filhos e brigava
170
+ * com o reset de borda do item.
171
+ *
172
+ * Vale pros TRÊS tipos, não só switch — radio em lista é um seletor de linha única, e
173
+ * checkbox em lista é uma lista de permissões.
174
+ *
175
+ * ⚠️ O `gap-0` é obrigatório e não é redundante: com `type="radio"` o grupo É o
176
+ * `RadioGroup` do DS, que traz `grid w-full gap-gp-xl` no base. Sem declarar gap aqui,
177
+ * o `gap-gp-xl` (12px) sobrevivia e a lista de radio saía com 12px entre as linhas —
178
+ * medido. (A 1ª tentativa foi um `grid-none` que eu inventei; classe inexistente é
179
+ * inerte e não zera nada.)
180
+ */
181
+ list: "gap-0 overflow-hidden border border-border-default"
182
+ },
183
+ size: {
184
+ // O radius do grupo acompanha o do item, senão o canto da lista destoa do card solto.
185
+ sm: "",
186
+ md: "",
187
+ lg: ""
188
+ },
189
+ disabled: {
190
+ true: "opacity-50 pointer-events-none"
191
+ }
192
+ },
193
+ compoundVariants: [
194
+ { layout: "list", size: "sm", class: "rounded-radius-md" },
195
+ { layout: "list", size: "md", class: "rounded-radius-lg" },
196
+ { layout: "list", size: "lg", class: "rounded-radius-xl" }
197
+ ],
198
+ defaultVariants: {
199
+ layout: "spaced",
200
+ size: "md"
201
+ }
202
+ });
203
+ const PADRAO_POR_TIPO = {
204
+ checkbox: { orientation: "left", highlightSelected: true },
205
+ radio: { orientation: "left", highlightSelected: true },
206
+ switch: { orientation: "right", highlightSelected: false }
207
+ };
208
+ const CardOptionCtx = React.createContext(null);
209
+ const CardOptionGroup = React.forwardRef(
210
+ function CardOptionGroup2({
211
+ type = "checkbox",
212
+ size = "md",
213
+ orientation,
214
+ layout = "spaced",
215
+ highlightSelected,
216
+ value,
217
+ defaultValue,
218
+ onValueChange,
219
+ name,
220
+ disabled,
221
+ children,
222
+ className,
223
+ ...rest
224
+ }, ref) {
225
+ const classes = cardOptionGroup({ layout, size, disabled: disabled ? true : void 0 });
226
+ const ctx = { type, size, orientation, layout, highlightSelected, disabled };
227
+ if (type === "radio") {
228
+ return /* @__PURE__ */ jsxRuntime.jsx(CardOptionCtx.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx(
229
+ toggleGroup.RadioGroup,
230
+ {
231
+ ref,
232
+ value,
233
+ defaultValue,
234
+ onValueChange,
235
+ name,
236
+ disabled,
237
+ className: avatar.cn(classes, className),
238
+ ...rest,
239
+ children
240
+ }
241
+ ) });
242
+ }
243
+ return /* @__PURE__ */ jsxRuntime.jsx(CardOptionCtx.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: avatar.cn(classes, className), ...rest, children }) });
244
+ }
245
+ );
246
+ const CardOption = React.forwardRef(
247
+ function CardOption2({
248
+ type: typeProp,
249
+ value,
250
+ size: sizeProp,
251
+ orientation: orientationProp,
252
+ highlightSelected: highlightProp,
68
253
  label,
69
254
  description: description2,
70
255
  icon,
71
256
  checked,
72
- disabled,
257
+ defaultChecked,
258
+ onCheckedChange,
259
+ disabled: disabledProp,
260
+ id: idProp,
73
261
  className,
74
- ...checkboxProps
75
- }, ref) => {
262
+ ...rest
263
+ }, ref) {
264
+ const ctx = React.useContext(CardOptionCtx);
76
265
  const autoId = React.useId();
77
- const isSelected = checked === true;
78
- const styles2 = cardCheckbox({
79
- selected: isSelected,
266
+ const id = idProp ?? autoId;
267
+ const type = typeProp ?? ctx?.type ?? "checkbox";
268
+ const size = sizeProp ?? ctx?.size ?? "md";
269
+ const disabled = disabledProp ?? ctx?.disabled;
270
+ const padroes = PADRAO_POR_TIPO[type];
271
+ const orientation = orientationProp ?? ctx?.orientation ?? padroes.orientation;
272
+ const emLista = ctx?.layout === "list";
273
+ const highlight = highlightProp ?? ctx?.highlightSelected ?? (emLista ? false : padroes.highlightSelected);
274
+ const styles2 = cardOption({
275
+ size,
276
+ orientation,
277
+ highlight,
278
+ inList: emLista ? true : void 0,
80
279
  disabled: disabled ? true : void 0
81
280
  });
82
- return /* @__PURE__ */ jsxRuntime.jsxs(
83
- "label",
281
+ const controle = type === "radio" ? /* @__PURE__ */ jsxRuntime.jsx(
282
+ toggleGroup.RadioGroupItem,
84
283
  {
85
- htmlFor: autoId,
86
- className: [styles2.root(), className].filter(Boolean).join(" "),
87
- children: [
88
- /* @__PURE__ */ jsxRuntime.jsx(
89
- sheet.Checkbox,
90
- {
91
- ref,
92
- id: autoId,
93
- checked,
94
- disabled,
95
- ...checkboxProps
96
- }
97
- ),
98
- icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "grid place-items-center shrink-0", "aria-hidden": "true", children: icon }),
99
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles2.body(), children: [
100
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.label(), children: label }),
101
- description2 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.description(), children: description2 })
102
- ] })
103
- ]
284
+ ref,
285
+ id,
286
+ value: value ?? "",
287
+ disabled,
288
+ className: styles2.control(),
289
+ ...rest
290
+ }
291
+ ) : type === "switch" ? /* @__PURE__ */ jsxRuntime.jsx(
292
+ sheet.Switch,
293
+ {
294
+ ref,
295
+ id,
296
+ checked,
297
+ defaultChecked,
298
+ onCheckedChange,
299
+ disabled,
300
+ className: styles2.control(),
301
+ ...rest
302
+ }
303
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
304
+ sheet.Checkbox,
305
+ {
306
+ ref,
307
+ id,
308
+ checked,
309
+ defaultChecked,
310
+ onCheckedChange,
311
+ disabled,
312
+ className: styles2.control(),
313
+ ...rest
104
314
  }
105
315
  );
316
+ return /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: id, className: avatar.cn(styles2.root(), className), children: [
317
+ controle,
318
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.iconWrap(), "aria-hidden": "true", children: icon }),
319
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles2.body(), children: [
320
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.label(), children: label }),
321
+ description2 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.description(), children: description2 })
322
+ ] })
323
+ ] });
106
324
  }
107
325
  );
108
- CardCheckbox.displayName = "CardCheckbox";
326
+ const CardCheckbox = React.forwardRef(
327
+ function CardCheckbox2(props, ref) {
328
+ return /* @__PURE__ */ jsxRuntime.jsx(CardOption, { ref, type: "checkbox", ...props });
329
+ }
330
+ );
331
+ const cardCheckbox = avatar.tv({
332
+ slots: {
333
+ root: [
334
+ "flex items-center gap-gp-lg w-full",
335
+ "p-pad-xl rounded-radius-lg border text-left cursor-pointer",
336
+ "transition-[border-color,background-color,box-shadow] duration-150",
337
+ "focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-brand"
338
+ ],
339
+ body: "flex flex-col flex-1 min-w-0 gap-gp-2xs",
340
+ label: "text-body-sm font-semibold text-fg-default leading-tight truncate",
341
+ description: "text-caption-md text-fg-muted"
342
+ },
343
+ variants: {
344
+ selected: {
345
+ true: { root: "border-border-brand bg-bg-success-muted shadow-sh-sm" },
346
+ false: {
347
+ root: "border-border-default bg-bg-surface hover:border-border-input hover:bg-bg-muted"
348
+ }
349
+ },
350
+ disabled: {
351
+ true: { root: "opacity-50 cursor-not-allowed pointer-events-none" }
352
+ }
353
+ },
354
+ defaultVariants: {
355
+ selected: false
356
+ }
357
+ });
109
358
  const colorPickerStyles = avatar.tv({
110
359
  slots: {
111
360
  root: "inline-flex w-full items-center gap-gp-md",
@@ -8175,12 +8424,12 @@ exports.PanelCloseAction = sheet.SheetClose;
8175
8424
  exports.PanelContent = sheet.SheetContent;
8176
8425
  exports.PanelRoot = sheet.Sheet;
8177
8426
  exports.PanelTrigger = sheet.SheetTrigger;
8427
+ exports.Badge = toggleGroup.Badge;
8428
+ exports.badgeVariants = toggleGroup.badgeVariants;
8178
8429
  Object.defineProperty(exports, "MessageReplyIcon", {
8179
8430
  enumerable: true,
8180
8431
  get: () => lucideReact.Reply
8181
8432
  });
8182
- exports.Badge = toggleGroup.Badge;
8183
- exports.badgeVariants = toggleGroup.badgeVariants;
8184
8433
  exports.Input = input.Input;
8185
8434
  exports.inputVariants = input.inputVariants;
8186
8435
  exports.Kpi = kpiDelta.Kpi;
@@ -8190,6 +8439,8 @@ exports.PageHeader = pageHeader.PageHeader;
8190
8439
  exports.pageHeaderStyles = pageHeader.pageHeaderStyles;
8191
8440
  exports.BRANDS = BRANDS;
8192
8441
  exports.CardCheckbox = CardCheckbox;
8442
+ exports.CardOption = CardOption;
8443
+ exports.CardOptionGroup = CardOptionGroup;
8193
8444
  exports.ChartContainer = ChartContainer;
8194
8445
  exports.ChartLegend = ChartLegend;
8195
8446
  exports.ChartLegendContent = ChartLegendContent;
@@ -8223,6 +8474,8 @@ exports.ToolbarMobileSection = ToolbarMobileSection;
8223
8474
  exports.ToolbarMobileSheet = ToolbarMobileSheet;
8224
8475
  exports.actionColumn = actionColumn;
8225
8476
  exports.cardCheckbox = cardCheckbox;
8477
+ exports.cardOption = cardOption;
8478
+ exports.cardOptionGroup = cardOptionGroup;
8226
8479
  exports.colorPickerStyles = colorPickerStyles;
8227
8480
  exports.conversationListItemStyles = conversationListItemStyles;
8228
8481
  exports.currencyColumn = currencyColumn;