@cloudflare/kumo 1.16.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 (286) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/ai/USAGE.md +38 -30
  3. package/ai/component-registry.json +237 -93
  4. package/ai/component-registry.md +421 -45
  5. package/ai/schemas.ts +15 -5
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +105 -49
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/ai/schemas.js +187 -174
  10. package/dist/ai/schemas.js.map +1 -1
  11. package/dist/chunks/{Legend-bov5dqf08wemc2qj.js → Legend-o0ntojbaplmszwk0.js} +4 -2
  12. package/dist/chunks/Legend-o0ntojbaplmszwk0.js.map +1 -0
  13. package/dist/chunks/badge-dan90i0rzy4pwa1j.js +102 -0
  14. package/dist/chunks/badge-dan90i0rzy4pwa1j.js.map +1 -0
  15. package/dist/chunks/banner-eiwcnk7ts21s3bnb.js +79 -0
  16. package/dist/chunks/banner-eiwcnk7ts21s3bnb.js.map +1 -0
  17. package/dist/chunks/{breadcrumbs-m79gm4gjwbfajpna.js → breadcrumbs-k39s28qx05vbxxth.js} +3 -3
  18. package/dist/chunks/{breadcrumbs-m79gm4gjwbfajpna.js.map → breadcrumbs-k39s28qx05vbxxth.js.map} +1 -1
  19. package/dist/chunks/{button-j0hi0afn33w9lxgi.js → button-cdxnqcgzwko8ooha.js} +55 -53
  20. package/dist/chunks/button-cdxnqcgzwko8ooha.js.map +1 -0
  21. package/dist/chunks/{checkbox-lawmt1894wr6rpgi.js → checkbox-kt1uojk2f9e0d0h1.js} +46 -55
  22. package/dist/chunks/checkbox-kt1uojk2f9e0d0h1.js.map +1 -0
  23. package/dist/chunks/{clipboard-text-ohx8kkpxisz382rj.js → clipboard-text-vcbvmtne4zjk4b18.js} +55 -54
  24. package/dist/chunks/clipboard-text-vcbvmtne4zjk4b18.js.map +1 -0
  25. package/dist/chunks/{code-liq1g6f5lhee305d.js → code-cz0w1y5z4h29a9eg.js} +18 -18
  26. package/dist/chunks/code-cz0w1y5z4h29a9eg.js.map +1 -0
  27. package/dist/chunks/{combobox-ft0u7rfaxawk0r0c.js → combobox-he2hd9e2ruknq5mp.js} +97 -82
  28. package/dist/chunks/combobox-he2hd9e2ruknq5mp.js.map +1 -0
  29. package/dist/chunks/{command-palette-b31nq4wk7o7gx4sa.js → command-palette-jc1w07jwakxvj23a.js} +159 -155
  30. package/dist/chunks/command-palette-jc1w07jwakxvj23a.js.map +1 -0
  31. package/dist/chunks/{dialog-l5tmwxrzp9g83jmw.js → dialog-oqh8l3l3zutpibxx.js} +22 -20
  32. package/dist/chunks/dialog-oqh8l3l3zutpibxx.js.map +1 -0
  33. package/dist/chunks/{dropdown-icy3xatdwhzr4une.js → dropdown-ncwhcd912vmone8k.js} +96 -90
  34. package/dist/chunks/dropdown-ncwhcd912vmone8k.js.map +1 -0
  35. package/dist/chunks/{empty-hrwtammqp0b2nvtf.js → empty-cj898km1r8xwuw44.js} +2 -2
  36. package/dist/chunks/{empty-hrwtammqp0b2nvtf.js.map → empty-cj898km1r8xwuw44.js.map} +1 -1
  37. package/dist/chunks/{field-csje72m7j9403fj5.js → field-krp6z6vfbkrvufz2.js} +3 -3
  38. package/dist/chunks/{field-csje72m7j9403fj5.js.map → field-krp6z6vfbkrvufz2.js.map} +1 -1
  39. package/dist/chunks/input-area-no30c09udyjxshu5.js +78 -0
  40. package/dist/chunks/input-area-no30c09udyjxshu5.js.map +1 -0
  41. package/dist/chunks/{input-group-cjsy8kh4vf9312xl.js → input-group-lxdd09p60cf27pe1.js} +26 -26
  42. package/dist/chunks/input-group-lxdd09p60cf27pe1.js.map +1 -0
  43. package/dist/chunks/{input-c8jmidy7gdqfiky1.js → input-h48k3uagzrgb98au.js} +40 -36
  44. package/dist/chunks/input-h48k3uagzrgb98au.js.map +1 -0
  45. package/dist/chunks/{label-i46xnnzdh9bsxk6a.js → label-latndvb1ngem7we8.js} +3 -3
  46. package/dist/chunks/{label-i46xnnzdh9bsxk6a.js.map → label-latndvb1ngem7we8.js.map} +1 -1
  47. package/dist/chunks/{layer-card-mu2w82x6ko1nhhtr.js → layer-card-l5yjvrxry1dhte57.js} +8 -8
  48. package/dist/chunks/{layer-card-mu2w82x6ko1nhhtr.js.map → layer-card-l5yjvrxry1dhte57.js.map} +1 -1
  49. package/dist/chunks/{link-o7yfj4kwgl19fklp.js → link-hn5ejal7nhh0o0b4.js} +2 -2
  50. package/dist/chunks/{link-o7yfj4kwgl19fklp.js.map → link-hn5ejal7nhh0o0b4.js.map} +1 -1
  51. package/dist/chunks/{loader-m5wfmqwgucrr4i5v.js → loader-hr2w7cpqeev3p3vl.js} +9 -6
  52. package/dist/chunks/loader-hr2w7cpqeev3p3vl.js.map +1 -0
  53. package/dist/chunks/{menubar-g1wqqjuyyfvsim83.js → menubar-f1pilzooe5mue7c4.js} +20 -20
  54. package/dist/chunks/menubar-f1pilzooe5mue7c4.js.map +1 -0
  55. package/dist/chunks/{meter-cqkrg5axjenbsuue.js → meter-gfa1hz9fhjnvx784.js} +2 -2
  56. package/dist/chunks/{meter-cqkrg5axjenbsuue.js.map → meter-gfa1hz9fhjnvx784.js.map} +1 -1
  57. package/dist/chunks/pagination-cu5lm6p5dxuycta4.js +243 -0
  58. package/dist/chunks/pagination-cu5lm6p5dxuycta4.js.map +1 -0
  59. package/dist/chunks/{popover-jurf834u2uywluux.js → popover-h300w4vit0s2ayej.js} +31 -28
  60. package/dist/chunks/popover-h300w4vit0s2ayej.js.map +1 -0
  61. package/dist/chunks/portal-provider-hwmkdmkpvct0cb76.js +18 -0
  62. package/dist/chunks/portal-provider-hwmkdmkpvct0cb76.js.map +1 -0
  63. package/dist/chunks/{radio-l9dzm6sohcvvrsdc.js → radio-jouttv89lbvhs55r.js} +47 -50
  64. package/dist/chunks/radio-jouttv89lbvhs55r.js.map +1 -0
  65. package/dist/chunks/select-kva5ru5f673kah1m.js +179 -0
  66. package/dist/chunks/select-kva5ru5f673kah1m.js.map +1 -0
  67. package/dist/chunks/{sensitive-input-lvtccf3iqc06lj7b.js → sensitive-input-hd4tpqkzifad1yca.js} +90 -84
  68. package/dist/chunks/sensitive-input-hd4tpqkzifad1yca.js.map +1 -0
  69. package/dist/chunks/{sidebar-l6rk9o5qf8k5vth1.js → sidebar-hljy3ssm8itc0ucx.js} +5 -5
  70. package/dist/chunks/sidebar-hljy3ssm8itc0ucx.js.map +1 -0
  71. package/dist/chunks/skeleton-line-epxenksfesr2fkcv.js +33 -0
  72. package/dist/chunks/skeleton-line-epxenksfesr2fkcv.js.map +1 -0
  73. package/dist/chunks/surface-cilvbyhmyujz1bee.js +36 -0
  74. package/dist/chunks/surface-cilvbyhmyujz1bee.js.map +1 -0
  75. package/dist/chunks/switch-ihaydbzem62bey4p.js +243 -0
  76. package/dist/chunks/switch-ihaydbzem62bey4p.js.map +1 -0
  77. package/dist/chunks/table-inweecadl3her7pd.js +183 -0
  78. package/dist/chunks/table-inweecadl3her7pd.js.map +1 -0
  79. package/dist/chunks/tabs-e7eh7l3mpk3xgmwq.js +92 -0
  80. package/dist/chunks/{tabs-n0t7iro7wr0pzgk2.js.map → tabs-e7eh7l3mpk3xgmwq.js.map} +1 -1
  81. package/dist/chunks/{text-gzt92mlji1lug13d.js → text-nmyi1rkwdj37f30f.js} +24 -22
  82. package/dist/chunks/text-nmyi1rkwdj37f30f.js.map +1 -0
  83. package/dist/chunks/{toast-r9ajsces7xp8l85w.js → toast-bpz6iaq54u9jmuu8.js} +62 -60
  84. package/dist/chunks/toast-bpz6iaq54u9jmuu8.js.map +1 -0
  85. package/dist/chunks/toml-nczb2z9n0o23o3ci.js +8 -0
  86. package/dist/chunks/toml-nczb2z9n0o23o3ci.js.map +1 -0
  87. package/dist/chunks/{tooltip-hnc71tg4gz2gpcvc.js → tooltip-belkznz8t8333h5f.js} +28 -21
  88. package/dist/chunks/tooltip-belkznz8t8333h5f.js.map +1 -0
  89. package/dist/chunks/{vendor-base-ui-ccr5l0ynrievzzv3.js → vendor-base-ui-k7bzesq81ie36nya.js} +55 -51
  90. package/dist/chunks/{vendor-base-ui-ccr5l0ynrievzzv3.js.map → vendor-base-ui-k7bzesq81ie36nya.js.map} +1 -1
  91. package/dist/code/server.js +10 -9
  92. package/dist/code/server.js.map +1 -1
  93. package/dist/code.js +3 -2
  94. package/dist/code.js.map +1 -1
  95. package/dist/components/badge.js +1 -1
  96. package/dist/components/banner.js +1 -1
  97. package/dist/components/breadcrumbs.js +1 -1
  98. package/dist/components/button.js +1 -1
  99. package/dist/components/chart.js +1 -1
  100. package/dist/components/checkbox.js +1 -1
  101. package/dist/components/clipboard-text.js +1 -1
  102. package/dist/components/code.js +1 -1
  103. package/dist/components/combobox.js +1 -1
  104. package/dist/components/command-palette.js +1 -1
  105. package/dist/components/dialog.js +1 -1
  106. package/dist/components/dropdown.js +1 -1
  107. package/dist/components/empty.js +1 -1
  108. package/dist/components/field.js +1 -1
  109. package/dist/components/flow.js +5 -4
  110. package/dist/components/flow.js.map +1 -1
  111. package/dist/components/input.js +3 -3
  112. package/dist/components/label.js +1 -1
  113. package/dist/components/layer-card.js +1 -1
  114. package/dist/components/link.js +1 -1
  115. package/dist/components/loader.js +2 -2
  116. package/dist/components/menubar.js +1 -1
  117. package/dist/components/meter.js +1 -1
  118. package/dist/components/pagination.js +1 -1
  119. package/dist/components/popover.js +1 -1
  120. package/dist/components/radio.js +1 -1
  121. package/dist/components/select.js +1 -1
  122. package/dist/components/sensitive-input.js +1 -1
  123. package/dist/components/sidebar.js +1 -1
  124. package/dist/components/surface.js +1 -1
  125. package/dist/components/switch.js +1 -1
  126. package/dist/components/table.js +1 -1
  127. package/dist/components/tabs.js +1 -1
  128. package/dist/components/text.js +1 -1
  129. package/dist/components/toast.js +2 -2
  130. package/dist/components/tooltip.js +1 -1
  131. package/dist/index.js +76 -74
  132. package/dist/index.js.map +1 -1
  133. package/dist/primitives/accordion.js +1 -1
  134. package/dist/primitives/alert-dialog.js +1 -1
  135. package/dist/primitives/autocomplete.js +1 -1
  136. package/dist/primitives/avatar.js +1 -1
  137. package/dist/primitives/button.js +1 -1
  138. package/dist/primitives/checkbox-group.js +1 -1
  139. package/dist/primitives/checkbox.js +1 -1
  140. package/dist/primitives/collapsible.js +1 -1
  141. package/dist/primitives/combobox.js +1 -1
  142. package/dist/primitives/context-menu.js +1 -1
  143. package/dist/primitives/csp-provider.js +1 -1
  144. package/dist/primitives/dialog.js +1 -1
  145. package/dist/primitives/direction-provider.js +1 -1
  146. package/dist/primitives/drawer.js +1 -1
  147. package/dist/primitives/field.js +1 -1
  148. package/dist/primitives/fieldset.js +1 -1
  149. package/dist/primitives/form.js +1 -1
  150. package/dist/primitives/input.js +1 -1
  151. package/dist/primitives/menu.js +1 -1
  152. package/dist/primitives/menubar.js +1 -1
  153. package/dist/primitives/meter.js +1 -1
  154. package/dist/primitives/navigation-menu.js +1 -1
  155. package/dist/primitives/number-field.js +1 -1
  156. package/dist/primitives/popover.js +1 -1
  157. package/dist/primitives/preview-card.js +1 -1
  158. package/dist/primitives/progress.js +1 -1
  159. package/dist/primitives/radio-group.js +1 -1
  160. package/dist/primitives/radio.js +1 -1
  161. package/dist/primitives/scroll-area.js +1 -1
  162. package/dist/primitives/select.js +1 -1
  163. package/dist/primitives/separator.js +1 -1
  164. package/dist/primitives/slider.js +1 -1
  165. package/dist/primitives/switch.js +1 -1
  166. package/dist/primitives/tabs.js +1 -1
  167. package/dist/primitives/toast.js +1 -1
  168. package/dist/primitives/toggle-group.js +1 -1
  169. package/dist/primitives/toggle.js +1 -1
  170. package/dist/primitives/toolbar.js +1 -1
  171. package/dist/primitives/tooltip.js +1 -1
  172. package/dist/primitives.js +1 -1
  173. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  174. package/dist/scripts/theme-generator/config.js +226 -43
  175. package/dist/scripts/theme-generator/config.js.map +1 -1
  176. package/dist/src/code/provider.d.ts.map +1 -1
  177. package/dist/src/code/server.d.ts.map +1 -1
  178. package/dist/src/code/types.d.ts +1 -1
  179. package/dist/src/code/types.d.ts.map +1 -1
  180. package/dist/src/components/badge/badge.d.ts +76 -21
  181. package/dist/src/components/badge/badge.d.ts.map +1 -1
  182. package/dist/src/components/banner/banner.d.ts +5 -3
  183. package/dist/src/components/banner/banner.d.ts.map +1 -1
  184. package/dist/src/components/button/button.d.ts +4 -2
  185. package/dist/src/components/button/button.d.ts.map +1 -1
  186. package/dist/src/components/chart/TimeseriesChart.d.ts.map +1 -1
  187. package/dist/src/components/checkbox/checkbox.d.ts +1 -1
  188. package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
  189. package/dist/src/components/clipboard-text/clipboard-text.d.ts +2 -0
  190. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  191. package/dist/src/components/code/code.d.ts.map +1 -1
  192. package/dist/src/components/combobox/combobox.d.ts +8 -1
  193. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  194. package/dist/src/components/command-palette/command-palette.d.ts +9 -2
  195. package/dist/src/components/command-palette/command-palette.d.ts.map +1 -1
  196. package/dist/src/components/command-palette/types.d.ts +7 -0
  197. package/dist/src/components/command-palette/types.d.ts.map +1 -1
  198. package/dist/src/components/dialog/dialog.d.ts +8 -1
  199. package/dist/src/components/dialog/dialog.d.ts.map +1 -1
  200. package/dist/src/components/dropdown/dropdown.d.ts +17 -2
  201. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  202. package/dist/src/components/flow/diagram.d.ts.map +1 -1
  203. package/dist/src/components/input/input-area.d.ts.map +1 -1
  204. package/dist/src/components/input/input.d.ts +1 -2
  205. package/dist/src/components/input/input.d.ts.map +1 -1
  206. package/dist/src/components/loader/loader.d.ts +7 -1
  207. package/dist/src/components/loader/loader.d.ts.map +1 -1
  208. package/dist/src/components/loader/skeleton-line.d.ts +2 -1
  209. package/dist/src/components/loader/skeleton-line.d.ts.map +1 -1
  210. package/dist/src/components/pagination/pagination.d.ts +11 -1
  211. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  212. package/dist/src/components/popover/popover.d.ts +8 -1
  213. package/dist/src/components/popover/popover.d.ts.map +1 -1
  214. package/dist/src/components/radio/radio.d.ts +1 -1
  215. package/dist/src/components/radio/radio.d.ts.map +1 -1
  216. package/dist/src/components/select/select.d.ts +74 -3
  217. package/dist/src/components/select/select.d.ts.map +1 -1
  218. package/dist/src/components/sensitive-input/sensitive-input.d.ts +1 -1
  219. package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -1
  220. package/dist/src/components/surface/surface.d.ts +23 -23
  221. package/dist/src/components/surface/surface.d.ts.map +1 -1
  222. package/dist/src/components/switch/switch.d.ts.map +1 -1
  223. package/dist/src/components/table/table.d.ts +34 -2
  224. package/dist/src/components/table/table.d.ts.map +1 -1
  225. package/dist/src/components/tabs/tabs.d.ts.map +1 -1
  226. package/dist/src/components/text/text.d.ts +5 -0
  227. package/dist/src/components/text/text.d.ts.map +1 -1
  228. package/dist/src/components/toast/toast.d.ts +16 -9
  229. package/dist/src/components/toast/toast.d.ts.map +1 -1
  230. package/dist/src/components/tooltip/tooltip.d.ts +21 -6
  231. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  232. package/dist/src/index.d.ts +1 -0
  233. package/dist/src/index.d.ts.map +1 -1
  234. package/dist/src/utils/index.d.ts +1 -0
  235. package/dist/src/utils/index.d.ts.map +1 -1
  236. package/dist/src/utils/portal-provider.d.ts +56 -0
  237. package/dist/src/utils/portal-provider.d.ts.map +1 -0
  238. package/dist/styles/kumo-binding.css +52 -46
  239. package/dist/styles/kumo-standalone.css +1 -1
  240. package/dist/styles/theme-fedramp.css +6 -6
  241. package/dist/styles/theme-kumo.css +183 -64
  242. package/dist/utils.js +8 -6
  243. package/dist/utils.js.map +1 -1
  244. package/package.json +2 -2
  245. package/scripts/component-registry/index.test.ts +4 -4
  246. package/scripts/component-registry/metadata.ts +3 -3
  247. package/scripts/theme-generator/config.ts +236 -43
  248. package/dist/chunks/Legend-bov5dqf08wemc2qj.js.map +0 -1
  249. package/dist/chunks/badge-mrshucy2530o70cq.js +0 -56
  250. package/dist/chunks/badge-mrshucy2530o70cq.js.map +0 -1
  251. package/dist/chunks/banner-vzdjbqsb6em7tmdk.js +0 -75
  252. package/dist/chunks/banner-vzdjbqsb6em7tmdk.js.map +0 -1
  253. package/dist/chunks/button-j0hi0afn33w9lxgi.js.map +0 -1
  254. package/dist/chunks/checkbox-lawmt1894wr6rpgi.js.map +0 -1
  255. package/dist/chunks/clipboard-text-ohx8kkpxisz382rj.js.map +0 -1
  256. package/dist/chunks/code-liq1g6f5lhee305d.js.map +0 -1
  257. package/dist/chunks/combobox-ft0u7rfaxawk0r0c.js.map +0 -1
  258. package/dist/chunks/command-palette-b31nq4wk7o7gx4sa.js.map +0 -1
  259. package/dist/chunks/dialog-l5tmwxrzp9g83jmw.js.map +0 -1
  260. package/dist/chunks/dropdown-icy3xatdwhzr4une.js.map +0 -1
  261. package/dist/chunks/input-area-jko15sbc6zeage3l.js +0 -74
  262. package/dist/chunks/input-area-jko15sbc6zeage3l.js.map +0 -1
  263. package/dist/chunks/input-c8jmidy7gdqfiky1.js.map +0 -1
  264. package/dist/chunks/input-group-cjsy8kh4vf9312xl.js.map +0 -1
  265. package/dist/chunks/loader-m5wfmqwgucrr4i5v.js.map +0 -1
  266. package/dist/chunks/menubar-g1wqqjuyyfvsim83.js.map +0 -1
  267. package/dist/chunks/pagination-e3dp8bd80s35f7sd.js +0 -224
  268. package/dist/chunks/pagination-e3dp8bd80s35f7sd.js.map +0 -1
  269. package/dist/chunks/popover-jurf834u2uywluux.js.map +0 -1
  270. package/dist/chunks/radio-l9dzm6sohcvvrsdc.js.map +0 -1
  271. package/dist/chunks/select-hnt87e3cfos48qql.js +0 -130
  272. package/dist/chunks/select-hnt87e3cfos48qql.js.map +0 -1
  273. package/dist/chunks/sensitive-input-lvtccf3iqc06lj7b.js.map +0 -1
  274. package/dist/chunks/sidebar-l6rk9o5qf8k5vth1.js.map +0 -1
  275. package/dist/chunks/skeleton-line-1j5exu6vv07mmhfb.js +0 -28
  276. package/dist/chunks/skeleton-line-1j5exu6vv07mmhfb.js.map +0 -1
  277. package/dist/chunks/surface-dhshylwccuaz91d1.js +0 -21
  278. package/dist/chunks/surface-dhshylwccuaz91d1.js.map +0 -1
  279. package/dist/chunks/switch-fukrbip86khvqjn7.js +0 -241
  280. package/dist/chunks/switch-fukrbip86khvqjn7.js.map +0 -1
  281. package/dist/chunks/table-orfgzwvxh8yr90dk.js +0 -155
  282. package/dist/chunks/table-orfgzwvxh8yr90dk.js.map +0 -1
  283. package/dist/chunks/tabs-n0t7iro7wr0pzgk2.js +0 -86
  284. package/dist/chunks/text-gzt92mlji1lug13d.js.map +0 -1
  285. package/dist/chunks/toast-r9ajsces7xp8l85w.js.map +0 -1
  286. package/dist/chunks/tooltip-hnc71tg4gz2gpcvc.js.map +0 -1
