@cloudflare/kumo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/CHANGELOG.md +510 -0
  2. package/LICENSE +21 -0
  3. package/README.md +521 -0
  4. package/ai/component-registry.json +3754 -0
  5. package/ai/component-registry.md +4022 -0
  6. package/ai/schemas.ts +594 -0
  7. package/dist/badge-Dc99vsfo.js +51 -0
  8. package/dist/badge-Dc99vsfo.js.map +1 -0
  9. package/dist/banner-4fkH6Sbt.js +51 -0
  10. package/dist/banner-4fkH6Sbt.js.map +1 -0
  11. package/dist/breadcrumbs-B5SY2CWj.js +132 -0
  12. package/dist/breadcrumbs-B5SY2CWj.js.map +1 -0
  13. package/dist/button-E2-hZMZE.js +191 -0
  14. package/dist/button-E2-hZMZE.js.map +1 -0
  15. package/dist/catalog.js +229 -0
  16. package/dist/catalog.js.map +1 -0
  17. package/dist/checkbox-BexIU_lZ.js +224 -0
  18. package/dist/checkbox-BexIU_lZ.js.map +1 -0
  19. package/dist/clipboard-text-BFHWMjmr.js +108 -0
  20. package/dist/clipboard-text-BFHWMjmr.js.map +1 -0
  21. package/dist/cn-Bhsu1vx2.js +26 -0
  22. package/dist/cn-Bhsu1vx2.js.map +1 -0
  23. package/dist/code-T2wPDiM0.js +60 -0
  24. package/dist/code-T2wPDiM0.js.map +1 -0
  25. package/dist/collapsible-OBNkTO48.js +56 -0
  26. package/dist/collapsible-OBNkTO48.js.map +1 -0
  27. package/dist/combobox-Dld0kS0U.js +228 -0
  28. package/dist/combobox-Dld0kS0U.js.map +1 -0
  29. package/dist/command-line/cli.js +764 -0
  30. package/dist/command-line/commands/add.js +220 -0
  31. package/dist/command-line/commands/blocks.js +61 -0
  32. package/dist/command-line/commands/doc.js +167 -0
  33. package/dist/command-line/commands/init.js +95 -0
  34. package/dist/command-line/commands/ls.js +53 -0
  35. package/dist/command-palette-BgQ680BG.js +393 -0
  36. package/dist/command-palette-BgQ680BG.js.map +1 -0
  37. package/dist/components/badge.js +7 -0
  38. package/dist/components/badge.js.map +1 -0
  39. package/dist/components/banner.js +7 -0
  40. package/dist/components/banner.js.map +1 -0
  41. package/dist/components/breadcrumbs.js +9 -0
  42. package/dist/components/breadcrumbs.js.map +1 -0
  43. package/dist/components/button.js +9 -0
  44. package/dist/components/button.js.map +1 -0
  45. package/dist/components/checkbox.js +8 -0
  46. package/dist/components/checkbox.js.map +1 -0
  47. package/dist/components/clipboard-text.js +6 -0
  48. package/dist/components/clipboard-text.js.map +1 -0
  49. package/dist/components/code.js +7 -0
  50. package/dist/components/code.js.map +1 -0
  51. package/dist/components/collapsible.js +6 -0
  52. package/dist/components/collapsible.js.map +1 -0
  53. package/dist/components/combobox.js +6 -0
  54. package/dist/components/combobox.js.map +1 -0
  55. package/dist/components/command-palette.js +8 -0
  56. package/dist/components/command-palette.js.map +1 -0
  57. package/dist/components/date-range-picker.js +6 -0
  58. package/dist/components/date-range-picker.js.map +1 -0
  59. package/dist/components/dialog.js +11 -0
  60. package/dist/components/dialog.js.map +1 -0
  61. package/dist/components/dropdown.js +6 -0
  62. package/dist/components/dropdown.js.map +1 -0
  63. package/dist/components/empty.js +9 -0
  64. package/dist/components/empty.js.map +1 -0
  65. package/dist/components/field.js +9 -0
  66. package/dist/components/field.js.map +1 -0
  67. package/dist/components/grid.js +11 -0
  68. package/dist/components/grid.js.map +1 -0
  69. package/dist/components/input.js +11 -0
  70. package/dist/components/input.js.map +1 -0
  71. package/dist/components/label.js +10 -0
  72. package/dist/components/label.js.map +1 -0
  73. package/dist/components/layer-card.js +6 -0
  74. package/dist/components/layer-card.js.map +1 -0
  75. package/dist/components/link.js +9 -0
  76. package/dist/components/link.js.map +1 -0
  77. package/dist/components/loader.js +8 -0
  78. package/dist/components/loader.js.map +1 -0
  79. package/dist/components/menubar.js +7 -0
  80. package/dist/components/menubar.js.map +1 -0
  81. package/dist/components/meter.js +6 -0
  82. package/dist/components/meter.js.map +1 -0
  83. package/dist/components/pagination.js +6 -0
  84. package/dist/components/pagination.js.map +1 -0
  85. package/dist/components/popover.js +14 -0
  86. package/dist/components/popover.js.map +1 -0
  87. package/dist/components/radio.js +10 -0
  88. package/dist/components/radio.js.map +1 -0
  89. package/dist/components/select.js +6 -0
  90. package/dist/components/select.js.map +1 -0
  91. package/dist/components/sensitive-input.js +8 -0
  92. package/dist/components/sensitive-input.js.map +1 -0
  93. package/dist/components/surface.js +6 -0
  94. package/dist/components/surface.js.map +1 -0
  95. package/dist/components/switch.js +8 -0
  96. package/dist/components/switch.js.map +1 -0
  97. package/dist/components/table.js +8 -0
  98. package/dist/components/table.js.map +1 -0
  99. package/dist/components/tabs.js +6 -0
  100. package/dist/components/tabs.js.map +1 -0
  101. package/dist/components/text.js +6 -0
  102. package/dist/components/text.js.map +1 -0
  103. package/dist/components/toast.js +8 -0
  104. package/dist/components/toast.js.map +1 -0
  105. package/dist/components/tooltip.js +7 -0
  106. package/dist/components/tooltip.js.map +1 -0
  107. package/dist/date-range-picker-CbKEQ9pi.js +408 -0
  108. package/dist/date-range-picker-CbKEQ9pi.js.map +1 -0
  109. package/dist/dialog-B1TaN0oR.js +77 -0
  110. package/dist/dialog-B1TaN0oR.js.map +1 -0
  111. package/dist/dropdown-D0rhYKeG.js +263 -0
  112. package/dist/dropdown-D0rhYKeG.js.map +1 -0
  113. package/dist/empty-DzCqjea-.js +93 -0
  114. package/dist/empty-DzCqjea-.js.map +1 -0
  115. package/dist/field-V3J0Ql_V.js +71 -0
  116. package/dist/field-V3J0Ql_V.js.map +1 -0
  117. package/dist/grid-DKajRHh8.js +127 -0
  118. package/dist/grid-DKajRHh8.js.map +1 -0
  119. package/dist/index.js +125 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/input-Dqvc2AB_.js +109 -0
  122. package/dist/input-Dqvc2AB_.js.map +1 -0
  123. package/dist/input-area-B9qajxvZ.js +57 -0
  124. package/dist/input-area-B9qajxvZ.js.map +1 -0
  125. package/dist/input-group-Bl6tgD5-.js +111 -0
  126. package/dist/input-group-Bl6tgD5-.js.map +1 -0
  127. package/dist/label-87HQArUG.js +50 -0
  128. package/dist/label-87HQArUG.js.map +1 -0
  129. package/dist/layer-card-C8j5Hkkj.js +44 -0
  130. package/dist/layer-card-C8j5Hkkj.js.map +1 -0
  131. package/dist/link-6TIZ4JIw.js +73 -0
  132. package/dist/link-6TIZ4JIw.js.map +1 -0
  133. package/dist/link-provider-DPBGo-0n.js +22 -0
  134. package/dist/link-provider-DPBGo-0n.js.map +1 -0
  135. package/dist/loader-DHGMYlC6.js +105 -0
  136. package/dist/loader-DHGMYlC6.js.map +1 -0
  137. package/dist/menubar-DLwLRFB1.js +92 -0
  138. package/dist/menubar-DLwLRFB1.js.map +1 -0
  139. package/dist/meter-DKUuvXxS.js +51 -0
  140. package/dist/meter-DKUuvXxS.js.map +1 -0
  141. package/dist/pagination-C4HQqodz.js +99 -0
  142. package/dist/pagination-C4HQqodz.js.map +1 -0
  143. package/dist/popover-DhdIqrP7.js +178 -0
  144. package/dist/popover-DhdIqrP7.js.map +1 -0
  145. package/dist/primitives/accordion.js +6 -0
  146. package/dist/primitives/accordion.js.map +1 -0
  147. package/dist/primitives/alert-dialog.js +6 -0
  148. package/dist/primitives/alert-dialog.js.map +1 -0
  149. package/dist/primitives/autocomplete.js +6 -0
  150. package/dist/primitives/autocomplete.js.map +1 -0
  151. package/dist/primitives/avatar.js +6 -0
  152. package/dist/primitives/avatar.js.map +1 -0
  153. package/dist/primitives/button.js +6 -0
  154. package/dist/primitives/button.js.map +1 -0
  155. package/dist/primitives/checkbox-group.js +6 -0
  156. package/dist/primitives/checkbox-group.js.map +1 -0
  157. package/dist/primitives/checkbox.js +6 -0
  158. package/dist/primitives/checkbox.js.map +1 -0
  159. package/dist/primitives/collapsible.js +6 -0
  160. package/dist/primitives/collapsible.js.map +1 -0
  161. package/dist/primitives/combobox.js +6 -0
  162. package/dist/primitives/combobox.js.map +1 -0
  163. package/dist/primitives/context-menu.js +6 -0
  164. package/dist/primitives/context-menu.js.map +1 -0
  165. package/dist/primitives/dialog.js +6 -0
  166. package/dist/primitives/dialog.js.map +1 -0
  167. package/dist/primitives/direction-provider.js +7 -0
  168. package/dist/primitives/direction-provider.js.map +1 -0
  169. package/dist/primitives/field.js +6 -0
  170. package/dist/primitives/field.js.map +1 -0
  171. package/dist/primitives/fieldset.js +6 -0
  172. package/dist/primitives/fieldset.js.map +1 -0
  173. package/dist/primitives/form.js +6 -0
  174. package/dist/primitives/form.js.map +1 -0
  175. package/dist/primitives/input.js +6 -0
  176. package/dist/primitives/input.js.map +1 -0
  177. package/dist/primitives/menu.js +6 -0
  178. package/dist/primitives/menu.js.map +1 -0
  179. package/dist/primitives/menubar.js +6 -0
  180. package/dist/primitives/menubar.js.map +1 -0
  181. package/dist/primitives/meter.js +6 -0
  182. package/dist/primitives/meter.js.map +1 -0
  183. package/dist/primitives/navigation-menu.js +6 -0
  184. package/dist/primitives/navigation-menu.js.map +1 -0
  185. package/dist/primitives/number-field.js +6 -0
  186. package/dist/primitives/number-field.js.map +1 -0
  187. package/dist/primitives/popover.js +6 -0
  188. package/dist/primitives/popover.js.map +1 -0
  189. package/dist/primitives/preview-card.js +6 -0
  190. package/dist/primitives/preview-card.js.map +1 -0
  191. package/dist/primitives/progress.js +6 -0
  192. package/dist/primitives/progress.js.map +1 -0
  193. package/dist/primitives/radio-group.js +6 -0
  194. package/dist/primitives/radio-group.js.map +1 -0
  195. package/dist/primitives/radio.js +6 -0
  196. package/dist/primitives/radio.js.map +1 -0
  197. package/dist/primitives/scroll-area.js +6 -0
  198. package/dist/primitives/scroll-area.js.map +1 -0
  199. package/dist/primitives/select.js +6 -0
  200. package/dist/primitives/select.js.map +1 -0
  201. package/dist/primitives/separator.js +6 -0
  202. package/dist/primitives/separator.js.map +1 -0
  203. package/dist/primitives/slider.js +6 -0
  204. package/dist/primitives/slider.js.map +1 -0
  205. package/dist/primitives/switch.js +6 -0
  206. package/dist/primitives/switch.js.map +1 -0
  207. package/dist/primitives/tabs.js +6 -0
  208. package/dist/primitives/tabs.js.map +1 -0
  209. package/dist/primitives/toast.js +6 -0
  210. package/dist/primitives/toast.js.map +1 -0
  211. package/dist/primitives/toggle-group.js +6 -0
  212. package/dist/primitives/toggle-group.js.map +1 -0
  213. package/dist/primitives/toggle.js +6 -0
  214. package/dist/primitives/toggle.js.map +1 -0
  215. package/dist/primitives/toolbar.js +6 -0
  216. package/dist/primitives/toolbar.js.map +1 -0
  217. package/dist/primitives/tooltip.js +6 -0
  218. package/dist/primitives/tooltip.js.map +1 -0
  219. package/dist/primitives.js +43 -0
  220. package/dist/primitives.js.map +1 -0
  221. package/dist/radio-BVAG7hNp.js +125 -0
  222. package/dist/radio-BVAG7hNp.js.map +1 -0
  223. package/dist/registry.js +2 -0
  224. package/dist/registry.js.map +1 -0
  225. package/dist/schemas-BSdA0fz-.js +3210 -0
  226. package/dist/schemas-BSdA0fz-.js.map +1 -0
  227. package/dist/select-B5Vb3zou.js +122 -0
  228. package/dist/select-B5Vb3zou.js.map +1 -0
  229. package/dist/sensitive-input-D5HCV04N.js +258 -0
  230. package/dist/sensitive-input-D5HCV04N.js.map +1 -0
  231. package/dist/skeleton-line-CtpS1u1J.js +28 -0
  232. package/dist/skeleton-line-CtpS1u1J.js.map +1 -0
  233. package/dist/src/blocks/page-header/index.d.ts +2 -0
  234. package/dist/src/blocks/page-header/index.d.ts.map +1 -0
  235. package/dist/src/blocks/page-header/page-header.d.ts +38 -0
  236. package/dist/src/blocks/page-header/page-header.d.ts.map +1 -0
  237. package/dist/src/blocks/resource-list/index.d.ts +2 -0
  238. package/dist/src/blocks/resource-list/index.d.ts.map +1 -0
  239. package/dist/src/blocks/resource-list/resource-list.d.ts +18 -0
  240. package/dist/src/blocks/resource-list/resource-list.d.ts.map +1 -0
  241. package/dist/src/catalog/catalog.d.ts +75 -0
  242. package/dist/src/catalog/catalog.d.ts.map +1 -0
  243. package/dist/src/catalog/data.d.ts +44 -0
  244. package/dist/src/catalog/data.d.ts.map +1 -0
  245. package/dist/src/catalog/index.d.ts +39 -0
  246. package/dist/src/catalog/index.d.ts.map +1 -0
  247. package/dist/src/catalog/types.d.ts +226 -0
  248. package/dist/src/catalog/types.d.ts.map +1 -0
  249. package/dist/src/catalog/visibility.d.ts +37 -0
  250. package/dist/src/catalog/visibility.d.ts.map +1 -0
  251. package/dist/src/command-line/build-cli.d.ts +7 -0
  252. package/dist/src/command-line/build-cli.d.ts.map +1 -0
  253. package/dist/src/command-line/cli.d.ts +13 -0
  254. package/dist/src/command-line/cli.d.ts.map +1 -0
  255. package/dist/src/command-line/commands/add.d.ts +10 -0
  256. package/dist/src/command-line/commands/add.d.ts.map +1 -0
  257. package/dist/src/command-line/commands/blocks.d.ts +10 -0
  258. package/dist/src/command-line/commands/blocks.d.ts.map +1 -0
  259. package/dist/src/command-line/commands/doc.d.ts +14 -0
  260. package/dist/src/command-line/commands/doc.d.ts.map +1 -0
  261. package/dist/src/command-line/commands/init.d.ts +18 -0
  262. package/dist/src/command-line/commands/init.d.ts.map +1 -0
  263. package/dist/src/command-line/commands/ls.d.ts +10 -0
  264. package/dist/src/command-line/commands/ls.d.ts.map +1 -0
  265. package/dist/src/command-line/commands/migrate.d.ts +10 -0
  266. package/dist/src/command-line/commands/migrate.d.ts.map +1 -0
  267. package/dist/src/command-line/utils/config.d.ts +42 -0
  268. package/dist/src/command-line/utils/config.d.ts.map +1 -0
  269. package/dist/src/command-line/utils/transformer.d.ts +17 -0
  270. package/dist/src/command-line/utils/transformer.d.ts.map +1 -0
  271. package/dist/src/components/badge/badge.d.ts +46 -0
  272. package/dist/src/components/badge/badge.d.ts.map +1 -0
  273. package/dist/src/components/badge/index.d.ts +2 -0
  274. package/dist/src/components/badge/index.d.ts.map +1 -0
  275. package/dist/src/components/banner/banner.d.ts +45 -0
  276. package/dist/src/components/banner/banner.d.ts.map +1 -0
  277. package/dist/src/components/banner/index.d.ts +2 -0
  278. package/dist/src/components/banner/index.d.ts.map +1 -0
  279. package/dist/src/components/breadcrumbs/breadcrumbs.d.ts +43 -0
  280. package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  281. package/dist/src/components/breadcrumbs/index.d.ts +2 -0
  282. package/dist/src/components/breadcrumbs/index.d.ts.map +1 -0
  283. package/dist/src/components/button/button.d.ts +118 -0
  284. package/dist/src/components/button/button.d.ts.map +1 -0
  285. package/dist/src/components/button/index.d.ts +2 -0
  286. package/dist/src/components/button/index.d.ts.map +1 -0
  287. package/dist/src/components/checkbox/checkbox.d.ts +167 -0
  288. package/dist/src/components/checkbox/checkbox.d.ts.map +1 -0
  289. package/dist/src/components/checkbox/index.d.ts +2 -0
  290. package/dist/src/components/checkbox/index.d.ts.map +1 -0
  291. package/dist/src/components/clipboard-text/clipboard-text.d.ts +38 -0
  292. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -0
  293. package/dist/src/components/clipboard-text/index.d.ts +2 -0
  294. package/dist/src/components/clipboard-text/index.d.ts.map +1 -0
  295. package/dist/src/components/code/code.d.ts +138 -0
  296. package/dist/src/components/code/code.d.ts.map +1 -0
  297. package/dist/src/components/code/index.d.ts +4 -0
  298. package/dist/src/components/code/index.d.ts.map +1 -0
  299. package/dist/src/components/collapsible/collapsible.d.ts +62 -0
  300. package/dist/src/components/collapsible/collapsible.d.ts.map +1 -0
  301. package/dist/src/components/collapsible/index.d.ts +2 -0
  302. package/dist/src/components/collapsible/index.d.ts.map +1 -0
  303. package/dist/src/components/combobox/combobox.d.ts +124 -0
  304. package/dist/src/components/combobox/combobox.d.ts.map +1 -0
  305. package/dist/src/components/combobox/index.d.ts +2 -0
  306. package/dist/src/components/combobox/index.d.ts.map +1 -0
  307. package/dist/src/components/command-palette/command-palette.d.ts +225 -0
  308. package/dist/src/components/command-palette/command-palette.d.ts.map +1 -0
  309. package/dist/src/components/command-palette/index.d.ts +3 -0
  310. package/dist/src/components/command-palette/index.d.ts.map +1 -0
  311. package/dist/src/components/command-palette/types.d.ts +149 -0
  312. package/dist/src/components/command-palette/types.d.ts.map +1 -0
  313. package/dist/src/components/date-range-picker/date-range-picker.d.ts +65 -0
  314. package/dist/src/components/date-range-picker/date-range-picker.d.ts.map +1 -0
  315. package/dist/src/components/date-range-picker/index.d.ts +2 -0
  316. package/dist/src/components/date-range-picker/index.d.ts.map +1 -0
  317. package/dist/src/components/dialog/dialog.d.ts +121 -0
  318. package/dist/src/components/dialog/dialog.d.ts.map +1 -0
  319. package/dist/src/components/dialog/index.d.ts +2 -0
  320. package/dist/src/components/dialog/index.d.ts.map +1 -0
  321. package/dist/src/components/dropdown/dropdown.d.ts +58 -0
  322. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -0
  323. package/dist/src/components/dropdown/index.d.ts +2 -0
  324. package/dist/src/components/dropdown/index.d.ts.map +1 -0
  325. package/dist/src/components/empty/empty.d.ts +34 -0
  326. package/dist/src/components/empty/empty.d.ts.map +1 -0
  327. package/dist/src/components/empty/index.d.ts +2 -0
  328. package/dist/src/components/empty/index.d.ts.map +1 -0
  329. package/dist/src/components/field/field.d.ts +38 -0
  330. package/dist/src/components/field/field.d.ts.map +1 -0
  331. package/dist/src/components/field/index.d.ts +2 -0
  332. package/dist/src/components/field/index.d.ts.map +1 -0
  333. package/dist/src/components/grid/grid.d.ts +107 -0
  334. package/dist/src/components/grid/grid.d.ts.map +1 -0
  335. package/dist/src/components/grid/index.d.ts +2 -0
  336. package/dist/src/components/grid/index.d.ts.map +1 -0
  337. package/dist/src/components/input/index.d.ts +4 -0
  338. package/dist/src/components/input/index.d.ts.map +1 -0
  339. package/dist/src/components/input/input-area.d.ts +46 -0
  340. package/dist/src/components/input/input-area.d.ts.map +1 -0
  341. package/dist/src/components/input/input-group.d.ts +39 -0
  342. package/dist/src/components/input/input-group.d.ts.map +1 -0
  343. package/dist/src/components/input/input.d.ts +157 -0
  344. package/dist/src/components/input/input.d.ts.map +1 -0
  345. package/dist/src/components/label/index.d.ts +2 -0
  346. package/dist/src/components/label/index.d.ts.map +1 -0
  347. package/dist/src/components/label/label.d.ts +54 -0
  348. package/dist/src/components/label/label.d.ts.map +1 -0
  349. package/dist/src/components/layer-card/index.d.ts +2 -0
  350. package/dist/src/components/layer-card/index.d.ts.map +1 -0
  351. package/dist/src/components/layer-card/layer-card.d.ts +16 -0
  352. package/dist/src/components/layer-card/layer-card.d.ts.map +1 -0
  353. package/dist/src/components/link/index.d.ts +2 -0
  354. package/dist/src/components/link/index.d.ts.map +1 -0
  355. package/dist/src/components/link/link.d.ts +35 -0
  356. package/dist/src/components/link/link.d.ts.map +1 -0
  357. package/dist/src/components/loader/index.d.ts +3 -0
  358. package/dist/src/components/loader/index.d.ts.map +1 -0
  359. package/dist/src/components/loader/loader.d.ts +30 -0
  360. package/dist/src/components/loader/loader.d.ts.map +1 -0
  361. package/dist/src/components/loader/skeleton-line.d.ts +10 -0
  362. package/dist/src/components/loader/skeleton-line.d.ts.map +1 -0
  363. package/dist/src/components/menubar/index.d.ts +3 -0
  364. package/dist/src/components/menubar/index.d.ts.map +1 -0
  365. package/dist/src/components/menubar/menubar.d.ts +22 -0
  366. package/dist/src/components/menubar/menubar.d.ts.map +1 -0
  367. package/dist/src/components/menubar/use-menu-navigation.d.ts +8 -0
  368. package/dist/src/components/menubar/use-menu-navigation.d.ts.map +1 -0
  369. package/dist/src/components/meter/index.d.ts +2 -0
  370. package/dist/src/components/meter/index.d.ts.map +1 -0
  371. package/dist/src/components/meter/meter.d.ts +18 -0
  372. package/dist/src/components/meter/meter.d.ts.map +1 -0
  373. package/dist/src/components/pagination/index.d.ts +2 -0
  374. package/dist/src/components/pagination/index.d.ts.map +1 -0
  375. package/dist/src/components/pagination/pagination.d.ts +28 -0
  376. package/dist/src/components/pagination/pagination.d.ts.map +1 -0
  377. package/dist/src/components/popover/index.d.ts +3 -0
  378. package/dist/src/components/popover/index.d.ts.map +1 -0
  379. package/dist/src/components/popover/popover.d.ts +110 -0
  380. package/dist/src/components/popover/popover.d.ts.map +1 -0
  381. package/dist/src/components/radio/index.d.ts +2 -0
  382. package/dist/src/components/radio/index.d.ts.map +1 -0
  383. package/dist/src/components/radio/radio.d.ts +141 -0
  384. package/dist/src/components/radio/radio.d.ts.map +1 -0
  385. package/dist/src/components/select/index.d.ts +2 -0
  386. package/dist/src/components/select/index.d.ts.map +1 -0
  387. package/dist/src/components/select/select.d.ts +128 -0
  388. package/dist/src/components/select/select.d.ts.map +1 -0
  389. package/dist/src/components/sensitive-input/index.d.ts +2 -0
  390. package/dist/src/components/sensitive-input/index.d.ts.map +1 -0
  391. package/dist/src/components/sensitive-input/sensitive-input.d.ts +70 -0
  392. package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -0
  393. package/dist/src/components/surface/index.d.ts +2 -0
  394. package/dist/src/components/surface/index.d.ts.map +1 -0
  395. package/dist/src/components/surface/surface.d.ts +48 -0
  396. package/dist/src/components/surface/surface.d.ts.map +1 -0
  397. package/dist/src/components/switch/index.d.ts +2 -0
  398. package/dist/src/components/switch/index.d.ts.map +1 -0
  399. package/dist/src/components/switch/switch.d.ts +155 -0
  400. package/dist/src/components/switch/switch.d.ts.map +1 -0
  401. package/dist/src/components/table/index.d.ts +2 -0
  402. package/dist/src/components/table/index.d.ts.map +1 -0
  403. package/dist/src/components/table/table.d.ts +54 -0
  404. package/dist/src/components/table/table.d.ts.map +1 -0
  405. package/dist/src/components/tabs/index.d.ts +3 -0
  406. package/dist/src/components/tabs/index.d.ts.map +1 -0
  407. package/dist/src/components/tabs/tabs.d.ts +64 -0
  408. package/dist/src/components/tabs/tabs.d.ts.map +1 -0
  409. package/dist/src/components/text/index.d.ts +2 -0
  410. package/dist/src/components/text/index.d.ts.map +1 -0
  411. package/dist/src/components/text/text.d.ts +153 -0
  412. package/dist/src/components/text/text.d.ts.map +1 -0
  413. package/dist/src/components/toast/index.d.ts +3 -0
  414. package/dist/src/components/toast/index.d.ts.map +1 -0
  415. package/dist/src/components/toast/toast.d.ts +66 -0
  416. package/dist/src/components/toast/toast.d.ts.map +1 -0
  417. package/dist/src/components/tooltip/index.d.ts +2 -0
  418. package/dist/src/components/tooltip/index.d.ts.map +1 -0
  419. package/dist/src/components/tooltip/tooltip.d.ts +43 -0
  420. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -0
  421. package/dist/src/index.d.ts +39 -0
  422. package/dist/src/index.d.ts.map +1 -0
  423. package/dist/src/primitives/accordion.d.ts +13 -0
  424. package/dist/src/primitives/accordion.d.ts.map +1 -0
  425. package/dist/src/primitives/alert-dialog.d.ts +13 -0
  426. package/dist/src/primitives/alert-dialog.d.ts.map +1 -0
  427. package/dist/src/primitives/autocomplete.d.ts +13 -0
  428. package/dist/src/primitives/autocomplete.d.ts.map +1 -0
  429. package/dist/src/primitives/avatar.d.ts +13 -0
  430. package/dist/src/primitives/avatar.d.ts.map +1 -0
  431. package/dist/src/primitives/button.d.ts +13 -0
  432. package/dist/src/primitives/button.d.ts.map +1 -0
  433. package/dist/src/primitives/checkbox-group.d.ts +13 -0
  434. package/dist/src/primitives/checkbox-group.d.ts.map +1 -0
  435. package/dist/src/primitives/checkbox.d.ts +13 -0
  436. package/dist/src/primitives/checkbox.d.ts.map +1 -0
  437. package/dist/src/primitives/collapsible.d.ts +13 -0
  438. package/dist/src/primitives/collapsible.d.ts.map +1 -0
  439. package/dist/src/primitives/combobox.d.ts +13 -0
  440. package/dist/src/primitives/combobox.d.ts.map +1 -0
  441. package/dist/src/primitives/context-menu.d.ts +13 -0
  442. package/dist/src/primitives/context-menu.d.ts.map +1 -0
  443. package/dist/src/primitives/dialog.d.ts +13 -0
  444. package/dist/src/primitives/dialog.d.ts.map +1 -0
  445. package/dist/src/primitives/direction-provider.d.ts +13 -0
  446. package/dist/src/primitives/direction-provider.d.ts.map +1 -0
  447. package/dist/src/primitives/field.d.ts +13 -0
  448. package/dist/src/primitives/field.d.ts.map +1 -0
  449. package/dist/src/primitives/fieldset.d.ts +13 -0
  450. package/dist/src/primitives/fieldset.d.ts.map +1 -0
  451. package/dist/src/primitives/form.d.ts +13 -0
  452. package/dist/src/primitives/form.d.ts.map +1 -0
  453. package/dist/src/primitives/index.d.ts +52 -0
  454. package/dist/src/primitives/index.d.ts.map +1 -0
  455. package/dist/src/primitives/input.d.ts +13 -0
  456. package/dist/src/primitives/input.d.ts.map +1 -0
  457. package/dist/src/primitives/menu.d.ts +13 -0
  458. package/dist/src/primitives/menu.d.ts.map +1 -0
  459. package/dist/src/primitives/menubar.d.ts +13 -0
  460. package/dist/src/primitives/menubar.d.ts.map +1 -0
  461. package/dist/src/primitives/meter.d.ts +13 -0
  462. package/dist/src/primitives/meter.d.ts.map +1 -0
  463. package/dist/src/primitives/navigation-menu.d.ts +13 -0
  464. package/dist/src/primitives/navigation-menu.d.ts.map +1 -0
  465. package/dist/src/primitives/number-field.d.ts +13 -0
  466. package/dist/src/primitives/number-field.d.ts.map +1 -0
  467. package/dist/src/primitives/popover.d.ts +13 -0
  468. package/dist/src/primitives/popover.d.ts.map +1 -0
  469. package/dist/src/primitives/preview-card.d.ts +13 -0
  470. package/dist/src/primitives/preview-card.d.ts.map +1 -0
  471. package/dist/src/primitives/progress.d.ts +13 -0
  472. package/dist/src/primitives/progress.d.ts.map +1 -0
  473. package/dist/src/primitives/radio-group.d.ts +13 -0
  474. package/dist/src/primitives/radio-group.d.ts.map +1 -0
  475. package/dist/src/primitives/radio.d.ts +13 -0
  476. package/dist/src/primitives/radio.d.ts.map +1 -0
  477. package/dist/src/primitives/scroll-area.d.ts +13 -0
  478. package/dist/src/primitives/scroll-area.d.ts.map +1 -0
  479. package/dist/src/primitives/select.d.ts +13 -0
  480. package/dist/src/primitives/select.d.ts.map +1 -0
  481. package/dist/src/primitives/separator.d.ts +13 -0
  482. package/dist/src/primitives/separator.d.ts.map +1 -0
  483. package/dist/src/primitives/slider.d.ts +13 -0
  484. package/dist/src/primitives/slider.d.ts.map +1 -0
  485. package/dist/src/primitives/switch.d.ts +13 -0
  486. package/dist/src/primitives/switch.d.ts.map +1 -0
  487. package/dist/src/primitives/tabs.d.ts +13 -0
  488. package/dist/src/primitives/tabs.d.ts.map +1 -0
  489. package/dist/src/primitives/toast.d.ts +13 -0
  490. package/dist/src/primitives/toast.d.ts.map +1 -0
  491. package/dist/src/primitives/toggle-group.d.ts +13 -0
  492. package/dist/src/primitives/toggle-group.d.ts.map +1 -0
  493. package/dist/src/primitives/toggle.d.ts +13 -0
  494. package/dist/src/primitives/toggle.d.ts.map +1 -0
  495. package/dist/src/primitives/toolbar.d.ts +13 -0
  496. package/dist/src/primitives/toolbar.d.ts.map +1 -0
  497. package/dist/src/primitives/tooltip.d.ts +13 -0
  498. package/dist/src/primitives/tooltip.d.ts.map +1 -0
  499. package/dist/src/registry/index.d.ts +8 -0
  500. package/dist/src/registry/index.d.ts.map +1 -0
  501. package/dist/src/registry/types.d.ts +191 -0
  502. package/dist/src/registry/types.d.ts.map +1 -0
  503. package/dist/src/utils/cn.d.ts +4 -0
  504. package/dist/src/utils/cn.d.ts.map +1 -0
  505. package/dist/src/utils/index.d.ts +3 -0
  506. package/dist/src/utils/index.d.ts.map +1 -0
  507. package/dist/src/utils/link-provider.d.ts +12 -0
  508. package/dist/src/utils/link-provider.d.ts.map +1 -0
  509. package/dist/src/utils/prop-examples.d.ts +36 -0
  510. package/dist/src/utils/prop-examples.d.ts.map +1 -0
  511. package/dist/styles/kumo-binding.css +190 -0
  512. package/dist/styles/kumo-standalone.css +2 -0
  513. package/dist/styles/kumo.css +55 -0
  514. package/dist/styles/theme-fedramp.css +20 -0
  515. package/dist/styles/theme-kumo.css +186 -0
  516. package/dist/surface-BIC6CXiz.js +21 -0
  517. package/dist/surface-BIC6CXiz.js.map +1 -0
  518. package/dist/switch-D4duMhJ0.js +257 -0
  519. package/dist/switch-D4duMhJ0.js.map +1 -0
  520. package/dist/table-KuvHGpL8.js +153 -0
  521. package/dist/table-KuvHGpL8.js.map +1 -0
  522. package/dist/tabs-lQup-IbT.js +85 -0
  523. package/dist/tabs-lQup-IbT.js.map +1 -0
  524. package/dist/text-BEhqwMfe.js +97 -0
  525. package/dist/text-BEhqwMfe.js.map +1 -0
  526. package/dist/toast-8YyyQuqZ.js +69 -0
  527. package/dist/toast-8YyyQuqZ.js.map +1 -0
  528. package/dist/tooltip-DJWsDTWJ.js +85 -0
  529. package/dist/tooltip-DJWsDTWJ.js.map +1 -0
  530. package/dist/utils.js +10 -0
  531. package/dist/utils.js.map +1 -0
  532. package/dist/vendor-base-ui-DWIDNgE1.js +20446 -0
  533. package/dist/vendor-base-ui-DWIDNgE1.js.map +1 -0
  534. package/dist/vendor-floating-ui-BgbEw62H.js +1286 -0
  535. package/dist/vendor-floating-ui-BgbEw62H.js.map +1 -0
  536. package/dist/vendor-styling-BQbxAbdS.js +2775 -0
  537. package/dist/vendor-styling-BQbxAbdS.js.map +1 -0
  538. package/dist/vendor-utils-DD8jNJwD.js +741 -0
  539. package/dist/vendor-utils-DD8jNJwD.js.map +1 -0
  540. package/package.json +444 -0
  541. package/scripts/component-registry/cache.ts +123 -0
  542. package/scripts/component-registry/discovery.ts +469 -0
  543. package/scripts/component-registry/example-cleanup.ts +168 -0
  544. package/scripts/component-registry/index.test.ts +680 -0
  545. package/scripts/component-registry/index.ts +874 -0
  546. package/scripts/component-registry/markdown-generator.ts +222 -0
  547. package/scripts/component-registry/metadata.ts +643 -0
  548. package/scripts/component-registry/props-filter.ts +310 -0
  549. package/scripts/component-registry/schema-generator.ts +326 -0
  550. package/scripts/component-registry/sub-components.ts +349 -0
  551. package/scripts/component-registry/types.ts +156 -0
  552. package/scripts/component-registry/utils.ts +280 -0
  553. package/scripts/component-registry/variant-parser.ts +261 -0
  554. package/scripts/css-build.ts +55 -0
  555. package/scripts/generate-primitives.ts +178 -0
  556. package/scripts/theme-generator/config.ts +392 -0
  557. package/scripts/theme-generator/generate-css.ts +250 -0
  558. package/scripts/theme-generator/index.ts +159 -0
  559. package/scripts/theme-generator/migrate.ts +560 -0
  560. package/scripts/theme-generator/types.ts +86 -0
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Utility functions for component registry generation.
3
+ *
4
+ * Pure functions for string transformations and common operations.
5
+ */
6
+
7
+ import { readFileSync } from "node:fs";
8
+ import { join, dirname } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+
13
+ // =============================================================================
14
+ // String Transformation Utilities
15
+ // =============================================================================
16
+
17
+ /**
18
+ * Convert kebab-case to PascalCase.
19
+ * Example: "clipboard-text" -> "ClipboardText"
20
+ */
21
+ export function toPascalCase(str: string): string {
22
+ return str
23
+ .split("-")
24
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
25
+ .join("");
26
+ }
27
+
28
+ /**
29
+ * Convert PascalCase to SCREAMING_SNAKE_CASE.
30
+ * Example: "ClipboardText" -> "CLIPBOARD_TEXT"
31
+ */
32
+ export function toScreamingSnakeCase(str: string): string {
33
+ return str
34
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
35
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
36
+ .toUpperCase();
37
+ }
38
+
39
+ // =============================================================================
40
+ // Balanced Brace Extraction
41
+ // =============================================================================
42
+
43
+ /**
44
+ * Extract a balanced brace block starting from a position in the string.
45
+ * Returns the content between the outermost braces, or null if unbalanced.
46
+ */
47
+ export function extractBalancedBraces(
48
+ content: string,
49
+ startIndex: number,
50
+ ): string | null {
51
+ let depth = 0;
52
+ let start = -1;
53
+
54
+ for (let i = startIndex; i < content.length; i++) {
55
+ if (content[i] === "{") {
56
+ if (depth === 0) start = i;
57
+ depth++;
58
+ } else if (content[i] === "}") {
59
+ depth--;
60
+ if (depth === 0 && start !== -1) {
61
+ return content.substring(start, i + 1);
62
+ }
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+
68
+ // =============================================================================
69
+ // Semantic Color Parsing
70
+ // =============================================================================
71
+
72
+ let _semanticColorNames: string[] | null = null;
73
+
74
+ /**
75
+ * Parse theme-kumo.css to extract semantic color names from --color-* and --text-color-* variables.
76
+ * Excludes raw palette colors (e.g., --color-red-650, --color-neutral-50) which have numeric suffixes.
77
+ * Results are cached for performance.
78
+ */
79
+ export function parseSemanticColorNames(): string[] {
80
+ if (_semanticColorNames) {
81
+ return _semanticColorNames;
82
+ }
83
+
84
+ const themePath = join(__dirname, "../../src/styles/theme-kumo.css");
85
+ const content = readFileSync(themePath, "utf-8");
86
+
87
+ const colorNames = new Set<string>();
88
+
89
+ // Match semantic color variable declarations that use light-dark()
90
+ // Pattern: "--color-<name>: light-dark(" or "--text-color-<name>: light-dark("
91
+ // This excludes raw palette colors which are defined with direct values like "oklch(...)"
92
+ const semanticColorPattern =
93
+ /--(?:text-)?color-([a-zA-Z][a-zA-Z0-9-]*)\s*:\s*light-dark\(/g;
94
+ let match: RegExpExecArray | null;
95
+
96
+ while ((match = semanticColorPattern.exec(content)) !== null) {
97
+ colorNames.add(match[1]);
98
+ }
99
+
100
+ _semanticColorNames = [...colorNames].sort();
101
+ return _semanticColorNames;
102
+ }
103
+
104
+ // Utility prefixes that use color tokens
105
+ const COLOR_UTILITY_PREFIXES = [
106
+ "text",
107
+ "bg",
108
+ "ring",
109
+ "outline",
110
+ "fill",
111
+ "border",
112
+ ];
113
+
114
+ /**
115
+ * Extract semantic color classes used in a source file.
116
+ * Returns array of Tailwind classes like ["bg-kumo-base", "text-kumo-subtle"].
117
+ */
118
+ export function extractSemanticColors(sourceFile: string): string[] {
119
+ try {
120
+ const content = readFileSync(sourceFile, "utf-8");
121
+ const matches: string[] = [];
122
+ const semanticColorNames = parseSemanticColorNames();
123
+
124
+ // Build regex pattern for each prefix + semantic color combination
125
+ // Match patterns like: text-surface, bg-primary, border-color, ring-kumo-line
126
+ // Also handles variants like: hover:bg-primary, disabled:text-kumo-subtle
127
+ for (const prefix of COLOR_UTILITY_PREFIXES) {
128
+ for (const colorName of semanticColorNames) {
129
+ // Escape hyphens for regex and create pattern
130
+ const pattern = new RegExp(
131
+ `(?:[\\w\\[\\]=_-]+:)*(${prefix}-${colorName})(?![a-zA-Z0-9-])`,
132
+ "g",
133
+ );
134
+ let match: RegExpExecArray | null;
135
+ while ((match = pattern.exec(content)) !== null) {
136
+ matches.push(match[1]);
137
+ }
138
+ }
139
+ }
140
+
141
+ return [...new Set(matches)].sort();
142
+ } catch {
143
+ return [];
144
+ }
145
+ }
146
+
147
+ // =============================================================================
148
+ // State Class Extraction
149
+ // =============================================================================
150
+
151
+ /**
152
+ * Extract state-specific classes from a class string.
153
+ * Identifies hover:*, focus:*, active:*, disabled:*, not-disabled:* prefixes.
154
+ * Also handles complex selectors like [&:hover>span], [&:focus-within>span].
155
+ */
156
+ export function extractStateClasses(
157
+ classString: string,
158
+ ): Record<string, string> {
159
+ const states: Record<string, string> = {};
160
+
161
+ // Split by whitespace to process each class individually
162
+ const classes = classString.split(/\s+/);
163
+
164
+ for (const cls of classes) {
165
+ if (!cls) continue;
166
+
167
+ // Check for hover states
168
+ if (cls.startsWith("hover:") || cls.match(/^\[&:hover[^\]]*\]:/)) {
169
+ states.hover = states.hover ? `${states.hover} ${cls}` : cls;
170
+ }
171
+ // Check for focus states (focus, focus-visible, focus-within)
172
+ else if (
173
+ cls.match(/^(focus|focus-visible|focus-within):/) ||
174
+ cls.match(/^\[&:focus(-visible|-within)?[^\]]*\]:/)
175
+ ) {
176
+ states.focus = states.focus ? `${states.focus} ${cls}` : cls;
177
+ }
178
+ // Check for active state
179
+ else if (cls.startsWith("active:")) {
180
+ states.active = states.active ? `${states.active} ${cls}` : cls;
181
+ }
182
+ // Check for disabled state
183
+ else if (cls.startsWith("disabled:")) {
184
+ states.disabled = states.disabled ? `${states.disabled} ${cls}` : cls;
185
+ }
186
+ // Check for not-disabled state
187
+ else if (cls.startsWith("not-disabled:")) {
188
+ states["not-disabled"] = states["not-disabled"]
189
+ ? `${states["not-disabled"]} ${cls}`
190
+ : cls;
191
+ }
192
+ // Check for data-state
193
+ else if (cls.match(/^data-\[state=[^\]]+\]:/)) {
194
+ states["data-state"] = states["data-state"]
195
+ ? `${states["data-state"]} ${cls}`
196
+ : cls;
197
+ }
198
+ }
199
+
200
+ return states;
201
+ }
202
+
203
+ // =============================================================================
204
+ // Block Dependency Extraction
205
+ // =============================================================================
206
+
207
+ /**
208
+ * Extract component dependencies from a block file.
209
+ * Returns array of component names imported from "../../components/*"
210
+ * Example: import { Tabs } from "../../components/tabs" -> ["Tabs"]
211
+ */
212
+ export function extractBlockDependencies(sourceFile: string): string[] {
213
+ try {
214
+ const content = readFileSync(sourceFile, "utf-8");
215
+ const dependencies = new Set<string>();
216
+
217
+ // Match imports from ../../components/* or ../../blocks/*
218
+ // Pattern: import { Foo, Bar } from "../../components/something"
219
+ // Pattern: import { Foo } from "../../blocks/something"
220
+ const importPattern =
221
+ /import\s+(?:type\s+)?\{([^}]+)\}\s+from\s+["']\.\.\/\.\.\/(?:components|blocks)\/[^"']+["']/g;
222
+ let match: RegExpExecArray | null;
223
+
224
+ while ((match = importPattern.exec(content)) !== null) {
225
+ const importList = match[1];
226
+ // Split by comma and extract component names
227
+ const items = importList
228
+ .split(",")
229
+ .map((s) => s.trim())
230
+ .filter(Boolean);
231
+
232
+ for (const item of items) {
233
+ // Skip type imports
234
+ if (item.startsWith("type ")) {
235
+ continue;
236
+ }
237
+ // Extract name (handle "Foo as Bar" -> "Foo")
238
+ const nameMatch = item.match(/^(\w+)(?:\s+as\s+\w+)?/);
239
+ if (nameMatch) {
240
+ dependencies.add(nameMatch[1]);
241
+ }
242
+ }
243
+ }
244
+
245
+ return [...dependencies].sort();
246
+ } catch {
247
+ return [];
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Get all files for a block (main file + stories + tests if they exist)
253
+ * Returns array of file paths relative to the blocks directory
254
+ */
255
+ export function getBlockFiles(blockDir: string, dirName: string): string[] {
256
+ const files: string[] = [];
257
+
258
+ // Main file (always exists)
259
+ files.push(`${dirName}/${dirName}.tsx`);
260
+
261
+ // Check for stories
262
+ const storiesPath = join(blockDir, dirName, `${dirName}.stories.tsx`);
263
+ try {
264
+ readFileSync(storiesPath);
265
+ files.push(`${dirName}/${dirName}.stories.tsx`);
266
+ } catch {
267
+ // Stories file doesn't exist
268
+ }
269
+
270
+ // Check for tests
271
+ const testPath = join(blockDir, dirName, `${dirName}.test.tsx`);
272
+ try {
273
+ readFileSync(testPath);
274
+ files.push(`${dirName}/${dirName}.test.tsx`);
275
+ } catch {
276
+ // Test file doesn't exist
277
+ }
278
+
279
+ return files;
280
+ }
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Variant parsing for component registry generation.
3
+ *
4
+ * Extracts KUMO_*_VARIANTS, KUMO_*_DEFAULT_VARIANTS, and KUMO_*_STYLING from component files
5
+ * using regex parsing to avoid import issues with JSX/React dependencies.
6
+ */
7
+
8
+ import { readFileSync } from "node:fs";
9
+ import { extractBalancedBraces, extractStateClasses } from "./utils.js";
10
+ import type { ComponentStyling } from "./types.js";
11
+
12
+ // =============================================================================
13
+ // Types
14
+ // =============================================================================
15
+
16
+ export interface ExtractedVariants {
17
+ // biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
18
+ variants: Record<string, Record<string, any>>;
19
+ defaults: Record<string, string>;
20
+ baseStyles: string | null;
21
+ }
22
+
23
+ // =============================================================================
24
+ // Base Styles Extraction
25
+ // =============================================================================
26
+
27
+ /**
28
+ * Extract KUMO_*_BASE_STYLES from a component file.
29
+ * Returns the base styles string or null if not found.
30
+ */
31
+ export function extractBaseStylesFromFile(filePath: string): string | null {
32
+ try {
33
+ const content = readFileSync(filePath, "utf-8");
34
+
35
+ // Match: export const KUMO_*_BASE_STYLES = "..." or '...' or `...`
36
+ // Handles multi-line strings with template literals
37
+ const baseStylesMatch = content.match(
38
+ /export\s+const\s+KUMO_\w+_BASE_STYLES\s*=\s*["'`]([^"'`]+)["'`]/,
39
+ );
40
+
41
+ if (baseStylesMatch) {
42
+ return baseStylesMatch[1].trim();
43
+ }
44
+
45
+ return null;
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ // =============================================================================
52
+ // Variants Object Parsing
53
+ // =============================================================================
54
+
55
+ /**
56
+ * Parse a variants object string into a structured object.
57
+ * Extracts variant keys and their descriptions.
58
+ */
59
+ // biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
60
+ export function parseVariantsObject(
61
+ objStr: string,
62
+ ): Record<string, Record<string, any>> {
63
+ // biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
64
+ const result: Record<string, Record<string, any>> = {};
65
+
66
+ // Find top-level property names (e.g., shape, size, variant)
67
+ // These are identifiers followed by `: {` at the first nesting level
68
+ const topLevelPropPattern = /^\s*(\w+)\s*:\s*\{/gm;
69
+ let propMatch: RegExpExecArray | null;
70
+
71
+ while ((propMatch = topLevelPropPattern.exec(objStr)) !== null) {
72
+ const propName = propMatch[1];
73
+
74
+ // Skip nested properties like classes, description
75
+ if (["classes", "description"].includes(propName)) continue;
76
+
77
+ // Extract the balanced brace block for this property
78
+ const propStartIndex = propMatch.index + propMatch[0].length - 1; // Start at the {
79
+ const propBlock = extractBalancedBraces(objStr, propStartIndex);
80
+
81
+ if (!propBlock) continue;
82
+
83
+ // Now parse the variant values within this block
84
+ // biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
85
+ const variants: Record<string, any> = {};
86
+ // Match variant names including quoted keys like "secondary-destructive"
87
+ const variantPropPattern = /^\s*(?:"([^"]+)"|'([^']+)'|(\w+))\s*:\s*\{/gm;
88
+ let variantMatch: RegExpExecArray | null;
89
+
90
+ while ((variantMatch = variantPropPattern.exec(propBlock)) !== null) {
91
+ // Capture group 1 = double-quoted, 2 = single-quoted, 3 = unquoted
92
+ const variantName = variantMatch[1] || variantMatch[2] || variantMatch[3];
93
+
94
+ // Skip nested properties
95
+ if (["classes", "description"].includes(variantName)) continue;
96
+
97
+ // Extract the balanced brace block for this variant
98
+ const variantStartIndex = variantMatch.index + variantMatch[0].length - 1;
99
+ const variantBlock = extractBalancedBraces(propBlock, variantStartIndex);
100
+
101
+ if (!variantBlock) continue;
102
+
103
+ // Extract description if present
104
+ const descMatch = variantBlock.match(
105
+ /description\s*:\s*["']([^"']*)["']/,
106
+ );
107
+ // Extract classes if present (for Figma plugin consumption)
108
+ const classesMatch = variantBlock.match(/classes\s*:\s*["']([^"']*)["']/);
109
+
110
+ // Extract state classes from the classes string
111
+ const stateClasses = classesMatch
112
+ ? extractStateClasses(classesMatch[1])
113
+ : {};
114
+
115
+ variants[variantName] = {
116
+ description: descMatch ? descMatch[1] : undefined,
117
+ ...(classesMatch && { classes: classesMatch[1] }),
118
+ ...(Object.keys(stateClasses).length > 0 && { stateClasses }),
119
+ };
120
+ }
121
+
122
+ if (Object.keys(variants).length > 0) {
123
+ result[propName] = variants;
124
+ }
125
+ }
126
+
127
+ return result;
128
+ }
129
+
130
+ /**
131
+ * Parse a defaults object string into a key-value map.
132
+ */
133
+ export function parseDefaultsObject(objStr: string): Record<string, string> {
134
+ const result: Record<string, string> = {};
135
+
136
+ // Match properties like: variant: "primary", size: "base"
137
+ const propPattern = /(\w+)\s*:\s*["']([^"']*)["']/g;
138
+ let match: RegExpExecArray | null;
139
+
140
+ while ((match = propPattern.exec(objStr)) !== null) {
141
+ result[match[1]] = match[2];
142
+ }
143
+
144
+ return result;
145
+ }
146
+
147
+ // =============================================================================
148
+ // Main Extraction
149
+ // =============================================================================
150
+
151
+ /**
152
+ * Extract KUMO_*_VARIANTS and KUMO_*_DEFAULT_VARIANTS from a component file.
153
+ * Uses regex parsing to avoid import issues with JSX/React dependencies.
154
+ */
155
+ export function extractVariantsFromFile(
156
+ filePath: string,
157
+ ): ExtractedVariants | null {
158
+ try {
159
+ const content = readFileSync(filePath, "utf-8");
160
+
161
+ // Find KUMO_*_VARIANTS export start position
162
+ const variantsStartMatch = content.match(
163
+ /export\s+const\s+KUMO_\w+_VARIANTS\s*=\s*/,
164
+ );
165
+ // Find KUMO_*_DEFAULT_VARIANTS export start position
166
+ const defaultsStartMatch = content.match(
167
+ /export\s+const\s+KUMO_\w+_DEFAULT_VARIANTS\s*=\s*/,
168
+ );
169
+
170
+ if (!variantsStartMatch || !defaultsStartMatch) {
171
+ return null;
172
+ }
173
+
174
+ // Extract balanced brace content for variants
175
+ const variantsStartIndex =
176
+ (variantsStartMatch.index ?? 0) + variantsStartMatch[0].length;
177
+ const variantsBlock = extractBalancedBraces(content, variantsStartIndex);
178
+
179
+ // Extract balanced brace content for defaults
180
+ const defaultsStartIndex =
181
+ (defaultsStartMatch.index ?? 0) + defaultsStartMatch[0].length;
182
+ const defaultsBlock = extractBalancedBraces(content, defaultsStartIndex);
183
+
184
+ if (!variantsBlock || !defaultsBlock) {
185
+ return null;
186
+ }
187
+
188
+ // Parse the variants object (may be empty for components without variants)
189
+ const variants = parseVariantsObject(variantsBlock);
190
+ const defaults = parseDefaultsObject(defaultsBlock);
191
+
192
+ // Extract base styles if present
193
+ const baseStyles = extractBaseStylesFromFile(filePath);
194
+
195
+ // Return even if variants is empty - component still has props to document
196
+ return { variants, defaults, baseStyles };
197
+ } catch {
198
+ return null;
199
+ }
200
+ }
201
+
202
+ // =============================================================================
203
+ // Styling Extraction
204
+ // =============================================================================
205
+
206
+ /**
207
+ * Parse a styling object string into a ComponentStyling object.
208
+ * Handles nested objects like container, title, description, closeButton, etc.
209
+ */
210
+ function parseStylingObject(objStr: string): ComponentStyling | null {
211
+ try {
212
+ // Remove 'as const' suffix if present
213
+ const cleanedStr = objStr.replace(/\s*as\s+const\s*$/, "");
214
+
215
+ // Use Function constructor to safely evaluate the object literal
216
+ // This is safe because we control the input (it comes from our own source files)
217
+ // biome-ignore lint/security/noGlobalEval: Safe evaluation of known source file content
218
+ const parsed = new Function(`return ${cleanedStr}`)();
219
+
220
+ return parsed as ComponentStyling;
221
+ } catch {
222
+ return null;
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Extract KUMO_*_STYLING from a component file.
228
+ * Returns the styling object or null if not found.
229
+ *
230
+ * This allows components to define Figma-specific styling metadata
231
+ * that gets automatically picked up by the registry generator.
232
+ */
233
+ export function extractStylingFromFile(
234
+ filePath: string,
235
+ ): ComponentStyling | null {
236
+ try {
237
+ const content = readFileSync(filePath, "utf-8");
238
+
239
+ // Find KUMO_*_STYLING export start position
240
+ const stylingStartMatch = content.match(
241
+ /export\s+const\s+KUMO_\w+_STYLING\s*=\s*/,
242
+ );
243
+
244
+ if (!stylingStartMatch) {
245
+ return null;
246
+ }
247
+
248
+ // Extract balanced brace content for styling
249
+ const stylingStartIndex =
250
+ (stylingStartMatch.index ?? 0) + stylingStartMatch[0].length;
251
+ const stylingBlock = extractBalancedBraces(content, stylingStartIndex);
252
+
253
+ if (!stylingBlock) {
254
+ return null;
255
+ }
256
+
257
+ return parseStylingObject(stylingBlock);
258
+ } catch {
259
+ return null;
260
+ }
261
+ }
@@ -0,0 +1,55 @@
1
+ import { copyFileSync, mkdirSync, existsSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { execSync } from "child_process";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+
9
+ const srcDir = join(__dirname, "../src/styles");
10
+ const distDir = join(__dirname, "../dist/styles");
11
+
12
+ // Create dist/styles directory if it doesn't exist
13
+ if (!existsSync(distDir)) {
14
+ mkdirSync(distDir, { recursive: true });
15
+ }
16
+
17
+ // Copy CSS files for Tailwind users (raw CSS with Tailwind directives)
18
+ const cssFiles: string[] = [
19
+ "kumo.css",
20
+ "kumo-binding.css",
21
+ "theme-kumo.css",
22
+ "theme-fedramp.css",
23
+ ];
24
+
25
+ cssFiles.forEach((file) => {
26
+ const srcPath = join(srcDir, file);
27
+ const distPath = join(distDir, file);
28
+
29
+ if (existsSync(srcPath)) {
30
+ copyFileSync(srcPath, distPath);
31
+ console.log(`✓ Copied ${file} to dist/styles/ (Tailwind version)`);
32
+ } else {
33
+ console.warn(`⚠ Warning: ${file} not found in src/styles/`);
34
+ }
35
+ });
36
+
37
+ // Compile standalone CSS for non-Tailwind users
38
+ console.log("📦 Compiling standalone CSS...");
39
+ try {
40
+ const standaloneInput = join(srcDir, "kumo-standalone.css");
41
+ const standaloneOutput = join(distDir, "kumo-standalone.css");
42
+
43
+ // Use Tailwind CLI to compile the CSS
44
+ execSync(
45
+ `npx tailwindcss -i ${standaloneInput} -o ${standaloneOutput} --minify`,
46
+ { stdio: "inherit" },
47
+ );
48
+
49
+ console.log("✓ Compiled kumo-standalone.css");
50
+ } catch (error) {
51
+ console.error("❌ Failed to compile standalone CSS:", error);
52
+ process.exit(1);
53
+ }
54
+
55
+ console.log("✅ CSS build complete");