czero 0.1.0 → 2.0.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 (114) hide show
  1. package/README.md +40 -0
  2. package/dist/cli/index.js +3780 -28
  3. package/dist/cli-new/cli/build-css.d.ts +19 -0
  4. package/dist/cli-new/cli/build-css.js +88 -0
  5. package/dist/cli-new/cli/generators/button.d.ts +9 -0
  6. package/dist/cli-new/cli/generators/button.js +224 -0
  7. package/dist/cli-new/cli/generators/card.d.ts +9 -0
  8. package/dist/cli-new/cli/generators/card.js +104 -0
  9. package/dist/cli-new/cli/generators/checkbox.d.ts +6 -0
  10. package/dist/cli-new/cli/generators/checkbox.js +163 -0
  11. package/dist/cli-new/cli/generators/index.d.ts +10 -0
  12. package/dist/cli-new/cli/generators/index.js +40 -0
  13. package/dist/cli-new/cli/generators/input.d.ts +9 -0
  14. package/dist/cli-new/cli/generators/input.js +231 -0
  15. package/dist/cli-new/cli/generators/switch.d.ts +6 -0
  16. package/dist/cli-new/cli/generators/switch.js +156 -0
  17. package/dist/cli-new/cli/generators/utilities.d.ts +9 -0
  18. package/dist/cli-new/cli/generators/utilities.js +150 -0
  19. package/dist/cli-new/cli/index.d.ts +8 -0
  20. package/dist/cli-new/cli/index.js +288 -0
  21. package/dist/cli-new/cli/token-resolver.d.ts +44 -0
  22. package/dist/cli-new/cli/token-resolver.js +137 -0
  23. package/dist/cli-new/cli/utils/deep-merge.d.ts +15 -0
  24. package/dist/cli-new/cli/utils/deep-merge.js +41 -0
  25. package/dist/cli-new/cli/validate-config.d.ts +19 -0
  26. package/dist/cli-new/cli/validate-config.js +151 -0
  27. package/dist/cli-new/src/core/component-defaults.d.ts +7 -0
  28. package/dist/cli-new/src/core/component-defaults.js +467 -0
  29. package/dist/cli-new/src/core/types/config.d.ts +489 -0
  30. package/dist/cli-new/src/core/types/config.js +5 -0
  31. package/dist/cli-new/src/presets/index.d.ts +44 -0
  32. package/dist/cli-new/src/presets/index.js +194 -0
  33. package/dist/components.css +1579 -2
  34. package/dist/react/core/component-defaults.d.ts +8 -0
  35. package/dist/react/core/component-defaults.d.ts.map +1 -0
  36. package/dist/react/core/types/config.d.ts +490 -0
  37. package/dist/react/core/types/config.d.ts.map +1 -0
  38. package/dist/react/index.cjs +11577 -17
  39. package/dist/react/index.cjs.map +1 -1
  40. package/dist/react/index.d.ts +407 -4
  41. package/dist/react/index.js +11532 -6
  42. package/dist/react/index.js.map +1 -1
  43. package/dist/react/presets/index.d.ts +45 -0
  44. package/dist/react/presets/index.d.ts.map +1 -0
  45. package/dist/react/react/components/accordion.d.ts +30 -0
  46. package/dist/react/react/components/accordion.d.ts.map +1 -0
  47. package/dist/react/react/components/alert.d.ts +7 -0
  48. package/dist/react/react/components/alert.d.ts.map +1 -0
  49. package/dist/react/react/components/aspect-ratio.d.ts +8 -0
  50. package/dist/react/react/components/aspect-ratio.d.ts.map +1 -0
  51. package/dist/react/react/components/avatar.d.ts +10 -0
  52. package/dist/react/react/components/avatar.d.ts.map +1 -0
  53. package/dist/react/react/components/breadcrumb.d.ts +28 -0
  54. package/dist/react/react/components/breadcrumb.d.ts.map +1 -0
  55. package/dist/react/react/components/button.d.ts +3 -2
  56. package/dist/react/react/components/button.d.ts.map +1 -1
  57. package/dist/react/react/components/checkbox.d.ts +9 -0
  58. package/dist/react/react/components/checkbox.d.ts.map +1 -0
  59. package/dist/react/react/components/code.d.ts +6 -0
  60. package/dist/react/react/components/code.d.ts.map +1 -0
  61. package/dist/react/react/components/container.d.ts +8 -0
  62. package/dist/react/react/components/container.d.ts.map +1 -0
  63. package/dist/react/react/components/dialog.d.ts +28 -0
  64. package/dist/react/react/components/dialog.d.ts.map +1 -0
  65. package/dist/react/react/components/dropdown-menu.d.ts +32 -0
  66. package/dist/react/react/components/dropdown-menu.d.ts.map +1 -0
  67. package/dist/react/react/components/grid.d.ts +8 -0
  68. package/dist/react/react/components/grid.d.ts.map +1 -0
  69. package/dist/react/react/components/input.d.ts +4 -0
  70. package/dist/react/react/components/input.d.ts.map +1 -1
  71. package/dist/react/react/components/kbd.d.ts +6 -0
  72. package/dist/react/react/components/kbd.d.ts.map +1 -0
  73. package/dist/react/react/components/label.d.ts +7 -0
  74. package/dist/react/react/components/label.d.ts.map +1 -0
  75. package/dist/react/react/components/progress.d.ts +10 -0
  76. package/dist/react/react/components/progress.d.ts.map +1 -0
  77. package/dist/react/react/components/radio-group.d.ts +15 -0
  78. package/dist/react/react/components/radio-group.d.ts.map +1 -0
  79. package/dist/react/react/components/scroll-area.d.ts +8 -0
  80. package/dist/react/react/components/scroll-area.d.ts.map +1 -0
  81. package/dist/react/react/components/select.d.ts +29 -0
  82. package/dist/react/react/components/select.d.ts.map +1 -0
  83. package/dist/react/react/components/separator.d.ts +8 -0
  84. package/dist/react/react/components/separator.d.ts.map +1 -0
  85. package/dist/react/react/components/skeleton.d.ts +8 -0
  86. package/dist/react/react/components/skeleton.d.ts.map +1 -0
  87. package/dist/react/react/components/spinner.d.ts +7 -0
  88. package/dist/react/react/components/spinner.d.ts.map +1 -0
  89. package/dist/react/react/components/stack.d.ts +11 -0
  90. package/dist/react/react/components/stack.d.ts.map +1 -0
  91. package/dist/react/react/components/switch.d.ts +10 -0
  92. package/dist/react/react/components/switch.d.ts.map +1 -0
  93. package/dist/react/react/components/table.d.ts +27 -0
  94. package/dist/react/react/components/table.d.ts.map +1 -0
  95. package/dist/react/react/components/tabs.d.ts +21 -0
  96. package/dist/react/react/components/tabs.d.ts.map +1 -0
  97. package/dist/react/react/components/tag.d.ts +10 -0
  98. package/dist/react/react/components/tag.d.ts.map +1 -0
  99. package/dist/react/react/components/textarea.d.ts +11 -0
  100. package/dist/react/react/components/textarea.d.ts.map +1 -0
  101. package/dist/react/react/components/toast.d.ts +28 -0
  102. package/dist/react/react/components/toast.d.ts.map +1 -0
  103. package/dist/react/react/components/tooltip.d.ts +16 -0
  104. package/dist/react/react/components/tooltip.d.ts.map +1 -0
  105. package/dist/react/react/components/visually-hidden.d.ts +7 -0
  106. package/dist/react/react/components/visually-hidden.d.ts.map +1 -0
  107. package/dist/react/react/hooks/index.d.ts +5 -0
  108. package/dist/react/react/hooks/index.d.ts.map +1 -0
  109. package/dist/react/react/hooks/use-theme.d.ts +17 -0
  110. package/dist/react/react/hooks/use-theme.d.ts.map +1 -0
  111. package/dist/react/react/index.d.ts +30 -0
  112. package/dist/react/react/index.d.ts.map +1 -1
  113. package/dist/styles.css +1579 -2
  114. package/package.json +35 -4
package/dist/cli/index.js CHANGED
@@ -4,6 +4,3759 @@
4
4
  import * as fs from "fs";
5
5
  import * as path from "path";
6
6
  import { fileURLToPath } from "url";