@@ -11,30 +11,63 @@
11
11
  "variant": {
12
12
  "type": "enum",
13
13
  "optional": true,
14
- "description": "Visual style of the badge.\n- `\"primary\"` — High-emphasis badge for important labels\n- `\"secondary\"` — Subtle badge for secondary information\n- `\"destructive\"` — Error or danger state indicator\n- `\"outline\"` — Bordered badge with transparent background\n- `\"beta\"` — Dashed-border badge for beta/experimental features",
14
+ "description": "Color variant of the badge. Recommended semantic variants:\n- `\"primary\"` — Primary badge\n- `\"secondary\"` — Secondary badge\n- `\"error\"` Error badge\n- `\"warning\"` — Warning badge\n- `\"success\"` Success badge\n- `\"info\"` — Info badge\n\nAdditional token variants:\n- `\"red\"`, `\"orange\"`, `\"green\"`, `\"teal\"`, `\"blue\"`, `\"purple\"`, `\"neutral\"`\n- `\"teal-subtle\"`, `\"neutral-subtle\"`\n- `\"inverted\"`\n- `\"outline\"` — Bordered badge with transparent background\n- `\"beta\"` — Dashed-border badge for beta/experimental features",
15
15
  "values": [
16
16
  "primary",
17
17
  "secondary",
18
- "destructive",
18
+ "error",
19
+ "warning",
19
20
  "success",
21
+ "destructive",
22
+ "info",
23
+ "beta",
20
24
  "outline",
21
- "beta"
25
+ "red",
26
+ "green",
27
+ "neutral",
28
+ "orange",
29
+ "purple",
30
+ "teal",
31
+ "teal-subtle",
32
+ "blue"
22
33
  ],
23
34
  "descriptions": {
24
- "primary": "Default high-emphasis badge for important labels",
25
- "secondary": "Subtle badge for secondary information",
26
- "destructive": "Error or danger state indicator",
27
- "success": "Success or positive state indicator",
35
+ "primary": "Primary badge",
36
+ "secondary": "Secondary badge",
37
+ "error": "Error badge",
38
+ "warning": "Warning badge",
39
+ "success": "Success badge",
40
+ "destructive": "Deprecated. Use red instead.",
41
+ "info": "Info badge",
42
+ "beta": "Indicates beta or experimental features",
28
43
  "outline": "Bordered badge with transparent background",
29
- "beta": "Indicates beta or experimental features"
44
+ "red": "Red badge",
45
+ "green": "Green badge",
46
+ "neutral": "Neutral badge",
47
+ "orange": "Orange badge",
48
+ "purple": "Purple badge",
49
+ "teal": "Teal badge",
50
+ "teal-subtle": "Subtle teal badge",
51
+ "blue": "Blue badge"
30
52
  },
31
53
  "classes": {
32
- "primary": "bg-kumo-contrast text-kumo-inverse",
33
- "secondary": "bg-kumo-fill text-kumo-default",
34
- "destructive": "bg-kumo-danger text-white",
35
- "success": "bg-kumo-success text-white",
54
+ "primary": "bg-kumo-badge-inverted text-kumo-badge-inverted",
55
+ "secondary": "bg-kumo-fill text-kumo-badge-neutral-subtle",
56
+ "error": "bg-kumo-danger-tint/60 text-kumo-danger",
57
+ "warning": "bg-kumo-warning-tint/70 text-kumo-warning",
58
+ "success": "bg-kumo-success-tint/70 text-kumo-success",
59
+ "destructive": "bg-kumo-badge-red text-white",
60
+ "info": "bg-kumo-info-tint/70 text-kumo-info",
61
+ "beta": "border border-dashed border-kumo-brand bg-transparent text-kumo-link",
36
62
  "outline": "border border-kumo-fill bg-transparent text-kumo-default",
37
- "beta": "border border-dashed border-kumo-brand bg-transparent text-kumo-link"
63
+ "red": "bg-kumo-badge-red text-white",
64
+ "green": "bg-kumo-badge-green text-white",
65
+ "neutral": "bg-kumo-badge-neutral text-white",
66
+ "orange": "bg-kumo-badge-orange text-black",
67
+ "purple": "bg-kumo-badge-purple text-white",
68
+ "teal": "bg-kumo-badge-teal text-white",
69
+ "teal-subtle": "bg-kumo-badge-teal-subtle text-kumo-badge-teal-subtle",
70
+ "blue": "bg-kumo-badge-blue text-white"
38
71
  },
39
72
  "default": "primary"
40
73
  },
