@cloudflare/kumo 1.17.0 → 1.18.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 (201) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/ai/USAGE.md +38 -32
  3. package/ai/component-registry.json +123 -120
  4. package/ai/component-registry.md +203 -63
  5. package/ai/schemas.ts +1 -1
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +40 -48
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/ai/schemas.js +2 -2
  10. package/dist/ai/schemas.js.map +1 -1
  11. package/dist/chunks/badge-dan90i0rzy4pwa1j.js +102 -0
  12. package/dist/chunks/badge-dan90i0rzy4pwa1j.js.map +1 -0
  13. package/dist/chunks/{banner-nz0eryqnz3qd86ln.js → banner-eiwcnk7ts21s3bnb.js} +4 -4
  14. package/dist/chunks/{banner-nz0eryqnz3qd86ln.js.map → banner-eiwcnk7ts21s3bnb.js.map} +1 -1
  15. package/dist/chunks/{breadcrumbs-cjgn3w4drahvqnuj.js → breadcrumbs-k39s28qx05vbxxth.js} +2 -2
  16. package/dist/chunks/{breadcrumbs-cjgn3w4drahvqnuj.js.map → breadcrumbs-k39s28qx05vbxxth.js.map} +1 -1
  17. package/dist/chunks/{button-odxi0hp4fvi5i2w3.js → button-cdxnqcgzwko8ooha.js} +15 -15
  18. package/dist/chunks/button-cdxnqcgzwko8ooha.js.map +1 -0
  19. package/dist/chunks/{checkbox-dx8x0rzv582yjv7n.js → checkbox-kt1uojk2f9e0d0h1.js} +13 -13
  20. package/dist/chunks/checkbox-kt1uojk2f9e0d0h1.js.map +1 -0
  21. package/dist/chunks/{clipboard-text-kyk51d1ze7zvdn4q.js → clipboard-text-vcbvmtne4zjk4b18.js} +4 -4
  22. package/dist/chunks/{clipboard-text-kyk51d1ze7zvdn4q.js.map → clipboard-text-vcbvmtne4zjk4b18.js.map} +1 -1
  23. package/dist/chunks/{code-liq1g6f5lhee305d.js → code-cz0w1y5z4h29a9eg.js} +18 -18
  24. package/dist/chunks/code-cz0w1y5z4h29a9eg.js.map +1 -0
  25. package/dist/chunks/{combobox-9fhjzprab46csmon.js → combobox-he2hd9e2ruknq5mp.js} +4 -4
  26. package/dist/chunks/{combobox-9fhjzprab46csmon.js.map → combobox-he2hd9e2ruknq5mp.js.map} +1 -1
  27. package/dist/chunks/{command-palette-kenx2bbdzd4kpx36.js → command-palette-jc1w07jwakxvj23a.js} +4 -4
  28. package/dist/chunks/{command-palette-kenx2bbdzd4kpx36.js.map → command-palette-jc1w07jwakxvj23a.js.map} +1 -1
  29. package/dist/chunks/{dialog-e05ysa8t2fklw065.js → dialog-oqh8l3l3zutpibxx.js} +3 -3
  30. package/dist/chunks/{dialog-e05ysa8t2fklw065.js.map → dialog-oqh8l3l3zutpibxx.js.map} +1 -1
  31. package/dist/chunks/{dropdown-g587px7zv3ssaxr4.js → dropdown-ncwhcd912vmone8k.js} +2 -2
  32. package/dist/chunks/{dropdown-g587px7zv3ssaxr4.js.map → dropdown-ncwhcd912vmone8k.js.map} +1 -1
  33. package/dist/chunks/{empty-fuz1un7r7mbz0kim.js → empty-cj898km1r8xwuw44.js} +2 -2
  34. package/dist/chunks/{empty-fuz1un7r7mbz0kim.js.map → empty-cj898km1r8xwuw44.js.map} +1 -1
  35. package/dist/chunks/{field-fq504lyu7ttsh5m9.js → field-krp6z6vfbkrvufz2.js} +3 -3
  36. package/dist/chunks/{field-fq504lyu7ttsh5m9.js.map → field-krp6z6vfbkrvufz2.js.map} +1 -1
  37. package/dist/chunks/input-area-no30c09udyjxshu5.js +78 -0
  38. package/dist/chunks/input-area-no30c09udyjxshu5.js.map +1 -0
  39. package/dist/chunks/{input-group-hbebbyh8fo6aqydn.js → input-group-lxdd09p60cf27pe1.js} +26 -26
  40. package/dist/chunks/input-group-lxdd09p60cf27pe1.js.map +1 -0
  41. package/dist/chunks/{input-kvhyo3p4859bexvx.js → input-h48k3uagzrgb98au.js} +40 -36
  42. package/dist/chunks/input-h48k3uagzrgb98au.js.map +1 -0
  43. package/dist/chunks/{label-j9owppbgnn35mebg.js → label-latndvb1ngem7we8.js} +3 -3
  44. package/dist/chunks/{label-j9owppbgnn35mebg.js.map → label-latndvb1ngem7we8.js.map} +1 -1
  45. package/dist/chunks/{link-hmmf3k1xn6rm72rt.js → link-hn5ejal7nhh0o0b4.js} +2 -2
  46. package/dist/chunks/{link-hmmf3k1xn6rm72rt.js.map → link-hn5ejal7nhh0o0b4.js.map} +1 -1
  47. package/dist/chunks/{loader-m5wfmqwgucrr4i5v.js → loader-hr2w7cpqeev3p3vl.js} +9 -6
  48. package/dist/chunks/loader-hr2w7cpqeev3p3vl.js.map +1 -0
  49. package/dist/chunks/{menubar-abojnm0uwjuni8ok.js → menubar-f1pilzooe5mue7c4.js} +2 -2
  50. package/dist/chunks/{menubar-abojnm0uwjuni8ok.js.map → menubar-f1pilzooe5mue7c4.js.map} +1 -1
  51. package/dist/chunks/{meter-i84dte2f82qmvn7y.js → meter-gfa1hz9fhjnvx784.js} +2 -2
  52. package/dist/chunks/{meter-i84dte2f82qmvn7y.js.map → meter-gfa1hz9fhjnvx784.js.map} +1 -1
  53. package/dist/chunks/pagination-cu5lm6p5dxuycta4.js +243 -0
  54. package/dist/chunks/pagination-cu5lm6p5dxuycta4.js.map +1 -0
  55. package/dist/chunks/{popover-i951xjcgezeqr4iv.js → popover-h300w4vit0s2ayej.js} +7 -7
  56. package/dist/chunks/{popover-i951xjcgezeqr4iv.js.map → popover-h300w4vit0s2ayej.js.map} +1 -1
  57. package/dist/chunks/{radio-l2vkcue40d84fmo1.js → radio-jouttv89lbvhs55r.js} +37 -37
  58. package/dist/chunks/radio-jouttv89lbvhs55r.js.map +1 -0
  59. package/dist/chunks/select-kva5ru5f673kah1m.js +179 -0
  60. package/dist/chunks/select-kva5ru5f673kah1m.js.map +1 -0
  61. package/dist/chunks/{sensitive-input-kznmknpp5h1grc6k.js → sensitive-input-hd4tpqkzifad1yca.js} +34 -34
  62. package/dist/chunks/{sensitive-input-kznmknpp5h1grc6k.js.map → sensitive-input-hd4tpqkzifad1yca.js.map} +1 -1
  63. package/dist/chunks/{sidebar-jepeq7gaf4issuw6.js → sidebar-hljy3ssm8itc0ucx.js} +5 -5
  64. package/dist/chunks/sidebar-hljy3ssm8itc0ucx.js.map +1 -0
  65. package/dist/chunks/{surface-blo81kgy9g0sexgm.js → surface-cilvbyhmyujz1bee.js} +2 -2
  66. package/dist/chunks/{surface-blo81kgy9g0sexgm.js.map → surface-cilvbyhmyujz1bee.js.map} +1 -1
  67. package/dist/chunks/{switch-i0zwcp3wq6vsxm1c.js → switch-ihaydbzem62bey4p.js} +106 -104
  68. package/dist/chunks/switch-ihaydbzem62bey4p.js.map +1 -0
  69. package/dist/chunks/{table-nrcw19tlpduayukl.js → table-inweecadl3her7pd.js} +9 -9
  70. package/dist/chunks/{table-nrcw19tlpduayukl.js.map → table-inweecadl3her7pd.js.map} +1 -1
  71. package/dist/chunks/{tabs-bw92jb303zxw7w4f.js → tabs-e7eh7l3mpk3xgmwq.js} +15 -15
  72. package/dist/chunks/{tabs-bw92jb303zxw7w4f.js.map → tabs-e7eh7l3mpk3xgmwq.js.map} +1 -1
  73. package/dist/chunks/{toast-lrnwby56drs7vtae.js → toast-bpz6iaq54u9jmuu8.js} +30 -30
  74. package/dist/chunks/{toast-lrnwby56drs7vtae.js.map → toast-bpz6iaq54u9jmuu8.js.map} +1 -1
  75. package/dist/chunks/{tooltip-cit9ltlxfuhwctuj.js → tooltip-belkznz8t8333h5f.js} +20 -16
  76. package/dist/chunks/tooltip-belkznz8t8333h5f.js.map +1 -0
  77. package/dist/chunks/{vendor-base-ui-n30qblevnpk9cc5c.js → vendor-base-ui-k7bzesq81ie36nya.js} +34 -31
  78. package/dist/chunks/{vendor-base-ui-n30qblevnpk9cc5c.js.map → vendor-base-ui-k7bzesq81ie36nya.js.map} +1 -1
  79. package/dist/code.js +1 -1
  80. package/dist/components/badge.js +1 -1
  81. package/dist/components/banner.js +1 -1
  82. package/dist/components/breadcrumbs.js +1 -1
  83. package/dist/components/button.js +1 -1
  84. package/dist/components/checkbox.js +1 -1
  85. package/dist/components/clipboard-text.js +1 -1
  86. package/dist/components/code.js +1 -1
  87. package/dist/components/combobox.js +1 -1
  88. package/dist/components/command-palette.js +1 -1
  89. package/dist/components/dialog.js +1 -1
  90. package/dist/components/dropdown.js +1 -1
  91. package/dist/components/empty.js +1 -1
  92. package/dist/components/field.js +1 -1
  93. package/dist/components/input.js +3 -3
  94. package/dist/components/label.js +1 -1
  95. package/dist/components/link.js +1 -1
  96. package/dist/components/loader.js +1 -1
  97. package/dist/components/menubar.js +1 -1
  98. package/dist/components/meter.js +1 -1
  99. package/dist/components/pagination.js +1 -1
  100. package/dist/components/popover.js +1 -1
  101. package/dist/components/radio.js +1 -1
  102. package/dist/components/select.js +1 -1
  103. package/dist/components/sensitive-input.js +1 -1
  104. package/dist/components/sidebar.js +1 -1
  105. package/dist/components/surface.js +1 -1
  106. package/dist/components/switch.js +1 -1
  107. package/dist/components/table.js +1 -1
  108. package/dist/components/tabs.js +1 -1
  109. package/dist/components/toast.js +2 -2
  110. package/dist/components/tooltip.js +1 -1
  111. package/dist/index.js +38 -38
  112. package/dist/primitives/accordion.js +1 -1
  113. package/dist/primitives/alert-dialog.js +1 -1
  114. package/dist/primitives/autocomplete.js +1 -1
  115. package/dist/primitives/avatar.js +1 -1
  116. package/dist/primitives/button.js +1 -1
  117. package/dist/primitives/checkbox-group.js +1 -1
  118. package/dist/primitives/checkbox.js +1 -1
  119. package/dist/primitives/collapsible.js +1 -1
  120. package/dist/primitives/combobox.js +1 -1
  121. package/dist/primitives/context-menu.js +1 -1
  122. package/dist/primitives/csp-provider.js +1 -1
  123. package/dist/primitives/dialog.js +1 -1
  124. package/dist/primitives/direction-provider.js +1 -1
  125. package/dist/primitives/drawer.js +1 -1
  126. package/dist/primitives/field.js +1 -1
  127. package/dist/primitives/fieldset.js +1 -1
  128. package/dist/primitives/form.js +1 -1
  129. package/dist/primitives/input.js +1 -1
  130. package/dist/primitives/menu.js +1 -1
  131. package/dist/primitives/menubar.js +1 -1
  132. package/dist/primitives/meter.js +1 -1
  133. package/dist/primitives/navigation-menu.js +1 -1
  134. package/dist/primitives/number-field.js +1 -1
  135. package/dist/primitives/popover.js +1 -1
  136. package/dist/primitives/preview-card.js +1 -1
  137. package/dist/primitives/progress.js +1 -1
  138. package/dist/primitives/radio-group.js +1 -1
  139. package/dist/primitives/radio.js +1 -1
  140. package/dist/primitives/scroll-area.js +1 -1
  141. package/dist/primitives/select.js +1 -1
  142. package/dist/primitives/separator.js +1 -1
  143. package/dist/primitives/slider.js +1 -1
  144. package/dist/primitives/switch.js +1 -1
  145. package/dist/primitives/tabs.js +1 -1
  146. package/dist/primitives/toast.js +1 -1
  147. package/dist/primitives/toggle-group.js +1 -1
  148. package/dist/primitives/toggle.js +1 -1
  149. package/dist/primitives/toolbar.js +1 -1
  150. package/dist/primitives/tooltip.js +1 -1
  151. package/dist/primitives.js +1 -1
  152. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  153. package/dist/scripts/theme-generator/config.js +29 -110
  154. package/dist/scripts/theme-generator/config.js.map +1 -1
  155. package/dist/src/components/badge/badge.d.ts +61 -79
  156. package/dist/src/components/badge/badge.d.ts.map +1 -1
  157. package/dist/src/components/banner/banner.d.ts +3 -3
  158. package/dist/src/components/button/button.d.ts +2 -2
  159. package/dist/src/components/checkbox/checkbox.d.ts +1 -1
  160. package/dist/src/components/code/code.d.ts.map +1 -1
  161. package/dist/src/components/input/input-area.d.ts.map +1 -1
  162. package/dist/src/components/input/input.d.ts +1 -2
  163. package/dist/src/components/input/input.d.ts.map +1 -1
  164. package/dist/src/components/loader/loader.d.ts +7 -1
  165. package/dist/src/components/loader/loader.d.ts.map +1 -1
  166. package/dist/src/components/pagination/pagination.d.ts +11 -1
  167. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  168. package/dist/src/components/radio/radio.d.ts +1 -1
  169. package/dist/src/components/select/select.d.ts +66 -2
  170. package/dist/src/components/select/select.d.ts.map +1 -1
  171. package/dist/src/components/sensitive-input/sensitive-input.d.ts +1 -1
  172. package/dist/src/components/switch/switch.d.ts.map +1 -1
  173. package/dist/src/components/toast/toast.d.ts +1 -1
  174. package/dist/src/components/tooltip/tooltip.d.ts +11 -1
  175. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  176. package/dist/styles/kumo-binding.css +3 -0
  177. package/dist/styles/kumo-standalone.css +1 -1
  178. package/dist/styles/theme-fedramp.css +3 -3
  179. package/dist/styles/theme-kumo.css +61 -122
  180. package/package.json +1 -1
  181. package/scripts/component-registry/index.test.ts +4 -4
  182. package/scripts/component-registry/metadata.ts +3 -3
  183. package/scripts/theme-generator/config.ts +29 -110
  184. package/dist/chunks/badge-n80t3z8u9ttlxi20.js +0 -120
  185. package/dist/chunks/badge-n80t3z8u9ttlxi20.js.map +0 -1
  186. package/dist/chunks/button-odxi0hp4fvi5i2w3.js.map +0 -1
  187. package/dist/chunks/checkbox-dx8x0rzv582yjv7n.js.map +0 -1
  188. package/dist/chunks/code-liq1g6f5lhee305d.js.map +0 -1
  189. package/dist/chunks/input-area-nq40szg9110on89c.js +0 -74
  190. package/dist/chunks/input-area-nq40szg9110on89c.js.map +0 -1
  191. package/dist/chunks/input-group-hbebbyh8fo6aqydn.js.map +0 -1
  192. package/dist/chunks/input-kvhyo3p4859bexvx.js.map +0 -1
  193. package/dist/chunks/loader-m5wfmqwgucrr4i5v.js.map +0 -1
  194. package/dist/chunks/pagination-pbd7qqik97ac0l7m.js +0 -224
  195. package/dist/chunks/pagination-pbd7qqik97ac0l7m.js.map +0 -1
  196. package/dist/chunks/radio-l2vkcue40d84fmo1.js.map +0 -1
  197. package/dist/chunks/select-paedwa3nlhpq82ua.js +0 -132
  198. package/dist/chunks/select-paedwa3nlhpq82ua.js.map +0 -1
  199. package/dist/chunks/sidebar-jepeq7gaf4issuw6.js.map +0 -1
  200. package/dist/chunks/switch-i0zwcp3wq6vsxm1c.js.map +0 -1
  201. package/dist/chunks/tooltip-cit9ltlxfuhwctuj.js.map +0 -1