7
+
8
+ // src/core/component-defaults.ts
9
+ var componentDefaults = {
10
+ // ===== BUTTON =====
11
+ button: {
12
+ height: { sm: "2rem", md: "2.5rem", lg: "3rem" },
13
+ paddingX: { sm: "0.75rem", md: "1rem", lg: "1.5rem" },
14
+ gap: "0.5rem",
15
+ fontSize: { sm: "$font-sm", md: "$font-md", lg: "$font-lg" },
16
+ fontWeight: "$font-medium",
17
+ borderRadius: "$radius-md",
18
+ borderWidth: "1px",
19
+ iconSize: { sm: "2rem", md: "2.5rem", lg: "3rem" },
20
+ transition: "$transition-fast",
21
+ states: {
22
+ hover: { opacity: "0.9" },
23
+ focus: { ringWidth: "2px", ringOffset: "2px", ringColor: "$color-ring" },
24
+ disabled: { opacity: "0.5" }
25
+ },
26
+ variants: {
27
+ primary: {
28
+ bg: "$color-primary",
29
+ color: "$color-primaryFg",
30
+ borderColor: "transparent",
31
+ hover: { opacity: "0.9" }
32
+ },
33
+ secondary: {
34
+ bg: "$color-secondary",
35
+ color: "$color-secondaryFg",
36
+ borderColor: "transparent",
37
+ hover: { opacity: "0.8" }
38
+ },
39
+ outline: {
40
+ bg: "transparent",
41
+ color: "$color-fg",
42
+ borderColor: "$color-border",
43
+ hover: { bg: "$color-muted" }
44
+ },
45
+ ghost: {
46
+ bg: "transparent",
47
+ color: "$color-fg",
48
+ borderColor: "transparent",
49
+ hover: { bg: "$color-muted" }
50
+ },
51
+ danger: {
52
+ bg: "$color-danger",
53
+ color: "$color-dangerFg",
54
+ borderColor: "transparent",
55
+ hover: { opacity: "0.9" }
56
+ },
57
+ link: {
58
+ bg: "transparent",
59
+ color: "$color-primary",
60
+ borderColor: "transparent",
61
+ textDecoration: "underline"
62
+ }
63
+ },
64
+ animations: {
65
+ loading: { duration: "0.75s", timing: "linear" }
66
+ }
67
+ },
68
+ // ===== INPUT =====
69
+ input: {
70
+ height: { sm: "2rem", md: "2.5rem", lg: "3rem" },
71
+ paddingX: { sm: "0.5rem", md: "0.75rem", lg: "1rem" },
72
+ fontSize: { sm: "$font-sm", md: "$font-md", lg: "$font-lg" },
73
+ borderRadius: "$radius-md",
74
+ borderWidth: "1px",
75
+ borderColor: "$color-border",
76
+ bg: "$color-bg",
77
+ color: "$color-fg",
78
+ placeholderColor: "$color-mutedFg",
79
+ iconSize: "1rem",
80
+ iconColor: "$color-mutedFg",
81
+ iconSpacing: "2.5rem",
82
+ states: {
83
+ focus: {
84
+ borderColor: "$color-ring",
85
+ shadow: "0 0 0 2px $color-ring / 0.2"
86
+ },
87
+ error: {
88
+ borderColor: "$color-danger",
89
+ focusShadow: "0 0 0 2px $color-danger / 0.2"
90
+ },
91
+ disabled: { opacity: "0.5", cursor: "not-allowed" }
92
+ }
93
+ },
94
+ // ===== TEXTAREA =====
95
+ textarea: {
96
+ minHeight: "5rem",
97
+ paddingX: { sm: "0.5rem", md: "0.75rem", lg: "1rem" },
98
+ paddingY: { sm: "0.375rem", md: "0.5rem", lg: "0.75rem" },
99
+ fontSize: { sm: "$font-sm", md: "$font-md", lg: "$font-lg" },
100
+ borderRadius: "$radius-md",
101
+ borderWidth: "1px",
102
+ borderColor: "$color-border",
103
+ bg: "$color-bg",
104
+ color: "$color-fg",
105
+ placeholderColor: "$color-mutedFg",
106
+ states: {
107
+ focus: {
108
+ borderColor: "$color-ring",
109
+ shadow: "0 0 0 2px $color-ring / 0.2"
110
+ },
111
+ disabled: { opacity: "0.5" }
112
+ }
113
+ },
114
+ // ===== CARD =====
115
+ card: {
116
+ padding: "$spacing-lg",
117
+ borderRadius: "$radius-lg",
118
+ borderWidth: "1px",
119
+ borderColor: "$color-border",
120
+ bg: "$color-bg",
121
+ shadow: "$shadow-sm",
122
+ header: {
123
+ paddingBottom: "$spacing-md",
124
+ borderWidth: "1px",
125
+ marginBottom: "$spacing-md"
126
+ },
127
+ title: {
128
+ fontSize: "$font-lg",
129
+ fontWeight: "$font-semibold",
130
+ color: "$color-fg"
131
+ },
132
+ description: {
133
+ fontSize: "$font-sm",
134
+ color: "$color-mutedFg"
135
+ },
136
+ footer: {
137
+ paddingTop: "$spacing-md",
138
+ marginTop: "$spacing-md",
139
+ borderWidth: "1px",
140
+ gap: "0.5rem"
141
+ }
142
+ },
143
+ // ===== BADGE =====
144
+ badge: {
145
+ paddingX: { sm: "0.375rem", md: "0.5rem" },
146
+ paddingY: { sm: "0.125rem", md: "0.125rem" },
147
+ fontSize: { sm: "0.7rem", md: "$font-xs" },
148
+ fontWeight: "$font-medium",
149
+ borderRadius: "$radius-full",
150
+ variants: {
151
+ default: { bg: "$color-secondary", color: "$color-secondaryFg" },
152
+ primary: { bg: "$color-primary", color: "$color-primaryFg" },
153
+ success: { bg: "$color-success", color: "$color-successFg" },
154
+ danger: { bg: "$color-danger", color: "$color-dangerFg" },
155
+ warning: { bg: "$color-warning", color: "$color-warningFg" },
156
+ outline: { bg: "transparent", color: "$color-fg", borderColor: "$color-border" }
157
+ }
158
+ },
159
+ // ===== SWITCH =====
160
+ switch: {
161
+ width: { sm: "2rem", md: "2.75rem", lg: "3.5rem" },
162
+ height: { sm: "1.125rem", md: "1.5rem", lg: "1.875rem" },
163
+ thumbSize: { sm: "0.875rem", md: "1.25rem", lg: "1.625rem" },
164
+ thumbOffset: "0.125rem",
165
+ borderRadius: "$radius-full",
166
+ bgUnchecked: "$color-muted",
167
+ bgChecked: "$color-primary",
168
+ thumbBg: "$color-bg",
169
+ thumbShadow: "$shadow-sm",
170
+ transition: "$transition-fast",
171
+ states: {
172
+ focus: { ringWidth: "2px", ringOffset: "2px", ringColor: "$color-ring" },
173
+ disabled: { opacity: "0.5" }
174
+ }
175
+ },
176
+ // ===== CHECKBOX =====
177
+ checkbox: {
178
+ size: { sm: "1rem", md: "1.25rem", lg: "1.5rem" },
179
+ iconSize: { sm: "10px", md: "12px", lg: "14px" },
180
+ borderRadius: "$radius-sm",
181
+ borderWidth: "2px",
182
+ borderColor: "$color-border",
183
+ bg: "$color-bg",
184
+ checkedBg: "$color-primary",
185
+ checkedBorderColor: "$color-primary",
186
+ indicatorColor: "$color-primaryFg",
187
+ labelFontSize: "$font-sm",
188
+ labelGap: "0.5rem",
189
+ states: {
190
+ hover: { borderColor: "$color-primary" },
191
+ focus: { ringWidth: "2px", ringOffset: "2px", ringColor: "$color-ring" },
192
+ disabled: { opacity: "0.5" }
193
+ }
194
+ },
195
+ // ===== RADIO =====
196
+ radio: {
197
+ size: "1.25rem",
198
+ indicatorSize: "0.625rem",
199
+ borderWidth: "2px",
200
+ borderColor: "$color-border",
201
+ bg: "$color-bg",
202
+ checkedBorderColor: "$color-primary",
203
+ indicatorBg: "$color-primary",
204
+ labelFontSize: "$font-sm",
205
+ labelGap: "0.5rem",
206
+ states: {
207
+ hover: { borderColor: "$color-primary" },
208
+ focus: { ringWidth: "2px", ringOffset: "2px", ringColor: "$color-ring" },
209
+ disabled: { opacity: "0.5" }
210
+ }
211
+ },
212
+ // ===== SELECT =====
213
+ select: {
214
+ height: { sm: "2rem", md: "2.5rem", lg: "3rem" },
215
+ paddingX: { sm: "0.5rem", md: "0.75rem", lg: "1rem" },
216
+ fontSize: { sm: "$font-sm", md: "$font-md", lg: "$font-lg" },
217
+ borderRadius: "$radius-md",
218
+ borderWidth: "1px",
219
+ borderColor: "$color-border",
220
+ bg: "$color-bg",
221
+ color: "$color-fg",
222
+ iconSize: "12px",
223
+ states: {
224
+ focus: { ringWidth: "2px", ringColor: "$color-ring" },
225
+ disabled: { opacity: "0.5" }
226
+ },
227
+ content: {
228
+ bg: "$color-bg",
229
+ borderRadius: "$radius-md",
230
+ shadow: "$shadow-md",
231
+ padding: "0.25rem"
232
+ },
233
+ item: {
234
+ paddingX: "0.5rem",
235
+ paddingY: "0.375rem",
236
+ borderRadius: "$radius-sm",
237
+ hoverBg: "$color-muted"
238
+ }
239
+ },
240
+ // ===== LABEL =====
241
+ label: {
242
+ fontSize: "$font-sm",
243
+ fontWeight: "$font-medium",
244
+ color: "$color-fg",
245
+ requiredColor: "$color-danger"
246
+ },
247
+ // ===== ALERT =====
248
+ alert: {
249
+ paddingX: "$spacing-lg",
250
+ paddingY: "$spacing-md",
251
+ borderRadius: "$radius-md",
252
+ borderWidth: "1px",
253
+ titleFontSize: "$font-sm",
254
+ titleFontWeight: "$font-semibold",
255
+ contentFontSize: "$font-sm",
256
+ variants: {
257
+ info: { bg: "$color-primary / 0.1", borderColor: "$color-primary / 0.3", color: "$color-primary" },
258
+ success: { bg: "$color-success / 0.1", borderColor: "$color-success / 0.3", color: "$color-success" },
259
+ warning: { bg: "$color-warning / 0.1", borderColor: "$color-warning / 0.3", color: "$color-warning" },
260
+ danger: { bg: "$color-danger / 0.1", borderColor: "$color-danger / 0.3", color: "$color-danger" }
261
+ }
262
+ },
263
+ // ===== TOOLTIP =====
264
+ tooltip: {
265
+ paddingX: "0.75rem",
266
+ paddingY: "0.375rem",
267
+ fontSize: "$font-sm",
268
+ borderRadius: "$radius-md",
269
+ bg: "$color-fg",
270
+ color: "$color-bg",
271
+ shadow: "$shadow-md",
272
+ offset: "0.5rem"
273
+ },
274
+ // ===== PROGRESS =====
275
+ progress: {
276
+ height: { sm: "0.375rem", md: "0.5rem", lg: "0.75rem" },
277
+ borderRadius: "$radius-full",
278
+ bg: "$color-muted",
279
+ barColors: {
280
+ default: "$color-primary",
281
+ success: "$color-success",
282
+ warning: "$color-warning",
283
+ danger: "$color-danger"
284
+ },
285
+ transition: "$transition-normal"
286
+ },
287
+ // ===== SKELETON =====
288
+ skeleton: {
289
+ bg: "$color-muted",
290
+ borderRadius: "$radius-sm",
291
+ animationDuration: "1.5s"
292
+ },
293
+ // ===== SPINNER =====
294
+ spinner: {
295
+ size: { sm: "1rem", md: "1.5rem", lg: "2rem" },
296
+ borderWidth: { sm: "2px", md: "2px", lg: "3px" },
297
+ color: "$color-primary",
298
+ trackColor: "$color-muted",
299
+ animationDuration: "0.6s"
300
+ },
301
+ // ===== TABS =====
302
+ tabs: {
303
+ listBorderWidth: "1px",
304
+ listBorderColor: "$color-border",
305
+ triggerPaddingX: "1rem",
306
+ triggerPaddingY: "0.5rem",
307
+ triggerFontSize: "$font-sm",
308
+ triggerFontWeight: "$font-medium",
309
+ triggerColor: "$color-mutedFg",
310
+ triggerActiveColor: "$color-primary",
311
+ triggerActiveBorderColor: "$color-primary",
312
+ contentPadding: "$spacing-lg",
313
+ states: {
314
+ hover: { color: "$color-fg" },
315
+ focus: { ringWidth: "2px", ringColor: "$color-ring" }
316
+ }
317
+ },
318
+ // ===== DIALOG =====
319
+ dialog: {
320
+ overlayBg: "rgba(0, 0, 0, 0.5)",
321
+ contentBg: "$color-bg",
322
+ contentBorderRadius: "$radius-lg",
323
+ contentShadow: "$shadow-lg",
324
+ contentMaxWidth: "32rem",
325
+ contentPadding: "$spacing-lg",
326
+ closeBtnSize: "2rem",
327
+ titleFontSize: "$font-lg",
328
+ titleFontWeight: "$font-semibold",
329
+ descriptionFontSize: "$font-sm",
330
+ descriptionColor: "$color-mutedFg"
331
+ },
332
+ // ===== DROPDOWN MENU =====
333
+ dropdownMenu: {
334
+ contentBg: "$color-bg",
335
+ contentBorderRadius: "$radius-md",
336
+ contentShadow: "$shadow-lg",
337
+ contentPadding: "0.25rem",
338
+ contentMinWidth: "8rem",
339
+ itemPaddingX: "0.5rem",
340
+ itemPaddingY: "0.375rem",
341
+ itemBorderRadius: "$radius-sm",
342
+ itemFontSize: "$font-sm",
343
+ itemHoverBg: "$color-muted",
344
+ separatorColor: "$color-border",
345
+ separatorMargin: "0.25rem"
346
+ },
347
+ // ===== ACCORDION =====
348
+ accordion: {
349
+ borderRadius: "$radius-md",
350
+ borderWidth: "1px",
351
+ borderColor: "$color-border",
352
+ itemBorderWidth: "1px",
353
+ triggerPadding: "1rem",
354
+ triggerFontWeight: "$font-medium",
355
+ triggerHoverBg: "$color-muted",
356
+ contentPadding: "1rem",
357
+ iconSize: "1rem",
358
+ states: {
359
+ focus: { ringWidth: "2px", ringColor: "$color-ring" }
360
+ }
361
+ },
362
+ // ===== TABLE =====
363
+ table: {
364
+ borderRadius: "$radius-md",
365
+ borderWidth: "1px",
366
+ borderColor: "$color-border",
367
+ headerBg: "$color-muted",
368
+ headerFontWeight: "$font-medium",
369
+ cellPaddingX: "0.75rem",
370
+ cellPaddingY: "0.5rem",
371
+ rowHoverBg: "$color-muted / 0.5",
372
+ stripedBg: "$color-muted / 0.3"
373
+ },
374
+ // ===== AVATAR =====
375
+ avatar: {
376
+ size: { sm: "2rem", md: "2.5rem", lg: "3.5rem" },
377
+ fontSize: { sm: "$font-xs", md: "$font-sm", lg: "$font-md" },
378
+ borderRadius: "$radius-full",
379
+ bg: "$color-muted",
380
+ color: "$color-mutedFg"
381
+ },
382
+ // ===== SEPARATOR =====
383
+ separator: {
384
+ color: "$color-border",
385
+ thickness: "1px"
386
+ },
387
+ // ===== BREADCRUMB =====
388
+ breadcrumb: {
389
+ fontSize: "$font-sm",
390
+ color: "$color-mutedFg",
391
+ activeColor: "$color-fg",
392
+ separatorColor: "$color-mutedFg",
393
+ gap: "0.5rem"
394
+ },
395
+ // ===== CODE =====
396
+ code: {
397
+ fontSize: "$font-sm",
398
+ fontFamily: "ui-monospace, monospace",
399
+ bg: "$color-muted",
400
+ color: "$color-fg",
401
+ paddingX: "0.25rem",
402
+ paddingY: "0.125rem",
403
+ borderRadius: "$radius-sm"
404
+ },
405
+ // ===== KBD =====
406
+ kbd: {
407
+ fontSize: "$font-xs",
408
+ fontFamily: "ui-monospace, monospace",
409
+ bg: "$color-muted",
410
+ color: "$color-fg",
411
+ borderColor: "$color-border",
412
+ paddingX: "0.375rem",
413
+ paddingY: "0.125rem",
414
+ borderRadius: "$radius-sm",
415
+ shadow: "0 1px 0 1px $color-border"
416
+ },
417
+ // ===== TAG =====
418
+ tag: {
419
+ paddingX: { sm: "0.5rem", md: "0.625rem" },
420
+ paddingY: { sm: "0.125rem", md: "0.25rem" },
421
+ fontSize: { sm: "$font-xs", md: "$font-sm" },
422
+ fontWeight: "$font-medium",
423
+ borderRadius: "$radius-md",
424
+ gap: "0.25rem",
425
+ variants: {
426
+ default: { bg: "$color-secondary", color: "$color-secondaryFg" },
427
+ primary: { bg: "$color-primary", color: "$color-primaryFg" },
428
+ success: { bg: "$color-success", color: "$color-successFg" },
429
+ danger: { bg: "$color-danger", color: "$color-dangerFg" },
430
+ warning: { bg: "$color-warning", color: "$color-warningFg" },
431
+ outline: { bg: "transparent", color: "$color-fg", borderColor: "$color-border" }
432
+ }
433
+ },
434
+ // ===== TOAST =====
435
+ toast: {
436
+ padding: "1rem",
437
+ borderRadius: "$radius-md",
438
+ shadow: "$shadow-lg",
439
+ minWidth: "300px",
440
+ maxWidth: "420px",
441
+ titleFontWeight: "$font-semibold",
442
+ variants: {
443
+ default: { bg: "$color-bg", color: "$color-fg", borderColor: "$color-border" },
444
+ success: { bg: "$color-success / 0.1", color: "$color-success", borderColor: "$color-success / 0.3" },
445
+ warning: { bg: "$color-warning / 0.1", color: "$color-warning", borderColor: "$color-warning / 0.3" },
446
+ danger: { bg: "$color-danger / 0.1", color: "$color-danger", borderColor: "$color-danger / 0.3" }
447
+ }
448
+ },
449
+ // ===== SCROLL AREA =====
450
+ scrollArea: {
451
+ scrollbarWidth: "10px",
452
+ scrollbarBg: "transparent",
453
+ thumbBg: "$color-border",
454
+ thumbHoverBg: "$color-mutedFg",
455
+ thumbBorderRadius: "$radius-full"
456
+ },
457
+ // ===== CONTAINER =====
458
+ container: {
459
+ maxWidth: { sm: "640px", md: "768px", lg: "1024px", xl: "1280px", "2xl": "1536px" },
460
+ paddingX: "1rem"
461
+ },
462
+ // ===== STACK =====
463
+ stack: {
464
+ gap: { sm: "0.5rem", md: "1rem", lg: "1.5rem" }
465
+ },
466
+ // ===== GRID =====
467
+ grid: {
468
+ gap: { sm: "0.5rem", md: "1rem", lg: "1.5rem" }
469
+ }
470
+ };
471
+
472
+ // cli/utils/deep-merge.ts
473
+ function deepMerge(target, source) {
474
+ const result = { ...target };
475
+ for (const key of Object.keys(source)) {
476
+ const sourceValue = source[key];
477
+ const targetValue = target[key];
478
+ if (sourceValue === null || sourceValue === void 0) {
479
+ result[key] = sourceValue;
480
+ continue;
481
+ }
482
+ if (typeof sourceValue === "object" && !Array.isArray(sourceValue) && typeof targetValue === "object" && !Array.isArray(targetValue) && targetValue !== null) {
483
+ result[key] = deepMerge(targetValue, sourceValue);
484
+ } else {
485
+ result[key] = sourceValue;
486
+ }
487
+ }
488
+ return result;
489
+ }
490
+
491
+ // cli/token-resolver.ts
492
+ function resolveToken(value) {
493
+ if (!value) return "";
494
+ if (typeof value !== "string") {
495
+ return "";
496
+ }
497
+ if (!value.startsWith("$")) {
498
+ return value;
499
+ }
500
+ const opacityMatch = value.match(/^\$([a-zA-Z-]+)\s*\/\s*(.+)$/);
501
+ if (opacityMatch) {
502
+ const [, tokenName2, opacity] = opacityMatch;
503
+ const cssVar2 = tokenNameToCssVar(tokenName2);
504
+ if (tokenName2.startsWith("color-")) {
505
+ return `hsl(var(${cssVar2}) / ${opacity})`;
506
+ }
507
+ return `var(${cssVar2}) / ${opacity}`;
508
+ }
509
+ const tokenName = value.slice(1);
510
+ const cssVar = tokenNameToCssVar(tokenName);
511
+ if (tokenName.startsWith("color-")) {
512
+ return `hsl(var(${cssVar}))`;
513
+ }
514
+ return `var(${cssVar})`;
515
+ }
516
+ function tokenNameToCssVar(tokenName) {
517
+ if (tokenName.startsWith("font-")) {
518
+ const fontPart = tokenName.slice(5);
519
+ if (["xs", "sm", "md", "lg", "xl"].includes(fontPart)) {
520
+ return `--cz-font-size-${fontPart}`;
521
+ }
522
+ if (["normal", "medium", "semibold", "bold"].includes(fontPart)) {
523
+ return `--cz-font-weight-${fontPart}`;
524
+ }
525
+ if (["tight", "relaxed"].includes(fontPart)) {
526
+ return `--cz-font-lineHeight-${fontPart}`;
527
+ }
528
+ return `--cz-font-${fontPart}`;
529
+ }
530
+ return `--cz-${tokenName}`;
531
+ }
532
+ function toKebabCase(str) {
533
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
534
+ }
535
+ function componentVarName(component, property, size) {
536
+ const componentShorthand = {
537
+ button: "btn",
538
+ dropdownMenu: "dropdown",
539
+ scrollArea: "scroll"
540
+ };
541
+ const compName = componentShorthand[component] || component;
542
+ const propName = toKebabCase(property);
543
+ if (size) {
544
+ return `--cz-${compName}-${propName}-${size}`;
545
+ }
546
+ return `--cz-${compName}-${propName}`;
547
+ }
548
+
549
+ // cli/generators/button.ts
550
+ function generateButtonCSS(config) {
551
+ let css = "";
552
+ css += "/* ===== BUTTON ===== */\n\n";
553
+ css += generateButtonVariables(config);
554
+ css += "\n";
555
+ css += generateButtonBase();
556
+ css += "\n";
557
+ css += generateButtonSizes(config);
558
+ css += "\n";
559
+ if (config.variants) {
560
+ css += generateButtonVariants(config.variants);
561
+ css += "\n";
562
+ }
563
+ css += generateButtonIcon(config);
564
+ css += "\n";
565
+ css += generateButtonLoading(config);
566
+ css += "\n";
567
+ if (config.customCSS) {
568
+ css += `/* Custom Button CSS */
569
+ ${config.customCSS}
570
+ `;
571
+ }
572
+ return css;
573
+ }
574
+ function generateButtonVariables(config) {
575
+ const vars = [];
576
+ if (config.height) {
577
+ for (const [size, value] of Object.entries(config.height)) {
578
+ vars.push(` ${componentVarName("button", "height", size)}: ${resolveToken(value)};`);
579
+ }
580
+ }
581
+ if (config.paddingX) {
582
+ for (const [size, value] of Object.entries(config.paddingX)) {
583
+ vars.push(` ${componentVarName("button", "paddingX", size)}: ${resolveToken(value)};`);
584
+ }
585
+ }
586
+ if (config.fontSize && typeof config.fontSize === "object") {
587
+ for (const [size, value] of Object.entries(config.fontSize)) {
588
+ vars.push(` ${componentVarName("button", "fontSize", size)}: ${resolveToken(value)};`);
589
+ }
590
+ }
591
+ if (config.iconSize) {
592
+ for (const [size, value] of Object.entries(config.iconSize)) {
593
+ vars.push(` ${componentVarName("button", "iconSize", size)}: ${resolveToken(value)};`);
594
+ }
595
+ }
596
+ if (config.gap) {
597
+ vars.push(` ${componentVarName("button", "gap")}: ${resolveToken(config.gap)};`);
598
+ }
599
+ if (config.fontWeight) {
600
+ vars.push(` ${componentVarName("button", "fontWeight")}: ${resolveToken(config.fontWeight)};`);
601
+ }
602
+ if (config.borderRadius) {
603
+ vars.push(` ${componentVarName("button", "borderRadius")}: ${resolveToken(config.borderRadius)};`);
604
+ }
605
+ if (config.borderWidth) {
606
+ vars.push(` ${componentVarName("button", "borderWidth")}: ${resolveToken(config.borderWidth)};`);
607
+ }
608
+ if (config.transition) {
609
+ vars.push(` ${componentVarName("button", "transition")}: ${resolveToken(config.transition)};`);
610
+ }
611
+ if (config.states?.hover?.opacity) {
612
+ vars.push(` ${componentVarName("button", "hoverOpacity")}: ${config.states.hover.opacity};`);
613
+ }
614
+ if (config.states?.focus?.ringWidth) {
615
+ vars.push(` ${componentVarName("button", "focusRingWidth")}: ${config.states.focus.ringWidth};`);
616
+ }
617
+ if (config.states?.focus?.ringOffset) {
618
+ vars.push(` ${componentVarName("button", "focusRingOffset")}: ${config.states.focus.ringOffset};`);
619
+ }
620
+ if (config.states?.focus?.ringColor) {
621
+ vars.push(` ${componentVarName("button", "focusRingColor")}: ${resolveToken(config.states.focus.ringColor)};`);
622
+ }
623
+ if (config.states?.disabled?.opacity) {
624
+ vars.push(` ${componentVarName("button", "disabledOpacity")}: ${config.states.disabled.opacity};`);
625
+ }
626
+ if (config.animations?.loading?.duration) {
627
+ vars.push(` ${componentVarName("button", "loadingDuration")}: ${config.animations.loading.duration};`);
628
+ }
629
+ if (config.animations?.loading?.timing) {
630
+ vars.push(` ${componentVarName("button", "loadingTiming")}: ${config.animations.loading.timing};`);
631
+ }
632
+ if (config.variants) {
633
+ for (const [name, variant] of Object.entries(config.variants)) {
634
+ if (variant.bg) {
635
+ vars.push(` --cz-btn-${name}-bg: ${resolveToken(variant.bg)};`);
636
+ }
637
+ if (variant.color) {
638
+ vars.push(` --cz-btn-${name}-color: ${resolveToken(variant.color)};`);
639
+ }
640
+ if (variant.borderColor) {
641
+ vars.push(` --cz-btn-${name}-border-color: ${resolveToken(variant.borderColor)};`);
642
+ }
643
+ }
644
+ }
645
+ return `:root {
646
+ ${vars.join("\n")}
647
+ }
648
+ `;
649
+ }
650
+ function generateButtonBase() {
651
+ return `.cz-btn {
652
+ display: inline-flex;
653
+ align-items: center;
654
+ justify-content: center;
655
+ gap: var(--cz-btn-gap);
656
+ border-radius: var(--cz-btn-border-radius);
657
+ font-weight: var(--cz-btn-font-weight);
658
+ transition: all var(--cz-btn-transition);
659
+ cursor: pointer;
660
+ border: var(--cz-btn-border-width) solid transparent;
661
+ }
662
+
663
+ .cz-btn:focus-visible {
664
+ outline: none;
665
+ box-shadow: 0 0 0 var(--cz-btn-focus-ring-offset) hsl(var(--cz-color-bg)),
666
+ 0 0 0 calc(var(--cz-btn-focus-ring-offset) + var(--cz-btn-focus-ring-width)) var(--cz-btn-focus-ring-color);
667
+ }
668
+
669
+ .cz-btn:disabled {
670
+ pointer-events: none;
671
+ opacity: var(--cz-btn-disabled-opacity);
672
+ }
673
+ `;
674
+ }
675
+ function generateButtonSizes(config) {
676
+ const sizes = ["sm", "md", "lg"];
677
+ let css = "/* Button Sizes */\n";
678
+ for (const size of sizes) {
679
+ css += `.cz-btn-${size} {
680
+ height: var(--cz-btn-height-${size});
681
+ padding: 0 var(--cz-btn-padding-x-${size});
682
+ font-size: var(--cz-btn-font-size-${size});
683
+ }
684
+ `;
685
+ }
686
+ return css;
687
+ }
688
+ function generateButtonVariants(variants) {
689
+ let css = "/* Button Variants */\n";
690
+ for (const [name, variant] of Object.entries(variants)) {
691
+ css += `.cz-btn-${name} {
692
+ `;
693
+ css += ` background: var(--cz-btn-${name}-bg);
694
+ `;
695
+ css += ` color: var(--cz-btn-${name}-color);
696
+ `;
697
+ if (variant.borderColor && variant.borderColor !== "transparent") {
698
+ css += ` border-color: var(--cz-btn-${name}-border-color);
699
+ `;
700
+ }
701
+ if (variant.textDecoration) {
702
+ css += ` text-decoration: ${variant.textDecoration};
703
+ `;
704
+ css += ` text-underline-offset: 4px;
705
+ `;
706
+ }
707
+ css += `}
708
+ `;
709
+ if (variant.hover) {
710
+ css += `.cz-btn-${name}:hover {
711
+ `;
712
+ if (variant.hover.opacity) {
713
+ css += ` opacity: ${variant.hover.opacity};
714
+ `;
715
+ }
716
+ if (variant.hover.bg) {
717
+ css += ` background: ${resolveToken(variant.hover.bg)};
718
+ `;
719
+ }
720
+ if (variant.textDecoration) {
721
+ css += ` text-decoration-thickness: 2px;
722
+ `;
723
+ }
724
+ css += `}
725
+ `;
726
+ }
727
+ }
728
+ return css;
729
+ }
730
+ function generateButtonIcon(config) {
731
+ return `/* Button Icon Size */
732
+ .cz-btn-icon {
733
+ padding: 0;
734
+ }
735
+ .cz-btn-icon.cz-btn-sm { width: var(--cz-btn-icon-size-sm); height: var(--cz-btn-icon-size-sm); }
736
+ .cz-btn-icon.cz-btn-md { width: var(--cz-btn-icon-size-md); height: var(--cz-btn-icon-size-md); }
737
+ .cz-btn-icon.cz-btn-lg { width: var(--cz-btn-icon-size-lg); height: var(--cz-btn-icon-size-lg); }
738
+ `;
739
+ }
740
+ function generateButtonLoading(config) {
741
+ return `/* Button Loading State */
742
+ .cz-btn-loading { position: relative; }
743
+ .cz-btn-spinner {
744
+ width: 1rem;
745
+ height: 1rem;
746
+ animation: cz-spin var(--cz-btn-loading-duration) var(--cz-btn-loading-timing) infinite;
747
+ flex-shrink: 0;
748
+ }
749
+ .cz-btn-content { opacity: 1; }
750
+ `;
751
+ }
752
+
753
+ // cli/generators/input.ts
754
+ function generateInputCSS(config) {
755
+ let css = "";
756
+ css += "/* ===== INPUT ===== */\n\n";
757
+ css += generateInputVariables(config);
758
+ css += "\n";
759
+ css += generateInputBase();
760
+ css += "\n";
761
+ css += generateInputSizes();
762
+ css += "\n";
763
+ css += generateInputStates(config);
764
+ css += "\n";
765
+ css += generateInputIcons(config);
766
+ css += "\n";
767
+ css += generateInputClear();
768
+ css += "\n";
769
+ if (config.customCSS) {
770
+ css += `/* Custom Input CSS */
771
+ ${config.customCSS}
772
+ `;
773
+ }
774
+ return css;
775
+ }
776
+ function generateInputVariables(config) {
777
+ const vars = [];
778
+ if (config.height) {
779
+ for (const [size, value] of Object.entries(config.height)) {
780
+ vars.push(` ${componentVarName("input", "height", size)}: ${resolveToken(value)};`);
781
+ }
782
+ }
783
+ if (config.paddingX) {
784
+ for (const [size, value] of Object.entries(config.paddingX)) {
785
+ vars.push(` ${componentVarName("input", "paddingX", size)}: ${resolveToken(value)};`);
786
+ }
787
+ }
788
+ if (config.fontSize && typeof config.fontSize === "object") {
789
+ for (const [size, value] of Object.entries(config.fontSize)) {
790
+ vars.push(` ${componentVarName("input", "fontSize", size)}: ${resolveToken(value)};`);
791
+ }
792
+ }
793
+ if (config.borderRadius) {
794
+ vars.push(` ${componentVarName("input", "borderRadius")}: ${resolveToken(config.borderRadius)};`);
795
+ }
796
+ if (config.borderWidth) {
797
+ vars.push(` ${componentVarName("input", "borderWidth")}: ${resolveToken(config.borderWidth)};`);
798
+ }
799
+ if (config.borderColor) {
800
+ vars.push(` ${componentVarName("input", "borderColor")}: ${resolveToken(config.borderColor)};`);
801
+ }
802
+ if (config.bg) {
803
+ vars.push(` ${componentVarName("input", "bg")}: ${resolveToken(config.bg)};`);
804
+ }
805
+ if (config.color) {
806
+ vars.push(` ${componentVarName("input", "color")}: ${resolveToken(config.color)};`);
807
+ }
808
+ if (config.placeholderColor) {
809
+ vars.push(` ${componentVarName("input", "placeholderColor")}: ${resolveToken(config.placeholderColor)};`);
810
+ }
811
+ if (config.iconSize) {
812
+ vars.push(` ${componentVarName("input", "iconSize")}: ${resolveToken(config.iconSize)};`);
813
+ }
814
+ if (config.iconColor) {
815
+ vars.push(` ${componentVarName("input", "iconColor")}: ${resolveToken(config.iconColor)};`);
816
+ }
817
+ if (config.iconSpacing) {
818
+ vars.push(` ${componentVarName("input", "iconSpacing")}: ${resolveToken(config.iconSpacing)};`);
819
+ }
820
+ if (config.states?.focus?.borderColor) {
821
+ vars.push(` ${componentVarName("input", "focusBorderColor")}: ${resolveToken(config.states.focus.borderColor)};`);
822
+ }
823
+ if (config.states?.focus?.shadow) {
824
+ vars.push(` ${componentVarName("input", "focusShadow")}: ${resolveToken(config.states.focus.shadow)};`);
825
+ }
826
+ if (config.states?.error?.borderColor) {
827
+ vars.push(` ${componentVarName("input", "errorBorderColor")}: ${resolveToken(config.states.error.borderColor)};`);
828
+ }
829
+ if (config.states?.error?.focusShadow) {
830
+ vars.push(` ${componentVarName("input", "errorFocusShadow")}: ${resolveToken(config.states.error.focusShadow)};`);
831
+ }
832
+ if (config.states?.disabled?.opacity) {
833
+ vars.push(` ${componentVarName("input", "disabledOpacity")}: ${config.states.disabled.opacity};`);
834
+ }
835
+ return `:root {
836
+ ${vars.join("\n")}
837
+ }
838
+ `;
839
+ }
840
+ function generateInputBase() {
841
+ return `.cz-input-field {
842
+ display: flex;
843
+ flex-direction: column;
844
+ gap: 0.375rem;
845
+ }
846
+
847
+ .cz-input-wrapper {
848
+ position: relative;
849
+ display: flex;
850
+ align-items: center;
851
+ width: 100%;
852
+ }
853
+
854
+ .cz-input {
855
+ width: 100%;
856
+ border-radius: var(--cz-input-border-radius);
857
+ border: var(--cz-input-border-width) solid var(--cz-input-border-color);
858
+ background-color: var(--cz-input-bg);
859
+ color: var(--cz-input-color);
860
+ transition: all var(--cz-transition-fast);
861
+ }
862
+
863
+ .cz-input::placeholder {
864
+ color: var(--cz-input-placeholder-color);
865
+ }
866
+ `;
867
+ }
868
+ function generateInputSizes() {
869
+ return `/* Input Sizes */
870
+ .cz-input-sm {
871
+ height: var(--cz-input-height-sm);
872
+ padding: 0 var(--cz-input-padding-x-sm);
873
+ font-size: var(--cz-input-font-size-sm);
874
+ }
875
+ .cz-input-md {
876
+ height: var(--cz-input-height-md);
877
+ padding: 0 var(--cz-input-padding-x-md);
878
+ font-size: var(--cz-input-font-size-md);
879
+ }
880
+ .cz-input-lg {
881
+ height: var(--cz-input-height-lg);
882
+ padding: 0 var(--cz-input-padding-x-lg);
883
+ font-size: var(--cz-input-font-size-lg);
884
+ }
885
+ `;
886
+ }
887
+ function generateInputStates(config) {
888
+ return `.cz-input:focus {
889
+ outline: none;
890
+ border-color: var(--cz-input-focus-border-color);
891
+ box-shadow: var(--cz-input-focus-shadow);
892
+ }
893
+
894
+ .cz-input:disabled {
895
+ cursor: not-allowed;
896
+ opacity: var(--cz-input-disabled-opacity);
897
+ }
898
+
899
+ .cz-input-error {
900
+ border-color: var(--cz-input-error-border-color);
901
+ }
902
+ .cz-input-error:focus {
903
+ border-color: var(--cz-input-error-border-color);
904
+ box-shadow: var(--cz-input-error-focus-shadow);
905
+ }
906
+
907
+ .cz-input-description {
908
+ font-size: var(--cz-font-size-xs);
909
+ color: var(--cz-input-placeholder-color);
910
+ }
911
+ `;
912
+ }
913
+ function generateInputIcons(config) {
914
+ return `/* Input with Icons */
915
+ .cz-input-has-left-icon .cz-input { padding-left: var(--cz-input-icon-spacing); }
916
+ .cz-input-has-right-icon .cz-input { padding-right: var(--cz-input-icon-spacing); }
917
+
918
+ .cz-input-icon {
919
+ position: absolute;
920
+ display: flex;
921
+ align-items: center;
922
+ justify-content: center;
923
+ width: var(--cz-input-icon-spacing);
924
+ height: 100%;
925
+ color: var(--cz-input-icon-color);
926
+ pointer-events: none;
927
+ }
928
+ .cz-input-icon svg { width: var(--cz-input-icon-size); height: var(--cz-input-icon-size); }
929
+ .cz-input-icon-left { left: 0; }
930
+ .cz-input-icon-right { right: 0; }
931
+ `;
932
+ }
933
+ function generateInputClear() {
934
+ return `/* Input Clear Button */
935
+ .cz-input-clear {
936
+ position: absolute;
937
+ right: 0;
938
+ display: flex;
939
+ align-items: center;
940
+ justify-content: center;
941
+ width: var(--cz-input-icon-spacing);
942
+ height: 100%;
943
+ color: var(--cz-input-icon-color);
944
+ background: transparent;
945
+ border: none;
946
+ cursor: pointer;
947
+ transition: color var(--cz-transition-fast);
948
+ }
949
+ .cz-input-clear:hover { color: var(--cz-input-color); }
950
+ .cz-input-clear svg { width: 0.875rem; height: 0.875rem; }
951
+ `;
952
+ }
953
+
954
+ // cli/generators/card.ts
955
+ function generateCardCSS(config) {
956
+ let css = "";
957
+ css += "/* ===== CARD ===== */\n\n";
958
+ css += generateCardVariables(config);
959
+ css += "\n";
960
+ css += generateCardBase();
961
+ css += "\n";
962
+ if (config.customCSS) {
963
+ css += `/* Custom Card CSS */
964
+ ${config.customCSS}
965
+ `;
966
+ }
967
+ return css;
968
+ }
969
+ function generateCardVariables(config) {
970
+ const vars = [];
971
+ if (config.padding) vars.push(` --cz-card-padding: ${resolveToken(config.padding)};`);
972
+ if (config.borderRadius) vars.push(` --cz-card-border-radius: ${resolveToken(config.borderRadius)};`);
973
+ if (config.borderWidth) vars.push(` --cz-card-border-width: ${resolveToken(config.borderWidth)};`);
974
+ if (config.borderColor) vars.push(` --cz-card-border-color: ${resolveToken(config.borderColor)};`);
975
+ if (config.bg) vars.push(` --cz-card-bg: ${resolveToken(config.bg)};`);
976
+ if (config.shadow) vars.push(` --cz-card-shadow: ${resolveToken(config.shadow)};`);
977
+ if (config.header?.paddingBottom) vars.push(` --cz-card-header-padding-bottom: ${resolveToken(config.header.paddingBottom)};`);
978
+ if (config.header?.marginBottom) vars.push(` --cz-card-header-margin-bottom: ${resolveToken(config.header.marginBottom)};`);
979
+ if (config.title?.fontSize) vars.push(` --cz-card-title-font-size: ${resolveToken(config.title.fontSize)};`);
980
+ if (config.title?.fontWeight) vars.push(` --cz-card-title-font-weight: ${resolveToken(config.title.fontWeight)};`);
981
+ if (config.title?.color) vars.push(` --cz-card-title-color: ${resolveToken(config.title.color)};`);
982
+ if (config.description?.fontSize) vars.push(` --cz-card-description-font-size: ${resolveToken(config.description.fontSize)};`);
983
+ if (config.description?.color) vars.push(` --cz-card-description-color: ${resolveToken(config.description.color)};`);
984
+ if (config.footer?.paddingTop) vars.push(` --cz-card-footer-padding-top: ${resolveToken(config.footer.paddingTop)};`);
985
+ if (config.footer?.marginTop) vars.push(` --cz-card-footer-margin-top: ${resolveToken(config.footer.marginTop)};`);
986
+ if (config.footer?.gap) vars.push(` --cz-card-footer-gap: ${config.footer.gap};`);
987
+ return `:root {
988
+ ${vars.join("\n")}
989
+ }
990
+ `;
991
+ }
992
+ function generateCardBase() {
993
+ return `.cz-card {
994
+ border-radius: var(--cz-card-border-radius);
995
+ border: var(--cz-card-border-width) solid var(--cz-card-border-color);
996
+ background-color: var(--cz-card-bg);
997
+ box-shadow: var(--cz-card-shadow);
998
+ padding: var(--cz-card-padding);
999
+ }
1000
+
1001
+ .cz-card-no-padding { padding: 0; }
1002
+
1003
+ .cz-card-header {
1004
+ display: flex;
1005
+ flex-direction: column;
1006
+ gap: 0.375rem;
1007
+ padding-bottom: var(--cz-card-header-padding-bottom);
1008
+ border-bottom: var(--cz-card-border-width) solid var(--cz-card-border-color);
1009
+ margin-bottom: var(--cz-card-header-margin-bottom);
1010
+ }
1011
+
1012
+ .cz-card-title {
1013
+ font-size: var(--cz-card-title-font-size);
1014
+ font-weight: var(--cz-card-title-font-weight);
1015
+ color: var(--cz-card-title-color);
1016
+ line-height: var(--cz-font-lineHeight-tight);
1017
+ }
1018
+
1019
+ .cz-card-description {
1020
+ font-size: var(--cz-card-description-font-size);
1021
+ color: var(--cz-card-description-color);
1022
+ }
1023
+
1024
+ .cz-card-body { color: var(--cz-card-title-color); }
1025
+
1026
+ .cz-card-footer {
1027
+ display: flex;
1028
+ align-items: center;
1029
+ gap: var(--cz-card-footer-gap);
1030
+ padding-top: var(--cz-card-footer-padding-top);
1031
+ margin-top: var(--cz-card-footer-margin-top);
1032
+ border-top: var(--cz-card-border-width) solid var(--cz-card-border-color);
1033
+ }
1034
+ `;
1035
+ }
1036
+
1037
+ // cli/generators/switch.ts
1038
+ function generateSwitchCSS(config) {
1039
+ let css = "";
1040
+ css += "/* ===== SWITCH ===== */\n\n";
1041
+ css += generateSwitchVariables(config);
1042
+ css += "\n";
1043
+ css += generateSwitchBase();
1044
+ css += "\n";
1045
+ css += generateSwitchSizes(config);
1046
+ css += "\n";
1047
+ css += generateSwitchLabel();
1048
+ css += "\n";
1049
+ if (config.customCSS) {
1050
+ css += `/* Custom Switch CSS */
1051
+ ${config.customCSS}
1052
+ `;
1053
+ }
1054
+ return css;
1055
+ }
1056
+ function generateSwitchVariables(config) {
1057
+ const vars = [];
1058
+ if (config.width) {
1059
+ for (const [size, value] of Object.entries(config.width)) {
1060
+ vars.push(` --cz-switch-width-${size}: ${resolveToken(value)};`);
1061
+ }
1062
+ }
1063
+ if (config.height) {
1064
+ for (const [size, value] of Object.entries(config.height)) {
1065
+ vars.push(` --cz-switch-height-${size}: ${resolveToken(value)};`);
1066
+ }
1067
+ }
1068
+ if (config.thumbSize) {
1069
+ for (const [size, value] of Object.entries(config.thumbSize)) {
1070
+ vars.push(` --cz-switch-thumb-size-${size}: ${resolveToken(value)};`);
1071
+ }
1072
+ }
1073
+ if (config.thumbOffset) vars.push(` --cz-switch-thumb-offset: ${config.thumbOffset};`);
1074
+ if (config.borderRadius) vars.push(` --cz-switch-border-radius: ${resolveToken(config.borderRadius)};`);
1075
+ if (config.bgUnchecked) vars.push(` --cz-switch-bg-unchecked: ${resolveToken(config.bgUnchecked)};`);
1076
+ if (config.bgChecked) vars.push(` --cz-switch-bg-checked: ${resolveToken(config.bgChecked)};`);
1077
+ if (config.thumbBg) vars.push(` --cz-switch-thumb-bg: ${resolveToken(config.thumbBg)};`);
1078
+ if (config.thumbShadow) vars.push(` --cz-switch-thumb-shadow: ${resolveToken(config.thumbShadow)};`);
1079
+ if (config.transition) vars.push(` --cz-switch-transition: ${resolveToken(config.transition)};`);
1080
+ if (config.states?.focus?.ringWidth) vars.push(` --cz-switch-focus-ring-width: ${config.states.focus.ringWidth};`);
1081
+ if (config.states?.focus?.ringColor) vars.push(` --cz-switch-focus-ring-color: ${resolveToken(config.states.focus.ringColor)};`);
1082
+ if (config.states?.disabled?.opacity) vars.push(` --cz-switch-disabled-opacity: ${config.states.disabled.opacity};`);
1083
+ return `:root {
1084
+ ${vars.join("\n")}
1085
+ }
1086
+ `;
1087
+ }
1088
+ function generateSwitchBase() {
1089
+ return `.cz-switch {
1090
+ all: unset;
1091
+ box-sizing: border-box;
1092
+ display: inline-flex;
1093
+ align-items: center;
1094
+ position: relative;
1095
+ border-radius: var(--cz-switch-border-radius);
1096
+ background-color: var(--cz-switch-bg-unchecked);
1097
+ transition: all var(--cz-switch-transition);
1098
+ cursor: pointer;
1099
+ }
1100
+
1101
+ .cz-switch:focus-visible {
1102
+ outline: none;
1103
+ box-shadow: 0 0 0 2px hsl(var(--cz-color-bg)), 0 0 0 4px var(--cz-switch-focus-ring-color);
1104
+ }
1105
+
1106
+ .cz-switch[data-state="checked"],
1107
+ .cz-switch.cz-switch-checked {
1108
+ background-color: var(--cz-switch-bg-checked);
1109
+ }
1110
+
1111
+ .cz-switch.cz-disabled,
1112
+ .cz-switch:disabled {
1113
+ opacity: var(--cz-switch-disabled-opacity);
1114
+ cursor: not-allowed;
1115
+ }
1116
+
1117
+ .cz-switch-thumb {
1118
+ display: block;
1119
+ border-radius: var(--cz-switch-border-radius);
1120
+ background-color: var(--cz-switch-thumb-bg);
1121
+ box-shadow: var(--cz-switch-thumb-shadow);
1122
+ transition: transform var(--cz-switch-transition);
1123
+ }
1124
+ `;
1125
+ }
1126
+ function generateSwitchSizes(config) {
1127
+ let css = "/* Switch Sizes */\n";
1128
+ for (const size of ["sm", "md", "lg"]) {
1129
+ css += `.cz-switch-${size} {
1130
+ width: var(--cz-switch-width-${size});
1131
+ height: var(--cz-switch-height-${size});
1132
+ }
1133
+ .cz-switch-${size} .cz-switch-thumb {
1134
+ width: var(--cz-switch-thumb-size-${size});
1135
+ height: var(--cz-switch-thumb-size-${size});
1136
+ transform: translateX(var(--cz-switch-thumb-offset));
1137
+ }
1138
+ .cz-switch-${size}[data-state="checked"] .cz-switch-thumb,
1139
+ .cz-switch-${size}.cz-switch-checked .cz-switch-thumb {
1140
+ transform: translateX(calc(var(--cz-switch-width-${size}) - var(--cz-switch-thumb-size-${size}) - var(--cz-switch-thumb-offset)));
1141
+ }
1142
+ `;
1143
+ }
1144
+ return css;
1145
+ }
1146
+ function generateSwitchLabel() {
1147
+ return `/* Switch with Label */
1148
+ .cz-switch-container {
1149
+ display: inline-flex;
1150
+ align-items: flex-start;
1151
+ gap: 0.75rem;
1152
+ cursor: pointer;
1153
+ }
1154
+ .cz-switch-container.cz-disabled {
1155
+ opacity: var(--cz-switch-disabled-opacity);
1156
+ cursor: not-allowed;
1157
+ }
1158
+
1159
+ .cz-switch-label-left { flex-direction: row-reverse; }
1160
+ .cz-switch-label-right { flex-direction: row; }
1161
+
1162
+ .cz-switch-text {
1163
+ display: flex;
1164
+ flex-direction: column;
1165
+ gap: 0.125rem;
1166
+ }
1167
+
1168
+ .cz-switch-label {
1169
+ font-size: var(--cz-font-size-sm);
1170
+ font-weight: var(--cz-font-weight-medium);
1171
+ color: hsl(var(--cz-color-fg));
1172
+ line-height: 1.5;
1173
+ }
1174
+
1175
+ .cz-switch-description {
1176
+ font-size: var(--cz-font-size-xs);
1177
+ color: hsl(var(--cz-color-mutedFg));
1178
+ }
1179
+ `;
1180
+ }
1181
+
1182
+ // cli/generators/checkbox.ts
1183
+ function generateCheckboxCSS(config) {
1184
+ let css = "";
1185
+ css += "/* ===== CHECKBOX ===== */\n\n";
1186
+ css += generateCheckboxVariables(config);
1187
+ css += "\n";
1188
+ css += generateCheckboxBase();
1189
+ css += "\n";
1190
+ css += generateCheckboxSizes(config);
1191
+ css += "\n";
1192
+ css += generateCheckboxDescription();
1193
+ css += "\n";
1194
+ if (config.customCSS) {
1195
+ css += `/* Custom Checkbox CSS */
1196
+ ${config.customCSS}
1197
+ `;
1198
+ }
1199
+ return css;
1200
+ }
1201
+ function generateCheckboxVariables(config) {
1202
+ const vars = [];
1203
+ if (config.size) {
1204
+ for (const [size, value] of Object.entries(config.size)) {
1205
+ vars.push(` --cz-checkbox-size-${size}: ${resolveToken(value)};`);
1206
+ }
1207
+ }
1208
+ if (config.iconSize) {
1209
+ for (const [size, value] of Object.entries(config.iconSize)) {
1210
+ vars.push(` --cz-checkbox-icon-size-${size}: ${value};`);
1211
+ }
1212
+ }
1213
+ if (config.borderRadius) vars.push(` --cz-checkbox-border-radius: ${resolveToken(config.borderRadius)};`);
1214
+ if (config.borderWidth) vars.push(` --cz-checkbox-border-width: ${config.borderWidth};`);
1215
+ if (config.borderColor) vars.push(` --cz-checkbox-border-color: ${resolveToken(config.borderColor)};`);
1216
+ if (config.bg) vars.push(` --cz-checkbox-bg: ${resolveToken(config.bg)};`);
1217
+ if (config.checkedBg) vars.push(` --cz-checkbox-checked-bg: ${resolveToken(config.checkedBg)};`);
1218
+ if (config.checkedBorderColor) vars.push(` --cz-checkbox-checked-border-color: ${resolveToken(config.checkedBorderColor)};`);
1219
+ if (config.indicatorColor) vars.push(` --cz-checkbox-indicator-color: ${resolveToken(config.indicatorColor)};`);
1220
+ if (config.labelFontSize) vars.push(` --cz-checkbox-label-font-size: ${resolveToken(config.labelFontSize)};`);
1221
+ if (config.labelGap) vars.push(` --cz-checkbox-label-gap: ${config.labelGap};`);
1222
+ if (config.states?.hover?.borderColor) vars.push(` --cz-checkbox-hover-border-color: ${resolveToken(config.states.hover.borderColor)};`);
1223
+ if (config.states?.focus?.ringWidth) vars.push(` --cz-checkbox-focus-ring-width: ${config.states.focus.ringWidth};`);
1224
+ if (config.states?.focus?.ringColor) vars.push(` --cz-checkbox-focus-ring-color: ${resolveToken(config.states.focus.ringColor)};`);
1225
+ if (config.states?.disabled?.opacity) vars.push(` --cz-checkbox-disabled-opacity: ${config.states.disabled.opacity};`);
1226
+ return `:root {
1227
+ ${vars.join("\n")}
1228
+ }
1229
+ `;
1230
+ }
1231
+ function generateCheckboxBase() {
1232
+ return `.cz-checkbox-wrapper {
1233
+ display: inline-flex;
1234
+ align-items: center;
1235
+ gap: var(--cz-checkbox-label-gap);
1236
+ cursor: pointer;
1237
+ user-select: none;
1238
+ }
1239
+
1240
+ .cz-checkbox-wrapper.cz-disabled {
1241
+ cursor: not-allowed;
1242
+ opacity: var(--cz-checkbox-disabled-opacity);
1243
+ }
1244
+
1245
+ .cz-checkbox {
1246
+ all: unset;
1247
+ box-sizing: border-box;
1248
+ display: inline-flex;
1249
+ align-items: center;
1250
+ justify-content: center;
1251
+ border-radius: var(--cz-checkbox-border-radius);
1252
+ border: var(--cz-checkbox-border-width) solid var(--cz-checkbox-border-color);
1253
+ background-color: var(--cz-checkbox-bg);
1254
+ transition: all var(--cz-transition-fast);
1255
+ flex-shrink: 0;
1256
+ cursor: pointer;
1257
+ }
1258
+
1259
+ .cz-checkbox:hover {
1260
+ border-color: var(--cz-checkbox-hover-border-color);
1261
+ }
1262
+
1263
+ .cz-checkbox:focus-visible {
1264
+ outline: none;
1265
+ box-shadow: 0 0 0 2px hsl(var(--cz-color-bg)), 0 0 0 4px var(--cz-checkbox-focus-ring-color);
1266
+ }
1267
+
1268
+ .cz-checkbox:disabled {
1269
+ cursor: not-allowed;
1270
+ opacity: var(--cz-checkbox-disabled-opacity);
1271
+ }
1272
+
1273
+ .cz-checkbox[data-state="checked"],
1274
+ .cz-checkbox[data-state="indeterminate"] {
1275
+ background-color: var(--cz-checkbox-checked-bg);
1276
+ border-color: var(--cz-checkbox-checked-border-color);
1277
+ }
1278
+
1279
+ .cz-checkbox-indicator {
1280
+ display: flex;
1281
+ align-items: center;
1282
+ justify-content: center;
1283
+ color: var(--cz-checkbox-indicator-color);
1284
+ width: 100%;
1285
+ height: 100%;
1286
+ }
1287
+
1288
+ .cz-checkbox-label {
1289
+ font-size: var(--cz-checkbox-label-font-size);
1290
+ color: hsl(var(--cz-color-fg));
1291
+ }
1292
+ `;
1293
+ }
1294
+ function generateCheckboxSizes(config) {
1295
+ let css = "/* Checkbox Sizes */\n";
1296
+ for (const size of ["sm", "md", "lg"]) {
1297
+ css += `.cz-checkbox-${size} {
1298
+ width: var(--cz-checkbox-size-${size});
1299
+ height: var(--cz-checkbox-size-${size});
1300
+ }
1301
+ .cz-checkbox-${size} .cz-checkbox-indicator svg {
1302
+ width: var(--cz-checkbox-icon-size-${size});
1303
+ height: var(--cz-checkbox-icon-size-${size});
1304
+ }
1305
+ `;
1306
+ }
1307
+ return css;
1308
+ }
1309
+ function generateCheckboxDescription() {
1310
+ return `/* Checkbox with Description */
1311
+ .cz-checkbox-wrapper-with-description {
1312
+ align-items: flex-start;
1313
+ }
1314
+ .cz-checkbox-wrapper-with-description .cz-checkbox {
1315
+ margin-top: 0.125rem;
1316
+ }
1317
+
1318
+ .cz-checkbox-text {
1319
+ display: flex;
1320
+ flex-direction: column;
1321
+ gap: 0.125rem;
1322
+ }
1323
+
1324
+ .cz-checkbox-description {
1325
+ font-size: var(--cz-font-size-xs);
1326
+ color: hsl(var(--cz-color-mutedFg));
1327
+ }
1328
+ `;
1329
+ }
1330
+
1331
+ // cli/generators/textarea.ts
1332
+ function generateTextareaCSS(config) {
1333
+ let css = "/* ===== TEXTAREA ===== */\n\n";
1334
+ css += generateTextareaVariables(config);
1335
+ css += "\n";
1336
+ css += generateTextareaBase();
1337
+ css += "\n";
1338
+ css += generateTextareaSizes();
1339
+ css += "\n";
1340
+ css += generateTextareaStates(config);
1341
+ css += "\n";
1342
+ if (config.customCSS) css += `/* Custom Textarea CSS */
1343
+ ${config.customCSS}
1344
+ `;
1345
+ return css;
1346
+ }
1347
+ function generateTextareaVariables(config) {
1348
+ const vars = [];
1349
+ if (config.minHeight) vars.push(` --cz-textarea-min-height: ${config.minHeight};`);
1350
+ if (config.borderRadius) vars.push(` --cz-textarea-border-radius: ${resolveToken(config.borderRadius)};`);
1351
+ if (config.borderWidth) vars.push(` --cz-textarea-border-width: ${config.borderWidth};`);
1352
+ if (config.borderColor) vars.push(` --cz-textarea-border-color: ${resolveToken(config.borderColor)};`);
1353
+ if (config.bg) vars.push(` --cz-textarea-bg: ${resolveToken(config.bg)};`);
1354
+ if (config.color) vars.push(` --cz-textarea-color: ${resolveToken(config.color)};`);
1355
+ if (config.placeholderColor) vars.push(` --cz-textarea-placeholder-color: ${resolveToken(config.placeholderColor)};`);
1356
+ if (config.paddingX) {
1357
+ for (const [size, value] of Object.entries(config.paddingX)) {
1358
+ vars.push(` --cz-textarea-padding-x-${size}: ${value};`);
1359
+ }
1360
+ }
1361
+ if (config.paddingY) {
1362
+ for (const [size, value] of Object.entries(config.paddingY)) {
1363
+ vars.push(` --cz-textarea-padding-y-${size}: ${value};`);
1364
+ }
1365
+ }
1366
+ if (config.fontSize && typeof config.fontSize === "object") {
1367
+ for (const [size, value] of Object.entries(config.fontSize)) {
1368
+ vars.push(` --cz-textarea-font-size-${size}: ${resolveToken(value)};`);
1369
+ }
1370
+ }
1371
+ if (config.states?.focus?.borderColor) vars.push(` --cz-textarea-focus-border-color: ${resolveToken(config.states.focus.borderColor)};`);
1372
+ if (config.states?.focus?.shadow) vars.push(` --cz-textarea-focus-shadow: ${config.states.focus.shadow};`);
1373
+ if (config.states?.disabled?.opacity) vars.push(` --cz-textarea-disabled-opacity: ${config.states.disabled.opacity};`);
1374
+ return `:root {
1375
+ ${vars.join("\n")}
1376
+ }
1377
+ `;
1378
+ }
1379
+ function generateTextareaBase() {
1380
+ return `.cz-textarea-field {
1381
+ display: flex;
1382
+ flex-direction: column;
1383
+ gap: 0.375rem;
1384
+ }
1385
+
1386
+ .cz-textarea {
1387
+ width: 100%;
1388
+ min-height: var(--cz-textarea-min-height);
1389
+ border-radius: var(--cz-textarea-border-radius);
1390
+ border: var(--cz-textarea-border-width) solid var(--cz-textarea-border-color);
1391
+ background-color: var(--cz-textarea-bg);
1392
+ color: var(--cz-textarea-color);
1393
+ resize: vertical;
1394
+ transition: all var(--cz-transition-fast);
1395
+ }
1396
+
1397
+ .cz-textarea::placeholder {
1398
+ color: var(--cz-textarea-placeholder-color);
1399
+ }
1400
+
1401
+ .cz-textarea-auto-resize {
1402
+ resize: none;
1403
+ overflow: hidden;
1404
+ }
1405
+ `;
1406
+ }
1407
+ function generateTextareaSizes() {
1408
+ return `/* Textarea Sizes */
1409
+ .cz-textarea-sm {
1410
+ padding: var(--cz-textarea-padding-y-sm) var(--cz-textarea-padding-x-sm);
1411
+ font-size: var(--cz-textarea-font-size-sm);
1412
+ }
1413
+ .cz-textarea-md {
1414
+ padding: var(--cz-textarea-padding-y-md) var(--cz-textarea-padding-x-md);
1415
+ font-size: var(--cz-textarea-font-size-md);
1416
+ }
1417
+ .cz-textarea-lg {
1418
+ padding: var(--cz-textarea-padding-y-lg) var(--cz-textarea-padding-x-lg);
1419
+ font-size: var(--cz-textarea-font-size-lg);
1420
+ }
1421
+ `;
1422
+ }
1423
+ function generateTextareaStates(config) {
1424
+ return `.cz-textarea:focus {
1425
+ outline: none;
1426
+ border-color: var(--cz-textarea-focus-border-color);
1427
+ box-shadow: var(--cz-textarea-focus-shadow);
1428
+ }
1429
+
1430
+ .cz-textarea:disabled {
1431
+ cursor: not-allowed;
1432
+ opacity: var(--cz-textarea-disabled-opacity);
1433
+ }
1434
+
1435
+ .cz-textarea-description {
1436
+ font-size: var(--cz-font-size-xs);
1437
+ color: var(--cz-textarea-placeholder-color);
1438
+ }
1439
+ `;
1440
+ }
1441
+
1442
+ // cli/generators/select.ts
1443
+ function generateSelectCSS(config) {
1444
+ let css = "/* ===== SELECT ===== */\n\n";
1445
+ css += generateSelectVariables(config);
1446
+ css += "\n";
1447
+ css += generateSelectBase();
1448
+ css += "\n";
1449
+ css += generateSelectSizes();
1450
+ css += "\n";
1451
+ css += generateSelectContent(config);
1452
+ css += "\n";
1453
+ if (config.customCSS) css += `/* Custom Select CSS */
1454
+ ${config.customCSS}
1455
+ `;
1456
+ return css;
1457
+ }
1458
+ function generateSelectVariables(config) {
1459
+ const vars = [];
1460
+ if (config.height) {
1461
+ for (const [size, value] of Object.entries(config.height)) {
1462
+ vars.push(` --cz-select-height-${size}: ${value};`);
1463
+ }
1464
+ }
1465
+ if (config.paddingX) {
1466
+ for (const [size, value] of Object.entries(config.paddingX)) {
1467
+ vars.push(` --cz-select-padding-x-${size}: ${value};`);
1468
+ }
1469
+ }
1470
+ if (config.fontSize && typeof config.fontSize === "object") {
1471
+ for (const [size, value] of Object.entries(config.fontSize)) {
1472
+ vars.push(` --cz-select-font-size-${size}: ${resolveToken(value)};`);
1473
+ }
1474
+ }
1475
+ if (config.borderRadius) vars.push(` --cz-select-border-radius: ${resolveToken(config.borderRadius)};`);
1476
+ if (config.borderWidth) vars.push(` --cz-select-border-width: ${config.borderWidth};`);
1477
+ if (config.borderColor) vars.push(` --cz-select-border-color: ${resolveToken(config.borderColor)};`);
1478
+ if (config.bg) vars.push(` --cz-select-bg: ${resolveToken(config.bg)};`);
1479
+ if (config.color) vars.push(` --cz-select-color: ${resolveToken(config.color)};`);
1480
+ if (config.iconSize) vars.push(` --cz-select-icon-size: ${config.iconSize};`);
1481
+ if (config.states?.focus?.ringWidth) vars.push(` --cz-select-focus-ring-width: ${config.states.focus.ringWidth};`);
1482
+ if (config.states?.focus?.ringColor) vars.push(` --cz-select-focus-ring-color: ${resolveToken(config.states.focus.ringColor)};`);
1483
+ if (config.states?.disabled?.opacity) vars.push(` --cz-select-disabled-opacity: ${config.states.disabled.opacity};`);
1484
+ if (config.content?.bg) vars.push(` --cz-select-content-bg: ${resolveToken(config.content.bg)};`);
1485
+ if (config.content?.borderRadius) vars.push(` --cz-select-content-border-radius: ${resolveToken(config.content.borderRadius)};`);
1486
+ if (config.content?.shadow) vars.push(` --cz-select-content-shadow: ${resolveToken(config.content.shadow)};`);
1487
+ if (config.content?.padding) vars.push(` --cz-select-content-padding: ${config.content.padding};`);
1488
+ if (config.item?.paddingX) vars.push(` --cz-select-item-padding-x: ${config.item.paddingX};`);
1489
+ if (config.item?.paddingY) vars.push(` --cz-select-item-padding-y: ${config.item.paddingY};`);
1490
+ if (config.item?.borderRadius) vars.push(` --cz-select-item-border-radius: ${resolveToken(config.item.borderRadius)};`);
1491
+ if (config.item?.hoverBg) vars.push(` --cz-select-item-hover-bg: ${resolveToken(config.item.hoverBg)};`);
1492
+ return `:root {
1493
+ ${vars.join("\n")}
1494
+ }
1495
+ `;
1496
+ }
1497
+ function generateSelectBase() {
1498
+ return `.cz-select-trigger {
1499
+ display: inline-flex;
1500
+ align-items: center;
1501
+ justify-content: space-between;
1502
+ border-radius: var(--cz-select-border-radius);
1503
+ border: var(--cz-select-border-width) solid var(--cz-select-border-color);
1504
+ background-color: var(--cz-select-bg);
1505
+ color: var(--cz-select-color);
1506
+ transition: all var(--cz-transition-fast);
1507
+ cursor: pointer;
1508
+ gap: 0.5rem;
1509
+ }
1510
+
1511
+ .cz-select-trigger:focus-visible {
1512
+ outline: none;
1513
+ box-shadow: 0 0 0 var(--cz-select-focus-ring-width) var(--cz-select-focus-ring-color);
1514
+ }
1515
+
1516
+ .cz-select-trigger:disabled {
1517
+ cursor: not-allowed;
1518
+ opacity: var(--cz-select-disabled-opacity);
1519
+ }
1520
+
1521
+ .cz-select-trigger[data-placeholder] {
1522
+ color: hsl(var(--cz-color-mutedFg));
1523
+ }
1524
+
1525
+ .cz-select-icon {
1526
+ width: var(--cz-select-icon-size);
1527
+ height: var(--cz-select-icon-size);
1528
+ color: hsl(var(--cz-color-mutedFg));
1529
+ flex-shrink: 0;
1530
+ }
1531
+ `;
1532
+ }
1533
+ function generateSelectSizes() {
1534
+ return `/* Select Sizes */
1535
+ .cz-select-sm {
1536
+ height: var(--cz-select-height-sm);
1537
+ padding: 0 var(--cz-select-padding-x-sm);
1538
+ font-size: var(--cz-select-font-size-sm);
1539
+ }
1540
+ .cz-select-md {
1541
+ height: var(--cz-select-height-md);
1542
+ padding: 0 var(--cz-select-padding-x-md);
1543
+ font-size: var(--cz-select-font-size-md);
1544
+ }
1545
+ .cz-select-lg {
1546
+ height: var(--cz-select-height-lg);
1547
+ padding: 0 var(--cz-select-padding-x-lg);
1548
+ font-size: var(--cz-select-font-size-lg);
1549
+ }
1550
+ `;
1551
+ }
1552
+ function generateSelectContent(config) {
1553
+ return `/* Select Content */
1554
+ .cz-select-content {
1555
+ overflow: hidden;
1556
+ background-color: var(--cz-select-content-bg);
1557
+ border-radius: var(--cz-select-content-border-radius);
1558
+ box-shadow: var(--cz-select-content-shadow);
1559
+ border: 1px solid hsl(var(--cz-color-border));
1560
+ padding: var(--cz-select-content-padding);
1561
+ z-index: 50;
1562
+ }
1563
+
1564
+ .cz-select-viewport {
1565
+ padding: 0;
1566
+ }
1567
+
1568
+ .cz-select-item {
1569
+ display: flex;
1570
+ align-items: center;
1571
+ padding: var(--cz-select-item-padding-y) var(--cz-select-item-padding-x);
1572
+ border-radius: var(--cz-select-item-border-radius);
1573
+ font-size: var(--cz-font-size-sm);
1574
+ cursor: pointer;
1575
+ outline: none;
1576
+ user-select: none;
1577
+ transition: background-color var(--cz-transition-fast);
1578
+ }
1579
+
1580
+ .cz-select-item:hover,
1581
+ .cz-select-item[data-highlighted] {
1582
+ background-color: var(--cz-select-item-hover-bg);
1583
+ }
1584
+
1585
+ .cz-select-item[data-disabled] {
1586
+ opacity: 0.5;
1587
+ pointer-events: none;
1588
+ }
1589
+
1590
+ .cz-select-item-indicator {
1591
+ display: inline-flex;
1592
+ align-items: center;
1593
+ justify-content: center;
1594
+ width: 1rem;
1595
+ margin-right: 0.5rem;
1596
+ }
1597
+
1598
+ .cz-select-separator {
1599
+ height: 1px;
1600
+ background-color: hsl(var(--cz-color-border));
1601
+ margin: 0.25rem 0;
1602
+ }
1603
+
1604
+ .cz-select-label {
1605
+ padding: var(--cz-select-item-padding-y) var(--cz-select-item-padding-x);
1606
+ font-size: var(--cz-font-size-xs);
1607
+ font-weight: var(--cz-font-weight-medium);
1608
+ color: hsl(var(--cz-color-mutedFg));
1609
+ }
1610
+ `;
1611
+ }
1612
+
1613
+ // cli/generators/radio.ts
1614
+ function generateRadioCSS(config) {
1615
+ let css = "/* ===== RADIO ===== */\n\n";
1616
+ css += generateRadioVariables(config);
1617
+ css += "\n";
1618
+ css += generateRadioBase();
1619
+ css += "\n";
1620
+ css += generateRadioGroup();
1621
+ css += "\n";
1622
+ if (config.customCSS) css += `/* Custom Radio CSS */
1623
+ ${config.customCSS}
1624
+ `;
1625
+ return css;
1626
+ }
1627
+ function generateRadioVariables(config) {
1628
+ const vars = [];
1629
+ if (config.size) vars.push(` --cz-radio-size: ${config.size};`);
1630
+ if (config.indicatorSize) vars.push(` --cz-radio-indicator-size: ${config.indicatorSize};`);
1631
+ if (config.borderWidth) vars.push(` --cz-radio-border-width: ${config.borderWidth};`);
1632
+ if (config.borderColor) vars.push(` --cz-radio-border-color: ${resolveToken(config.borderColor)};`);
1633
+ if (config.bg) vars.push(` --cz-radio-bg: ${resolveToken(config.bg)};`);
1634
+ if (config.checkedBorderColor) vars.push(` --cz-radio-checked-border-color: ${resolveToken(config.checkedBorderColor)};`);
1635
+ if (config.indicatorBg) vars.push(` --cz-radio-indicator-bg: ${resolveToken(config.indicatorBg)};`);
1636
+ if (config.labelFontSize) vars.push(` --cz-radio-label-font-size: ${resolveToken(config.labelFontSize)};`);
1637
+ if (config.labelGap) vars.push(` --cz-radio-label-gap: ${config.labelGap};`);
1638
+ if (config.states?.hover?.borderColor) vars.push(` --cz-radio-hover-border-color: ${resolveToken(config.states.hover.borderColor)};`);
1639
+ if (config.states?.focus?.ringWidth) vars.push(` --cz-radio-focus-ring-width: ${config.states.focus.ringWidth};`);
1640
+ if (config.states?.focus?.ringColor) vars.push(` --cz-radio-focus-ring-color: ${resolveToken(config.states.focus.ringColor)};`);
1641
+ if (config.states?.disabled?.opacity) vars.push(` --cz-radio-disabled-opacity: ${config.states.disabled.opacity};`);
1642
+ return `:root {
1643
+ ${vars.join("\n")}
1644
+ }
1645
+ `;
1646
+ }
1647
+ function generateRadioBase() {
1648
+ return `.cz-radio-wrapper {
1649
+ display: inline-flex;
1650
+ align-items: center;
1651
+ gap: var(--cz-radio-label-gap);
1652
+ cursor: pointer;
1653
+ user-select: none;
1654
+ }
1655
+
1656
+ .cz-radio-wrapper.cz-disabled {
1657
+ cursor: not-allowed;
1658
+ opacity: var(--cz-radio-disabled-opacity);
1659
+ }
1660
+
1661
+ .cz-radio {
1662
+ all: unset;
1663
+ box-sizing: border-box;
1664
+ display: inline-flex;
1665
+ align-items: center;
1666
+ justify-content: center;
1667
+ width: var(--cz-radio-size);
1668
+ height: var(--cz-radio-size);
1669
+ border-radius: var(--cz-radius-full);
1670
+ border: var(--cz-radio-border-width) solid var(--cz-radio-border-color);
1671
+ background-color: var(--cz-radio-bg);
1672
+ transition: all var(--cz-transition-fast);
1673
+ flex-shrink: 0;
1674
+ cursor: pointer;
1675
+ }
1676
+
1677
+ .cz-radio:hover {
1678
+ border-color: var(--cz-radio-hover-border-color);
1679
+ }
1680
+
1681
+ .cz-radio:focus-visible {
1682
+ outline: none;
1683
+ box-shadow: 0 0 0 2px hsl(var(--cz-color-bg)), 0 0 0 4px var(--cz-radio-focus-ring-color);
1684
+ }
1685
+
1686
+ .cz-radio:disabled {
1687
+ cursor: not-allowed;
1688
+ opacity: var(--cz-radio-disabled-opacity);
1689
+ }
1690
+
1691
+ .cz-radio[data-state="checked"] {
1692
+ border-color: var(--cz-radio-checked-border-color);
1693
+ }
1694
+
1695
+ .cz-radio-indicator {
1696
+ display: flex;
1697
+ align-items: center;
1698
+ justify-content: center;
1699
+ width: 100%;
1700
+ height: 100%;
1701
+ }
1702
+
1703
+ .cz-radio-indicator::after {
1704
+ content: "";
1705
+ display: block;
1706
+ width: var(--cz-radio-indicator-size);
1707
+ height: var(--cz-radio-indicator-size);
1708
+ border-radius: var(--cz-radius-full);
1709
+ background-color: var(--cz-radio-indicator-bg);
1710
+ }
1711
+
1712
+ .cz-radio-label {
1713
+ font-size: var(--cz-radio-label-font-size);
1714
+ color: hsl(var(--cz-color-fg));
1715
+ }
1716
+ `;
1717
+ }
1718
+ function generateRadioGroup() {
1719
+ return `/* Radio Group */
1720
+ .cz-radio-group {
1721
+ display: flex;
1722
+ flex-direction: column;
1723
+ gap: 0.5rem;
1724
+ }
1725
+
1726
+ .cz-radio-group-horizontal {
1727
+ flex-direction: row;
1728
+ flex-wrap: wrap;
1729
+ gap: 1rem;
1730
+ }
1731
+
1732
+ .cz-radio-group-item {
1733
+ display: flex;
1734
+ align-items: flex-start;
1735
+ gap: var(--cz-radio-label-gap);
1736
+ }
1737
+
1738
+ .cz-radio-group-item .cz-radio {
1739
+ margin-top: 0.125rem;
1740
+ }
1741
+
1742
+ .cz-radio-group-text {
1743
+ display: flex;
1744
+ flex-direction: column;
1745
+ gap: 0.125rem;
1746
+ }
1747
+
1748
+ .cz-radio-group-label {
1749
+ font-size: var(--cz-font-size-sm);
1750
+ font-weight: var(--cz-font-weight-medium);
1751
+ color: hsl(var(--cz-color-fg));
1752
+ }
1753
+
1754
+ .cz-radio-group-description {
1755
+ font-size: var(--cz-font-size-xs);
1756
+ color: hsl(var(--cz-color-mutedFg));
1757
+ }
1758
+ `;
1759
+ }
1760
+
1761
+ // cli/generators/label.ts
1762
+ function generateLabelCSS(config) {
1763
+ let css = "/* ===== LABEL ===== */\n\n";
1764
+ css += generateLabelVariables(config);
1765
+ css += "\n";
1766
+ css += generateLabelBase();
1767
+ css += "\n";
1768
+ if (config.customCSS) css += `/* Custom Label CSS */
1769
+ ${config.customCSS}
1770
+ `;
1771
+ return css;
1772
+ }
1773
+ function generateLabelVariables(config) {
1774
+ const vars = [];
1775
+ if (config.fontSize) vars.push(` --cz-label-font-size: ${resolveToken(config.fontSize)};`);
1776
+ if (config.fontWeight) vars.push(` --cz-label-font-weight: ${resolveToken(config.fontWeight)};`);
1777
+ if (config.color) vars.push(` --cz-label-color: ${resolveToken(config.color)};`);
1778
+ if (config.requiredColor) vars.push(` --cz-label-required-color: ${resolveToken(config.requiredColor)};`);
1779
+ if (config.disabledOpacity) vars.push(` --cz-label-disabled-opacity: ${config.disabledOpacity};`);
1780
+ return `:root {
1781
+ ${vars.join("\n")}
1782
+ }
1783
+ `;
1784
+ }
1785
+ function generateLabelBase() {
1786
+ return `.cz-label {
1787
+ font-size: var(--cz-label-font-size);
1788
+ font-weight: var(--cz-label-font-weight);
1789
+ color: var(--cz-label-color);
1790
+ }
1791
+
1792
+ .cz-label-required {
1793
+ color: var(--cz-label-required-color);
1794
+ margin-left: 0.25rem;
1795
+ }
1796
+
1797
+ .cz-label-disabled {
1798
+ opacity: var(--cz-label-disabled-opacity);
1799
+ cursor: not-allowed;
1800
+ }
1801
+
1802
+ .cz-error {
1803
+ font-size: var(--cz-font-size-sm);
1804
+ color: hsl(var(--cz-color-danger));
1805
+ }
1806
+ `;
1807
+ }
1808
+
1809
+ // cli/generators/badge.ts
1810
+ function generateBadgeCSS(config) {
1811
+ let css = "/* ===== BADGE ===== */\n\n";
1812
+ css += generateBadgeVariables(config);
1813
+ css += "\n";
1814
+ css += generateBadgeBase();
1815
+ css += "\n";
1816
+ css += generateBadgeSizes();
1817
+ css += "\n";
1818
+ css += generateBadgeVariants(config);
1819
+ css += "\n";
1820
+ if (config.customCSS) css += `/* Custom Badge CSS */
1821
+ ${config.customCSS}
1822
+ `;
1823
+ return css;
1824
+ }
1825
+ function generateBadgeVariables(config) {
1826
+ const vars = [];
1827
+ if (config.paddingX) {
1828
+ for (const [size, value] of Object.entries(config.paddingX)) {
1829
+ vars.push(` --cz-badge-padding-x-${size}: ${value};`);
1830
+ }
1831
+ }
1832
+ if (config.paddingY) {
1833
+ for (const [size, value] of Object.entries(config.paddingY)) {
1834
+ vars.push(` --cz-badge-padding-y-${size}: ${value};`);
1835
+ }
1836
+ }
1837
+ if (config.fontSize) {
1838
+ for (const [size, value] of Object.entries(config.fontSize)) {
1839
+ vars.push(` --cz-badge-font-size-${size}: ${resolveToken(value)};`);
1840
+ }
1841
+ }
1842
+ if (config.fontWeight) vars.push(` --cz-badge-font-weight: ${resolveToken(config.fontWeight)};`);
1843
+ if (config.borderRadius) vars.push(` --cz-badge-border-radius: ${resolveToken(config.borderRadius)};`);
1844
+ if (config.variants) {
1845
+ for (const [name, variant] of Object.entries(config.variants)) {
1846
+ if (variant.bg) vars.push(` --cz-badge-${name}-bg: ${resolveToken(variant.bg)};`);
1847
+ if (variant.color) vars.push(` --cz-badge-${name}-color: ${resolveToken(variant.color)};`);
1848
+ if (variant.borderColor) vars.push(` --cz-badge-${name}-border-color: ${resolveToken(variant.borderColor)};`);
1849
+ }
1850
+ }
1851
+ return `:root {
1852
+ ${vars.join("\n")}
1853
+ }
1854
+ `;
1855
+ }
1856
+ function generateBadgeBase() {
1857
+ return `.cz-badge {
1858
+ display: inline-flex;
1859
+ align-items: center;
1860
+ border-radius: var(--cz-badge-border-radius);
1861
+ font-weight: var(--cz-badge-font-weight);
1862
+ white-space: nowrap;
1863
+ border: 1px solid transparent;
1864
+ }
1865
+ `;
1866
+ }
1867
+ function generateBadgeSizes() {
1868
+ return `/* Badge Sizes */
1869
+ .cz-badge-sm {
1870
+ padding: var(--cz-badge-padding-y-sm) var(--cz-badge-padding-x-sm);
1871
+ font-size: var(--cz-badge-font-size-sm);
1872
+ }
1873
+ .cz-badge-md {
1874
+ padding: var(--cz-badge-padding-y-md) var(--cz-badge-padding-x-md);
1875
+ font-size: var(--cz-badge-font-size-md);
1876
+ }
1877
+ `;
1878
+ }
1879
+ function generateBadgeVariants(config) {
1880
+ let css = "/* Badge Variants */\n";
1881
+ const defaultVariants = ["default", "primary", "success", "danger", "warning", "outline"];
1882
+ for (const name of defaultVariants) {
1883
+ css += `.cz-badge-${name} {
1884
+ background: var(--cz-badge-${name}-bg);
1885
+ color: var(--cz-badge-${name}-color);
1886
+ }
1887
+ `;
1888
+ }
1889
+ if (config.variants) {
1890
+ for (const name of Object.keys(config.variants)) {
1891
+ if (!defaultVariants.includes(name)) {
1892
+ css += `.cz-badge-${name} {
1893
+ background: var(--cz-badge-${name}-bg);
1894
+ color: var(--cz-badge-${name}-color);
1895
+ }
1896
+ `;
1897
+ }
1898
+ }
1899
+ }
1900
+ return css;
1901
+ }
1902
+
1903
+ // cli/generators/avatar.ts
1904
+ function generateAvatarCSS(config) {
1905
+ let css = "/* ===== AVATAR ===== */\n\n";
1906
+ css += generateAvatarVariables(config);
1907
+ css += "\n";
1908
+ css += generateAvatarBase();
1909
+ css += "\n";
1910
+ css += generateAvatarSizes();
1911
+ css += "\n";
1912
+ if (config.customCSS) css += `/* Custom Avatar CSS */
1913
+ ${config.customCSS}
1914
+ `;
1915
+ return css;
1916
+ }
1917
+ function generateAvatarVariables(config) {
1918
+ const vars = [];
1919
+ if (config.size) {
1920
+ for (const [size, value] of Object.entries(config.size)) {
1921
+ vars.push(` --cz-avatar-size-${size}: ${value};`);
1922
+ }
1923
+ }
1924
+ if (config.borderRadius) vars.push(` --cz-avatar-border-radius: ${resolveToken(config.borderRadius)};`);
1925
+ if (config.fallbackBg) vars.push(` --cz-avatar-fallback-bg: ${resolveToken(config.fallbackBg)};`);
1926
+ if (config.fallbackColor) vars.push(` --cz-avatar-fallback-color: ${resolveToken(config.fallbackColor)};`);
1927
+ if (config.fallbackFontWeight) vars.push(` --cz-avatar-fallback-font-weight: ${resolveToken(config.fallbackFontWeight)};`);
1928
+ return `:root {
1929
+ ${vars.join("\n")}
1930
+ }
1931
+ `;
1932
+ }
1933
+ function generateAvatarBase() {
1934
+ return `.cz-avatar {
1935
+ position: relative;
1936
+ display: inline-flex;
1937
+ align-items: center;
1938
+ justify-content: center;
1939
+ overflow: hidden;
1940
+ border-radius: var(--cz-avatar-border-radius);
1941
+ background-color: var(--cz-avatar-fallback-bg);
1942
+ flex-shrink: 0;
1943
+ }
1944
+
1945
+ .cz-avatar-image {
1946
+ width: 100%;
1947
+ height: 100%;
1948
+ object-fit: cover;
1949
+ }
1950
+
1951
+ .cz-avatar-fallback {
1952
+ display: flex;
1953
+ align-items: center;
1954
+ justify-content: center;
1955
+ width: 100%;
1956
+ height: 100%;
1957
+ font-weight: var(--cz-avatar-fallback-font-weight);
1958
+ color: var(--cz-avatar-fallback-color);
1959
+ text-transform: uppercase;
1960
+ }
1961
+ `;
1962
+ }
1963
+ function generateAvatarSizes() {
1964
+ return `/* Avatar Sizes */
1965
+ .cz-avatar-sm {
1966
+ width: var(--cz-avatar-size-sm);
1967
+ height: var(--cz-avatar-size-sm);
1968
+ font-size: calc(var(--cz-avatar-size-sm) * 0.4);
1969
+ }
1970
+ .cz-avatar-md {
1971
+ width: var(--cz-avatar-size-md);
1972
+ height: var(--cz-avatar-size-md);
1973
+ font-size: calc(var(--cz-avatar-size-md) * 0.4);
1974
+ }
1975
+ .cz-avatar-lg {
1976
+ width: var(--cz-avatar-size-lg);
1977
+ height: var(--cz-avatar-size-lg);
1978
+ font-size: calc(var(--cz-avatar-size-lg) * 0.4);
1979
+ }
1980
+ .cz-avatar-xl {
1981
+ width: var(--cz-avatar-size-xl);
1982
+ height: var(--cz-avatar-size-xl);
1983
+ font-size: calc(var(--cz-avatar-size-xl) * 0.4);
1984
+ }
1985
+
1986
+ /* Avatar Group */
1987
+ .cz-avatar-group {
1988
+ display: flex;
1989
+ }
1990
+
1991
+ .cz-avatar-group .cz-avatar {
1992
+ border: 2px solid hsl(var(--cz-color-bg));
1993
+ margin-left: -0.5rem;
1994
+ }
1995
+
1996
+ .cz-avatar-group .cz-avatar:first-child {
1997
+ margin-left: 0;
1998
+ }
1999
+ `;
2000
+ }
2001
+
2002
+ // cli/generators/table.ts
2003
+ function generateTableCSS(config) {
2004
+ let css = "/* ===== TABLE ===== */\n\n";
2005
+ css += generateTableVariables(config);
2006
+ css += "\n";
2007
+ css += generateTableBase();
2008
+ css += "\n";
2009
+ if (config.customCSS) css += `/* Custom Table CSS */
2010
+ ${config.customCSS}
2011
+ `;
2012
+ return css;
2013
+ }
2014
+ function generateTableVariables(config) {
2015
+ const vars = [];
2016
+ if (config.borderColor) vars.push(` --cz-table-border-color: ${resolveToken(config.borderColor)};`);
2017
+ if (config.headerBg) vars.push(` --cz-table-header-bg: ${resolveToken(config.headerBg)};`);
2018
+ if (config.headerFontWeight) vars.push(` --cz-table-header-font-weight: ${resolveToken(config.headerFontWeight)};`);
2019
+ if (config.cellPaddingX) vars.push(` --cz-table-cell-padding-x: ${config.cellPaddingX};`);
2020
+ if (config.cellPaddingY) vars.push(` --cz-table-cell-padding-y: ${config.cellPaddingY};`);
2021
+ if (config.rowHoverBg) vars.push(` --cz-table-row-hover-bg: ${resolveToken(config.rowHoverBg)};`);
2022
+ if (config.stripedBg) vars.push(` --cz-table-striped-bg: ${resolveToken(config.stripedBg)};`);
2023
+ return `:root {
2024
+ ${vars.join("\n")}
2025
+ }
2026
+ `;
2027
+ }
2028
+ function generateTableBase() {
2029
+ return `.cz-table-wrapper {
2030
+ width: 100%;
2031
+ overflow: auto;
2032
+ }
2033
+
2034
+ .cz-table {
2035
+ width: 100%;
2036
+ border-collapse: collapse;
2037
+ font-size: var(--cz-font-size-sm);
2038
+ }
2039
+
2040
+ .cz-table-header {
2041
+ background-color: var(--cz-table-header-bg);
2042
+ }
2043
+
2044
+ .cz-table-head {
2045
+ padding: var(--cz-table-cell-padding-y) var(--cz-table-cell-padding-x);
2046
+ text-align: left;
2047
+ font-weight: var(--cz-table-header-font-weight);
2048
+ color: hsl(var(--cz-color-mutedFg));
2049
+ border-bottom: 1px solid var(--cz-table-border-color);
2050
+ white-space: nowrap;
2051
+ }
2052
+
2053
+ .cz-table-body {
2054
+ color: hsl(var(--cz-color-fg));
2055
+ }
2056
+
2057
+ .cz-table-row {
2058
+ transition: background-color var(--cz-transition-fast);
2059
+ }
2060
+
2061
+ .cz-table-row:hover {
2062
+ background-color: var(--cz-table-row-hover-bg);
2063
+ }
2064
+
2065
+ .cz-table-cell {
2066
+ padding: var(--cz-table-cell-padding-y) var(--cz-table-cell-padding-x);
2067
+ border-bottom: 1px solid var(--cz-table-border-color);
2068
+ }
2069
+
2070
+ .cz-table-footer {
2071
+ background-color: var(--cz-table-header-bg);
2072
+ font-weight: var(--cz-font-weight-medium);
2073
+ }
2074
+
2075
+ .cz-table-footer .cz-table-cell {
2076
+ border-bottom: none;
2077
+ border-top: 1px solid var(--cz-table-border-color);
2078
+ }
2079
+
2080
+ /* Table Striped */
2081
+ .cz-table-striped .cz-table-row:nth-child(even) {
2082
+ background-color: var(--cz-table-striped-bg);
2083
+ }
2084
+
2085
+ /* Table Caption */
2086
+ .cz-table-caption {
2087
+ margin-top: 0.5rem;
2088
+ font-size: var(--cz-font-size-sm);
2089
+ color: hsl(var(--cz-color-mutedFg));
2090
+ text-align: center;
2091
+ }
2092
+ `;
2093
+ }
2094
+
2095
+ // cli/generators/code.ts
2096
+ function generateCodeCSS(config) {
2097
+ let css = "/* ===== CODE ===== */\n\n";
2098
+ css += generateCodeVariables(config);
2099
+ css += "\n";
2100
+ css += generateCodeBase();
2101
+ css += "\n";
2102
+ if (config.customCSS) css += `/* Custom Code CSS */
2103
+ ${config.customCSS}
2104
+ `;
2105
+ return css;
2106
+ }
2107
+ function generateCodeVariables(config) {
2108
+ const vars = [];
2109
+ if (config.fontFamily) vars.push(` --cz-code-font-family: ${config.fontFamily};`);
2110
+ if (config.fontSize) vars.push(` --cz-code-font-size: ${resolveToken(config.fontSize)};`);
2111
+ if (config.paddingX) vars.push(` --cz-code-padding-x: ${config.paddingX};`);
2112
+ if (config.paddingY) vars.push(` --cz-code-padding-y: ${config.paddingY};`);
2113
+ if (config.borderRadius) vars.push(` --cz-code-border-radius: ${resolveToken(config.borderRadius)};`);
2114
+ if (config.bg) vars.push(` --cz-code-bg: ${resolveToken(config.bg)};`);
2115
+ if (config.color) vars.push(` --cz-code-color: ${resolveToken(config.color)};`);
2116
+ if (config.blockPadding) vars.push(` --cz-code-block-padding: ${resolveToken(config.blockPadding)};`);
2117
+ return `:root {
2118
+ ${vars.join("\n")}
2119
+ }
2120
+ `;
2121
+ }
2122
+ function generateCodeBase() {
2123
+ return `.cz-code {
2124
+ font-family: var(--cz-code-font-family);
2125
+ font-size: var(--cz-code-font-size);
2126
+ padding: var(--cz-code-padding-y) var(--cz-code-padding-x);
2127
+ border-radius: var(--cz-code-border-radius);
2128
+ background-color: var(--cz-code-bg);
2129
+ color: var(--cz-code-color);
2130
+ }
2131
+
2132
+ .cz-code-block {
2133
+ display: block;
2134
+ padding: var(--cz-code-block-padding);
2135
+ overflow-x: auto;
2136
+ white-space: pre;
2137
+ }
2138
+ `;
2139
+ }
2140
+
2141
+ // cli/generators/kbd.ts
2142
+ function generateKbdCSS(config) {
2143
+ let css = "/* ===== KBD ===== */\n\n";
2144
+ css += generateKbdVariables(config);
2145
+ css += "\n";
2146
+ css += generateKbdBase();
2147
+ css += "\n";
2148
+ if (config.customCSS) css += `/* Custom Kbd CSS */
2149
+ ${config.customCSS}
2150
+ `;
2151
+ return css;
2152
+ }
2153
+ function generateKbdVariables(config) {
2154
+ const vars = [];
2155
+ if (config.fontFamily) vars.push(` --cz-kbd-font-family: ${config.fontFamily};`);
2156
+ if (config.fontSize) vars.push(` --cz-kbd-font-size: ${resolveToken(config.fontSize)};`);
2157
+ if (config.fontWeight) vars.push(` --cz-kbd-font-weight: ${resolveToken(config.fontWeight)};`);
2158
+ if (config.paddingX) vars.push(` --cz-kbd-padding-x: ${config.paddingX};`);
2159
+ if (config.paddingY) vars.push(` --cz-kbd-padding-y: ${config.paddingY};`);
2160
+ if (config.borderRadius) vars.push(` --cz-kbd-border-radius: ${resolveToken(config.borderRadius)};`);
2161
+ if (config.bg) vars.push(` --cz-kbd-bg: ${resolveToken(config.bg)};`);
2162
+ if (config.color) vars.push(` --cz-kbd-color: ${resolveToken(config.color)};`);
2163
+ if (config.borderColor) vars.push(` --cz-kbd-border-color: ${resolveToken(config.borderColor)};`);
2164
+ if (config.shadow) vars.push(` --cz-kbd-shadow: ${resolveToken(config.shadow)};`);
2165
+ return `:root {
2166
+ ${vars.join("\n")}
2167
+ }
2168
+ `;
2169
+ }
2170
+ function generateKbdBase() {
2171
+ return `.cz-kbd {
2172
+ display: inline-flex;
2173
+ align-items: center;
2174
+ justify-content: center;
2175
+ font-family: var(--cz-kbd-font-family);
2176
+ font-size: var(--cz-kbd-font-size);
2177
+ font-weight: var(--cz-kbd-font-weight);
2178
+ padding: var(--cz-kbd-padding-y) var(--cz-kbd-padding-x);
2179
+ border-radius: var(--cz-kbd-border-radius);
2180
+ background-color: var(--cz-kbd-bg);
2181
+ color: var(--cz-kbd-color);
2182
+ border: 1px solid var(--cz-kbd-border-color);
2183
+ box-shadow: var(--cz-kbd-shadow);
2184
+ min-width: 1.5rem;
2185
+ }
2186
+ `;
2187
+ }
2188
+
2189
+ // cli/generators/tag.ts
2190
+ function generateTagCSS(config) {
2191
+ let css = "/* ===== TAG ===== */\n\n";
2192
+ css += generateTagVariables(config);
2193
+ css += "\n";
2194
+ css += generateTagBase();
2195
+ css += "\n";
2196
+ if (config.customCSS) css += `/* Custom Tag CSS */
2197
+ ${config.customCSS}
2198
+ `;
2199
+ return css;
2200
+ }
2201
+ function generateTagVariables(config) {
2202
+ const vars = [];
2203
+ if (config.paddingX) vars.push(` --cz-tag-padding-x: ${config.paddingX};`);
2204
+ if (config.paddingY) vars.push(` --cz-tag-padding-y: ${config.paddingY};`);
2205
+ if (config.fontSize) vars.push(` --cz-tag-font-size: ${resolveToken(config.fontSize)};`);
2206
+ if (config.fontWeight) vars.push(` --cz-tag-font-weight: ${resolveToken(config.fontWeight)};`);
2207
+ if (config.borderRadius) vars.push(` --cz-tag-border-radius: ${resolveToken(config.borderRadius)};`);
2208
+ if (config.gap) vars.push(` --cz-tag-gap: ${config.gap};`);
2209
+ if (config.variants) {
2210
+ for (const [name, variant] of Object.entries(config.variants)) {
2211
+ if (variant.bg) vars.push(` --cz-tag-${name}-bg: ${resolveToken(variant.bg)};`);
2212
+ if (variant.color) vars.push(` --cz-tag-${name}-color: ${resolveToken(variant.color)};`);
2213
+ }
2214
+ }
2215
+ return `:root {
2216
+ ${vars.join("\n")}
2217
+ }
2218
+ `;
2219
+ }
2220
+ function generateTagBase() {
2221
+ return `.cz-tag {
2222
+ display: inline-flex;
2223
+ align-items: center;
2224
+ gap: var(--cz-tag-gap);
2225
+ padding: var(--cz-tag-padding-y) var(--cz-tag-padding-x);
2226
+ border-radius: var(--cz-tag-border-radius);
2227
+ font-size: var(--cz-tag-font-size);
2228
+ font-weight: var(--cz-tag-font-weight);
2229
+ white-space: nowrap;
2230
+ }
2231
+
2232
+ .cz-tag-icon {
2233
+ width: 0.875rem;
2234
+ height: 0.875rem;
2235
+ flex-shrink: 0;
2236
+ }
2237
+
2238
+ .cz-tag-close {
2239
+ display: inline-flex;
2240
+ align-items: center;
2241
+ justify-content: center;
2242
+ width: 1rem;
2243
+ height: 1rem;
2244
+ margin-left: 0.25rem;
2245
+ margin-right: -0.25rem;
2246
+ border-radius: var(--cz-radius-sm);
2247
+ cursor: pointer;
2248
+ opacity: 0.7;
2249
+ transition: opacity var(--cz-transition-fast);
2250
+ }
2251
+
2252
+ .cz-tag-close:hover {
2253
+ opacity: 1;
2254
+ }
2255
+
2256
+ /* Tag Variants */
2257
+ .cz-tag-default {
2258
+ background: var(--cz-tag-default-bg);
2259
+ color: var(--cz-tag-default-color);
2260
+ }
2261
+ .cz-tag-primary {
2262
+ background: var(--cz-tag-primary-bg);
2263
+ color: var(--cz-tag-primary-color);
2264
+ }
2265
+ .cz-tag-success {
2266
+ background: var(--cz-tag-success-bg);
2267
+ color: var(--cz-tag-success-color);
2268
+ }
2269
+ .cz-tag-warning {
2270
+ background: var(--cz-tag-warning-bg);
2271
+ color: var(--cz-tag-warning-color);
2272
+ }
2273
+ .cz-tag-danger {
2274
+ background: var(--cz-tag-danger-bg);
2275
+ color: var(--cz-tag-danger-color);
2276
+ }
2277
+
2278
+ /* Tag Group */
2279
+ .cz-tag-group {
2280
+ display: flex;
2281
+ flex-wrap: wrap;
2282
+ gap: 0.5rem;
2283
+ }
2284
+ `;
2285
+ }
2286
+
2287
+ // cli/generators/alert.ts
2288
+ function generateAlertCSS(config) {
2289
+ let css = "/* ===== ALERT ===== */\n\n";
2290
+ css += generateAlertVariables(config);
2291
+ css += "\n";
2292
+ css += generateAlertBase();
2293
+ css += "\n";
2294
+ css += generateAlertVariants(config);
2295
+ css += "\n";
2296
+ if (config.customCSS) css += `/* Custom Alert CSS */
2297
+ ${config.customCSS}
2298
+ `;
2299
+ return css;
2300
+ }
2301
+ function generateAlertVariables(config) {
2302
+ const vars = [];
2303
+ if (config.paddingX) vars.push(` --cz-alert-padding-x: ${resolveToken(config.paddingX)};`);
2304
+ if (config.paddingY) vars.push(` --cz-alert-padding-y: ${resolveToken(config.paddingY)};`);
2305
+ if (config.borderRadius) vars.push(` --cz-alert-border-radius: ${resolveToken(config.borderRadius)};`);
2306
+ if (config.borderWidth) vars.push(` --cz-alert-border-width: ${config.borderWidth};`);
2307
+ if (config.titleFontSize) vars.push(` --cz-alert-title-font-size: ${resolveToken(config.titleFontSize)};`);
2308
+ if (config.titleFontWeight) vars.push(` --cz-alert-title-font-weight: ${resolveToken(config.titleFontWeight)};`);
2309
+ if (config.contentFontSize) vars.push(` --cz-alert-content-font-size: ${resolveToken(config.contentFontSize)};`);
2310
+ if (config.variants) {
2311
+ for (const [name, variant] of Object.entries(config.variants)) {
2312
+ if (variant.bg) vars.push(` --cz-alert-${name}-bg: ${resolveToken(variant.bg)};`);
2313
+ if (variant.borderColor) vars.push(` --cz-alert-${name}-border-color: ${resolveToken(variant.borderColor)};`);
2314
+ if (variant.color) vars.push(` --cz-alert-${name}-color: ${resolveToken(variant.color)};`);
2315
+ }
2316
+ }
2317
+ return `:root {
2318
+ ${vars.join("\n")}
2319
+ }
2320
+ `;
2321
+ }
2322
+ function generateAlertBase() {
2323
+ return `.cz-alert {
2324
+ display: flex;
2325
+ gap: 0.75rem;
2326
+ padding: var(--cz-alert-padding-y) var(--cz-alert-padding-x);
2327
+ border-radius: var(--cz-alert-border-radius);
2328
+ border: var(--cz-alert-border-width) solid transparent;
2329
+ }
2330
+
2331
+ .cz-alert-icon {
2332
+ flex-shrink: 0;
2333
+ width: 1.25rem;
2334
+ height: 1.25rem;
2335
+ margin-top: 0.125rem;
2336
+ }
2337
+
2338
+ .cz-alert-content {
2339
+ display: flex;
2340
+ flex-direction: column;
2341
+ gap: 0.25rem;
2342
+ }
2343
+
2344
+ .cz-alert-title {
2345
+ font-size: var(--cz-alert-title-font-size);
2346
+ font-weight: var(--cz-alert-title-font-weight);
2347
+ line-height: var(--cz-font-lineHeight-tight);
2348
+ }
2349
+
2350
+ .cz-alert-description {
2351
+ font-size: var(--cz-alert-content-font-size);
2352
+ opacity: 0.9;
2353
+ }
2354
+ `;
2355
+ }
2356
+ function generateAlertVariants(config) {
2357
+ let css = "/* Alert Variants */\n";
2358
+ const defaultVariants = ["info", "success", "warning", "danger"];
2359
+ for (const name of defaultVariants) {
2360
+ css += `.cz-alert-${name} {
2361
+ background: var(--cz-alert-${name}-bg);
2362
+ border-color: var(--cz-alert-${name}-border-color);
2363
+ color: var(--cz-alert-${name}-color);
2364
+ }
2365
+ .cz-alert-${name} .cz-alert-icon { color: var(--cz-alert-${name}-color); }
2366
+ `;
2367
+ }
2368
+ return css;
2369
+ }
2370
+
2371
+ // cli/generators/toast.ts
2372
+ function generateToastCSS(config) {
2373
+ let css = "/* ===== TOAST ===== */\n\n";
2374
+ css += generateToastVariables(config);
2375
+ css += "\n";
2376
+ css += generateToastBase();
2377
+ css += "\n";
2378
+ if (config.customCSS) css += `/* Custom Toast CSS */
2379
+ ${config.customCSS}
2380
+ `;
2381
+ return css;
2382
+ }
2383
+ function generateToastVariables(config) {
2384
+ const vars = [];
2385
+ if (config.bg) vars.push(` --cz-toast-bg: ${resolveToken(config.bg)};`);
2386
+ if (config.borderRadius) vars.push(` --cz-toast-border-radius: ${resolveToken(config.borderRadius)};`);
2387
+ if (config.borderColor) vars.push(` --cz-toast-border-color: ${resolveToken(config.borderColor)};`);
2388
+ if (config.shadow) vars.push(` --cz-toast-shadow: ${resolveToken(config.shadow)};`);
2389
+ if (config.padding) vars.push(` --cz-toast-padding: ${resolveToken(config.padding)};`);
2390
+ if (config.gap) vars.push(` --cz-toast-gap: ${config.gap};`);
2391
+ if (config.titleFontSize) vars.push(` --cz-toast-title-font-size: ${resolveToken(config.titleFontSize)};`);
2392
+ if (config.titleFontWeight) vars.push(` --cz-toast-title-font-weight: ${resolveToken(config.titleFontWeight)};`);
2393
+ if (config.descriptionFontSize) vars.push(` --cz-toast-description-font-size: ${resolveToken(config.descriptionFontSize)};`);
2394
+ return `:root {
2395
+ ${vars.join("\n")}
2396
+ }
2397
+ `;
2398
+ }
2399
+ function generateToastBase() {
2400
+ return `.cz-toast-viewport {
2401
+ position: fixed;
2402
+ bottom: 0;
2403
+ right: 0;
2404
+ display: flex;
2405
+ flex-direction: column;
2406
+ gap: 0.5rem;
2407
+ padding: 1rem;
2408
+ max-width: 420px;
2409
+ width: 100%;
2410
+ z-index: 100;
2411
+ pointer-events: none;
2412
+ }
2413
+
2414
+ .cz-toast {
2415
+ display: flex;
2416
+ gap: var(--cz-toast-gap);
2417
+ padding: var(--cz-toast-padding);
2418
+ background-color: var(--cz-toast-bg);
2419
+ border-radius: var(--cz-toast-border-radius);
2420
+ border: 1px solid var(--cz-toast-border-color);
2421
+ box-shadow: var(--cz-toast-shadow);
2422
+ pointer-events: auto;
2423
+ animation: cz-toast-slide-in 300ms ease;
2424
+ }
2425
+
2426
+ .cz-toast[data-state="closed"] {
2427
+ animation: cz-toast-slide-out 200ms ease forwards;
2428
+ }
2429
+
2430
+ .cz-toast-icon {
2431
+ flex-shrink: 0;
2432
+ width: 1.25rem;
2433
+ height: 1.25rem;
2434
+ }
2435
+
2436
+ .cz-toast-content {
2437
+ display: flex;
2438
+ flex-direction: column;
2439
+ gap: 0.25rem;
2440
+ flex: 1;
2441
+ min-width: 0;
2442
+ }
2443
+
2444
+ .cz-toast-title {
2445
+ font-size: var(--cz-toast-title-font-size);
2446
+ font-weight: var(--cz-toast-title-font-weight);
2447
+ color: hsl(var(--cz-color-fg));
2448
+ }
2449
+
2450
+ .cz-toast-description {
2451
+ font-size: var(--cz-toast-description-font-size);
2452
+ color: hsl(var(--cz-color-mutedFg));
2453
+ }
2454
+
2455
+ .cz-toast-close {
2456
+ position: absolute;
2457
+ top: 0.5rem;
2458
+ right: 0.5rem;
2459
+ padding: 0.25rem;
2460
+ border-radius: var(--cz-radius-sm);
2461
+ background: transparent;
2462
+ border: none;
2463
+ cursor: pointer;
2464
+ color: hsl(var(--cz-color-mutedFg));
2465
+ opacity: 0.5;
2466
+ transition: opacity var(--cz-transition-fast);
2467
+ }
2468
+
2469
+ .cz-toast-close:hover {
2470
+ opacity: 1;
2471
+ }
2472
+
2473
+ .cz-toast-action {
2474
+ margin-top: 0.5rem;
2475
+ }
2476
+
2477
+ /* Toast Variants */
2478
+ .cz-toast-success .cz-toast-icon { color: hsl(var(--cz-color-success)); }
2479
+ .cz-toast-warning .cz-toast-icon { color: hsl(var(--cz-color-warning)); }
2480
+ .cz-toast-danger .cz-toast-icon { color: hsl(var(--cz-color-danger)); }
2481
+
2482
+ @keyframes cz-toast-slide-in {
2483
+ from { transform: translateX(100%); opacity: 0; }
2484
+ to { transform: translateX(0); opacity: 1; }
2485
+ }
2486
+
2487
+ @keyframes cz-toast-slide-out {
2488
+ from { transform: translateX(0); opacity: 1; }
2489
+ to { transform: translateX(100%); opacity: 0; }
2490
+ }
2491
+ `;
2492
+ }
2493
+
2494
+ // cli/generators/tooltip.ts
2495
+ function generateTooltipCSS(config) {
2496
+ let css = "/* ===== TOOLTIP ===== */\n\n";
2497
+ css += generateTooltipVariables(config);
2498
+ css += "\n";
2499
+ css += generateTooltipBase();
2500
+ css += "\n";
2501
+ if (config.customCSS) css += `/* Custom Tooltip CSS */
2502
+ ${config.customCSS}
2503
+ `;
2504
+ return css;
2505
+ }
2506
+ function generateTooltipVariables(config) {
2507
+ const vars = [];
2508
+ if (config.paddingX) vars.push(` --cz-tooltip-padding-x: ${config.paddingX};`);
2509
+ if (config.paddingY) vars.push(` --cz-tooltip-padding-y: ${config.paddingY};`);
2510
+ if (config.fontSize) vars.push(` --cz-tooltip-font-size: ${resolveToken(config.fontSize)};`);
2511
+ if (config.borderRadius) vars.push(` --cz-tooltip-border-radius: ${resolveToken(config.borderRadius)};`);
2512
+ if (config.bg) vars.push(` --cz-tooltip-bg: ${resolveToken(config.bg)};`);
2513
+ if (config.color) vars.push(` --cz-tooltip-color: ${resolveToken(config.color)};`);
2514
+ if (config.shadow) vars.push(` --cz-tooltip-shadow: ${resolveToken(config.shadow)};`);
2515
+ if (config.offset) vars.push(` --cz-tooltip-offset: ${config.offset};`);
2516
+ return `:root {
2517
+ ${vars.join("\n")}
2518
+ }
2519
+ `;
2520
+ }
2521
+ function generateTooltipBase() {
2522
+ return `.cz-tooltip-content {
2523
+ padding: var(--cz-tooltip-padding-y) var(--cz-tooltip-padding-x);
2524
+ font-size: var(--cz-tooltip-font-size);
2525
+ border-radius: var(--cz-tooltip-border-radius);
2526
+ background-color: var(--cz-tooltip-bg);
2527
+ color: var(--cz-tooltip-color);
2528
+ box-shadow: var(--cz-tooltip-shadow);
2529
+ z-index: 50;
2530
+ animation: cz-tooltip-fade-in 150ms ease;
2531
+ }
2532
+
2533
+ .cz-tooltip-arrow {
2534
+ fill: var(--cz-tooltip-bg);
2535
+ }
2536
+
2537
+ @keyframes cz-tooltip-fade-in {
2538
+ from { opacity: 0; transform: scale(0.95); }
2539
+ to { opacity: 1; transform: scale(1); }
2540
+ }
2541
+ `;
2542
+ }
2543
+
2544
+ // cli/generators/progress.ts
2545
+ function generateProgressCSS(config) {
2546
+ let css = "/* ===== PROGRESS ===== */\n\n";
2547
+ css += generateProgressVariables(config);
2548
+ css += "\n";
2549
+ css += generateProgressBase();
2550
+ css += "\n";
2551
+ css += generateProgressSizes();
2552
+ css += "\n";
2553
+ css += generateProgressVariants(config);
2554
+ css += "\n";
2555
+ if (config.customCSS) css += `/* Custom Progress CSS */
2556
+ ${config.customCSS}
2557
+ `;
2558
+ return css;
2559
+ }
2560
+ function generateProgressVariables(config) {
2561
+ const vars = [];
2562
+ if (config.height) {
2563
+ for (const [size, value] of Object.entries(config.height)) {
2564
+ vars.push(` --cz-progress-height-${size}: ${value};`);
2565
+ }
2566
+ }
2567
+ if (config.borderRadius) vars.push(` --cz-progress-border-radius: ${resolveToken(config.borderRadius)};`);
2568
+ if (config.bg) vars.push(` --cz-progress-bg: ${resolveToken(config.bg)};`);
2569
+ if (config.transition) vars.push(` --cz-progress-transition: ${resolveToken(config.transition)};`);
2570
+ if (config.barColors) {
2571
+ for (const [name, value] of Object.entries(config.barColors)) {
2572
+ vars.push(` --cz-progress-bar-${name}: ${resolveToken(value)};`);
2573
+ }
2574
+ }
2575
+ return `:root {
2576
+ ${vars.join("\n")}
2577
+ }
2578
+ `;
2579
+ }
2580
+ function generateProgressBase() {
2581
+ return `.cz-progress {
2582
+ position: relative;
2583
+ overflow: hidden;
2584
+ background-color: var(--cz-progress-bg);
2585
+ border-radius: var(--cz-progress-border-radius);
2586
+ width: 100%;
2587
+ }
2588
+
2589
+ .cz-progress-bar {
2590
+ height: 100%;
2591
+ background-color: var(--cz-progress-bar-default);
2592
+ border-radius: var(--cz-progress-border-radius);
2593
+ transition: width var(--cz-progress-transition);
2594
+ }
2595
+
2596
+ .cz-progress-indeterminate .cz-progress-bar {
2597
+ width: 50% !important;
2598
+ animation: cz-progress-indeterminate 1.5s ease-in-out infinite;
2599
+ }
2600
+
2601
+ @keyframes cz-progress-indeterminate {
2602
+ 0% { transform: translateX(-100%); }
2603
+ 100% { transform: translateX(300%); }
2604
+ }
2605
+ `;
2606
+ }
2607
+ function generateProgressSizes() {
2608
+ return `/* Progress Sizes */
2609
+ .cz-progress-sm { height: var(--cz-progress-height-sm); }
2610
+ .cz-progress-md { height: var(--cz-progress-height-md); }
2611
+ .cz-progress-lg { height: var(--cz-progress-height-lg); }
2612
+ `;
2613
+ }
2614
+ function generateProgressVariants(config) {
2615
+ let css = "/* Progress Variants */\n";
2616
+ const variants = ["default", "success", "warning", "danger"];
2617
+ for (const name of variants) {
2618
+ css += `.cz-progress-${name} .cz-progress-bar { background-color: var(--cz-progress-bar-${name}); }
2619
+ `;
2620
+ }
2621
+ return css;
2622
+ }
2623
+
2624
+ // cli/generators/spinner.ts
2625
+ function generateSpinnerCSS(config) {
2626
+ let css = "/* ===== SPINNER ===== */\n\n";
2627
+ css += generateSpinnerVariables(config);
2628
+ css += "\n";
2629
+ css += generateSpinnerBase();
2630
+ css += "\n";
2631
+ css += generateSpinnerSizes();
2632
+ css += "\n";
2633
+ if (config.customCSS) css += `/* Custom Spinner CSS */
2634
+ ${config.customCSS}
2635
+ `;
2636
+ return css;
2637
+ }
2638
+ function generateSpinnerVariables(config) {
2639
+ const vars = [];
2640
+ if (config.size) {
2641
+ for (const [size, value] of Object.entries(config.size)) {
2642
+ vars.push(` --cz-spinner-size-${size}: ${value};`);
2643
+ }
2644
+ }
2645
+ if (config.borderWidth) {
2646
+ for (const [size, value] of Object.entries(config.borderWidth)) {
2647
+ vars.push(` --cz-spinner-border-width-${size}: ${value};`);
2648
+ }
2649
+ }
2650
+ if (config.color) vars.push(` --cz-spinner-color: ${resolveToken(config.color)};`);
2651
+ if (config.trackColor) vars.push(` --cz-spinner-track-color: ${resolveToken(config.trackColor)};`);
2652
+ if (config.animationDuration) vars.push(` --cz-spinner-duration: ${config.animationDuration};`);
2653
+ return `:root {
2654
+ ${vars.join("\n")}
2655
+ }
2656
+ `;
2657
+ }
2658
+ function generateSpinnerBase() {
2659
+ return `.cz-spinner {
2660
+ display: inline-block;
2661
+ border-radius: var(--cz-radius-full);
2662
+ border-style: solid;
2663
+ border-color: var(--cz-spinner-track-color);
2664
+ border-top-color: var(--cz-spinner-color);
2665
+ animation: cz-spin var(--cz-spinner-duration) linear infinite;
2666
+ }
2667
+ `;
2668
+ }
2669
+ function generateSpinnerSizes() {
2670
+ return `/* Spinner Sizes */
2671
+ .cz-spinner-sm {
2672
+ width: var(--cz-spinner-size-sm);
2673
+ height: var(--cz-spinner-size-sm);
2674
+ border-width: var(--cz-spinner-border-width-sm);
2675
+ }
2676
+ .cz-spinner-md {
2677
+ width: var(--cz-spinner-size-md);
2678
+ height: var(--cz-spinner-size-md);
2679
+ border-width: var(--cz-spinner-border-width-md);
2680
+ }
2681
+ .cz-spinner-lg {
2682
+ width: var(--cz-spinner-size-lg);
2683
+ height: var(--cz-spinner-size-lg);
2684
+ border-width: var(--cz-spinner-border-width-lg);
2685
+ }
2686
+ `;
2687
+ }
2688
+
2689
+ // cli/generators/skeleton.ts
2690
+ function generateSkeletonCSS(config) {
2691
+ let css = "/* ===== SKELETON ===== */\n\n";
2692
+ css += generateSkeletonVariables(config);
2693
+ css += "\n";
2694
+ css += generateSkeletonBase();
2695
+ css += "\n";
2696
+ if (config.customCSS) css += `/* Custom Skeleton CSS */
2697
+ ${config.customCSS}
2698
+ `;
2699
+ return css;
2700
+ }
2701
+ function generateSkeletonVariables(config) {
2702
+ const vars = [];
2703
+ if (config.bg) vars.push(` --cz-skeleton-bg: ${resolveToken(config.bg)};`);
2704
+ if (config.borderRadius) vars.push(` --cz-skeleton-border-radius: ${resolveToken(config.borderRadius)};`);
2705
+ if (config.animationDuration) vars.push(` --cz-skeleton-duration: ${config.animationDuration};`);
2706
+ return `:root {
2707
+ ${vars.join("\n")}
2708
+ }
2709
+ `;
2710
+ }
2711
+ function generateSkeletonBase() {
2712
+ return `.cz-skeleton {
2713
+ background-color: var(--cz-skeleton-bg);
2714
+ border-radius: var(--cz-skeleton-border-radius);
2715
+ animation: cz-skeleton-pulse var(--cz-skeleton-duration) ease-in-out infinite;
2716
+ }
2717
+
2718
+ .cz-skeleton-circle {
2719
+ border-radius: var(--cz-radius-full);
2720
+ }
2721
+
2722
+ .cz-skeleton-text {
2723
+ height: 1rem;
2724
+ width: 100%;
2725
+ }
2726
+
2727
+ @keyframes cz-skeleton-pulse {
2728
+ 0%, 100% { opacity: 1; }
2729
+ 50% { opacity: 0.5; }
2730
+ }
2731
+ `;
2732
+ }
2733
+
2734
+ // cli/generators/tabs.ts
2735
+ function generateTabsCSS(config) {
2736
+ let css = "/* ===== TABS ===== */\n\n";
2737
+ css += generateTabsVariables(config);
2738
+ css += "\n";
2739
+ css += generateTabsBase();
2740
+ css += "\n";
2741
+ if (config.customCSS) css += `/* Custom Tabs CSS */
2742
+ ${config.customCSS}
2743
+ `;
2744
+ return css;
2745
+ }
2746
+ function generateTabsVariables(config) {
2747
+ const vars = [];
2748
+ if (config.listBorderWidth) vars.push(` --cz-tabs-list-border-width: ${config.listBorderWidth};`);
2749
+ if (config.listBorderColor) vars.push(` --cz-tabs-list-border-color: ${resolveToken(config.listBorderColor)};`);
2750
+ if (config.triggerPaddingX) vars.push(` --cz-tabs-trigger-padding-x: ${config.triggerPaddingX};`);
2751
+ if (config.triggerPaddingY) vars.push(` --cz-tabs-trigger-padding-y: ${config.triggerPaddingY};`);
2752
+ if (config.triggerFontSize) vars.push(` --cz-tabs-trigger-font-size: ${resolveToken(config.triggerFontSize)};`);
2753
+ if (config.triggerFontWeight) vars.push(` --cz-tabs-trigger-font-weight: ${resolveToken(config.triggerFontWeight)};`);
2754
+ if (config.triggerColor) vars.push(` --cz-tabs-trigger-color: ${resolveToken(config.triggerColor)};`);
2755
+ if (config.triggerActiveColor) vars.push(` --cz-tabs-trigger-active-color: ${resolveToken(config.triggerActiveColor)};`);
2756
+ if (config.triggerActiveBorderColor) vars.push(` --cz-tabs-trigger-active-border-color: ${resolveToken(config.triggerActiveBorderColor)};`);
2757
+ if (config.contentPadding) vars.push(` --cz-tabs-content-padding: ${resolveToken(config.contentPadding)};`);
2758
+ if (config.states?.hover?.color) vars.push(` --cz-tabs-trigger-hover-color: ${resolveToken(config.states.hover.color)};`);
2759
+ if (config.states?.focus?.ringWidth) vars.push(` --cz-tabs-trigger-focus-ring-width: ${config.states.focus.ringWidth};`);
2760
+ if (config.states?.focus?.ringColor) vars.push(` --cz-tabs-trigger-focus-ring-color: ${resolveToken(config.states.focus.ringColor)};`);
2761
+ return `:root {
2762
+ ${vars.join("\n")}
2763
+ }
2764
+ `;
2765
+ }
2766
+ function generateTabsBase() {
2767
+ return `.cz-tabs {
2768
+ display: flex;
2769
+ flex-direction: column;
2770
+ }
2771
+
2772
+ .cz-tabs-list {
2773
+ display: flex;
2774
+ border-bottom: var(--cz-tabs-list-border-width) solid var(--cz-tabs-list-border-color);
2775
+ gap: 0.5rem;
2776
+ }
2777
+
2778
+ .cz-tabs-trigger {
2779
+ display: inline-flex;
2780
+ align-items: center;
2781
+ justify-content: center;
2782
+ padding: var(--cz-tabs-trigger-padding-y) var(--cz-tabs-trigger-padding-x);
2783
+ font-size: var(--cz-tabs-trigger-font-size);
2784
+ font-weight: var(--cz-tabs-trigger-font-weight);
2785
+ color: var(--cz-tabs-trigger-color);
2786
+ background: transparent;
2787
+ border: none;
2788
+ border-bottom: 2px solid transparent;
2789
+ margin-bottom: calc(var(--cz-tabs-list-border-width) * -1);
2790
+ cursor: pointer;
2791
+ transition: all var(--cz-transition-fast);
2792
+ white-space: nowrap;
2793
+ }
2794
+
2795
+ .cz-tabs-trigger:hover {
2796
+ color: var(--cz-tabs-trigger-hover-color);
2797
+ }
2798
+
2799
+ .cz-tabs-trigger:focus-visible {
2800
+ outline: none;
2801
+ box-shadow: 0 0 0 var(--cz-tabs-trigger-focus-ring-width) var(--cz-tabs-trigger-focus-ring-color);
2802
+ border-radius: var(--cz-radius-sm);
2803
+ }
2804
+
2805
+ .cz-tabs-trigger[data-state="active"],
2806
+ .cz-tabs-trigger.cz-tabs-trigger-active {
2807
+ color: var(--cz-tabs-trigger-active-color);
2808
+ border-bottom-color: var(--cz-tabs-trigger-active-border-color);
2809
+ }
2810
+
2811
+ .cz-tabs-trigger:disabled {
2812
+ opacity: 0.5;
2813
+ cursor: not-allowed;
2814
+ }
2815
+
2816
+ .cz-tabs-content {
2817
+ padding: var(--cz-tabs-content-padding);
2818
+ }
2819
+
2820
+ .cz-tabs-content[data-state="inactive"] {
2821
+ display: none;
2822
+ }
2823
+ `;
2824
+ }
2825
+
2826
+ // cli/generators/breadcrumb.ts
2827
+ function generateBreadcrumbCSS(config) {
2828
+ let css = "/* ===== BREADCRUMB ===== */\n\n";
2829
+ css += generateBreadcrumbVariables(config);
2830
+ css += "\n";
2831
+ css += generateBreadcrumbBase();
2832
+ css += "\n";
2833
+ if (config.customCSS) css += `/* Custom Breadcrumb CSS */
2834
+ ${config.customCSS}
2835
+ `;
2836
+ return css;
2837
+ }
2838
+ function generateBreadcrumbVariables(config) {
2839
+ const vars = [];
2840
+ if (config.gap) vars.push(` --cz-breadcrumb-gap: ${config.gap};`);
2841
+ if (config.fontSize) vars.push(` --cz-breadcrumb-font-size: ${resolveToken(config.fontSize)};`);
2842
+ if (config.itemColor) vars.push(` --cz-breadcrumb-item-color: ${resolveToken(config.itemColor)};`);
2843
+ if (config.linkColor) vars.push(` --cz-breadcrumb-link-color: ${resolveToken(config.linkColor)};`);
2844
+ if (config.activeColor) vars.push(` --cz-breadcrumb-active-color: ${resolveToken(config.activeColor)};`);
2845
+ if (config.separatorColor) vars.push(` --cz-breadcrumb-separator-color: ${resolveToken(config.separatorColor)};`);
2846
+ return `:root {
2847
+ ${vars.join("\n")}
2848
+ }
2849
+ `;
2850
+ }
2851
+ function generateBreadcrumbBase() {
2852
+ return `.cz-breadcrumb {
2853
+ display: flex;
2854
+ flex-wrap: wrap;
2855
+ align-items: center;
2856
+ gap: var(--cz-breadcrumb-gap);
2857
+ font-size: var(--cz-breadcrumb-font-size);
2858
+ }
2859
+
2860
+ .cz-breadcrumb-item {
2861
+ display: inline-flex;
2862
+ align-items: center;
2863
+ gap: var(--cz-breadcrumb-gap);
2864
+ color: var(--cz-breadcrumb-item-color);
2865
+ }
2866
+
2867
+ .cz-breadcrumb-link {
2868
+ color: var(--cz-breadcrumb-link-color);
2869
+ text-decoration: none;
2870
+ transition: color var(--cz-transition-fast);
2871
+ }
2872
+
2873
+ .cz-breadcrumb-link:hover {
2874
+ color: var(--cz-breadcrumb-active-color);
2875
+ text-decoration: underline;
2876
+ }
2877
+
2878
+ .cz-breadcrumb-page {
2879
+ color: var(--cz-breadcrumb-active-color);
2880
+ font-weight: var(--cz-font-weight-medium);
2881
+ }
2882
+
2883
+ .cz-breadcrumb-separator {
2884
+ color: var(--cz-breadcrumb-separator-color);
2885
+ }
2886
+
2887
+ .cz-breadcrumb-ellipsis {
2888
+ display: flex;
2889
+ align-items: center;
2890
+ justify-content: center;
2891
+ width: 1rem;
2892
+ height: 1rem;
2893
+ }
2894
+ `;
2895
+ }
2896
+
2897
+ // cli/generators/accordion.ts
2898
+ function generateAccordionCSS(config) {
2899
+ let css = "/* ===== ACCORDION ===== */\n\n";
2900
+ css += generateAccordionVariables(config);
2901
+ css += "\n";
2902
+ css += generateAccordionBase();
2903
+ css += "\n";
2904
+ if (config.customCSS) css += `/* Custom Accordion CSS */
2905
+ ${config.customCSS}
2906
+ `;
2907
+ return css;
2908
+ }
2909
+ function generateAccordionVariables(config) {
2910
+ const vars = [];
2911
+ if (config.borderColor) vars.push(` --cz-accordion-border-color: ${resolveToken(config.borderColor)};`);
2912
+ if (config.triggerPaddingX) vars.push(` --cz-accordion-trigger-padding-x: ${config.triggerPaddingX};`);
2913
+ if (config.triggerPaddingY) vars.push(` --cz-accordion-trigger-padding-y: ${config.triggerPaddingY};`);
2914
+ if (config.triggerFontSize) vars.push(` --cz-accordion-trigger-font-size: ${resolveToken(config.triggerFontSize)};`);
2915
+ if (config.triggerFontWeight) vars.push(` --cz-accordion-trigger-font-weight: ${resolveToken(config.triggerFontWeight)};`);
2916
+ if (config.triggerHoverBg) vars.push(` --cz-accordion-trigger-hover-bg: ${resolveToken(config.triggerHoverBg)};`);
2917
+ if (config.contentPaddingX) vars.push(` --cz-accordion-content-padding-x: ${config.contentPaddingX};`);
2918
+ if (config.contentPaddingBottom) vars.push(` --cz-accordion-content-padding-bottom: ${config.contentPaddingBottom};`);
2919
+ return `:root {
2920
+ ${vars.join("\n")}
2921
+ }
2922
+ `;
2923
+ }
2924
+ function generateAccordionBase() {
2925
+ return `.cz-accordion {
2926
+ width: 100%;
2927
+ }
2928
+
2929
+ .cz-accordion-item {
2930
+ border-bottom: 1px solid var(--cz-accordion-border-color);
2931
+ }
2932
+
2933
+ .cz-accordion-trigger {
2934
+ display: flex;
2935
+ align-items: center;
2936
+ justify-content: space-between;
2937
+ width: 100%;
2938
+ padding: var(--cz-accordion-trigger-padding-y) var(--cz-accordion-trigger-padding-x);
2939
+ font-size: var(--cz-accordion-trigger-font-size);
2940
+ font-weight: var(--cz-accordion-trigger-font-weight);
2941
+ color: hsl(var(--cz-color-fg));
2942
+ background: transparent;
2943
+ border: none;
2944
+ cursor: pointer;
2945
+ text-align: left;
2946
+ transition: background-color var(--cz-transition-fast);
2947
+ }
2948
+
2949
+ .cz-accordion-trigger:hover {
2950
+ background-color: var(--cz-accordion-trigger-hover-bg);
2951
+ }
2952
+
2953
+ .cz-accordion-trigger-icon {
2954
+ width: 1rem;
2955
+ height: 1rem;
2956
+ flex-shrink: 0;
2957
+ transition: transform var(--cz-transition-fast);
2958
+ }
2959
+
2960
+ .cz-accordion-item[data-state="open"] .cz-accordion-trigger-icon {
2961
+ transform: rotate(180deg);
2962
+ }
2963
+
2964
+ .cz-accordion-content {
2965
+ overflow: hidden;
2966
+ font-size: var(--cz-font-size-sm);
2967
+ color: hsl(var(--cz-color-mutedFg));
2968
+ }
2969
+
2970
+ .cz-accordion-content[data-state="open"] {
2971
+ animation: cz-accordion-open 200ms ease-out;
2972
+ }
2973
+
2974
+ .cz-accordion-content[data-state="closed"] {
2975
+ animation: cz-accordion-close 200ms ease-out;
2976
+ }
2977
+
2978
+ .cz-accordion-content-inner {
2979
+ padding: 0 var(--cz-accordion-content-padding-x) var(--cz-accordion-content-padding-bottom);
2980
+ }
2981
+
2982
+ @keyframes cz-accordion-open {
2983
+ from { height: 0; }
2984
+ to { height: var(--radix-accordion-content-height); }
2985
+ }
2986
+
2987
+ @keyframes cz-accordion-close {
2988
+ from { height: var(--radix-accordion-content-height); }
2989
+ to { height: 0; }
2990
+ }
2991
+ `;
2992
+ }
2993
+
2994
+ // cli/generators/dialog.ts
2995
+ function generateDialogCSS(config) {
2996
+ let css = "/* ===== DIALOG ===== */\n\n";
2997
+ css += generateDialogVariables(config);
2998
+ css += "\n";
2999
+ css += generateDialogBase();
3000
+ css += "\n";
3001
+ if (config.customCSS) css += `/* Custom Dialog CSS */
3002
+ ${config.customCSS}
3003
+ `;
3004
+ return css;
3005
+ }
3006
+ function generateDialogVariables(config) {
3007
+ const vars = [];
3008
+ if (config.overlayBg) vars.push(` --cz-dialog-overlay-bg: ${resolveToken(config.overlayBg)};`);
3009
+ if (config.contentBg) vars.push(` --cz-dialog-content-bg: ${resolveToken(config.contentBg)};`);
3010
+ if (config.contentBorderRadius) vars.push(` --cz-dialog-content-border-radius: ${resolveToken(config.contentBorderRadius)};`);
3011
+ if (config.contentShadow) vars.push(` --cz-dialog-content-shadow: ${resolveToken(config.contentShadow)};`);
3012
+ if (config.contentPadding) vars.push(` --cz-dialog-content-padding: ${resolveToken(config.contentPadding)};`);
3013
+ if (config.contentMaxWidth) vars.push(` --cz-dialog-content-max-width: ${config.contentMaxWidth};`);
3014
+ if (config.headerGap) vars.push(` --cz-dialog-header-gap: ${config.headerGap};`);
3015
+ if (config.titleFontSize) vars.push(` --cz-dialog-title-font-size: ${resolveToken(config.titleFontSize)};`);
3016
+ if (config.titleFontWeight) vars.push(` --cz-dialog-title-font-weight: ${resolveToken(config.titleFontWeight)};`);
3017
+ if (config.descriptionFontSize) vars.push(` --cz-dialog-description-font-size: ${resolveToken(config.descriptionFontSize)};`);
3018
+ if (config.footerGap) vars.push(` --cz-dialog-footer-gap: ${config.footerGap};`);
3019
+ return `:root {
3020
+ ${vars.join("\n")}
3021
+ }
3022
+ `;
3023
+ }
3024
+ function generateDialogBase() {
3025
+ return `.cz-dialog-overlay {
3026
+ position: fixed;
3027
+ inset: 0;
3028
+ background-color: var(--cz-dialog-overlay-bg);
3029
+ z-index: 50;
3030
+ animation: cz-dialog-overlay-show 150ms ease;
3031
+ }
3032
+
3033
+ .cz-dialog-content {
3034
+ position: fixed;
3035
+ top: 50%;
3036
+ left: 50%;
3037
+ transform: translate(-50%, -50%);
3038
+ max-width: var(--cz-dialog-content-max-width);
3039
+ width: calc(100% - 2rem);
3040
+ max-height: 85vh;
3041
+ background-color: var(--cz-dialog-content-bg);
3042
+ border-radius: var(--cz-dialog-content-border-radius);
3043
+ box-shadow: var(--cz-dialog-content-shadow);
3044
+ padding: var(--cz-dialog-content-padding);
3045
+ z-index: 51;
3046
+ animation: cz-dialog-content-show 150ms ease;
3047
+ overflow-y: auto;
3048
+ }
3049
+
3050
+ .cz-dialog-header {
3051
+ display: flex;
3052
+ flex-direction: column;
3053
+ gap: var(--cz-dialog-header-gap);
3054
+ margin-bottom: 1rem;
3055
+ }
3056
+
3057
+ .cz-dialog-title {
3058
+ font-size: var(--cz-dialog-title-font-size);
3059
+ font-weight: var(--cz-dialog-title-font-weight);
3060
+ color: hsl(var(--cz-color-fg));
3061
+ line-height: var(--cz-font-lineHeight-tight);
3062
+ }
3063
+
3064
+ .cz-dialog-description {
3065
+ font-size: var(--cz-dialog-description-font-size);
3066
+ color: hsl(var(--cz-color-mutedFg));
3067
+ }
3068
+
3069
+ .cz-dialog-footer {
3070
+ display: flex;
3071
+ justify-content: flex-end;
3072
+ gap: var(--cz-dialog-footer-gap);
3073
+ margin-top: 1.5rem;
3074
+ }
3075
+
3076
+ .cz-dialog-close {
3077
+ position: absolute;
3078
+ top: 1rem;
3079
+ right: 1rem;
3080
+ padding: 0.25rem;
3081
+ border-radius: var(--cz-radius-sm);
3082
+ background: transparent;
3083
+ border: none;
3084
+ cursor: pointer;
3085
+ color: hsl(var(--cz-color-mutedFg));
3086
+ transition: all var(--cz-transition-fast);
3087
+ }
3088
+
3089
+ .cz-dialog-close:hover {
3090
+ background: hsl(var(--cz-color-muted));
3091
+ color: hsl(var(--cz-color-fg));
3092
+ }
3093
+
3094
+ @keyframes cz-dialog-overlay-show {
3095
+ from { opacity: 0; }
3096
+ to { opacity: 1; }
3097
+ }
3098
+
3099
+ @keyframes cz-dialog-content-show {
3100
+ from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
3101
+ to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
3102
+ }
3103
+ `;
3104
+ }
3105
+
3106
+ // cli/generators/dropdown-menu.ts
3107
+ function generateDropdownMenuCSS(config) {
3108
+ let css = "/* ===== DROPDOWN MENU ===== */\n\n";
3109
+ css += generateDropdownVariables(config);
3110
+ css += "\n";
3111
+ css += generateDropdownBase();
3112
+ css += "\n";
3113
+ if (config.customCSS) css += `/* Custom Dropdown CSS */
3114
+ ${config.customCSS}
3115
+ `;
3116
+ return css;
3117
+ }
3118
+ function generateDropdownVariables(config) {
3119
+ const vars = [];
3120
+ if (config.contentBg) vars.push(` --cz-dropdown-content-bg: ${resolveToken(config.contentBg)};`);
3121
+ if (config.contentBorderRadius) vars.push(` --cz-dropdown-content-border-radius: ${resolveToken(config.contentBorderRadius)};`);
3122
+ if (config.contentShadow) vars.push(` --cz-dropdown-content-shadow: ${resolveToken(config.contentShadow)};`);
3123
+ if (config.contentPadding) vars.push(` --cz-dropdown-content-padding: ${config.contentPadding};`);
3124
+ if (config.itemPaddingX) vars.push(` --cz-dropdown-item-padding-x: ${config.itemPaddingX};`);
3125
+ if (config.itemPaddingY) vars.push(` --cz-dropdown-item-padding-y: ${config.itemPaddingY};`);
3126
+ if (config.itemBorderRadius) vars.push(` --cz-dropdown-item-border-radius: ${resolveToken(config.itemBorderRadius)};`);
3127
+ if (config.itemFontSize) vars.push(` --cz-dropdown-item-font-size: ${resolveToken(config.itemFontSize)};`);
3128
+ if (config.itemHoverBg) vars.push(` --cz-dropdown-item-hover-bg: ${resolveToken(config.itemHoverBg)};`);
3129
+ return `:root {
3130
+ ${vars.join("\n")}
3131
+ }
3132
+ `;
3133
+ }
3134
+ function generateDropdownBase() {
3135
+ return `.cz-dropdown-content {
3136
+ min-width: 8rem;
3137
+ overflow: hidden;
3138
+ background-color: var(--cz-dropdown-content-bg);
3139
+ border-radius: var(--cz-dropdown-content-border-radius);
3140
+ box-shadow: var(--cz-dropdown-content-shadow);
3141
+ border: 1px solid hsl(var(--cz-color-border));
3142
+ padding: var(--cz-dropdown-content-padding);
3143
+ z-index: 50;
3144
+ animation: cz-dropdown-fade-in 150ms ease;
3145
+ }
3146
+
3147
+ .cz-dropdown-item {
3148
+ display: flex;
3149
+ align-items: center;
3150
+ padding: var(--cz-dropdown-item-padding-y) var(--cz-dropdown-item-padding-x);
3151
+ border-radius: var(--cz-dropdown-item-border-radius);
3152
+ font-size: var(--cz-dropdown-item-font-size);
3153
+ color: hsl(var(--cz-color-fg));
3154
+ cursor: pointer;
3155
+ outline: none;
3156
+ user-select: none;
3157
+ transition: background-color var(--cz-transition-fast);
3158
+ gap: 0.5rem;
3159
+ }
3160
+
3161
+ .cz-dropdown-item:hover,
3162
+ .cz-dropdown-item[data-highlighted] {
3163
+ background-color: var(--cz-dropdown-item-hover-bg);
3164
+ }
3165
+
3166
+ .cz-dropdown-item[data-disabled] {
3167
+ opacity: 0.5;
3168
+ pointer-events: none;
3169
+ }
3170
+
3171
+ .cz-dropdown-item-icon {
3172
+ width: 1rem;
3173
+ height: 1rem;
3174
+ color: hsl(var(--cz-color-mutedFg));
3175
+ }
3176
+
3177
+ .cz-dropdown-item-shortcut {
3178
+ margin-left: auto;
3179
+ font-size: var(--cz-font-size-xs);
3180
+ color: hsl(var(--cz-color-mutedFg));
3181
+ }
3182
+
3183
+ .cz-dropdown-separator {
3184
+ height: 1px;
3185
+ background-color: hsl(var(--cz-color-border));
3186
+ margin: 0.25rem 0;
3187
+ }
3188
+
3189
+ .cz-dropdown-label {
3190
+ padding: var(--cz-dropdown-item-padding-y) var(--cz-dropdown-item-padding-x);
3191
+ font-size: var(--cz-font-size-xs);
3192
+ font-weight: var(--cz-font-weight-medium);
3193
+ color: hsl(var(--cz-color-mutedFg));
3194
+ }
3195
+
3196
+ .cz-dropdown-sub-trigger {
3197
+ display: flex;
3198
+ align-items: center;
3199
+ justify-content: space-between;
3200
+ }
3201
+
3202
+ .cz-dropdown-sub-trigger-icon {
3203
+ width: 1rem;
3204
+ height: 1rem;
3205
+ margin-left: auto;
3206
+ }
3207
+
3208
+ @keyframes cz-dropdown-fade-in {
3209
+ from { opacity: 0; transform: scale(0.95); }
3210
+ to { opacity: 1; transform: scale(1); }
3211
+ }
3212
+ `;
3213
+ }
3214
+
3215
+ // cli/generators/separator.ts
3216
+ function generateSeparatorCSS(config) {
3217
+ let css = "/* ===== SEPARATOR ===== */\n\n";
3218
+ css += generateSeparatorVariables(config);
3219
+ css += "\n";
3220
+ css += generateSeparatorBase();
3221
+ css += "\n";
3222
+ if (config.customCSS) css += `/* Custom Separator CSS */
3223
+ ${config.customCSS}
3224
+ `;
3225
+ return css;
3226
+ }
3227
+ function generateSeparatorVariables(config) {
3228
+ const vars = [];
3229
+ if (config.color) vars.push(` --cz-separator-color: ${resolveToken(config.color)};`);
3230
+ if (config.thickness) vars.push(` --cz-separator-thickness: ${config.thickness};`);
3231
+ if (config.marginY) vars.push(` --cz-separator-margin-y: ${resolveToken(config.marginY)};`);
3232
+ if (config.marginX) vars.push(` --cz-separator-margin-x: ${resolveToken(config.marginX)};`);
3233
+ return `:root {
3234
+ ${vars.join("\n")}
3235
+ }
3236
+ `;
3237
+ }
3238
+ function generateSeparatorBase() {
3239
+ return `.cz-separator {
3240
+ background-color: var(--cz-separator-color);
3241
+ flex-shrink: 0;
3242
+ }
3243
+
3244
+ .cz-separator-horizontal {
3245
+ width: 100%;
3246
+ height: var(--cz-separator-thickness);
3247
+ margin: var(--cz-separator-margin-y) 0;
3248
+ }
3249
+
3250
+ .cz-separator-vertical {
3251
+ width: var(--cz-separator-thickness);
3252
+ height: 100%;
3253
+ margin: 0 var(--cz-separator-margin-x);
3254
+ }
3255
+ `;
3256
+ }
3257
+
3258
+ // cli/generators/scroll-area.ts
3259
+ function generateScrollAreaCSS(config) {
3260
+ let css = "/* ===== SCROLL AREA ===== */\n\n";
3261
+ css += generateScrollAreaVariables(config);
3262
+ css += "\n";
3263
+ css += generateScrollAreaBase();
3264
+ css += "\n";
3265
+ if (config.customCSS) css += `/* Custom Scroll Area CSS */
3266
+ ${config.customCSS}
3267
+ `;
3268
+ return css;
3269
+ }
3270
+ function generateScrollAreaVariables(config) {
3271
+ const vars = [];
3272
+ if (config.scrollbarWidth) vars.push(` --cz-scrollbar-width: ${config.scrollbarWidth};`);
3273
+ if (config.thumbBg) vars.push(` --cz-scrollbar-thumb-bg: ${resolveToken(config.thumbBg)};`);
3274
+ if (config.thumbBorderRadius) vars.push(` --cz-scrollbar-thumb-border-radius: ${resolveToken(config.thumbBorderRadius)};`);
3275
+ if (config.trackBg) vars.push(` --cz-scrollbar-track-bg: ${resolveToken(config.trackBg)};`);
3276
+ return `:root {
3277
+ ${vars.join("\n")}
3278
+ }
3279
+ `;
3280
+ }
3281
+ function generateScrollAreaBase() {
3282
+ return `.cz-scroll-area {
3283
+ position: relative;
3284
+ overflow: hidden;
3285
+ }
3286
+
3287
+ .cz-scroll-area-viewport {
3288
+ width: 100%;
3289
+ height: 100%;
3290
+ overflow: scroll;
3291
+ scrollbar-width: none;
3292
+ -ms-overflow-style: none;
3293
+ }
3294
+
3295
+ .cz-scroll-area-viewport::-webkit-scrollbar {
3296
+ display: none;
3297
+ }
3298
+
3299
+ .cz-scrollbar {
3300
+ display: flex;
3301
+ touch-action: none;
3302
+ user-select: none;
3303
+ padding: 2px;
3304
+ transition: background-color var(--cz-transition-fast);
3305
+ }
3306
+
3307
+ .cz-scrollbar:hover {
3308
+ background-color: var(--cz-scrollbar-track-bg);
3309
+ }
3310
+
3311
+ .cz-scrollbar[data-orientation="vertical"] {
3312
+ width: var(--cz-scrollbar-width);
3313
+ }
3314
+
3315
+ .cz-scrollbar[data-orientation="horizontal"] {
3316
+ flex-direction: column;
3317
+ height: var(--cz-scrollbar-width);
3318
+ }
3319
+
3320
+ .cz-scrollbar-thumb {
3321
+ flex: 1;
3322
+ background-color: var(--cz-scrollbar-thumb-bg);
3323
+ border-radius: var(--cz-scrollbar-thumb-border-radius);
3324
+ position: relative;
3325
+ }
3326
+
3327
+ .cz-scrollbar-thumb::before {
3328
+ content: "";
3329
+ position: absolute;
3330
+ top: 50%;
3331
+ left: 50%;
3332
+ transform: translate(-50%, -50%);
3333
+ width: 100%;
3334
+ height: 100%;
3335
+ min-width: 44px;
3336
+ min-height: 44px;
3337
+ }
3338
+
3339
+ .cz-scroll-area-corner {
3340
+ background-color: var(--cz-scrollbar-track-bg);
3341
+ }
3342
+ `;
3343
+ }
3344
+
3345
+ // cli/generators/utilities.ts
3346
+ function generateUtilitiesCSS() {
3347
+ return `/**
3348
+ * CZero Utility Classes
3349
+ */
3350
+
3351
+ /* Display */
3352
+ .cz-inline-flex { display: inline-flex; }
3353
+ .cz-flex { display: flex; }
3354
+ .cz-flex-col { flex-direction: column; }
3355
+ .cz-items-center { align-items: center; }
3356
+ .cz-justify-center { justify-content: center; }
3357
+ .cz-flex-wrap { flex-wrap: wrap; }
3358
+
3359
+ /* Gap */
3360
+ .cz-gap-1 { gap: 0.25rem; }
3361
+ .cz-gap-1\\.5 { gap: 0.375rem; }
3362
+ .cz-gap-2 { gap: 0.5rem; }
3363
+
3364
+ /* Width */
3365
+ .cz-w-full { width: 100%; }
3366
+
3367
+ /* Whitespace */
3368
+ .cz-whitespace-nowrap { white-space: nowrap; }
3369
+
3370
+ /* Opacity */
3371
+ .cz-opacity-25 { opacity: 0.25; }
3372
+ .cz-opacity-50 { opacity: 0.5; }
3373
+ .cz-opacity-75 { opacity: 0.75; }
3374
+
3375
+ /* Animation */
3376
+ @keyframes cz-spin {
3377
+ from { transform: rotate(0deg); }
3378
+ to { transform: rotate(360deg); }
3379
+ }
3380
+ .cz-animate-spin { animation: cz-spin 1s linear infinite; }
3381
+
3382
+ /* Sizing */
3383
+ .cz-h-4 { height: 1rem; }
3384
+ .cz-w-4 { width: 1rem; }
3385
+ .cz-h-8 { height: 2rem; }
3386
+ .cz-h-10 { height: 2.5rem; }
3387
+ .cz-h-12 { height: 3rem; }
3388
+
3389
+ /* Padding */
3390
+ .cz-px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }
3391
+ .cz-px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
3392
+ .cz-px-4 { padding-left: 1rem; padding-right: 1rem; }
3393
+ .cz-px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }
3394
+ .cz-py-0\\.5 { padding-top: 0.125rem; padding-bottom: 0.125rem; }
3395
+ .cz-p-lg { padding: var(--cz-spacing-lg); }
3396
+ .cz-pb-md { padding-bottom: var(--cz-spacing-md); }
3397
+ .cz-pt-md { padding-top: var(--cz-spacing-md); }
3398
+ .cz-px-1\\.5 { padding-left: 0.375rem; padding-right: 0.375rem; }
3399
+
3400
+ /* Margin */
3401
+ .cz-mb-md { margin-bottom: var(--cz-spacing-md); }
3402
+ .cz-mt-md { margin-top: var(--cz-spacing-md); }
3403
+
3404
+ /* Typography */
3405
+ .cz-text-xs { font-size: var(--cz-font-size-xs); }
3406
+ .cz-text-sm { font-size: var(--cz-font-size-sm); }
3407
+ .cz-text-md { font-size: var(--cz-font-size-md); }
3408
+ .cz-text-lg { font-size: var(--cz-font-size-lg); }
3409
+ .cz-font-medium { font-weight: var(--cz-font-weight-medium); }
3410
+ .cz-font-semibold { font-weight: var(--cz-font-weight-semibold); }
3411
+ .cz-leading-tight { line-height: var(--cz-font-lineHeight-tight); }
3412
+
3413
+ /* Colors - Background */
3414
+ .cz-bg-bg { background-color: hsl(var(--cz-color-bg)); }
3415
+ .cz-bg-primary { background-color: hsl(var(--cz-color-primary)); }
3416
+ .cz-bg-secondary { background-color: hsl(var(--cz-color-secondary)); }
3417
+ .cz-bg-muted { background-color: hsl(var(--cz-color-muted)); }
3418
+ .cz-bg-danger { background-color: hsl(var(--cz-color-danger)); }
3419
+ .cz-bg-success { background-color: hsl(var(--cz-color-success)); }
3420
+ .cz-bg-warning { background-color: hsl(var(--cz-color-warning)); }
3421
+ .cz-bg-transparent { background-color: transparent; }
3422
+
3423
+ /* Colors - Text */
3424
+ .cz-text-fg { color: hsl(var(--cz-color-fg)); }
3425
+ .cz-text-primary-fg { color: hsl(var(--cz-color-primaryFg)); }
3426
+ .cz-text-secondary-fg { color: hsl(var(--cz-color-secondaryFg)); }
3427
+ .cz-text-muted-fg { color: hsl(var(--cz-color-mutedFg)); }
3428
+ .cz-text-danger { color: hsl(var(--cz-color-danger)); }
3429
+ .cz-text-danger-fg { color: hsl(var(--cz-color-dangerFg)); }
3430
+ .cz-text-success-fg { color: hsl(var(--cz-color-successFg)); }
3431
+ .cz-text-warning-fg { color: hsl(var(--cz-color-warningFg)); }
3432
+
3433
+ /* Border */
3434
+ .cz-border { border-width: 1px; border-style: solid; }
3435
+ .cz-border-b { border-bottom-width: 1px; border-bottom-style: solid; }
3436
+ .cz-border-t { border-top-width: 1px; border-top-style: solid; }
3437
+ .cz-border-border { border-color: hsl(var(--cz-color-border)); }
3438
+ .cz-border-danger { border-color: hsl(var(--cz-color-danger)); }
3439
+
3440
+ /* Border Radius */
3441
+ .cz-rounded-sm { border-radius: var(--cz-radius-sm); }
3442
+ .cz-rounded-md { border-radius: var(--cz-radius-md); }
3443
+ .cz-rounded-lg { border-radius: var(--cz-radius-lg); }
3444
+ .cz-rounded-full { border-radius: var(--cz-radius-full); }
3445
+
3446
+ /* Shadow */
3447
+ .cz-shadow-sm { box-shadow: var(--cz-shadow-sm); }
3448
+
3449
+ /* Transitions */
3450
+ .cz-transition { transition: all var(--cz-transition-fast); }
3451
+
3452
+ /* States */
3453
+ .cz-disabled {
3454
+ pointer-events: none;
3455
+ opacity: 0.5;
3456
+ cursor: not-allowed;
3457
+ }
3458
+
3459
+ /* Focus */
3460
+ .cz-focus-ring:focus,
3461
+ .cz-focus-ring:focus-visible {
3462
+ outline: none;
3463
+ box-shadow: 0 0 0 2px hsl(var(--cz-color-bg)), 0 0 0 4px hsl(var(--cz-color-ring));
3464
+ }
3465
+
3466
+ /* Hover states */
3467
+ .cz-hover-opacity:hover { opacity: 0.9; }
3468
+ .cz-hover-muted:hover { background-color: hsl(var(--cz-color-muted)); }
3469
+
3470
+ /* Label & Error */
3471
+ .cz-label {
3472
+ font-size: var(--cz-font-size-sm);
3473
+ font-weight: var(--cz-font-weight-medium);
3474
+ color: hsl(var(--cz-color-fg));
3475
+ }
3476
+
3477
+ .cz-label-required {
3478
+ color: hsl(var(--cz-color-danger));
3479
+ margin-left: 0.25rem;
3480
+ }
3481
+
3482
+ .cz-error {
3483
+ font-size: var(--cz-font-size-sm);
3484
+ color: hsl(var(--cz-color-danger));
3485
+ }
3486
+ `;
3487
+ }
3488
+
3489
+ // cli/build-css.ts
3490
+ function buildComponentsCSS(config) {
3491
+ const components = deepMerge(componentDefaults, config.components || {});
3492
+ let css = "";
3493
+ if (config.customCSS?.before) {
3494
+ css += `/* Custom CSS (before) */
3495
+ ${config.customCSS.before}
3496
+
3497
+ `;
3498
+ }
3499
+ if (components.button) {
3500
+ css += generateButtonCSS(components.button) + "\n";
3501
+ }
3502
+ if (components.input) {
3503
+ css += generateInputCSS(components.input) + "\n";
3504
+ }
3505
+ if (components.card) {
3506
+ css += generateCardCSS(components.card) + "\n";
3507
+ }
3508
+ if (components.switch) {
3509
+ css += generateSwitchCSS(components.switch) + "\n";
3510
+ }
3511
+ if (components.checkbox) {
3512
+ css += generateCheckboxCSS(components.checkbox) + "\n";
3513
+ }
3514
+ if (components.textarea) {
3515
+ css += generateTextareaCSS(components.textarea) + "\n";
3516
+ }
3517
+ if (components.select) {
3518
+ css += generateSelectCSS(components.select) + "\n";
3519
+ }
3520
+ if (components.radio) {
3521
+ css += generateRadioCSS(components.radio) + "\n";
3522
+ }
3523
+ if (components.label) {
3524
+ css += generateLabelCSS(components.label) + "\n";
3525
+ }
3526
+ if (components.badge) {
3527
+ css += generateBadgeCSS(components.badge) + "\n";
3528
+ }
3529
+ if (components.avatar) {
3530
+ css += generateAvatarCSS(components.avatar) + "\n";
3531
+ }
3532
+ if (components.table) {
3533
+ css += generateTableCSS(components.table) + "\n";
3534
+ }
3535
+ if (components.code) {
3536
+ css += generateCodeCSS(components.code) + "\n";
3537
+ }
3538
+ if (components.kbd) {
3539
+ css += generateKbdCSS(components.kbd) + "\n";
3540
+ }
3541
+ if (components.tag) {
3542
+ css += generateTagCSS(components.tag) + "\n";
3543
+ }
3544
+ if (components.alert) {
3545
+ css += generateAlertCSS(components.alert) + "\n";
3546
+ }
3547
+ if (components.toast) {
3548
+ css += generateToastCSS(components.toast) + "\n";
3549
+ }
3550
+ if (components.tooltip) {
3551
+ css += generateTooltipCSS(components.tooltip) + "\n";
3552
+ }
3553
+ if (components.progress) {
3554
+ css += generateProgressCSS(components.progress) + "\n";
3555
+ }
3556
+ if (components.spinner) {
3557
+ css += generateSpinnerCSS(components.spinner) + "\n";
3558
+ }
3559
+ if (components.skeleton) {
3560
+ css += generateSkeletonCSS(components.skeleton) + "\n";
3561
+ }
3562
+ if (components.tabs) {
3563
+ css += generateTabsCSS(components.tabs) + "\n";
3564
+ }
3565
+ if (components.breadcrumb) {
3566
+ css += generateBreadcrumbCSS(components.breadcrumb) + "\n";
3567
+ }
3568
+ if (components.accordion) {
3569
+ css += generateAccordionCSS(components.accordion) + "\n";
3570
+ }
3571
+ if (components.dialog) {
3572
+ css += generateDialogCSS(components.dialog) + "\n";
3573
+ }
3574
+ if (components.dropdownMenu) {
3575
+ css += generateDropdownMenuCSS(components.dropdownMenu) + "\n";
3576
+ }
3577
+ if (components.separator) {
3578
+ css += generateSeparatorCSS(components.separator) + "\n";
3579
+ }
3580
+ if (components.scrollArea) {
3581
+ css += generateScrollAreaCSS(components.scrollArea) + "\n";
3582
+ }
3583
+ if (config.customCSS?.after) {
3584
+ css += `/* Custom CSS (after) */
3585
+ ${config.customCSS.after}
3586
+ `;
3587
+ }
3588
+ return css;
3589
+ }
3590
+
3591
+ // src/presets/index.ts
3592
+ var defaultPreset = {
3593
+ // Uses all default values from component-defaults.ts
3594
+ };
3595
+ var compact = {
3596
+ spacing: {
3597
+ xs: "0.125rem",
3598
+ sm: "0.375rem",
3599
+ md: "0.5rem",
3600
+ lg: "0.75rem",
3601
+ xl: "1rem"
3602
+ },
3603
+ components: {
3604
+ button: {
3605
+ height: { sm: "1.75rem", md: "2rem", lg: "2.5rem" },
3606
+ paddingX: { sm: "0.5rem", md: "0.75rem", lg: "1rem" },
3607
+ gap: "0.375rem"
3608
+ },
3609
+ input: {
3610
+ height: { sm: "1.75rem", md: "2rem", lg: "2.5rem" },
3611
+ paddingX: { sm: "0.375rem", md: "0.5rem", lg: "0.75rem" }
3612
+ },
3613
+ card: {
3614
+ padding: "$spacing-md",
3615
+ header: { paddingBottom: "$spacing-sm", marginBottom: "$spacing-sm" },
3616
+ footer: { paddingTop: "$spacing-sm", marginTop: "$spacing-sm", gap: "0.375rem" }
3617
+ },
3618
+ switch: {
3619
+ width: { sm: "1.75rem", md: "2.25rem", lg: "3rem" },
3620
+ height: { sm: "1rem", md: "1.25rem", lg: "1.5rem" },
3621
+ thumbSize: { sm: "0.75rem", md: "1rem", lg: "1.25rem" }
3622
+ },
3623
+ checkbox: {
3624
+ size: { sm: "0.875rem", md: "1rem", lg: "1.25rem" },
3625
+ iconSize: { sm: "8px", md: "10px", lg: "12px" },
3626
+ labelGap: "0.375rem"
3627
+ }
3628
+ }
3629
+ };
3630
+ var comfortable = {
3631
+ spacing: {
3632
+ xs: "0.375rem",
3633
+ sm: "0.75rem",
3634
+ md: "1rem",
3635
+ lg: "1.5rem",
3636
+ xl: "2rem"
3637
+ },
3638
+ components: {
3639
+ button: {
3640
+ height: { sm: "2.5rem", md: "3rem", lg: "3.5rem" },
3641
+ paddingX: { sm: "1rem", md: "1.5rem", lg: "2rem" },
3642
+ gap: "0.75rem"
3643
+ },
3644
+ input: {
3645
+ height: { sm: "2.5rem", md: "3rem", lg: "3.5rem" },
3646
+ paddingX: { sm: "0.75rem", md: "1rem", lg: "1.25rem" }
3647
+ },
3648
+ card: {
3649
+ padding: "$spacing-xl",
3650
+ header: { paddingBottom: "$spacing-lg", marginBottom: "$spacing-lg" },
3651
+ footer: { paddingTop: "$spacing-lg", marginTop: "$spacing-lg", gap: "0.75rem" }
3652
+ },
3653
+ switch: {
3654
+ width: { sm: "2.5rem", md: "3.25rem", lg: "4rem" },
3655
+ height: { sm: "1.375rem", md: "1.75rem", lg: "2.125rem" },
3656
+ thumbSize: { sm: "1.125rem", md: "1.5rem", lg: "1.875rem" }
3657
+ },
3658
+ checkbox: {
3659
+ size: { sm: "1.25rem", md: "1.5rem", lg: "1.75rem" },
3660
+ iconSize: { sm: "12px", md: "14px", lg: "16px" },
3661
+ labelGap: "0.75rem"
3662
+ }
3663
+ }
3664
+ };
3665
+ var rounded = {
3666
+ radius: {
3667
+ none: "0",
3668
+ sm: "0.5rem",
3669
+ md: "0.75rem",
3670
+ lg: "1rem",
3671
+ xl: "1.5rem",
3672
+ full: "9999px"
3673
+ },
3674
+ components: {
3675
+ button: {
3676
+ borderRadius: "$radius-lg"
3677
+ },
3678
+ input: {
3679
+ borderRadius: "$radius-lg"
3680
+ },
3681
+ card: {
3682
+ borderRadius: "$radius-xl"
3683
+ }
3684
+ }
3685
+ };
3686
+ var sharp = {
3687
+ radius: {
3688
+ none: "0",
3689
+ sm: "0",
3690
+ md: "2px",
3691
+ lg: "4px",
3692
+ xl: "6px",
3693
+ full: "9999px"
3694
+ },
3695
+ components: {
3696
+ button: {
3697
+ borderRadius: "$radius-sm"
3698
+ },
3699
+ input: {
3700
+ borderRadius: "$radius-sm"
3701
+ },
3702
+ card: {
3703
+ borderRadius: "$radius-md"
3704
+ },
3705
+ checkbox: {
3706
+ borderRadius: "2px"
3707
+ }
3708
+ }
3709
+ };
3710
+ var minimal = {
3711
+ shadow: {
3712
+ none: "none",
3713
+ sm: "none",
3714
+ md: "0 1px 2px rgb(0 0 0 / 0.03)",
3715
+ lg: "0 2px 4px rgb(0 0 0 / 0.05)"
3716
+ },
3717
+ components: {
3718
+ button: {
3719
+ states: {
3720
+ hover: { opacity: "0.8" },
3721
+ focus: { ringWidth: "1px", ringOffset: "1px" }
3722
+ }
3723
+ },
3724
+ card: {
3725
+ shadow: "none",
3726
+ borderWidth: "1px"
3727
+ }
3728
+ }
3729
+ };
3730
+ var vibrant = {
3731
+ shadow: {
3732
+ none: "none",
3733
+ sm: "0 2px 4px rgb(0 0 0 / 0.1)",
3734
+ md: "0 4px 8px rgb(0 0 0 / 0.12)",
3735
+ lg: "0 8px 16px rgb(0 0 0 / 0.15)"
3736
+ },
3737
+ components: {
3738
+ button: {
3739
+ states: {
3740
+ hover: { opacity: "1", transform: "translateY(-1px)" },
3741
+ focus: { ringWidth: "3px", ringOffset: "2px" }
3742
+ }
3743
+ },
3744
+ card: {
3745
+ shadow: "$shadow-md"
3746
+ }
3747
+ }
3748
+ };
3749
+ var presets = {
3750
+ default: defaultPreset,
3751
+ compact,
3752
+ comfortable,
3753
+ rounded,
3754
+ sharp,
3755
+ minimal,
3756
+ vibrant
3757
+ };
3758
+
3759
+ // cli/index.ts
7
3760
  var __filename = fileURLToPath(import.meta.url);