@@ -50,25 +83,36 @@
50
83
  }
51
84
  },
52
85
  "examples": [
53
- "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"primary\">Primary</Badge>\n <Badge variant=\"secondary\">Secondary</Badge>\n <Badge variant=\"destructive\">Destructive</Badge>\n <Badge variant=\"success\">Success</Badge>\n <Badge variant=\"outline\">Outline</Badge>\n <Badge variant=\"beta\">Beta</Badge>\n </div>",
54
- "<Badge variant=\"primary\">Primary</Badge>",
55
- "<Badge variant=\"secondary\">Secondary</Badge>",
56
- "<Badge variant=\"destructive\">Destructive</Badge>",
57
- "<Badge variant=\"success\">Success</Badge>",
58
- "<Badge variant=\"outline\">Outline</Badge>",
59
- "<Badge variant=\"beta\">Beta</Badge>",
60
- "<p className=\"flex items-center gap-2\">\n Workers\n <Badge variant=\"beta\">Beta</Badge>\n </p>"
86
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"primary\">Primary</Badge>\n <Badge variant=\"secondary\">Secondary</Badge>\n <Badge variant=\"error\">Error</Badge>\n <Badge variant=\"success\">Success</Badge>\n <Badge variant=\"warning\">Warning</Badge>\n <Badge variant=\"info\">Info</Badge>\n <Badge variant=\"outline\">Outline</Badge>\n <Badge variant=\"beta\">Beta</Badge>\n </div>",
87
+ "<div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"neutral\">Neutral</Badge>\n <Badge variant=\"red\">Red</Badge>\n <Badge variant=\"orange\">Orange</Badge>\n <Badge variant=\"green\">Green</Badge>\n <Badge variant=\"teal\">Teal</Badge>\n <Badge variant=\"blue\">Blue</Badge>\n <Badge variant=\"purple\">Purple</Badge>\n </div>",
88
+ "<p className=\"flex items-center gap-2\">\n Workers\n <Badge variant=\"secondary\">New</Badge>\n </p>"
61
89
  ],
62
90
  "colors": [
63
- "bg-kumo-contrast",
64
- "bg-kumo-danger",
91
+ "bg-kumo-badge-blue",
92
+ "bg-kumo-badge-green",
93
+ "bg-kumo-badge-inverted",
94
+ "bg-kumo-badge-neutral",
95
+ "bg-kumo-badge-orange",
96
+ "bg-kumo-badge-purple",
97
+ "bg-kumo-badge-red",
98
+ "bg-kumo-badge-teal",
99
+ "bg-kumo-badge-teal-subtle",
100
+ "bg-kumo-danger-tint",
65
101
  "bg-kumo-fill",
66
- "bg-kumo-success",
102
+ "bg-kumo-info-tint",
103
+ "bg-kumo-success-tint",
104
+ "bg-kumo-warning-tint",
67
105
  "border-kumo-brand",
68
106
  "border-kumo-fill",
107
+ "text-kumo-badge-inverted",
108
+ "text-kumo-badge-neutral-subtle",
109
+ "text-kumo-badge-teal-subtle",
110
+ "text-kumo-danger",
69
111
  "text-kumo-default",
70
- "text-kumo-inverse",
71
- "text-kumo-link"
112
+ "text-kumo-info",
113
+ "text-kumo-link",
114
+ "text-kumo-success",
115
+ "text-kumo-warning"
72
116
  ],
73
117
  "baseStyles": "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"
74
118
  },
@@ -94,6 +138,11 @@
94
138
  "optional": true,
95
139
  "description": "Secondary description text displayed below the title. Use for i18n string injection."
96
140
  },