@@ -97,7 +97,7 @@ export const THEME_CONFIG: ThemeConfig = {
97
97
  newName: "",
98
98
  theme: {
99
99
  kumo: {
100
- light: "var(--color-blue-700, oklch(48.8% 0.243 264.376))",
100
+ light: "var(--color-blue-800, oklch(42.4% 0.199 265.638))",
101
101
  dark: "var(--color-blue-400, oklch(70.7% 0.165 254.624))",
102
102
  },
103
103
  },
@@ -106,8 +106,8 @@ export const THEME_CONFIG: ThemeConfig = {
106
106
  newName: "",
107
107
  theme: {
108
108
  kumo: {
109
- light: "var(--color-green-500, oklch(72.3% 0.219 149.579))",
110
- dark: "var(--color-green-400, oklch(79.2% 0.209 151.711))",
109
+ light: "var(--color-emerald-800, oklch(43.2% 0.095 166.913))",
110
+ dark: "var(--color-emerald-200, oklch(90.5% 0.093 164.15))",
111
111
  },
112
112
  },
113
113
  },
@@ -134,16 +134,6 @@ export const THEME_CONFIG: ThemeConfig = {
134
134
  * Badge text color tokens
135
135
  * Subtle variants need colored text; inverted needs flipping text
136
136
  */
137
- "kumo-badge-red-subtle": {
138
- newName: "",
139
- description: "Text color for subtle red badge",
140
- theme: {
141
- kumo: {
142
- light: "var(--color-red-800, oklch(44.4% 0.177 26.899))",
143
- dark: "var(--color-red-200, oklch(88.5% 0.062 18.334))",
144
- },
145
- },
146
- },
147
137
  "kumo-badge-orange-subtle": {
148
138
  newName: "",
149
139
  description: "Text color for subtle orange badge",
@@ -154,26 +144,6 @@ export const THEME_CONFIG: ThemeConfig = {
154
144
  },
155
145
  },
156
146
  },
157
- "kumo-badge-yellow-subtle": {
158
- newName: "",
159
- description: "Text color for subtle yellow badge",
160
- theme: {
161
- kumo: {
162
- light: "var(--color-yellow-800, oklch(47.6% 0.114 61.907))",
163
- dark: "var(--color-yellow-200, oklch(94.5% 0.129 101.54))",
164
- },
165
- },
166
- },
167
- "kumo-badge-green-subtle": {
168
- newName: "",
169
- description: "Text color for subtle green badge",
170
- theme: {
171
- kumo: {
172
- light: "var(--color-emerald-800, oklch(43.2% 0.095 166.913))",
173
- dark: "var(--color-emerald-200, oklch(90.5% 0.093 164.15))",
174
- },
175
- },
176
- },
177
147
  "kumo-badge-teal-subtle": {
178
148
  newName: "",
179
149
  description: "Text color for subtle teal badge",
@@ -184,16 +154,6 @@ export const THEME_CONFIG: ThemeConfig = {
184
154
  },
185
155
  },
186
156
  },