8
3761
  var __dirname = path.dirname(__filename);
9
3762
  var defaultTheme = {
@@ -55,11 +3808,11 @@ var defaultTheme = {
55
3808
  },
56
3809
  transition: { fast: "150ms ease", normal: "200ms ease", slow: "300ms ease" }
57
3810
  };
58
- function deepMerge(target, source) {
3811
+ function deepMerge2(target, source) {
59
3812
  const result = { ...target };
60
3813
  for (const key of Object.keys(source)) {
61
3814
  if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
62
- result[key] = deepMerge(target[key] || {}, source[key]);
3815
+ result[key] = deepMerge2(target[key] || {}, source[key]);
63
3816
  } else {
64
3817
  result[key] = source[key];
65
3818
  }
@@ -111,30 +3864,6 @@ ${darkVars.join("\n")}
111
3864
  }
112
3865
  `;
113
3866
  }
114
- function getComponentsCSS() {
115
- const possiblePaths = [
116
- path.join(__dirname, "components.css"),
117
- // dist/cli/../components.css = dist/components.css
118
- path.join(__dirname, "../components.css"),
119
- // dist/components.css
120
- path.join(__dirname, "../dist/components.css"),
121
- // from root
122
- path.join(__dirname, "../../dist/components.css"),
123
- // from cli folder
124
- path.join(__dirname, "../src/core/styles/components.css"),
125
- // dev mode
126
- path.join(__dirname, "../../src/core/styles/components.css")
127
- // dev mode from cli
128
- ];
129
- for (const p of possiblePaths) {
130
- if (fs.existsSync(p)) {
131
- return fs.readFileSync(p, "utf-8");
132
- }
133
- }
134
- console.error("Error: Could not find components.css");
135
- console.error("Searched paths:", possiblePaths);
136
- process.exit(1);
137
- }
138
3867
  function getResetCSS() {
139
3868
  const possiblePaths = [
140
3869
  path.join(__dirname, "reset.css"),
@@ -173,6 +3902,7 @@ async function main() {
173
3902
  const args = process.argv.slice(2);
174
3903
  let configPath = "czero.config.js";
175
3904
  let outputPath = "czero.css";
3905
+ const presetNames = [];
176
3906
  for (let i = 0; i < args.length; i++) {
177
3907
  if (args[i] === "--config" && args[i + 1]) {
178
3908
  configPath = args[i + 1];
@@ -180,6 +3910,9 @@ async function main() {
180
3910
  } else if (args[i] === "--output" && args[i + 1]) {
181
3911
  outputPath = args[i + 1];
182
3912
  i++;
3913
+ } else if (args[i] === "--preset" && args[i + 1]) {
3914
+ presetNames.push(args[i + 1]);
3915
+ i++;
183
3916
  } else if (args[i] === "build") {
184
3917
  } else if (args[i] === "--help" || args[i] === "-h") {
185
3918
  console.log(`
@@ -191,10 +3924,15 @@ Usage:
191
3924
  Options:
192
3925
  --config <path> Path to config file (default: czero.config.js)
193
3926
  --output <path> Output CSS file path (default: czero.css)
3927
+ --preset <name> Apply a theme preset. Can be specified multiple times.
3928
+ Available: compact, comfortable, rounded, sharp, minimal, vibrant
194
3929
  --help, -h Show this help message
195
3930
 
196
3931
  Example:
3932
+ npx czero build
197
3933
  npx czero build --config my-theme.js --output src/styles/czero.css
3934
+ npx czero build --preset compact
3935
+ npx czero build --preset compact --preset rounded
198
3936
  `);
199
3937
  process.exit(0);
200
3938
  }
@@ -202,12 +3940,26 @@ Example:
202
3940
  console.log("\u{1F3A8} CZero CSS Generator");
203
3941
  console.log(` Config: ${configPath}`);
204
3942
  console.log(` Output: ${outputPath}`);
3943
+ if (presetNames.length > 0) {
3944
+ console.log(` Presets: ${presetNames.join(", ")}`);
3945
+ }
205
3946
  console.log("");
206
3947
  const userConfig = await loadUserConfig(configPath);
207
- const theme = deepMerge(defaultTheme, userConfig);
3948
+ let mergedConfig = {};
3949
+ for (const presetName of presetNames) {
3950
+ const preset = presets[presetName];
3951
+ if (preset) {
3952
+ mergedConfig = deepMerge2(mergedConfig, preset);
3953
+ } else {
3954
+ console.warn(`\u26A0\uFE0F Unknown preset: ${presetName}`);
3955
+ }
3956
+ }
3957
+ mergedConfig = deepMerge2(mergedConfig, userConfig);
3958
+ const theme = deepMerge2(defaultTheme, mergedConfig);
208
3959
  const resetCSS = getResetCSS();
209
3960
  const tokensCSS = generateTokensCSS(theme);
210
- const componentsCSS = getComponentsCSS();
3961
+ let componentsCSS = buildComponentsCSS(mergedConfig);
3962
+ componentsCSS += "\n" + generateUtilitiesCSS();
211
3963
  const finalCSS = `${resetCSS}
212
3964
  ${tokensCSS}
213
3965
  ${componentsCSS}`;