141
+ "action": {
142
+ "type": "ReactNode",
143
+ "optional": true,
144
+ "description": "Action slot rendered at the trailing end of the banner (e.g. a CTA button or link). Only used in structured mode (with `title` or `description`)."
145
+ },
97
146
  "text": {
98
147
  "type": "string",
99
148
  "optional": true
@@ -117,9 +166,9 @@
117
166
  "error": "Error banner for critical issues"
118
167
  },
119
168
  "classes": {
120
- "default": "bg-kumo-info/10 border-kumo-info/30 text-kumo-info selection:bg-kumo-info-tint",
121
- "alert": "bg-kumo-warning/10 border-kumo-warning/30 text-kumo-warning selection:bg-kumo-warning-tint",
122
- "error": "bg-kumo-danger/10 border-kumo-danger/30 text-kumo-danger selection:bg-kumo-danger-tint"
169
+ "default": "bg-kumo-info-tint/30 border-kumo-info/50 text-kumo-info selection:bg-kumo-info",
170
+ "alert": "bg-kumo-warning-tint/15 border-kumo-warning/50 text-kumo-warning selection:bg-kumo-warning",
171
+ "error": "bg-kumo-danger-tint/15 border-kumo-danger/50 text-kumo-danger selection:bg-kumo-danger"
123
172
  },
124
173
  "default": "default"
125
174
  },
@@ -130,13 +179,15 @@
130
179
  }
131
180
  },
132
181
  "examples": [
133
- "<div className=\"space-y-3\">\n <Banner\n icon={<Info weight=\"fill\" />}\n title=\"Update available\"\n description=\"A new version is ready to install.\"\n />\n <Banner\n icon={<Warning weight=\"fill\" />}\n variant=\"alert\"\n title=\"Session expiring\"\n description=\"Your session will expire in 5 minutes.\"\n />\n <Banner\n icon={<WarningCircle weight=\"fill\" />}\n variant=\"error\"\n title=\"Save failed\"\n description=\"We couldn't save your changes. Please try again.\"\n />\n </div>",
182
+ "<div className=\"w-full space-y-3\">\n <Banner\n icon={<Info weight=\"fill\" />}\n title=\"Update available\"\n description=\"A new version is ready to install.\"\n />\n <Banner\n icon={<Warning weight=\"fill\" />}\n variant=\"alert\"\n title=\"Session expiring\"\n description=\"Your session will expire in 5 minutes.\"\n />\n <Banner\n icon={<WarningCircle weight=\"fill\" />}\n variant=\"error\"\n title=\"Save failed\"\n description=\"We couldn't save your changes. Please try again.\"\n />\n </div>",
134
183
  "<Banner\n icon={<Info weight=\"fill\" />}\n title=\"Update available\"\n description=\"A new version is ready to install.\"\n />",
135
184
  "<Banner\n icon={<Warning weight=\"fill\" />}\n variant=\"alert\"\n title=\"Session expiring\"\n description=\"Your session will expire in 5 minutes.\"\n />",
136
185
  "<Banner\n icon={<WarningCircle weight=\"fill\" />}\n variant=\"error\"\n title=\"Save failed\"\n description=\"We couldn't save your changes. Please try again.\"\n />",
137
186
  "<Banner\n icon={<Info weight=\"fill\" />}\n title=\"Your changes have been saved.\"\n />",
138
187
  "<Banner\n icon={<Warning weight=\"fill\" />}\n variant=\"alert\"\n title=\"Review required\"\n description=\"Please review your billing information before proceeding.\"\n />",
139
188
  "<Banner\n icon={<Info weight=\"fill\" />}\n title=\"Custom content supported\"\n description={\n <Text DANGEROUS_className=\"text-inherit\">\n This banner supports <strong>custom content</strong> with Text.\n </Text>\n }\n />",
189
+ "<div className=\"w-full space-y-3\">\n <Banner\n icon={<Info weight=\"fill\" />}\n title=\"Update available\"\n description=\"A new version is ready to install.\"\n action={<Button size=\"sm\">Update now</Button>}\n />\n <Banner\n icon={<Info weight=\"fill\" />}\n title=\"Update available\"\n description=\"A new version is ready to install.\"\n action={\n <Button\n size=\"sm\"\n variant=\"ghost\"\n shape=\"square\"\n icon={X}\n aria-label=\"Dismiss\"\n />\n }\n />\n </div>",
190
+ "<Banner\n icon={<Warning weight=\"fill\" />}\n variant=\"alert\"\n title=\"Session expiring\"\n description=\"Your session will expire in 5 minutes.\"\n action={\n <>\n <Button size=\"sm\" variant=\"secondary\">\n Dismiss\n </Button>\n <Button size=\"sm\">Extend session</Button>\n </>\n }\n />",
140
191
  "<Banner icon={<Info />}>This is a simple banner using children.</Banner>"
141
192
  ],
142
193
  "colors": [
@@ -318,11 +369,11 @@
318
369
  },
319
370
  "classes": {
320
371
  "primary": "bg-kumo-brand !text-white hover:bg-kumo-brand-hover focus:bg-kumo-brand-hover disabled:bg-kumo-brand/50",
321
- "secondary": "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",
372
+ "secondary": "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-hairline data-[state=open]:bg-kumo-base",
322
373
  "ghost": "text-kumo-default hover:bg-kumo-tint shadow-none bg-inherit",
323
374
  "destructive": "bg-kumo-danger !text-white hover:bg-kumo-danger/70",
324
375
  "secondary-destructive": "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",
325
- "outline": "bg-transparent text-kumo-default ring ring-kumo-ring"
376
+ "outline": "bg-transparent text-kumo-default ring ring-kumo-hairline"
326
377
  },