187
- "kumo-badge-blue-subtle": {
188
- newName: "",
189
- description: "Text color for subtle blue badge",
190
- theme: {
191
- kumo: {
192
- light: "var(--color-blue-800, oklch(42.4% 0.199 265.638))",
193
- dark: "var(--color-blue-200, oklch(88.2% 0.059 254.128))",
194
- },
195
- },
196
- },
197
157
  "kumo-badge-neutral-subtle": {
198
158
  newName: "",
199
159
  description: "Text color for subtle neutral badge",
@@ -249,7 +209,7 @@ export const THEME_CONFIG: ThemeConfig = {
249
209
  theme: {
250
210
  kumo: {
251
211
  light: "var(--color-kumo-neutral-125, oklch(96% 0 0))",
252
- dark: "var(--color-kumo-neutral-950, oklch(12% 0 0))",
212
+ dark: "var(--color-kumo-neutral-950, oklch(15% 0 0))",
253
213
  },
254
214
  },
255
215
  },
@@ -356,7 +316,7 @@ export const THEME_CONFIG: ThemeConfig = {
356
316
  },
357
317
  },
358
318
  },
359
- "kumo-ring": {
319
+ "kumo-hairline": {
360
320
  newName: "",
361
321
  theme: {
362
322
  kumo: {
@@ -407,16 +367,16 @@ export const THEME_CONFIG: ThemeConfig = {
407
367
  },
408
368
  },
409
369
  },
410
- "kumo-info": {
370
+ "kumo-info-tint": {
411
371
  newName: "",
412
372
  theme: {
413
373
  kumo: {
414
- light: "var(--color-blue-500, oklch(62.3% 0.214 259.815))",
415
- dark: "var(--color-blue-400, oklch(70.7% 0.165 254.624))",
374
+ light: "var(--color-blue-100, oklch(93.2% 0.032 255.585))",
375
+ dark: "var(--color-blue-900, oklch(37.9% 0.146 265.522))",
416
376
  },
417
377
  },
418
378
  },
419
- "kumo-info-tint": {
379
+ "kumo-info": {
420
380
  newName: "",
421
381
  theme: {
422
382
  kumo: {
@@ -425,16 +385,16 @@ export const THEME_CONFIG: ThemeConfig = {
425
385
  },
426
386
  },
427
387
  },
428
- "kumo-warning": {
388
+ "kumo-warning-tint": {
429
389
  newName: "",
430
390
  theme: {
431
391
  kumo: {
432
- light: "var(--color-yellow-500, oklch(79.5% 0.184 86.047))",
392
+ light: "var(--color-yellow-100, oklch(97.3% 0.071 103.193))",
433
393
  dark: "var(--color-yellow-700, oklch(55.4% 0.135 66.442))",
434
394
  },
435
395
  },
436
396
  },
437
- "kumo-warning-tint": {
397
+ "kumo-warning": {
438
398
  newName: "",
439
399
  theme: {
440
400
  kumo: {
@@ -443,34 +403,34 @@ export const THEME_CONFIG: ThemeConfig = {
443
403
  },
444
404
  },
445
405
  },
446
- "kumo-danger": {
406
+ "kumo-danger-tint": {
447
407
  newName: "",
448
408
  theme: {
449
409
  kumo: {
450
- light: "var(--color-red-500, oklch(63.7% 0.237 25.331))",
451
- dark: "var(--color-red-700, oklch(50.5% 0.213 27.518))",
410
+ light: "var(--color-red-100, oklch(93.6% 0.032 17.717))",
411
+ dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
452
412
  },
453
413
  },
454
414
  },
455
- "kumo-danger-tint": {
415
+ "kumo-danger": {
456
416
  newName: "",
457
417
  theme: {
458
418
  kumo: {
459
- light: "var(--color-red-300, oklch(80.8% 0.114 19.571))",
419
+ light: "var(--color-red-500, oklch(63.7% 0.237 25.331))",
460
420
  dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
461
421
  },
462
422
  },
463
423
  },
464
- "kumo-success": {
424
+ "kumo-success-tint": {
465
425
  newName: "",
466
426
  theme: {
467
427
  kumo: {
468
- light: "var(--color-green-500, oklch(72.3% 0.219 149.579))",
469
- dark: "var(--color-green-700, oklch(52.7% 0.154 150.069))",
428
+ light: "var(--color-emerald-100, oklch(95% 0.052 163.051))",
429
+ dark: "var(--color-emerald-900, oklch(37.8% 0.077 168.94))",
470
430
  },
471
431
  },
472
432
  },
473
- "kumo-success-tint": {
433
+ "kumo-success": {
474
434
  newName: "",
475
435
  theme: {
476
436
  kumo: {
@@ -497,16 +457,6 @@ export const THEME_CONFIG: ThemeConfig = {
497
457
  },
498
458
  },
499
459
  },
500
- "kumo-badge-red-subtle": {
501
- newName: "",
502
- description: "Subtle red badge background",
503
- theme: {
504
- kumo: {
505
- light: "var(--color-red-100, oklch(93.6% 0.032 17.717))",
506
- dark: "var(--color-red-900, oklch(39.6% 0.141 25.723))",
507
- },
508
- },
509
- },
510
460
 
511
461
  // Orange
512
462
  "kumo-badge-orange": {
@@ -514,8 +464,8 @@ export const THEME_CONFIG: ThemeConfig = {
514
464
  description: "Orange badge background",
515
465
  theme: {
516
466
  kumo: {
517
- light: "var(--color-orange-600, oklch(64.6% 0.222 41.116))",
518
- dark: "var(--color-orange-700, oklch(55.3% 0.195 38.402))",
467
+ light: "var(--color-orange-650, oklch(81.5% 0.197 76))",
468
+ dark: "var(--color-orange-650, oklch(81.5% 0.197 76))",
519
469
  },
520
470
  },
521
471
  },
@@ -530,24 +480,13 @@ export const THEME_CONFIG: ThemeConfig = {
530
480
  },
531
481
  },
532
482
 
533
- // Yellow
534
- "kumo-badge-yellow": {
535
- newName: "",
536
- description: "Yellow badge background",
537
- theme: {
538
- kumo: {
539
- light: "var(--color-yellow-600, oklch(68.1% 0.162 75.834))",
540
- dark: "var(--color-yellow-700, oklch(55.4% 0.135 66.442))",
541
- },
542
- },
543
- },
544
- "kumo-badge-yellow-subtle": {
483
+ "kumo-badge-purple": {
545
484
  newName: "",
546
- description: "Subtle yellow badge background",
485
+ description: "Purple badge background",
547
486
  theme: {
548
487
  kumo: {
549
- light: "var(--color-yellow-100, oklch(97.3% 0.071 103.193))",
550
- dark: "var(--color-yellow-900, oklch(42.1% 0.095 57.708))",
488
+ light: "var(--color-purple-600, oklch(60% 0.118 184.704))",
489
+ dark: "var(--color-purple-700, oklch(50.8% 0.118 165.612))",
551
490
  },
552
491
  },
553
492
  },
@@ -558,21 +497,11 @@ export const THEME_CONFIG: ThemeConfig = {
558
497
  description: "Green badge background",
559
498
  theme: {
560
499
  kumo: {
561
- light: "var(--color-emerald-600, oklch(59.6% 0.145 163.225))",
500
+ light: "var(--color-emerald-700, oklch(50.8% 0.118 165.612))",
562
501
  dark: "var(--color-emerald-700, oklch(50.8% 0.118 165.612))",
563
502
  },
564
503
  },
565
504
  },
566
- "kumo-badge-green-subtle": {
567
- newName: "",
568
- description: "Subtle green badge background",
569
- theme: {
570
- kumo: {
571
- light: "var(--color-emerald-100, oklch(95% 0.052 163.051))",
572
- dark: "var(--color-emerald-900, oklch(37.8% 0.077 168.94))",
573
- },
574
- },
575
- },
576
505
 
577
506
  // Teal
578
507
  "kumo-badge-teal": {
@@ -580,7 +509,7 @@ export const THEME_CONFIG: ThemeConfig = {
580
509
  description: "Teal badge background",
581
510
  theme: {
582
511
  kumo: {
583
- light: "var(--color-teal-600, oklch(60% 0.118 184.704))",
512
+ light: "var(--color-teal-650, oklch(54.9% 0.096 184.565))",
584
513
  dark: "var(--color-teal-700, oklch(51.1% 0.096 186.391))",
585
514
  },
586
515
  },
@@ -607,16 +536,6 @@ export const THEME_CONFIG: ThemeConfig = {
607
536
  },
608
537
  },
609
538
  },
610
- "kumo-badge-blue-subtle": {
611
- newName: "",
612
- description: "Subtle blue badge background",
613
- theme: {
614
- kumo: {
615
- light: "var(--color-blue-100, oklch(93.2% 0.032 255.585))",
616
- dark: "var(--color-blue-900, oklch(37.9% 0.146 265.522))",
617
- },
618
- },
619
- },
620
539
 
621
540
  // Neutral
622
541
  "kumo-badge-neutral": {
@@ -1,120 +0,0 @@
1
- "use client";
2
- import { jsx as b } from "react/jsx-runtime";
3
- import { c as r } from "./cn-ct4n7r74mh8y0f48.js";
4
- const l = "inline-flex w-fit flex-none shrink-0 items-center justify-self-start rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap", a = {
5
- variant: {
6
- red: {
7
- classes: "bg-kumo-badge-red text-white",
8
- description: "Red badge"
9
- },
10
- "red-subtle": {
11
- classes: "bg-kumo-badge-red-subtle text-kumo-badge-red-subtle",
12
- description: "Subtle red badge"
13
- },
14
- orange: {
15
- classes: "bg-kumo-badge-orange text-white",
16
- description: "Orange badge"
17
- },
18
- "orange-subtle": {
19
- classes: "bg-kumo-badge-orange-subtle text-kumo-badge-orange-subtle",
20
- description: "Subtle orange badge"
21
- },
22
- yellow: {
23
- classes: "bg-kumo-badge-yellow text-white",
24
- description: "Yellow badge"
25
- },
26
- "yellow-subtle": {
27
- classes: "bg-kumo-badge-yellow-subtle text-kumo-badge-yellow-subtle",
28
- description: "Subtle yellow badge"
29
- },
30
- green: {
31
- classes: "bg-kumo-badge-green text-white",
32
- description: "Green badge"
33
- },
34
- "green-subtle": {
35
- classes: "bg-kumo-badge-green-subtle text-kumo-badge-green-subtle",
36
- description: "Subtle green badge"
37
- },
38
- teal: {
39
- classes: "bg-kumo-badge-teal text-white",
40
- description: "Teal badge"
41
- },
42
- "teal-subtle": {
43
- classes: "bg-kumo-badge-teal-subtle text-kumo-badge-teal-subtle",
44
- description: "Subtle teal badge"
45
- },
46
- blue: {
47
- classes: "bg-kumo-badge-blue text-white",
48
- description: "Blue badge"
49
- },
50
- "blue-subtle": {
51
- classes: "bg-kumo-badge-blue-subtle text-kumo-badge-blue-subtle",
52
- description: "Subtle blue badge"
53
- },
54
- neutral: {
55
- classes: "bg-kumo-badge-neutral text-white",
56
- description: "Neutral badge"
57
- },
58
- "neutral-subtle": {
59
- classes: "bg-kumo-fill text-kumo-badge-neutral-subtle",
60
- description: "Subtle neutral badge"
61
- },
62
- inverted: {
63
- classes: "bg-kumo-badge-inverted text-kumo-badge-inverted",
64
- description: "Inverted badge"
65
- },
66
- outline: {
67
- classes: "border border-kumo-fill bg-transparent text-kumo-default",
68
- description: "Bordered badge with transparent background"
69
- },
70
- beta: {
71
- classes: "border border-dashed border-kumo-brand bg-transparent text-kumo-link",
72
- description: "Indicates beta or experimental features"
73
- },
74
- /** @deprecated Use `"inverted"` instead. */
75
- primary: {
76
- classes: "bg-kumo-badge-inverted text-kumo-badge-inverted",
77
- description: "Deprecated. Use inverted instead."
78
- },
79
- /** @deprecated Use `"neutral"` instead. */
80
- secondary: {
81
- classes: "bg-kumo-badge-neutral text-white",
82
- description: "Deprecated. Use neutral instead."
83
- },
84
- /** @deprecated Use `"red"` instead. */
85
- destructive: {
86
- classes: "bg-kumo-badge-red text-white",
87
- description: "Deprecated. Use red instead."
88
- },
89
- /** @deprecated Use `"green"` instead. */
90
- success: {
91
- classes: "bg-kumo-badge-green text-white",
92
- description: "Deprecated. Use green instead."
93
- }
94
- }
95
- }, s = {
96
- variant: "neutral"
97
- };
98
- function n({
99
- variant: e = s.variant
100
- } = {}) {
101
- const t = a.variant[e];
102
- return r(
103
- // Base styles (exported as KUMO_BADGE_BASE_STYLES for Figma plugin)
104
- l,
105
- // Apply variant styles from KUMO_BADGE_VARIANTS (fallback to primary if variant not found)
106
- t?.classes ?? a.variant[s.variant].classes
107
- );
108
- }
109
- function u({
110
- variant: e = s.variant,
111
- className: t,
112
- children: d
113
- }) {
114
- return /* @__PURE__ */ b("span", { className: r(n({ variant: e }), t), children: d });
115
- }
116
- export {
117
- u as B,
118
- l as K
119
- };
120
- //# sourceMappingURL=badge-n80t3z8u9ttlxi20.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"badge-n80t3z8u9ttlxi20.js","sources":["../../src/components/badge/badge.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Base styles applied to all badge variants. */\nexport const KUMO_BADGE_BASE_STYLES =\n \"inline-flex w-fit flex-none shrink-0 items-center justify-self-start rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap\";\n\n/** Badge variant definitions mapping variant names to their Tailwind classes and descriptions. */\nexport const KUMO_BADGE_VARIANTS = {\n variant: {\n red: {\n classes: \"bg-kumo-badge-red text-white\",\n description: \"Red badge\",\n },\n \"red-subtle\": {\n classes: \"bg-kumo-badge-red-subtle text-kumo-badge-red-subtle\",\n description: \"Subtle red badge\",\n },\n orange: {\n classes: \"bg-kumo-badge-orange text-white\",\n description: \"Orange badge\",\n },\n \"orange-subtle\": {\n classes: \"bg-kumo-badge-orange-subtle text-kumo-badge-orange-subtle\",\n description: \"Subtle orange badge\",\n },\n yellow: {\n classes: \"bg-kumo-badge-yellow text-white\",\n description: \"Yellow badge\",\n },\n \"yellow-subtle\": {\n classes: \"bg-kumo-badge-yellow-subtle text-kumo-badge-yellow-subtle\",\n description: \"Subtle yellow badge\",\n },\n green: {\n classes: \"bg-kumo-badge-green text-white\",\n description: \"Green badge\",\n },\n \"green-subtle\": {\n classes: \"bg-kumo-badge-green-subtle text-kumo-badge-green-subtle\",\n description: \"Subtle green badge\",\n },\n teal: {\n classes: \"bg-kumo-badge-teal text-white\",\n description: \"Teal badge\",\n },\n \"teal-subtle\": {\n classes: \"bg-kumo-badge-teal-subtle text-kumo-badge-teal-subtle\",\n description: \"Subtle teal badge\",\n },\n blue: {\n classes: \"bg-kumo-badge-blue text-white\",\n description: \"Blue badge\",\n },\n \"blue-subtle\": {\n classes: \"bg-kumo-badge-blue-subtle text-kumo-badge-blue-subtle\",\n description: \"Subtle blue badge\",\n },\n neutral: {\n classes: \"bg-kumo-badge-neutral text-white\",\n description: \"Neutral badge\",\n },\n \"neutral-subtle\": {\n classes: \"bg-kumo-fill text-kumo-badge-neutral-subtle\",\n description: \"Subtle neutral badge\",\n },\n inverted: {\n classes: \"bg-kumo-badge-inverted text-kumo-badge-inverted\",\n description: \"Inverted badge\",\n },\n outline: {\n classes: \"border border-kumo-fill bg-transparent text-kumo-default\",\n description: \"Bordered badge with transparent background\",\n },\n beta: {\n classes:\n \"border border-dashed border-kumo-brand bg-transparent text-kumo-link\",\n description: \"Indicates beta or experimental features\",\n },\n /** @deprecated Use `\"inverted\"` instead. */\n primary: {\n classes: \"bg-kumo-badge-inverted text-kumo-badge-inverted\",\n description: \"Deprecated. Use inverted instead.\",\n },\n /** @deprecated Use `\"neutral\"` instead. */\n secondary: {\n classes: \"bg-kumo-badge-neutral text-white\",\n description: \"Deprecated. Use neutral instead.\",\n },\n /** @deprecated Use `\"red\"` instead. */\n destructive: {\n classes: \"bg-kumo-badge-red text-white\",\n description: \"Deprecated. Use red instead.\",\n },\n /** @deprecated Use `\"green\"` instead. */\n success: {\n classes: \"bg-kumo-badge-green text-white\",\n description: \"Deprecated. Use green instead.\",\n },\n },\n} as const;\n\nexport const KUMO_BADGE_DEFAULT_VARIANTS = {\n variant: \"neutral\",\n} as const;\n\n// Derived types from KUMO_BADGE_VARIANTS\nexport type KumoBadgeVariant = keyof typeof KUMO_BADGE_VARIANTS.variant;\n\nexport interface KumoBadgeVariantsProps {\n variant?: KumoBadgeVariant;\n}\n\nexport function badgeVariants({\n variant = KUMO_BADGE_DEFAULT_VARIANTS.variant,\n}: KumoBadgeVariantsProps = {}) {\n const variantConfig = KUMO_BADGE_VARIANTS.variant[variant];\n return cn(\n // Base styles (exported as KUMO_BADGE_BASE_STYLES for Figma plugin)\n KUMO_BADGE_BASE_STYLES,\n // Apply variant styles from KUMO_BADGE_VARIANTS (fallback to primary if variant not found)\n variantConfig?.classes ??\n KUMO_BADGE_VARIANTS.variant[KUMO_BADGE_DEFAULT_VARIANTS.variant].classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type BadgeVariant = KumoBadgeVariant;\n\n/**\n * Badge component props.\n *\n * @example\n * ```tsx\n * <Badge variant=\"green\">Active</Badge>\n * <Badge variant=\"red\">Error</Badge>\n * <Badge variant=\"neutral\">Inactive</Badge>\n * ```\n */\nexport interface BadgeProps {\n /**\n * Color variant of the badge.\n * - `\"red\"` / `\"red-subtle\"` — Red badge\n * - `\"orange\"` / `\"orange-subtle\"` — Orange badge\n * - `\"yellow\"` / `\"yellow-subtle\"` — Yellow badge\n * - `\"green\"` / `\"green-subtle\"` — Green badge (emerald scale)\n * - `\"teal\"` / `\"teal-subtle\"` — Teal badge\n * - `\"blue\"` / `\"blue-subtle\"` — Blue badge\n * - `\"neutral\"` / `\"neutral-subtle\"` — Neutral badge\n * - `\"inverted\"` — Inverted badge (near-black, white in dark mode)\n * - `\"outline\"` — Bordered badge with transparent background\n * - `\"beta\"` — Dashed-border badge for beta/experimental features\n * - `\"primary\"` — **Deprecated.** Use `\"inverted\"` instead.\n * - `\"secondary\"` — **Deprecated.** Use `\"neutral\"` instead.\n * - `\"destructive\"` — **Deprecated.** Use `\"red\"` instead.\n * - `\"success\"` — **Deprecated.** Use `\"green\"` instead.\n * @default \"neutral\"\n */\n variant?: KumoBadgeVariant;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Content rendered inside the badge. */\n children: ReactNode;\n}\n\n/**\n * Small status label for categorizing or highlighting content.\n *\n * @example\n * ```tsx\n * <Badge variant=\"green\">Active</Badge>\n * ```\n */\nexport function Badge({\n variant = KUMO_BADGE_DEFAULT_VARIANTS.variant,\n className,\n children,\n}: BadgeProps) {\n return (\n <span className={cn(badgeVariants({ variant }), className)}>\n {children}\n </span>\n );\n}\n"],"names":["KUMO_BADGE_BASE_STYLES","KUMO_BADGE_VARIANTS","KUMO_BADGE_DEFAULT_VARIANTS","badgeVariants","variant","variantConfig","cn","Badge","className","children","jsx"],"mappings":";;;AAIO,MAAMA,IACX,uIAGWC,IAAsB;AAAA,EACjC,SAAS;AAAA,IACP,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,gBAAgB;AAAA,MACd,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,eAAe;AAAA,MACb,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,eAAe;AAAA,MACb,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,kBAAkB;AAAA,MAChB,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,UAAU;AAAA,MACR,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SACE;AAAA,MACF,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,WAAW;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,aAAa;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA;AAAA,IAGf,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAA8B;AAAA,EACzC,SAAS;AACX;AASO,SAASC,EAAc;AAAA,EAC5B,SAAAC,IAAUF,EAA4B;AACxC,IAA4B,IAAI;AAC9B,QAAMG,IAAgBJ,EAAoB,QAAQG,CAAO;AACzD,SAAOE;AAAA;AAAA,IAELN;AAAA;AAAA,IAEAK,GAAe,WACbJ,EAAoB,QAAQC,EAA4B,OAAO,EAAE;AAAA,EAAA;AAEvE;AAiDO,SAASK,EAAM;AAAA,EACpB,SAAAH,IAAUF,EAA4B;AAAA,EACtC,WAAAM;AAAA,EACA,UAAAC;AACF,GAAe;AACb,SACE,gBAAAC,EAAC,QAAA,EAAK,WAAWJ,EAAGH,EAAc,EAAE,SAAAC,GAAS,GAAGI,CAAS,GACtD,UAAAC,EAAA,CACH;AAEJ;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"button-odxi0hp4fvi5i2w3.js","sources":["../../src/components/button/button.tsx"],"sourcesContent":["import React from \"react\";\nimport { ArrowsClockwise, type Icon } from \"@phosphor-icons/react\";\nimport { Loader } from \"../loader/loader\";\nimport { Tooltip } from \"../tooltip/tooltip\";\nimport { cn } from \"../../utils/cn\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\n\n/** Button variant definitions mapping shape, size, and variant names to their Tailwind classes. */\nexport const KUMO_BUTTON_VARIANTS = {\n shape: {\n base: {\n classes: \"\",\n description: \"Default rectangular button shape\",\n },\n square: {\n classes: \"items-center justify-center p-0\",\n description: \"Square button for icon-only actions\",\n },\n circle: {\n classes: \"items-center justify-center p-0 rounded-full\",\n description: \"Circular button for icon-only actions\",\n },\n },\n size: {\n xs: {\n classes: \"h-5 gap-1 rounded-sm px-1.5 text-xs\",\n description: \"Extra small button for compact UIs\",\n },\n sm: {\n classes: \"h-6.5 gap-1 rounded-md px-2 text-xs\",\n description: \"Small button for secondary actions\",\n },\n base: {\n classes: \"h-9 gap-1.5 rounded-lg px-3 text-base\",\n description: \"Default button size\",\n },\n lg: {\n classes: \"h-10 gap-2 rounded-lg px-4 text-base\",\n description: \"Large button for primary CTAs\",\n },\n },\n compactSize: {\n xs: { classes: \"size-3.5\" },\n sm: { classes: \"size-6.5\" },\n base: { classes: \"size-9\" },\n lg: { classes: \"size-10\" },\n },\n variant: {\n primary: {\n classes:\n \"bg-kumo-brand !text-white hover:bg-kumo-brand-hover focus:bg-kumo-brand-hover disabled:bg-kumo-brand/50\",\n description: \"High-emphasis button for primary actions\",\n },\n secondary: {\n classes:\n \"bg-kumo-base !text-kumo-default ring not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-tint disabled:bg-kumo-base/50 disabled:!text-kumo-default/70 ring-kumo-ring data-[state=open]:bg-kumo-base\",\n description: \"Default button style for most actions\",\n },\n ghost: {\n classes: \"text-kumo-default hover:bg-kumo-tint shadow-none bg-inherit\",\n description: \"Minimal button with no background\",\n },\n destructive: {\n classes: \"bg-kumo-danger !text-white hover:bg-kumo-danger/70\",\n description: \"Danger button for destructive actions like delete\",\n },\n \"secondary-destructive\": {\n classes:\n \"bg-kumo-base !text-kumo-danger ring not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-base disabled:bg-kumo-base/50 disabled:!text-kumo-danger/70 ring-kumo-line data-[state=open]:bg-kumo-base\",\n description:\n \"Secondary button with destructive text for less prominent dangerous actions\",\n },\n outline: {\n classes: \"bg-transparent text-kumo-default ring ring-kumo-ring\",\n description: \"Bordered button with transparent background\",\n },\n },\n} as const;\n\nexport const KUMO_BUTTON_DEFAULT_VARIANTS = {\n shape: \"base\",\n size: \"base\",\n variant: \"secondary\",\n} as const;\n\n// Derived types from KUMO_BUTTON_VARIANTS\nexport type KumoButtonShape = keyof typeof KUMO_BUTTON_VARIANTS.shape;\nexport type KumoButtonSize = keyof typeof KUMO_BUTTON_VARIANTS.size;\nexport type KumoButtonVariant = keyof typeof KUMO_BUTTON_VARIANTS.variant;\n\nexport interface KumoButtonVariantsProps {\n /**\n * Button shape.\n * - `\"base\"` — Default rectangular button\n * - `\"square\"` — Square button for icon-only actions\n * - `\"circle\"` — Circular button for icon-only actions\n * @default \"base\"\n */\n shape?: KumoButtonShape;\n /**\n * Button size.\n * - `\"xs\"` — Extra small for compact UIs\n * - `\"sm\"` — Small for secondary actions\n * - `\"base\"` — Default size\n * - `\"lg\"` — Large for primary CTAs\n * @default \"base\"\n */\n size?: KumoButtonSize;\n /**\n * Visual style of the button.\n * - `\"primary\"` — High-emphasis, brand-colored for primary actions\n * - `\"secondary\"` — Default style with border for most actions\n * - `\"ghost\"` — Minimal, no background for tertiary actions\n * - `\"destructive\"` — Danger button for destructive actions\n * - `\"secondary-destructive\"` — Secondary style with destructive text\n * - `\"outline\"` — Bordered with transparent background\n * @default \"secondary\"\n */\n variant?: KumoButtonVariant;\n}\n\nexport function buttonVariants({\n variant = KUMO_BUTTON_DEFAULT_VARIANTS.variant,\n size = KUMO_BUTTON_DEFAULT_VARIANTS.size,\n shape = KUMO_BUTTON_DEFAULT_VARIANTS.shape,\n}: KumoButtonVariantsProps = {}) {\n const isCompactShape = shape === \"square\" || shape === \"circle\";\n\n return cn(\n // Base styles\n \"group flex w-max shrink-0 items-center font-medium select-none\",\n \"border-0 shadow-xs\",\n \"cursor-pointer\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:text-kumo-subtle\",\n // Apply variant, size, shape styles from KUMO_BUTTON_VARIANTS\n KUMO_BUTTON_VARIANTS.variant[variant].classes,\n KUMO_BUTTON_VARIANTS.size[size].classes,\n KUMO_BUTTON_VARIANTS.shape[shape].classes,\n isCompactShape && KUMO_BUTTON_VARIANTS.compactSize[size].classes,\n );\n}\n\n// Normalize icon prop to support both React elements and component types\nconst renderIconNode = (IconComponent?: Icon | React.ReactNode) => {\n if (!IconComponent) return null;\n if (React.isValidElement(IconComponent)) return IconComponent;\n const Comp = IconComponent as React.ComponentType<Record<string, unknown>>;\n return <Comp />;\n};\n\n/**\n * Button component props.\n *\n * Uses a discriminated union on `shape` so that icon-only buttons\n * (`shape=\"square\"` or `shape=\"circle\"`) require an `aria-label`.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n * <Button variant=\"destructive\" loading>Deleting...</Button>\n * ```\n */\ntype ButtonBaseProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Content rendered inside the button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean;\n /** When set, wraps the button in a Tooltip with this content. */\n title?: React.ReactNode;\n};\n\ntype ButtonWithTextProps = ButtonBaseProps & {\n shape?: \"base\";\n size?: KumoButtonSize;\n variant?: KumoButtonVariant;\n};\n\ntype IconOnlyButtonProps = ButtonBaseProps & {\n shape: \"square\" | \"circle\";\n size?: KumoButtonSize;\n variant?: KumoButtonVariant;\n /** Required for icon-only buttons to provide accessible label for screen readers */\n \"aria-label\": string;\n};\n\nexport type ButtonProps = ButtonWithTextProps | IconOnlyButtonProps;\n\n/**\n * LinkButton component props — renders an anchor styled as a button.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/docs\" variant=\"ghost\" icon={BookIcon}>Docs</LinkButton>\n * <LinkButton href=\"https://example.com\" external>Visit Site</LinkButton>\n * ```\n */\nexport type LinkButtonProps = React.AnchorHTMLAttributes<HTMLAnchorElement> &\n KumoButtonVariantsProps & {\n /** Content rendered inside the link button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** When `true`, opens in a new tab with `rel=\"noopener noreferrer\"`. */\n external?: boolean;\n linksExternal?: boolean;\n };\n\n/**\n * Primary action trigger. Supports multiple variants, sizes, shapes, icons, and loading state.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" icon={PlusIcon}>Create Worker</Button>\n * ```\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled,\n loading,\n shape = \"base\",\n size = \"base\",\n variant = \"secondary\",\n icon: IconComponent,\n title,\n ...props\n },\n ref,\n ) => {\n const { type, ...restProps } = props;\n const button = (\n <button\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n \"focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\", // Focus styles\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n disabled={loading || disabled}\n type={type ?? \"button\"}\n {...restProps}\n >\n {loading && <Loader size={size === \"lg\" ? 16 : 14} />}\n {!loading && renderIconNode(IconComponent)}\n\n {children}\n </button>\n );\n\n if (title) {\n return (\n <Tooltip content={title} asChild>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n },\n);\n\nButton.displayName = \"Button\";\n\n/**\n * Square button with a rotating arrows icon, used to trigger data refresh actions.\n *\n * @example\n * ```tsx\n * <RefreshButton loading={isRefreshing} onClick={refresh} />\n * ```\n */\nexport const RefreshButton = ({\n \"aria-label\": ariaLabel = \"Refresh\",\n loading,\n ...props\n}: ButtonProps) => (\n <Button shape=\"square\" aria-label={ariaLabel} {...props}>\n <ArrowsClockwise\n className={cn({\n \"animate-refresh\": loading,\n \"size-4.5\": props.size === \"base\" || !props.size,\n \"size-4\": props.size === \"sm\",\n \"size-5\": props.size === \"lg\",\n })}\n />\n </Button>\n);\n\n/**\n * Anchor element styled as a button. Integrates with `LinkProvider` for framework routing.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/settings\" variant=\"ghost\">Settings</LinkButton>\n * ```\n */\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, LinkButtonProps>(\n (\n {\n children,\n className,\n external,\n href,\n shape = \"base\",\n size = \"base\",\n variant = \"ghost\",\n icon: IconComponent,\n // linksExternal = false,\n ...props\n },\n ref,\n ) => {\n const LinkComponent = useLinkComponent();\n const externalProps = external\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : {};\n\n return (\n <LinkComponent\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n \"flex items-center no-underline!\",\n className,\n )}\n href={href}\n to={typeof href === \"string\" ? href : undefined}\n {...externalProps}\n {...props}\n >\n {renderIconNode(IconComponent)}\n {children}\n </LinkComponent>\n );\n },\n);\n\nLinkButton.displayName = \"LinkButton\";\n"],"names":["KUMO_BUTTON_VARIANTS","KUMO_BUTTON_DEFAULT_VARIANTS","buttonVariants","variant","size","shape","isCompactShape","cn","renderIconNode","IconComponent","React","Button","children","className","disabled","loading","title","props","ref","type","restProps","button","jsxs","Loader","Tooltip","RefreshButton","ariaLabel","jsx","ArrowsClockwise","LinkButton","external","href","LinkComponent","useLinkComponent","externalProps"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkbox-dx8x0rzv582yjv7n.js","sources":["../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { forwardRef, createContext, useContext, type ReactNode } from \"react\";\nimport { CheckIcon, MinusIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"../../utils/cn\";\nimport { Label } from \"../label\";\nimport { Fieldset } from \"@base-ui/react/fieldset\";\nimport { Field as FieldBase } from \"@base-ui/react/field\";\nimport { CheckboxGroup as BaseCheckboxGroup } from \"@base-ui/react/checkbox-group\";\nimport {\n Checkbox as BaseCheckbox,\n type CheckboxRootChangeEventDetails,\n} from \"@base-ui/react/checkbox\";\n\n/** Checkbox variant definitions mapping variant names to their Tailwind classes. */\nexport const KUMO_CHECKBOX_VARIANTS = {\n variant: {\n default: {\n classes:\n \"[&:focus-within>span]:ring-kumo-ring [&:hover>span]:ring-kumo-ring\",\n description: \"Default checkbox appearance\",\n },\n error: {\n classes: \"[&>span]:ring-kumo-danger\",\n description: \"Error state for validation failures\",\n },\n },\n} as const;\n\nexport const KUMO_CHECKBOX_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// Derived types from KUMO_CHECKBOX_VARIANTS\nexport type KumoCheckboxVariant = keyof typeof KUMO_CHECKBOX_VARIANTS.variant;\n\nexport interface KumoCheckboxVariantsProps {\n /**\n * Visual variant.\n * - `\"default\"` — Standard checkbox appearance\n * - `\"error\"` — Error state for validation failures\n * @default \"default\"\n */\n variant?: KumoCheckboxVariant;\n}\n\nexport function checkboxVariants({\n variant = KUMO_CHECKBOX_DEFAULT_VARIANTS.variant,\n}: KumoCheckboxVariantsProps = {}) {\n return cn(KUMO_CHECKBOX_VARIANTS.variant[variant].classes);\n}\n\n// Legacy type alias for backwards compatibility\nexport type CheckboxVariant = KumoCheckboxVariant;\n\n// Context for passing controlFirst from Group to Items\nconst CheckboxGroupContext = createContext<{ controlFirst: boolean }>({\n controlFirst: true,\n});\n\n/**\n * Single checkbox component props with accessibility guidance.\n *\n * **Accessible Name Required:** Checkbox should have one of:\n * 1. `label` prop (recommended) - built-in Field wrapper with horizontal layout\n * 2. `aria-label` - for checkboxes without visible label\n * 3. `aria-labelledby` - for custom label association\n *\n * **Note:** When used inside Checkbox.Group or Dropdown, label is optional (parent provides context).\n *\n * Missing accessible names will trigger console warnings in development (unless inside a group).\n *\n * @example\n * // Recommended: Built-in Field wrapper with label\n * <Checkbox label=\"Accept terms and conditions\" />\n *\n * @example\n * // Control-first layout (checkbox before label)\n * <Checkbox label=\"Remember me\" controlFirst={true} />\n *\n * @example\n * // Label-first layout (label before checkbox)\n * <Checkbox label=\"Enable notifications\" controlFirst={false} />\n *\n * @example\n * // Error variant (visual only, no error text for single checkboxes)\n * <Checkbox label=\"Required field\" variant=\"error\" />\n *\n * @example\n * // Without visible label (aria-label required)\n * <Checkbox aria-label=\"Select all items\" />\n *\n * @example\n * // Custom label association\n * <label id=\"terms-label\">I accept the terms</label>\n * <Checkbox aria-labelledby=\"terms-label\" />\n *\n * @example\n * // Inside Checkbox.Group (label optional)\n * <Checkbox.Group legend=\"Preferences\">\n * <Checkbox.Item value=\"email\" label=\"Email notifications\" />\n * <Checkbox.Item value=\"sms\" label=\"SMS notifications\" />\n * </Checkbox.Group>\n */\nexport type CheckboxProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text) */\n variant?: CheckboxVariant;\n /** Label content for the checkbox (enables built-in Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Whether the checkbox is checked (controlled) */\n checked?: boolean;\n /** Whether the checkbox is in indeterminate state */\n indeterminate?: boolean;\n /** Whether the checkbox is disabled */\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n /** @deprecated Use onCheckedChange instead */\n onValueChange?: (checked: boolean) => void;\n /** @deprecated Use onCheckedChange instead */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n /** Click handler */\n onClick?: (event: React.MouseEvent) => void;\n /** Name for form submission */\n name?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label when no visible label is provided */\n \"aria-label\"?: string;\n /** ID of element that labels this checkbox */\n \"aria-labelledby\"?: string;\n};\n\n/**\n * Checkbox group component props (with built-in Fieldset and CheckboxGroup)\n *\n * Usage:\n * ```tsx\n * <Checkbox.Group\n * legend=\"Choose preferences\"\n * defaultValue={['email']}\n * error=\"You must select at least one option\"\n * >\n * <Checkbox.Item label=\"Email notifications\" value=\"email\" />\n * <Checkbox.Item label=\"SMS notifications\" value=\"sms\" />\n * </Checkbox.Group>\n * ```\n */\nexport interface CheckboxGroupProps {\n /** Legend text for the group */\n legend: string;\n /** Child Checkbox.Item components */\n children: ReactNode;\n /** Error message for the group (only appears in groups, not single checkboxes) */\n error?: string;\n /** Helper text for the group */\n description?: ReactNode;\n /** Values of checkboxes that should be initially checked (uncontrolled) */\n defaultValue?: string[];\n /** Values of checkboxes that should be checked (controlled) */\n value?: string[];\n /** Event handler called when checkbox values change */\n onValueChange?: (value: string[]) => void;\n /** All possible checkbox values (required for parent checkbox pattern) */\n allValues?: string[];\n /** Whether all checkboxes in the group are disabled */\n disabled?: boolean;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Individual checkbox item within a group\n */\nexport type CheckboxItemProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures */\n variant?: CheckboxVariant;\n /** Label text displayed next to checkbox */\n label: string;\n /** Value of the checkbox (required when used in Checkbox.Group) */\n value?: string;\n /** Additional CSS classes for the label wrapper */\n className?: string;\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n /** @deprecated Use onCheckedChange instead */\n onValueChange?: (checked: boolean) => void;\n name?: string;\n};\n\n// Single checkbox with built-in Field\nconst CheckboxBase = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n labelTooltip,\n controlFirst = true,\n onCheckedChange,\n onValueChange,\n onChange,\n required,\n name,\n ...props\n },\n ref,\n ) => {\n // A11y enforcement: warn in dev if no accessible name provided\n if (process.env.NODE_ENV !== \"production\") {\n const hasLabel = Boolean(label);\n const hasAriaLabel = Boolean(props[\"aria-label\"]);\n const hasAriaLabelledBy = Boolean(props[\"aria-labelledby\"]);\n\n if (!hasLabel && !hasAriaLabel && !hasAriaLabelledBy) {\n console.warn(\n \"[Kumo Checkbox]: Checkbox must have an accessible name. Provide either:\\n\" +\n \" - label prop: <Checkbox label='Accept terms' />\\n\" +\n \" - aria-label: <Checkbox aria-label='Select item' />\\n\" +\n \" - aria-labelledby for custom label association\\n\" +\n \" Note: When used inside Checkbox.Group, label is optional\",\n );\n }\n }\n\n // Handle onCheckedChange (preferred) and deprecated onValueChange/onChange\n const handleCheckedChange = (\n newChecked: boolean,\n eventDetails: CheckboxRootChangeEventDetails,\n ) => {\n onCheckedChange?.(newChecked);\n onValueChange?.(newChecked);\n if (onChange) {\n // Backwards compatibility: extend native event with target.checked\n // so existing code using `e.target.checked` continues to work\n const event = Object.assign(eventDetails.event, {\n target: { checked: newChecked },\n });\n onChange(event as never);\n }\n };\n\n const checkboxControl = (\n <BaseCheckbox.Root\n ref={ref}\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={handleCheckedChange}\n className={cn(\n \"relative flex h-4 w-4 items-center justify-center rounded-sm border-0 bg-kumo-base ring after:absolute after:-inset-x-3 after:-inset-y-2\",\n variant === \"error\" ? \"ring-kumo-danger\" : \"ring-kumo-line\",\n !disabled && \"hover:ring-kumo-ring focus-visible:ring-kumo-ring\",\n \"data-[checked]:bg-kumo-contrast data-[checked]:ring-kumo-contrast data-[indeterminate]:bg-kumo-contrast data-[indeterminate]:ring-kumo-contrast\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-kumo-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n );\n\n // If no label provided, return bare checkbox (for use in other components like Dropdown)\n if (!label) {\n return checkboxControl;\n }\n\n // Use Field.Root + Field.Label enclosing pattern for proper a11y association\n // See: https://base-ui.com/react/components/field\n return (\n <FieldBase.Root className=\"inline-flex\">\n <FieldBase.Label\n className={cn(\n \"!m-0 !min-h-0 !text-base inline-flex items-center gap-2\",\n controlFirst ? \"flex-row\" : \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n {checkboxControl}\n <Label\n showOptional={required === false}\n tooltip={labelTooltip}\n asContent\n >\n {label}\n </Label>\n </FieldBase.Label>\n </FieldBase.Root>\n );\n },\n);\n\nCheckboxBase.displayName = \"Checkbox\";\n\n// Checkbox.Item for use within Checkbox.Group\nconst CheckboxItem = forwardRef<HTMLButtonElement, CheckboxItemProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n value,\n onCheckedChange,\n onValueChange,\n name,\n },\n ref,\n ) => {\n const { controlFirst } = useContext(CheckboxGroupContext);\n\n // Handle onCheckedChange (preferred) and deprecated onValueChange\n const handleCheckedChange = (newChecked: boolean) => {\n onCheckedChange?.(newChecked);\n onValueChange?.(newChecked);\n };\n\n return (\n <label\n className={cn(\n \"m-0 relative inline-flex items-center gap-2\",\n // Control first (default): checkbox before label\n // Label first: label before checkbox using flex-row-reverse\n !controlFirst && \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n className,\n )}\n >\n <BaseCheckbox.Root\n ref={ref}\n value={value}\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={handleCheckedChange}\n className={cn(\n \"peer relative flex h-4 w-4 items-center justify-center rounded-sm border-0 bg-kumo-base ring after:absolute after:-inset-x-3 after:-inset-y-2\",\n variant === \"error\" ? \"ring-kumo-danger\" : \"ring-kumo-line\",\n !disabled &&\n \"group-hover:ring-kumo-ring hover:ring-kumo-ring focus-visible:ring-kumo-ring\",\n \"data-[checked]:bg-kumo-contrast data-[checked]:ring-kumo-contrast data-[indeterminate]:bg-kumo-contrast data-[indeterminate]:ring-kumo-contrast\",\n )}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-kumo-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n <span className=\"text-base text-kumo-default\">{label}</span>\n </label>\n );\n },\n);\n\nCheckboxItem.displayName = \"Checkbox.Item\";\n\n// Checkbox.Group with built-in Fieldset and CheckboxGroup\nfunction CheckboxGroup({\n legend,\n children,\n error,\n description,\n defaultValue,\n value,\n onValueChange,\n allValues,\n disabled,\n controlFirst = true,\n className,\n}: CheckboxGroupProps) {\n return (\n <CheckboxGroupContext.Provider value={{ controlFirst }}>\n <BaseCheckboxGroup\n defaultValue={defaultValue}\n value={value}\n onValueChange={onValueChange}\n allValues={allValues}\n disabled={disabled}\n >\n <Fieldset.Root className={cn(\"flex flex-col gap-4\", className)}>\n <Fieldset.Legend className=\"text-base font-medium text-kumo-default\">\n {legend}\n </Fieldset.Legend>\n <div className=\"flex flex-col gap-2\">{children}</div>\n {error && <p className=\"text-sm text-kumo-danger\">{error}</p>}\n {description && (\n <p className=\"text-sm text-kumo-subtle\">{description}</p>\n )}\n </Fieldset.Root>\n </BaseCheckboxGroup>\n </CheckboxGroupContext.Provider>\n );\n}\n\n// Compound component\nexport const Checkbox = Object.assign(CheckboxBase, {\n Item: CheckboxItem,\n Group: CheckboxGroup,\n});\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["KUMO_CHECKBOX_VARIANTS","KUMO_CHECKBOX_DEFAULT_VARIANTS","CheckboxGroupContext","createContext","CheckboxBase","forwardRef","className","checked","indeterminate","disabled","variant","label","labelTooltip","controlFirst","onCheckedChange","onValueChange","onChange","required","name","props","ref","hasLabel","hasAriaLabel","hasAriaLabelledBy","checkboxControl","jsx","BaseCheckbox.Root","newChecked","eventDetails","event","cn","BaseCheckbox.Indicator","renderProps","state","MinusIcon","CheckIcon","FieldBase.Root","jsxs","FieldBase.Label","Label","CheckboxItem","value","useContext","handleCheckedChange","CheckboxGroup","legend","children","error","description","defaultValue","allValues","BaseCheckboxGroup","Fieldset.Root","Fieldset.Legend","Checkbox"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-liq1g6f5lhee305d.js","sources":["../../src/components/code/code.tsx"],"sourcesContent":["import { type CSSProperties } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Code language variant definitions. */\nexport const KUMO_CODE_VARIANTS = {\n lang: {\n ts: {\n classes: \"\",\n description: \"TypeScript code\",\n },\n tsx: {\n classes: \"\",\n description: \"TypeScript JSX code\",\n },\n jsonc: {\n classes: \"\",\n description: \"JSON with comments\",\n },\n bash: {\n classes: \"\",\n description: \"Shell/Bash commands\",\n },\n css: {\n classes: \"\",\n description: \"CSS styles\",\n },\n },\n} as const;\n\nexport const KUMO_CODE_DEFAULT_VARIANTS = {\n lang: \"ts\",\n} as const;\n\n/**\n * Styling metadata for Code component (for AI/Figma plugin consumption)\n */\nexport const KUMO_CODE_STYLING = {\n /** Base semantic tokens used */\n baseTokens: [\"text-kumo-strong\"],\n /** Typography and layout */\n typography: {\n fontFamily: \"font-mono\",\n fontSize: \"text-sm\",\n lineHeight: \"leading-[20px]\",\n },\n /** Container dimensions */\n dimensions: {\n margin: \"m-0\",\n padding: \"p-0\",\n width: \"w-auto\",\n },\n /** Border and background */\n appearance: {\n borderRadius: \"rounded-none\",\n border: \"border-none\",\n background: \"bg-transparent\",\n },\n} as const;\n\n/**\n * Styling metadata for CodeBlock component (for AI/Figma plugin consumption)\n */\nexport const KUMO_CODEBLOCK_STYLING = {\n /** Base semantic tokens used */\n baseTokens: [\"bg-kumo-base\", \"border-kumo-fill\"],\n /** Container styling */\n container: {\n minWidth: \"min-w-0\",\n borderRadius: \"rounded-md\",\n border: \"border border-kumo-fill\",\n background: \"bg-kumo-base\",\n },\n /** Inner code element padding */\n innerPadding: \"[&>pre]:p-2.5\",\n /** Parsed dimensions */\n dimensions: {\n borderRadius: 6, // md = 6px\n padding: 10, // p-2.5 = 10px\n },\n} as const;\n\n// Derived types from KUMO_CODE_VARIANTS\nexport type KumoCodeLang = keyof typeof KUMO_CODE_VARIANTS.lang;\n\nexport interface KumoCodeVariantsProps {\n /**\n * Language hint for the code content.\n * - `\"ts\"` — TypeScript code\n * - `\"tsx\"` — TypeScript JSX code\n * - `\"jsonc\"` — JSON with comments\n * - `\"bash\"` — Shell/Bash commands\n * - `\"css\"` — CSS styles\n * @default \"ts\"\n */\n lang?: KumoCodeLang;\n}\n\nexport function codeVariants({\n lang = KUMO_CODE_DEFAULT_VARIANTS.lang,\n}: KumoCodeVariantsProps = {}) {\n return cn(\n // Base styles\n \"m-0 w-auto rounded-none border-none bg-transparent p-0 font-mono text-sm leading-[20px] text-kumo-strong\",\n // Apply lang-specific styles (currently none, but extensible)\n KUMO_CODE_VARIANTS.lang[lang].classes,\n );\n}\n\n// Legacy type alias for backwards compatibility\nexport type CodeLang = KumoCodeLang;\n\n/** @deprecated Use CodeLang instead */\nexport type BundledLanguage = CodeLang;\n\n/**\n * Code component props.\n *\n * @example\n * ```tsx\n * <Code code=\"const x = 1;\" lang=\"ts\" />\n * <Code code=\"export API_KEY={{apiKey}}\" lang=\"bash\"\n * values={{ apiKey: { value: \"sk_live_123\", highlight: true } }}\n * />\n * ```\n */\nexport interface CodeProps extends KumoCodeVariantsProps {\n /** The code string to display. */\n code: string;\n /** Template values for `{{key}}` interpolation. Values with `highlight: true` are visually emphasized. */\n values?: Record<\n string,\n {\n value: string;\n highlight?: boolean;\n }\n >;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Inline styles. */\n style?: CSSProperties;\n}\n\n/**\n * Simple code component without syntax highlighting.\n *\n * Renders code in a monospace font with customizable language metadata.\n * For a bordered container version, use `Code.Block` or `CodeBlock`.\n *\n * **Styling:**\n * - Typography: `font-mono text-sm leading-[20px]`\n * - Colors: `text-kumo-strong` with `bg-transparent`\n * - No borders or padding (use CodeBlock for styled container)\n * - Supports all semantic tokens via className prop\n *\n * @deprecated Use `CodeHighlighted` from `@cloudflare/kumo/code` for syntax highlighting.\n * This component will be removed in v2.0.\n *\n * @example Migration:\n * ```tsx\n * // Before\n * import { Code } from \"@cloudflare/kumo\";\n * <Code code=\"const x = 1;\" lang=\"ts\" />\n *\n * // After\n * import { ShikiProvider, CodeHighlighted } from \"@cloudflare/kumo/code\";\n * <ShikiProvider engine=\"javascript\" languages={['tsx']} themes={{ light: 'github-light', dark: 'github-dark' }}>\n * <CodeHighlighted code=\"const x = 1;\" lang=\"tsx\" />\n * </ShikiProvider>\n * ```\n */\nfunction CodeComponent({\n code,\n lang = KUMO_CODE_DEFAULT_VARIANTS.lang,\n className,\n style,\n}: CodeProps) {\n return (\n <pre className={cn(codeVariants({ lang }), className)} style={style}>\n {code}\n </pre>\n );\n}\n\nCodeComponent.displayName = \"Code\";\n\n/**\n * CodeBlock component props — code inside a bordered container.\n *\n * @example\n * ```tsx\n * <CodeBlock lang=\"tsx\" code={`const greeting = \"Hello!\";`} />\n * ```\n */\nexport interface CodeBlockProps {\n /** The code string to display. */\n code: string;\n /**\n * Language hint for the code content.\n * @default \"ts\"\n */\n lang?: CodeLang;\n}\n\n/**\n * Code block with border and background container.\n *\n * A styled wrapper around Code that adds a bordered container with surface background.\n * Useful for displaying code snippets with visual separation from surrounding content.\n *\n * **Styling:**\n * - Container: `min-w-0 rounded-md border border-kumo-fill bg-kumo-base`\n * - Inner padding: `p-2.5` (10px)\n * - Uses semantic tokens: `bg-kumo-base`, `border-kumo-fill`\n *\n * @deprecated Use `CodeHighlighted` from `@cloudflare/kumo/code` for syntax highlighting.\n * This component will be removed in v2.0.\n */\nfunction CodeBlockComponent({ code, lang }: CodeBlockProps) {\n return (\n <div className=\"min-w-0 rounded-md border border-kumo-fill bg-kumo-base [&>pre]:p-2.5!\">\n <CodeComponent lang={lang} code={code} />\n </div>\n );\n}\n\nCodeBlockComponent.displayName = \"CodeBlock\";\n\n// Export Code with Block sub-component (for registry detection)\nexport const Code = Object.assign(CodeComponent, {\n Block: CodeBlockComponent,\n});\n\n// Backward-compatible standalone export\nexport const CodeBlock = CodeBlockComponent;\n"],"names":["KUMO_CODE_VARIANTS","KUMO_CODE_DEFAULT_VARIANTS","codeVariants","lang","cn","CodeComponent","code","className","style","jsx","CodeBlockComponent","Code","CodeBlock"],"mappings":";;;AAIO,MAAMA,IAAqB;AAAA,EAChC,MAAM;AAAA,IACJ,IAAI;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IAEf,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAA6B;AAAA,EACxC,MAAM;AACR;AAkEO,SAASC,EAAa;AAAA,EAC3B,MAAAC,IAAOF,EAA2B;AACpC,IAA2B,IAAI;AAC7B,SAAOG;AAAA;AAAA,IAEL;AAAA;AAAA,IAEAJ,EAAmB,KAAKG,CAAI,EAAE;AAAA,EAAA;AAElC;AAgEA,SAASE,EAAc;AAAA,EACrB,MAAAC;AAAA,EACA,MAAAH,IAAOF,EAA2B;AAAA,EAClC,WAAAM;AAAA,EACA,OAAAC;AACF,GAAc;AACZ,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWL,EAAGF,EAAa,EAAE,MAAAC,EAAA,CAAM,GAAGI,CAAS,GAAG,OAAAC,GACpD,UAAAF,EAAA,CACH;AAEJ;AAEAD,EAAc,cAAc;AAkC5B,SAASK,EAAmB,EAAE,MAAAJ,GAAM,MAAAH,KAAwB;AAC1D,SACE,gBAAAM,EAAC,SAAI,WAAU,0EACb,4BAACJ,GAAA,EAAc,MAAAF,GAAY,MAAAG,GAAY,EAAA,CACzC;AAEJ;AAEAI,EAAmB,cAAc;AAG1B,MAAMC,IAAO,OAAO,OAAON,GAAe;AAAA,EAC/C,OAAOK;AACT,CAAC,GAGYE,IAAYF;"}
@@ -1,74 +0,0 @@
1
- "use client";
2
- import { jsx as r } from "react/jsx-runtime";
3
- import { i as x } from "./input-kvhyo3p4859bexvx.js";
4
- import { c as N } from "./cn-ct4n7r74mh8y0f48.js";
5
- import * as b from "react";
6
- import { useCallback as I } from "react";
7
- import { F as y } from "./field-fq504lyu7ttsh5m9.js";
8
- import { aP as F } from "./vendor-base-ui-n30qblevnpk9cc5c.js";
9
- const c = b.forwardRef(
10
- (p, o) => {
11
- const {
12
- className: u,
13
- onValueChange: s,
14
- size: d = "base",
15
- variant: f = "default",
16
- onChange: n,
17
- label: i,
18
- labelTooltip: h,
19
- description: g,
20
- error: a,
21
- ...t
22
- } = p, { required: C } = t, l = I(
23
- (e) => {
24
- n?.(e), s?.(e.target.value);
25
- },
26
- [n, s]
27
- ), m = N(
28
- x({ size: d, variant: f, focusIndicator: !0 }),
29
- "h-auto py-2",
30
- // Input variant always comes with size, but it does not apply for textarea
31
- u
32
- );
33
- return i ? /* @__PURE__ */ r(
34
- y,
35
- {
36
- label: i,
37
- required: C,
38
- labelTooltip: h,
39
- description: g,
40
- error: a ? typeof a == "string" ? { message: a, match: !0 } : a : void 0,
41
- children: /* @__PURE__ */ r(
42
- F,
43
- {
44
- render: (e) => /* @__PURE__ */ r(
45
- "textarea",
46
- {
47
- ...e,
48
- ref: o,
49
- className: m,
50
- onChange: l,
51
- ...t
52
- }
53
- )
54
- }
55
- )
56
- }
57
- ) : /* @__PURE__ */ r(
58
- "textarea",
59
- {
60
- ref: o,
61
- className: m,
62
- onChange: l,
63
- ...t
64
- }
65
- );
66
- }
67
- );
68
- c.displayName = "InputArea";
69
- const k = c;
70
- export {
71
- c as I,
72
- k as T
73
- };
74
- //# sourceMappingURL=input-area-nq40szg9110on89c.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-area-nq40szg9110on89c.js","sources":["../../src/components/input/input-area.tsx"],"sourcesContent":["import { inputVariants } from \"./input\";\nimport { cn } from \"../../utils/cn\";\nimport { useCallback, type ReactNode } from \"react\";\nimport * as React from \"react\";\nimport { Field as FieldBase } from \"@base-ui/react/field\";\nimport { Field as KumoField, type FieldErrorMatch } from \"../field/field\";\n\nexport const InputArea = React.forwardRef<HTMLTextAreaElement, InputAreaProps>(\n (props, ref) => {\n const {\n className,\n onValueChange,\n size = \"base\",\n variant = \"default\",\n onChange,\n label,\n labelTooltip,\n description,\n error,\n ...inputProps\n } = props;\n\n // Extract required from inputProps to pass to Field for label decoration\n const { required } = inputProps;\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n onValueChange?.(event.target.value);\n },\n [onChange, onValueChange],\n );\n\n const textareaClassName = cn(\n inputVariants({ size, variant, focusIndicator: true }),\n \"h-auto py-2\", // Input variant always comes with size, but it does not apply for textarea\n className,\n );\n\n // Render with Field wrapper if label is provided\n // Use FieldBase.Control with render callback to ensure proper label-textarea association.\n // The render callback receives props with the correct id/aria-labelledby from Field context.\n if (label) {\n return (\n <KumoField\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n <FieldBase.Control\n render={(controlProps) => (\n <textarea\n {...controlProps}\n ref={ref}\n className={textareaClassName}\n onChange={handleChange}\n {...inputProps}\n />\n )}\n />\n </KumoField>\n );\n }\n\n // Render bare textarea without Field wrapper\n return (\n <textarea\n ref={ref}\n className={textareaClassName}\n onChange={handleChange}\n {...inputProps}\n />\n );\n },\n);\n\nInputArea.displayName = \"InputArea\";\n\n/** Alias for InputArea — provided for discoverability when migrating from other libraries */\nexport const Textarea = InputArea;\n\n/**\n * InputArea component props\n * @property {ReactNode} [label] - Label content for the textarea (enables Field wrapper)\n * @property {ReactNode} [description] - Helper text displayed below the textarea\n * @property {string | { message: ReactNode, match: FieldErrorMatch }} [error] - Error message or validation error object\n */\nexport type InputAreaProps = {\n onValueChange?: (value: string) => void;\n variant?: \"default\" | \"error\";\n size?: \"xs\" | \"sm\" | \"base\" | \"lg\";\n // Then other custom props\n children?: React.ReactNode;\n className?: string;\n /** Label content for the textarea (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the textarea */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n\n // Finally, spread the native input props (least important)\n} & Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\">;\n"],"names":["InputArea","React","props","ref","className","onValueChange","size","variant","onChange","label","labelTooltip","description","error","inputProps","required","handleChange","useCallback","event","textareaClassName","cn","inputVariants","jsx","KumoField","FieldBase.Control","controlProps","Textarea"],"mappings":";;;;;;;;AAOO,MAAMA,IAAYC,EAAM;AAAA,EAC7B,CAACC,GAAOC,MAAQ;AACd,UAAM;AAAA,MACJ,WAAAC;AAAA,MACA,eAAAC;AAAA,MACA,MAAAC,IAAO;AAAA,MACP,SAAAC,IAAU;AAAA,MACV,UAAAC;AAAA,MACA,OAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,OAAAC;AAAA,MACA,GAAGC;AAAA,IAAA,IACDX,GAGE,EAAE,UAAAY,MAAaD,GACfE,IAAeC;AAAA,MACnB,CAACC,MAAkD;AACjD,QAAAT,IAAWS,CAAK,GAChBZ,IAAgBY,EAAM,OAAO,KAAK;AAAA,MACpC;AAAA,MACA,CAACT,GAAUH,CAAa;AAAA,IAAA,GAGpBa,IAAoBC;AAAA,MACxBC,EAAc,EAAE,MAAAd,GAAM,SAAAC,GAAS,gBAAgB,IAAM;AAAA,MACrD;AAAA;AAAA,MACAH;AAAA,IAAA;AAMF,WAAIK,IAEA,gBAAAY;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,OAAAb;AAAA,QACA,UAAAK;AAAA,QACA,cAAAJ;AAAA,QACA,aAAAC;AAAA,QACA,OACEC,IACI,OAAOA,KAAU,WACf,EAAE,SAASA,GAAO,OAAO,GAAA,IACzBA,IACF;AAAA,QAGN,UAAA,gBAAAS;AAAA,UAACE;AAAAA,UAAA;AAAA,YACC,QAAQ,CAACC,MACP,gBAAAH;AAAA,cAAC;AAAA,cAAA;AAAA,gBACE,GAAGG;AAAA,gBACJ,KAAArB;AAAA,gBACA,WAAWe;AAAA,gBACX,UAAUH;AAAA,gBACT,GAAGF;AAAA,cAAA;AAAA,YAAA;AAAA,UACN;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA,IAOJ,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAlB;AAAA,QACA,WAAWe;AAAA,QACX,UAAUH;AAAA,QACT,GAAGF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AAEAb,EAAU,cAAc;AAGjB,MAAMyB,IAAWzB;"}