327
378
  "stateClasses": {
328
379
  "primary": {
@@ -367,15 +418,15 @@
367
418
  "optional": true,
368
419
  "description": "Shows a loading spinner and disables interaction."
369
420
  },
370
- "id": {
421
+ "title": {
371
422
  "type": "string",
372
423
  "optional": true
373
424
  },
374
- "lang": {
425
+ "id": {
375
426
  "type": "string",
376
427
  "optional": true
377
428
  },
378
- "title": {
429
+ "lang": {
379
430
  "type": "string",
380
431
  "optional": true
381
432
  },
@@ -413,7 +464,9 @@
413
464
  "<Button variant=\"secondary\" icon={PlusIcon}>\n Create Worker\n </Button>",
414
465
  "<div className=\"flex flex-wrap items-center gap-3\">\n <Button\n variant=\"secondary\"\n shape=\"square\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n />\n <Button\n variant=\"secondary\"\n shape=\"circle\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n />\n </div>",
415
466
  "<Button variant=\"primary\" loading>\n Loading...\n </Button>",
416
- "<Button variant=\"secondary\" disabled>\n Disabled\n </Button>"
467
+ "<Button variant=\"secondary\" disabled>\n Disabled\n </Button>",
468
+ "<Button variant=\"secondary\">Click me</Button>",
469
+ "<div className=\"flex flex-wrap items-center gap-3\">\n <Button variant=\"secondary\" title=\"Create a new Worker\">\n Create Worker\n </Button>\n <Button\n variant=\"secondary\"\n shape=\"square\"\n icon={PlusIcon}\n aria-label=\"Add item\"\n title=\"Add item\"\n />\n </div>"
417
470
  ],
418
471
  "colors": [
419
472
  "bg-kumo-base",
@@ -421,8 +474,8 @@
421
474
  "bg-kumo-brand-hover",
422
475
  "bg-kumo-danger",
423
476
  "bg-kumo-tint",
477
+ "ring-kumo-hairline",
424
478
  "ring-kumo-line",
425
- "ring-kumo-ring",
426
479
  "text-kumo-danger",
427
480
  "text-kumo-default",
428
481
  "text-kumo-subtle"
@@ -448,13 +501,13 @@
448
501
  "error": "Error state for validation failures"
449
502
  },
450
503
  "classes": {
451
- "default": "[&:focus-within>span]:ring-kumo-ring [&:hover>span]:ring-kumo-ring",
504
+ "default": "[&:focus-within>span]:ring-kumo-hairline [&:hover>span]:ring-kumo-hairline",
452
505
  "error": "[&>span]:ring-kumo-danger"
453
506
  },
454
507
  "stateClasses": {
455
508
  "default": {
456
- "focus": "[&:focus-within>span]:ring-kumo-ring",
457
- "hover": "[&:hover>span]:ring-kumo-ring"
509
+ "focus": "[&:focus-within>span]:ring-kumo-hairline",
510
+ "hover": "[&:hover>span]:ring-kumo-hairline"
458
511
  }
459
512
  },
460
513
  "default": "default"
@@ -523,11 +576,10 @@
523
576
  "colors": [
524
577
  "bg-kumo-base",
525
578
  "bg-kumo-contrast",
526
- "border-kumo-line",
527
579
  "ring-kumo-contrast",
528
580
  "ring-kumo-danger",
581
+ "ring-kumo-hairline",
529
582
  "ring-kumo-line",
530
- "ring-kumo-ring",
531
583
  "text-kumo-danger",
532
584
  "text-kumo-default",
533
585
  "text-kumo-inverse",
@@ -602,10 +654,10 @@
602
654
  "ring-kumo-danger"
603
655
  ],
604
656
  "hover": [
605
- "ring-kumo-ring"
657
+ "ring-kumo-hairline"
606
658
  ],
607
659
  "focus": [
608
- "ring-kumo-ring"
660
+ "ring-kumo-hairline"
609
661
  ],
610
662
  "disabled": [
611
663
  "opacity-50",
@@ -659,6 +711,11 @@
659
711
  "required": true,
660
712
  "description": "The text to display and copy to clipboard."
661
713
  },
714
+ "textToCopy": {
715
+ "type": "string",
716
+ "optional": true,
717
+ "description": "If provided, this text will be copied to clipboard instead of the `text` prop."
718
+ },
662
719
  "className": {
663
720
  "type": "string",
664
721
  "optional": true,
@@ -679,6 +736,7 @@
679
736
  "<ClipboardText text=\"0c239dd2\" />",
680
737
  "<ClipboardText text=\"abc123\" />",
681
738
  "<ClipboardText text=\"sk_live_51H8...\" />",
739
+ "<ClipboardText\n text=\"sk_live_***********\"\n textToCopy=\"sk_live_51H8_abc123\"\n />",
682
740
  "<ClipboardText text=\"https://example.com/very/long/url/path\" />",
683
741
  "<ClipboardText\n text=\"npx kumo add button\"\n tooltip={{ text: \"Copy\", copiedText: \"Copied!\", side: \"top\" }}\n />"
684
742
  ],
@@ -2119,6 +2177,7 @@
2119
2177
  "<Combobox\n value={value}\n onValueChange={(v) => setValue(v as ServerLocation | null)}\n items={servers}\n >\n <Combobox.TriggerInput\n className=\"w-[200px]\"\n placeholder=\"Select server\"\n />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(group: ServerLocationGroup) => (\n <Combobox.Group key={group.value} items={group.items}>\n <Combobox.GroupLabel>{group.value}</Combobox.GroupLabel>\n <Combobox.Collection>\n {(item: ServerLocation) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.Collection>\n </Combobox.Group>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>",
2120
2178
  "<div className=\"flex gap-2\">\n <Combobox\n value={value}\n onValueChange={setValue}\n items={bots}\n isItemEqualToValue={(bot: BotItem, selected: BotItem) =>\n bot.value === selected.value\n }\n multiple\n >\n <Combobox.TriggerMultipleWithInput\n className=\"w-[400px]\"\n placeholder=\"Select bots\"\n renderItem={(selected: BotItem) => (\n <Combobox.Chip key={selected.value}>{selected.label}</Combobox.Chip>\n )}\n inputSide=\"right\"\n />\n <Combobox.Content className=\"max-h-[200px] min-w-auto overflow-y-auto\">\n <Combobox.Empty />\n <Combobox.List>\n {(item: BotItem) => (\n <Combobox.Item key={item.value} value={item}>\n <div className=\"flex gap-2\">\n <Text>{item.label}</Text>\n <Text variant=\"secondary\">{item.author}</Text>\n </div>\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <Button variant=\"primary\">Submit</Button>\n </div>",
2121
2179
  "<div className=\"w-80\">\n <Combobox\n items={databases}\n value={value}\n onValueChange={setValue}\n label=\"Database\"\n description=\"Select your preferred database\"\n >\n <Combobox.TriggerInput placeholder=\"Select database\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: DatabaseItem) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>",
2180
+ "<div className=\"flex flex-wrap gap-4 items-start\">\n <Combobox value=\"Apple\" items={fruits} disabled>\n <Combobox.TriggerInput\n className=\"w-[200px]\"\n placeholder=\"Select fruit\"\n />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: string) => (\n <Combobox.Item key={item} value={item}>\n {item}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n\n <Combobox value={languages[0]} items={languages} disabled>\n <Combobox.TriggerValue className=\"w-[200px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>",
2122
2181
  "<div className=\"w-80\">\n <Combobox\n items={databases}\n value={value}\n onValueChange={setValue}\n label=\"Database\"\n error={{ message: \"Please select a database\", match: true }}\n >\n <Combobox.TriggerInput placeholder=\"Select database\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: DatabaseItem) => (\n <Combobox.Item key={item.value} value={item}>\n {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>",
2123
2182
  "<div className=\"flex flex-wrap items-center gap-4\">\n <Combobox\n size=\"sm\"\n value={smValue}\n onValueChange={(v) => setSmValue(v as string | null)}\n items={fruits.slice(0, 8)}\n >\n <Combobox.TriggerInput placeholder=\"Small (sm)\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: string) => (\n <Combobox.Item key={item} value={item}>\n {item}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <Combobox\n size=\"base\"\n value={baseValue}\n onValueChange={(v) => setBaseValue(v as string | null)}\n items={fruits.slice(0, 8)}\n >\n <Combobox.TriggerInput placeholder=\"Base (default)\" />\n <Combobox.Content>\n <Combobox.Empty />\n <Combobox.List>\n {(item: string) => (\n <Combobox.Item key={item} value={item}>\n {item}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>",
2124
2183
  "<div className=\"flex flex-wrap items-center gap-4\">\n <Combobox\n size=\"sm\"\n value={smValue}\n onValueChange={(v) => setSmValue(v as Language)}\n items={languages}\n >\n <Combobox.TriggerValue className=\"w-[160px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <Combobox\n size=\"base\"\n value={baseValue}\n onValueChange={(v) => setBaseValue(v as Language)}\n items={languages}\n >\n <Combobox.TriggerValue className=\"w-[180px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>"
@@ -2158,6 +2217,10 @@
2158
2217
  "sideOffset": {
2159
2218
  "type": "ComboboxBase.Positioner.Props[\"sideOffset\"]",
2160
2219
  "optional": true
2220
+ },
2221
+ "container": {
2222
+ "type": "PortalContainer",
2223
+ "optional": true
2161
2224
  }
2162
2225
  }
2163
2226
  },
@@ -2245,6 +2308,11 @@
2245
2308
  "type": "ReactNode",
2246
2309
  "optional": true,
2247
2310
  "description": "Child content - typically one or more Panel components"
2311
+ },
2312
+ "container": {
2313
+ "type": "PortalContainer",
2314
+ "optional": true,
2315
+ "description": "Container element for the portal. Use this to render the command palette inside a Shadow DOM or custom container. Overrides `KumoPortalProvider` context."
2248
2316
  }
2249
2317
  },
2250
2318
  "examples": [
@@ -2432,6 +2500,11 @@
2432
2500
  "optional": true,
2433
2501
  "description": "Dialog content (typically Title, Description, Close, and action buttons)."
2434
2502
  },
2503
+ "container": {
2504
+ "type": "PortalContainer",
2505
+ "optional": true,
2506
+ "description": "Container element for the portal. Use this to render the dialog inside a Shadow DOM or custom container. Overrides `KumoPortalProvider` context."
2507
+ },
2435
2508
  "size": {
2436
2509
  "type": "enum",
2437
2510
  "optional": true,
@@ -2468,6 +2541,7 @@
2468
2541
  ],
2469
2542
  "colors": [
2470
2543
  "bg-kumo-base",
2544
+ "bg-kumo-recessed",
2471
2545
  "text-kumo-default"
2472
2546
  ],
2473
2547
  "subComponents": {
@@ -2997,12 +3071,12 @@
2997
3071
  "error": "Error state for validation failures"
2998
3072
  },
2999
3073
  "classes": {
3000
- "default": "focus:ring-kumo-ring",
3074
+ "default": "focus:ring-kumo-hairline",
3001
3075
  "error": "!ring-kumo-danger focus:ring-kumo-danger"
3002
3076
  },
3003
3077
  "stateClasses": {
3004
3078
  "default": {
3005
- "focus": "focus:ring-kumo-ring"
3079
+ "focus": "focus:ring-kumo-hairline"
3006
3080
  },
3007
3081
  "error": {
3008
3082
  "focus": "focus:ring-kumo-danger"
@@ -3014,8 +3088,8 @@
3014
3088
  "examples": [
3015
3089
  "<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n description=\"We'll never share your email\"\n />",
3016
3090
  "<Input\n label=\"Username\"\n placeholder=\"Choose a username\"\n description=\"3-20 characters, alphanumeric only\"\n />",
3017
- "<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n value=\"invalid-email\"\n variant=\"error\"\n error=\"Please enter a valid email address\"\n />",
3018
- "<Input\n label=\"Password\"\n type=\"password\"\n value=\"short\"\n variant=\"error\"\n error={{\n message: \"Password must be at least 8 characters\",\n match: \"tooShort\",\n }}\n minLength={8}\n />",
3091
+ "<Input\n label=\"Email\"\n placeholder=\"you@example.com\"\n value=\"invalid-email\"\n error=\"Please enter a valid email address\"\n />",
3092
+ "<Input\n label=\"Password\"\n type=\"password\"\n value=\"short\"\n error={{\n message: \"Password must be at least 8 characters\",\n match: \"tooShort\",\n }}\n minLength={8}\n />",
3019
3093
  "<div className=\"flex flex-col gap-4\">\n <Input size=\"xs\" label=\"Extra Small\" placeholder=\"Extra small input\" />\n <Input size=\"sm\" label=\"Small\" placeholder=\"Small input\" />\n <Input label=\"Base\" placeholder=\"Base input (default)\" />\n <Input size=\"lg\" label=\"Large\" placeholder=\"Large input\" />\n </div>",
3020
3094
  "<Input label=\"Disabled field\" placeholder=\"Cannot edit\" disabled />",
3021
3095
  "<Input placeholder=\"Search...\" aria-label=\"Search products\" />",
@@ -3027,8 +3101,8 @@
3027
3101
  "colors": [
3028
3102
  "bg-kumo-control",
3029
3103
  "ring-kumo-danger",
3104
+ "ring-kumo-hairline",
3030
3105
  "ring-kumo-line",
3031
- "ring-kumo-ring",
3032
3106
  "text-kumo-default",
3033
3107
  "text-kumo-subtle"
3034
3108
  ],
@@ -3159,7 +3233,6 @@
3159
3233
  "colors": [
3160
3234
  "bg-kumo-base",
3161
3235
  "bg-kumo-elevated",
3162
- "bg-kumo-recessed",
3163
3236
  "ring-kumo-fill",
3164
3237
  "ring-kumo-line",
3165
3238
  "text-kumo-strong"
@@ -3388,8 +3461,9 @@
3388
3461
  ],
3389
3462
  "colors": [
3390
3463
  "bg-kumo-base",
3391
- "bg-kumo-fill",
3392
- "border-kumo-fill"
3464
+ "bg-kumo-recessed",
3465
+ "border-kumo-fill",
3466
+ "border-kumo-recessed"
3393
3467
  ],
3394
3468
  "styling": {
3395
3469
  "container": {
@@ -3529,10 +3603,12 @@
3529
3603
  "<Pagination\n page={page}\n setPage={setPage}\n perPage={perPage}\n totalCount={500}\n >\n <Pagination.Info />\n <Pagination.Separator />\n <Pagination.PageSize\n value={perPage}\n onChange={(size) => {\n setPerPage(size);\n setPage(1);\n }}\n />\n <Pagination.Controls />\n </Pagination>",
3530
3604
  "<Pagination\n page={page}\n setPage={setPage}\n perPage={perPage}\n totalCount={200}\n >\n <Pagination.Info />\n <Pagination.Separator />\n <Pagination.PageSize\n value={perPage}\n onChange={(size) => {\n setPerPage(size);\n setPage(1);\n }}\n options={[10, 20, 50]}\n />\n <Pagination.Controls />\n </Pagination>",
3531
3605
  "<Pagination page={page} setPage={setPage} perPage={25} totalCount={100}>\n <Pagination.Info>\n {({ page, totalCount }) =>\n `Page ${page} of ${Math.ceil((totalCount ?? 1) / 25)}`\n }\n </Pagination.Info>\n <Pagination.Controls />\n </Pagination>",
3606
+ "<Pagination\n page={page}\n setPage={setPage}\n perPage={perPage}\n totalCount={500}\n >\n <Pagination.Info />\n <Pagination.Separator />\n <Pagination.PageSize\n value={perPage}\n onChange={(size) => {\n setPerPage(size);\n setPage(1);\n }}\n />\n <Pagination.Controls pageSelector=\"dropdown\" />\n </Pagination>",
3532
3607
  "<Pagination\n page={page}\n setPage={setPage}\n perPage={perPage}\n totalCount={500}\n >\n <Pagination.Info />\n <div className=\"flex items-center gap-2\">\n <Pagination.Controls />\n <Pagination.Separator />\n <Pagination.PageSize\n value={perPage}\n onChange={(size) => {\n setPerPage(size);\n setPage(1);\n }}\n />\n </div>\n </Pagination>"
3533
3608
  ],
3534
3609
  "colors": [
3535
3610
  "border-kumo-line",
3611
+ "ring-kumo-line",
3536
3612
  "text-kumo-strong"
3537
3613
  ],
3538
3614
  "subComponents": {
@@ -3588,6 +3664,14 @@
3588
3664
  "name": "Controls",
3589
3665
  "description": "Controls sub-component",
3590
3666
  "props": {
3667
+ "Note": {
3668
+ "type": "** `\"dropdown\"` renders an option for every page",
3669
+ "required": true
3670
+ },
3671
+ "pageSelector": {
3672
+ "type": "\"input\" | \"dropdown\"",
3673
+ "optional": true
3674
+ },
3591
3675
  "className": {
3592
3676
  "type": "string",
3593
3677
  "optional": true
@@ -3726,7 +3810,7 @@
3726
3810
  "card": "Choice card appearance with border, padding, and highlighted selection state"
3727
3811
  },
3728
3812
  "classes": {
3729
- "card": "rounded-lg border border-kumo-ring bg-kumo-base p-3 transition-colors hover:bg-kumo-tint has-[[data-checked]]:border-kumo-interact has-[[data-checked]]:bg-kumo-tint"
3813
+ "card": "rounded-lg border border-kumo-hairline bg-kumo-base p-3 transition-colors hover:bg-kumo-tint has-[[data-checked]]:border-kumo-interact has-[[data-checked]]:bg-kumo-tint"
3730
3814
  },
3731
3815
  "stateClasses": {
3732
3816
  "card": {
@@ -3791,12 +3875,11 @@
3791
3875
  "bg-kumo-contrast",
3792
3876
  "bg-kumo-tint",
3793
3877
  "border-kumo-danger",
3878
+ "border-kumo-hairline",
3794
3879
  "border-kumo-interact",
3795
- "border-kumo-line",
3796
- "border-kumo-ring",
3797
3880
  "ring-kumo-danger",
3881
+ "ring-kumo-hairline",
3798
3882
  "ring-kumo-line",
3799
- "ring-kumo-ring",
3800
3883
  "text-kumo-danger",
3801
3884
  "text-kumo-default",
3802
3885
  "text-kumo-subtle"
@@ -3953,13 +4036,19 @@
3953
4036
  "<Select\n label=\"Assignee\"\n className=\"w-[200px]\"\n loading={loading}\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n placeholder=\"Select assignee\"\n items={items}\n />",
3954
4037
  "<Select\n label=\"Visible Columns\"\n className=\"w-[250px]\"\n multiple\n renderValue={(value) => {\n if (value.length > 3) {\n return (\n <span className=\"line-clamp-1\">\n {value.slice(0, 2).join(\", \") + ` and ${value.length - 2} more`}\n </span>\n );\n }\n return <span>{value.join(\", \")}</span>;\n }}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n <Select.Option value=\"Name\">Name</Select.Option>\n <Select.Option value=\"Location\">Location</Select.Option>\n <Select.Option value=\"Size\">Size</Select.Option>\n <Select.Option value=\"Read\">Read</Select.Option>\n <Select.Option value=\"Write\">Write</Select.Option>\n <Select.Option value=\"CreatedAt\">Created At</Select.Option>\n </Select>",
3955
4038
  "<Select\n label=\"Compliance Frameworks\"\n className=\"w-[280px]\"\n multiple\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n <Select.Option value=\"European Union Privacy Regulation\">\n European Union Privacy Regulation\n </Select.Option>\n <Select.Option value=\"California Consumer Protection Act\">\n California Consumer Protection Act\n </Select.Option>\n <Select.Option value=\"Health Insurance Portability Act\">\n Health Insurance Portability Act\n </Select.Option>\n <Select.Option value=\"Payment Card Industry Standard\">\n Payment Card Industry Standard\n </Select.Option>\n </Select>",
3956
- "<Select\n label=\"Issue Types\"\n className=\"w-[220px]\"\n multiple\n renderValue={(selected) => (\n <span className=\"flex items-center gap-2\">\n <span>Issue Types</span>\n {selected.length > 0 && (\n <Badge variant=\"secondary\">{selected.length}</Badge>\n )}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n {allOptions.map((option) => (\n <Select.Option key={option.value} value={option.value}>\n {option.label}\n </Select.Option>\n ))}\n </Select>",
3957
- "<Select\n label=\"Author\"\n description=\"Select the primary author for this document\"\n className=\"w-[200px]\"\n onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}\n value={value}\n isItemEqualToValue={(item, value) => item?.id === value?.id}\n renderValue={(author) => {\n return author?.name ?? \"Select an author\";\n }}\n >\n {authors.map((author) => (\n <Select.Option key={author.id} value={author}>\n <div className=\"flex w-[300px] items-center justify-between gap-2\">\n <Text>{author.name}</Text>\n <Text variant=\"secondary\">{author.title}</Text>\n </div>\n </Select.Option>\n ))}\n </Select>"
4039
+ "<Select\n label=\"Issue Types\"\n className=\"w-[220px]\"\n multiple\n renderValue={(selected) => (\n <span className=\"flex items-center gap-2\">\n <span>Issue Types</span>\n {selected.length > 0 && (\n <Badge variant=\"neutral\">{selected.length}</Badge>\n )}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n {allOptions.map((option) => (\n <Select.Option key={option.value} value={option.value}>\n {option.label}\n </Select.Option>\n ))}\n </Select>",
4040
+ "<Select\n label=\"Author\"\n description=\"Select the primary author for this document\"\n className=\"w-[200px]\"\n onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}\n value={value}\n isItemEqualToValue={(item, value) => item?.id === value?.id}\n renderValue={(author) => {\n return author?.name ?? \"Select an author\";\n }}\n >\n {authors.map((author) => (\n <Select.Option key={author.id} value={author}>\n <div className=\"flex w-[300px] items-center justify-between gap-2\">\n <Text>{author.name}</Text>\n <Text variant=\"secondary\">{author.title}</Text>\n </div>\n </Select.Option>\n ))}\n </Select>",
4041
+ "<Select\n label=\"Deployment Region\"\n placeholder=\"Choose a region...\"\n className=\"w-[250px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n >\n <Select.Option value=\"us-east\">US East</Select.Option>\n <Select.Option value=\"us-west\">US West</Select.Option>\n <Select.Option value=\"eu-west\" disabled>\n EU West\n </Select.Option>\n <Select.Option value=\"ap-south\" disabled>\n AP South\n </Select.Option>\n </Select>",
4042
+ "<Select\n label=\"Plan\"\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={{\n free: \"Free\",\n pro: \"Pro\",\n business: { label: \"Business\", disabled: true },\n enterprise: { label: \"Enterprise\", disabled: true },\n }}\n />",
4043
+ "<Select\n label=\"Food\"\n placeholder=\"Pick a food...\"\n className=\"w-[220px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n >\n <Select.Group>\n <Select.GroupLabel>Fruits</Select.GroupLabel>\n <Select.Option value=\"apple\">Apple</Select.Option>\n <Select.Option value=\"banana\">Banana</Select.Option>\n <Select.Option value=\"cherry\">Cherry</Select.Option>\n </Select.Group>\n <Select.Separator />\n <Select.Group>\n <Select.GroupLabel>Vegetables</Select.GroupLabel>\n <Select.Option value=\"carrot\">Carrot</Select.Option>\n <Select.Option value=\"broccoli\">Broccoli</Select.Option>\n <Select.Option value=\"spinach\">Spinach</Select.Option>\n </Select.Group>\n </Select>",
4044
+ "<Select\n label=\"Server Region\"\n placeholder=\"Select a region...\"\n className=\"w-[260px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n >\n <Select.Group>\n <Select.GroupLabel>Available</Select.GroupLabel>\n <Select.Option value=\"us-east-1\">US East (N. Virginia)</Select.Option>\n <Select.Option value=\"us-west-2\">US West (Oregon)</Select.Option>\n <Select.Option value=\"eu-west-1\">EU West (Ireland)</Select.Option>\n </Select.Group>\n <Select.Separator />\n <Select.Group>\n <Select.GroupLabel>Unavailable</Select.GroupLabel>\n <Select.Option value=\"ap-south-1\" disabled>\n AP South (Mumbai)\n </Select.Option>\n <Select.Option value=\"sa-east-1\" disabled>\n SA East (São Paulo)\n </Select.Option>\n </Select.Group>\n </Select>",
4045
+ "<Select\n label=\"Long List Select\"\n description=\"Tests scrolling behavior with many options\"\n placeholder=\"Choose an option...\"\n className=\"w-[220px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n >\n {longListItems.map((item) => (\n <Select.Option key={item.value} value={item.value}>\n {item.label}\n </Select.Option>\n ))}\n </Select>"
3958
4046
  ],
3959
4047
  "colors": [
3960
4048
  "bg-kumo-base",
4049
+ "bg-kumo-line",
3961
4050
  "bg-kumo-tint",
3962
- "ring-kumo-ring",
4051
+ "ring-kumo-hairline",
3963
4052
  "text-kumo-danger",
3964
4053
  "text-kumo-default",
3965
4054
  "text-kumo-subtle"
@@ -3969,6 +4058,21 @@
3969
4058
  "name": "Option",
3970
4059
  "description": "Option sub-component",
3971
4060
  "props": {}
4061
+ },
4062
+ "Group": {
4063
+ "name": "Group",
4064
+ "description": "Group sub-component",
4065
+ "props": {}
4066
+ },
4067
+ "GroupLabel": {
4068
+ "name": "GroupLabel",
4069
+ "description": "GroupLabel sub-component",
4070
+ "props": {}
4071
+ },
4072
+ "Separator": {
4073
+ "name": "Separator",
4074
+ "description": "Separator sub-component",
4075
+ "props": {}
3972
4076
  }
3973
4077
  },
3974
4078
  "styling": {
@@ -4143,8 +4247,8 @@
4143
4247
  "colors": [
4144
4248
  "bg-kumo-brand",
4145
4249
  "bg-kumo-control",
4146
- "outline-kumo-ring",
4147
- "ring-kumo-ring",
4250
+ "outline-kumo-hairline",
4251
+ "ring-kumo-hairline",
4148
4252
  "text-kumo-default",
4149
4253
  "text-kumo-subtle"
4150
4254
  ]
@@ -4258,8 +4362,8 @@
4258
4362
  "bg-kumo-recessed",
4259
4363
  "bg-kumo-tint",
4260
4364
  "border-kumo-line",
4365
+ "ring-kumo-hairline",
4261
4366
  "ring-kumo-line",
4262
- "ring-kumo-ring",
4263
4367
  "text-kumo-default",
4264
4368
  "text-kumo-strong",
4265
4369
  "text-kumo-subtle"
@@ -4444,29 +4548,43 @@
4444
4548
  "Surface": {
4445
4549
  "name": "Surface",
4446
4550
  "type": "component",
4447
- "description": "Surface component",
4551
+ "description": "Polymorphic container with consistent background, shadow, and border styling. Use the `render` prop to change the underlying element: ```tsx <Surface render={<section />} className=\"rounded-lg p-4\">Card content</Surface> ```",
4448
4552
  "importPath": "@cloudflare/kumo",
4449
4553
  "category": "Layout",
4450
4554
  "props": {
4451
4555
  "as": {
4452
4556
  "type": "React.ElementType",
4453
- "optional": true,
4454
- "description": "The HTML element type to render as (e.g. `\"div\"`, `\"section\"`, `\"article\"`)."
4557
+ "optional": true
4455
4558
  },
4456
- "className": {
4457
- "type": "string",
4559
+ "render": {
4560
+ "type": "ReactNode",
4458
4561
  "optional": true,
4459
- "description": "Additional CSS classes merged via `cn()`."
4562
+ "description": "Allows you to replace the component’s HTML element with a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render."
4460
4563
  },
4461
4564
  "children": {
4462
4565
  "type": "ReactNode",
4463
- "optional": true,
4464
- "description": "Content rendered inside the surface."
4566
+ "optional": true
4567
+ },
4568
+ "className": {
4569
+ "type": "string",
4570
+ "optional": true
4571
+ },
4572
+ "id": {
4573
+ "type": "string",
4574
+ "optional": true
4575
+ },
4576
+ "lang": {
4577
+ "type": "string",
4578
+ "optional": true
4579
+ },
4580
+ "title": {
4581
+ "type": "string",
4582
+ "optional": true
4465
4583
  }
4466
4584
  },
4467
4585
  "examples": [
4468
4586
  "<Surface className=\"rounded-lg p-6\">\n <Text size=\"lg\" bold>\n Surface Component\n </Text>\n <div className=\"mt-2\">\n <Text variant=\"secondary\">\n A container with consistent elevation and border styling.\n </Text>\n </div>\n </Surface>",
4469
- "<div className=\"flex flex-col gap-4\">\n <Surface as=\"section\" className=\"rounded-lg p-4\">\n <Text bold>As section element</Text>\n </Surface>\n <Surface as=\"article\" className=\"rounded-lg p-4\">\n <Text bold>As article element</Text>\n </Surface>\n <Surface as=\"aside\" className=\"rounded-lg p-4\">\n <Text bold>As aside element</Text>\n </Surface>\n </div>",
4587
+ "<div className=\"flex flex-col gap-4\">\n <Surface render={<section />} className=\"rounded-lg p-4\">\n <Text bold>As section element</Text>\n </Surface>\n <Surface render={<article />} className=\"rounded-lg p-4\">\n <Text bold>As article element</Text>\n </Surface>\n <Surface render={<aside />} className=\"rounded-lg p-4\">\n <Text bold>As aside element</Text>\n </Surface>\n </div>",
4470
4588
  "<Surface className=\"rounded-lg p-6\">\n <Text bold>Outer Surface</Text>\n <Surface className=\"mt-4 rounded-md bg-kumo-elevated p-4\">\n <Text variant=\"secondary\">Nested Surface</Text>\n </Surface>\n </Surface>"
4471
4589
  ],
4472
4590
  "colors": [
@@ -4593,7 +4711,8 @@
4593
4711
  "<Switch label=\"Disabled\" checked={false} disabled />",
4594
4712
  "<Switch\n label=\"Neutral switch\"\n variant=\"neutral\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
4595
4713
  "<div className=\"flex flex-col gap-4\">\n <Switch\n label=\"Neutral off\"\n variant=\"neutral\"\n checked={false}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral on\"\n variant=\"neutral\"\n checked={true}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral disabled\"\n variant=\"neutral\"\n checked={false}\n disabled\n />\n </div>",
4596
- "<div className=\"flex flex-col gap-4\">\n <Switch\n label=\"Default variant\"\n checked={true}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral variant\"\n variant=\"neutral\"\n checked={true}\n onCheckedChange={() => {}}\n />\n </div>",
4714
+ "<div className=\"grid grid-cols-2 gap-x-8 gap-y-4\">\n <Switch label=\"Default off\" checked={false} onCheckedChange={() => {}} />\n <Switch label=\"Default on\" checked={true} onCheckedChange={() => {}} />\n <Switch\n label=\"Neutral off\"\n variant=\"neutral\"\n checked={false}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral on\"\n variant=\"neutral\"\n checked={true}\n onCheckedChange={() => {}}\n />\n </div>",
4715
+ "<Switch\n id=\"my-custom-switch\"\n label=\"Custom ID\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
4597
4716
  "<div className=\"flex flex-col gap-4\">\n <Switch\n label=\"Small\"\n size=\"sm\"\n checked={true}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Base (default)\"\n size=\"base\"\n checked={true}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Large\"\n size=\"lg\"\n checked={true}\n onCheckedChange={() => {}}\n />\n </div>"
4598
4717
  ],
4599
4718
  "colors": [
@@ -4683,6 +4802,21 @@
4683
4802
  "selected": "bg-kumo-tint"
4684
4803
  }
4685
4804
  },
4805
+ "sticky": {
4806
+ "type": "enum",
4807
+ "values": [
4808
+ "left",
4809
+ "right"
4810
+ ],
4811
+ "descriptions": {
4812
+ "left": "Pin column to the left edge of the scroll container",
4813
+ "right": "Pin column to the right edge of the scroll container"
4814
+ },
4815
+ "classes": {
4816
+ "left": "sticky left-0",
4817
+ "right": "sticky right-0"
4818
+ }
4819
+ },
4686
4820
  "className": {
4687
4821
  "type": "string",
4688
4822
  "description": "Additional CSS classes"
@@ -4698,12 +4832,13 @@
4698
4832
  "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header variant=\"compact\">\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.slice(0, 3).map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4699
4833
  "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === rows.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < rows.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4700
4834
  "<LayerCard>\n <LayerCard.Primary className=\"p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />\n <col className=\"w-[150px]\" />\n <col className=\"w-[150px]\" />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell>{row.subject}</Table.Cell>\n <Table.Cell>{row.from}</Table.Cell>\n <Table.Cell>{row.date}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4835
+ "<LayerCard>\n <LayerCard.Primary className=\"w-full max-w-md overflow-x-auto p-0\">\n <Table>\n <Table.Header>\n <Table.Row>\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n <Table.Head>Tags</Table.Head>\n <Table.Head sticky=\"right\">\n <span className=\"sr-only\">Actions</span>\n </Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row key={row.id}>\n <Table.Cell className=\"whitespace-nowrap\">\n {row.subject}\n </Table.Cell>\n <Table.Cell className=\"whitespace-nowrap\">\n {row.from}\n </Table.Cell>\n <Table.Cell className=\"whitespace-nowrap\">\n {row.date}\n </Table.Cell>\n <Table.Cell className=\"whitespace-nowrap\">\n {row.tags ? (\n <div className=\"inline-flex gap-1\">\n {row.tags.map((tag) => (\n <Badge key={tag}>{tag}</Badge>\n ))}\n </div>\n ) : (\n \"—\"\n )}\n </Table.Cell>\n <Table.Cell sticky=\"right\" className=\"text-right\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"More options\"\n >\n <DotsThree weight=\"bold\" size={16} />\n </Button>\n }\n />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>\n <DropdownMenu.Item icon={PencilSimple}>\n Edit\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={Trash} variant=\"danger\">\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>",
4701
4836
  "<LayerCard>\n <LayerCard.Primary className=\"w-full overflow-x-auto p-0\">\n <Table layout=\"fixed\">\n <colgroup>\n <col />{\" \"}\n {/* Checkbox column - width handled by Table.CheckHead/CheckCell */}\n <col />\n <col style={{ width: \"150px\" }} />\n <col style={{ width: \"120px\" }} />\n <col style={{ width: \"50px\" }} />\n </colgroup>\n <Table.Header>\n <Table.Row>\n <Table.CheckHead\n checked={selectedIds.size === emailData.length}\n indeterminate={\n selectedIds.size > 0 && selectedIds.size < emailData.length\n }\n onValueChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n <Table.Head>Subject</Table.Head>\n <Table.Head>From</Table.Head>\n <Table.Head>Date</Table.Head>\n <Table.Head></Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {emailData.map((row) => (\n <Table.Row\n key={row.id}\n variant={selectedIds.has(row.id) ? \"selected\" : \"default\"}\n >\n <Table.CheckCell\n checked={selectedIds.has(row.id)}\n onValueChange={() => toggleRow(row.id)}\n aria-label={`Select ${row.subject}`}\n />\n <Table.Cell>\n <div className=\"flex items-center gap-2\">\n <EnvelopeSimple size={16} />\n <span className=\"truncate\">{row.subject}</span>\n {row.tags && (\n <div className=\"ml-2 inline-flex gap-1\">\n {row.tags.map((tag) => (\n <Badge key={tag}>{tag}</Badge>\n ))}\n </div>\n )}\n </div>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.from}</span>\n </Table.Cell>\n <Table.Cell>\n <span className=\"truncate\">{row.date}</span>\n </Table.Cell>\n <Table.Cell className=\"text-right\">\n <DropdownMenu>\n <DropdownMenu.Trigger\n render={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n aria-label=\"More options\"\n >\n <DotsThree weight=\"bold\" size={16} />\n </Button>\n }\n />\n <DropdownMenu.Content>\n <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>\n <DropdownMenu.Item icon={PencilSimple}>\n Edit\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item icon={Trash} variant=\"danger\">\n Delete\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </LayerCard.Primary>\n </LayerCard>"
4702
4837
  ],
4703
4838
  "colors": [
4704
4839
  "bg-kumo-base",
4705
4840
  "bg-kumo-elevated",
4706
- "bg-kumo-ring",
4841
+ "bg-kumo-hairline",
4707
4842
  "bg-kumo-tint",
4708
4843
  "border-kumo-fill",
4709
4844
  "text-kumo-default",
@@ -4826,10 +4961,10 @@
4826
4961
  "bg-kumo-base",
4827
4962
  "bg-kumo-brand",
4828
4963
  "bg-kumo-recessed",
4829
- "bg-kumo-surface",
4830
4964
  "bg-kumo-tint",
4831
- "border-kumo-ring",
4832
- "ring-kumo-ring",
4965
+ "border-kumo-hairline",
4966
+ "ring-kumo-hairline",
4967
+ "ring-kumo-line",
4833
4968
  "text-kumo-default",
4834
4969
  "text-kumo-strong",
4835
4970
  "text-kumo-subtle"
@@ -4933,6 +5068,11 @@
4933
5068
  "optional": true,
4934
5069
  "description": "Whether to use bold font weight (only applies to body variants)."
4935
5070
  },
5071
+ "truncate": {
5072
+ "type": "boolean",
5073
+ "optional": true,
5074
+ "description": "Whether to truncate overflowing text with an ellipsis. Adds `truncate min-w-0` classes."
5075
+ },
4936
5076
  "as": {
4937
5077
  "type": "React.ElementType",
4938
5078
  "optional": true,
@@ -4945,7 +5085,8 @@
4945
5085
  }
4946
5086
  },
4947
5087
  "examples": [
4948
- "<div className=\"grid w-full grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"heading1\">Heading 1</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-3xl (30px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"heading2\">Heading 2</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-2xl (24px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"heading3\">Heading 3</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text>Body</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text bold>Body bold</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text size=\"lg\">Body lg</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text size=\"sm\">Body sm</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text size=\"xs\">Body xs</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-xs (12px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"secondary\">Body secondary</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"mono\">Monospace</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"mono\" size=\"lg\">\n Monospace lg\n </Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"mono-secondary\">Monospace secondary</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"success\">Success</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"error\">Error</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n </div>"
5088
+ "<div className=\"grid w-full grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"heading1\">Heading 1</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-3xl (30px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"heading2\">Heading 2</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-2xl (24px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"heading3\">Heading 3</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text>Body</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text bold>Body bold</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text size=\"lg\">Body lg</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-lg (16px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text size=\"sm\">Body sm</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text size=\"xs\">Body xs</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-xs (12px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"secondary\">Body secondary</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"mono\">Monospace</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"mono\" size=\"lg\">\n Monospace lg\n </Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"mono-secondary\">Monospace secondary</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-sm (13px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"success\">Success</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n <div className=\"flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text variant=\"error\">Error</Text>\n <p className=\"font-mono text-xs text-kumo-subtle\">text-base (14px)</p>\n </div>\n </div>",
5089
+ "<div className=\"w-64 rounded-lg border border-kumo-line bg-kumo-base p-4\">\n <Text truncate>\n This is a long piece of text that will be truncated with an ellipsis\n when it overflows its container.\n </Text>\n </div>"
4949
5090
  ],
4950
5091
  "colors": [
4951
5092
  "text-kumo-danger",
@@ -5008,11 +5149,11 @@
5008
5149
  "info": "Info toast for neutral informational messages"
5009
5150
  },
5010
5151
  "classes": {
5011
- "default": "border-kumo-fill bg-kumo-control",
5012
- "success": "border-kumo-success bg-kumo-control [&_[data-toast-icon]]:text-kumo-success [&_[data-toast-title]]:text-kumo-success",
5013
- "error": "border-kumo-danger bg-kumo-control [&_[data-toast-icon]]:text-kumo-danger [&_[data-toast-title]]:text-kumo-danger",
5014
- "warning": "border-kumo-warning bg-kumo-control [&_[data-toast-icon]]:text-kumo-warning [&_[data-toast-title]]:text-kumo-warning",
5015
- "info": "border-kumo-info bg-kumo-control [&_[data-toast-icon]]:text-kumo-info [&_[data-toast-title]]:text-kumo-info"
5152
+ "default": "border-kumo-fill bg-kumo-base",
5153
+ "success": "ring-[0.3px] ring-kumo-success bg-kumo-base [&_[data-toast-icon]]:text-kumo-success [&_[data-toast-title]]:text-kumo-success",
5154
+ "error": "ring-[0.3px] ring-kumo-danger bg-kumo-base [&_[data-toast-icon]]:text-kumo-danger [&_[data-toast-title]]:text-kumo-danger",
5155
+ "warning": "ring-[0.3px] ring-kumo-warning bg-kumo-base [&_[data-toast-icon]]:text-kumo-warning [&_[data-toast-title]]:text-kumo-warning",
5156
+ "info": "ring-[0.3px] ring-kumo-info bg-kumo-control [&_[data-toast-icon]]:text-kumo-info [&_[data-toast-title]]:text-kumo-info"
5016
5157
  }
5017
5158
  },
5018
5159
  "className": {
@@ -5026,18 +5167,20 @@
5026
5167
  },
5027
5168
  "examples": [],
5028
5169
  "colors": [
5170
+ "bg-kumo-base",
5029
5171
  "bg-kumo-contrast",
5030
5172
  "bg-kumo-control",
5031
- "bg-kumo-danger-tint",
5173
+ "bg-kumo-danger",
5032
5174
  "bg-kumo-fill-hover",
5033
- "bg-kumo-info-tint",
5034
- "bg-kumo-success-tint",
5035
- "bg-kumo-warning-tint",
5036
- "border-kumo-danger",
5175
+ "bg-kumo-info",
5176
+ "bg-kumo-success",
5177
+ "bg-kumo-warning",
5037
5178
  "border-kumo-fill",
5038
- "border-kumo-info",
5039
- "border-kumo-success",
5040
- "border-kumo-warning",
5179
+ "ring-kumo-danger",
5180
+ "ring-kumo-hairline",
5181
+ "ring-kumo-info",
5182
+ "ring-kumo-success",
5183
+ "ring-kumo-warning",
5041
5184
  "text-kumo-danger",
5042
5185
  "text-kumo-default",
5043
5186
  "text-kumo-info",
@@ -5051,8 +5194,8 @@
5051
5194
  "width": 300,
5052
5195
  "padding": 16,
5053
5196
  "borderRadius": 8,
5054
- "background": "color-secondary",
5055
- "border": "color-color",
5197
+ "background": "bg-kumo-base",
5198
+ "border": "ring-[0.3px] ring-kumo-hairline",
5056
5199
  "shadow": "shadow-lg",
5057
5200
  "gap": 4
5058
5201
  },
@@ -5118,7 +5261,8 @@
5118
5261
  "<TooltipProvider>\n <Tooltip content=\"Add new item\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add new item\" />\n </Tooltip>\n </TooltipProvider>",
5119
5262
  "<TooltipProvider>\n <Tooltip content=\"Add\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n </TooltipProvider>",
5120
5263
  "<TooltipProvider>\n <div className=\"flex gap-2\">\n <Tooltip content=\"Add\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n <Tooltip content=\"Change language\" asChild>\n <Button\n shape=\"square\"\n icon={TranslateIcon}\n aria-label=\"Change language\"\n />\n </Tooltip>\n </div>\n </TooltipProvider>",
5121
- "<TooltipProvider>\n <Tooltip\n content=\"Click to learn more\"\n className=\"inline-flex items-center gap-1.5 rounded-full bg-kumo-brand px-3 py-1.5 text-sm font-medium text-white shadow-md transition-transform hover:scale-105 active:scale-95\"\n >\n <Info className=\"size-4\" />\n <span>Help</span>\n </Tooltip>\n </TooltipProvider>"
5264
+ "<TooltipProvider>\n <Tooltip\n content=\"Click to learn more\"\n className=\"inline-flex items-center gap-1.5 rounded-full bg-kumo-brand px-3 py-1.5 text-sm font-medium text-white shadow-md transition-transform hover:scale-105 active:scale-95\"\n >\n <Info className=\"size-4\" />\n <span>Help</span>\n </Tooltip>\n </TooltipProvider>",
5265
+ "<TooltipProvider>\n <div className=\"flex gap-4\">\n <Tooltip content=\"Opens after 1 second\" delay={1000} asChild>\n <Button variant=\"secondary\">1s open delay</Button>\n </Tooltip>\n <Tooltip\n content=\"Stays open 500ms after leaving\"\n closeDelay={500}\n asChild\n >\n <Button variant=\"secondary\">500ms close delay</Button>\n </Tooltip>\n <Tooltip\n content=\"Instant open, stays 1s\"\n delay={0}\n closeDelay={1000}\n asChild\n >\n <Button variant=\"secondary\">Instant + 1s close</Button>\n </Tooltip>\n </div>\n </TooltipProvider>"
5122
5266
  ],
5123
5267
  "colors": [
5124
5268
  "bg-kumo-base",