@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,469 @@
1
+ /**
2
+ * Component discovery for registry generation.
3
+ *
4
+ * Auto-discovers components from the filesystem and builds configurations
5
+ * by parsing index.ts exports and component files.
6
+ */
7
+
8
+ import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import type {
11
+ ComponentConfig,
12
+ ComponentType,
13
+ ComponentOverride,
14
+ DetectedExports,
15
+ } from "./types.js";
16
+ import { toPascalCase } from "./utils.js";
17
+ import {
18
+ extractVariantsFromFile,
19
+ extractStylingFromFile,
20
+ } from "./variant-parser.js";
21
+
22
+ // =============================================================================
23
+ // Category Configuration
24
+ // =============================================================================
25
+
26
+ /**
27
+ * Category mappings based on component type.
28
+ * Key is the directory name (kebab-case).
29
+ */
30
+ export const CATEGORY_MAP: Record<string, string> = {
31
+ // Action
32
+ button: "Action",
33
+ "clipboard-text": "Action",
34
+ // Display
35
+ badge: "Display",
36
+ breadcrumbs: "Display",
37
+ code: "Display",
38
+ collapsible: "Display",
39
+ empty: "Display",
40
+ "layer-card": "Display",
41
+ meter: "Display",
42
+ text: "Display",
43
+ // Feedback
44
+ banner: "Feedback",
45
+ loader: "Feedback",
46
+ toast: "Feedback",
47
+ // Input
48
+ checkbox: "Input",
49
+ combobox: "Input",
50
+ "date-range-picker": "Input",
51
+ field: "Input",
52
+ input: "Input",
53
+ radio: "Input",
54
+ select: "Input",
55
+ switch: "Input",
56
+ // Layout
57
+ grid: "Layout",
58
+ surface: "Layout",
59
+ // Navigation
60
+ "command-palette": "Navigation",
61
+ menubar: "Navigation",
62
+ pagination: "Navigation",
63
+ tabs: "Navigation",
64
+ // Overlay
65
+ dialog: "Overlay",
66
+ dropdown: "Overlay",
67
+ popover: "Overlay",
68
+ tooltip: "Overlay",
69
+ // Blocks
70
+ "page-header": "Layout",
71
+ "resource-list": "Layout",
72
+ };
73
+
74
+ /**
75
+ * Overrides for component metadata that can't be auto-detected.
76
+ * Key is the directory name (kebab-case).
77
+ * Note: Component names and props types are now auto-detected from index.ts exports.
78
+ */
79
+ export const COMPONENT_OVERRIDES: Record<string, ComponentOverride> = {};
80
+
81
+ // =============================================================================
82
+ // Export Detection
83
+ // =============================================================================
84
+
85
+ /**
86
+ * Parse index.ts to detect the main component name and props type.
87
+ * This eliminates the need for manual overrides for naming conventions.
88
+ *
89
+ * Detection rules:
90
+ * 1. Component name: First PascalCase named export (not a type)
91
+ * 2. Props type: First export matching *Props pattern
92
+ */
93
+ export function detectExportsFromIndex(dirPath: string): DetectedExports {
94
+ const indexPath = join(dirPath, "index.ts");
95
+ const result: DetectedExports = { componentName: null, propsType: null };
96
+
97
+ if (!existsSync(indexPath)) {
98
+ return result;
99
+ }
100
+
101
+ try {
102
+ const content = readFileSync(indexPath, "utf-8");
103
+
104
+ // Match named exports: export { Foo, Bar, type BazProps } from "./file"
105
+ // Also handles: export { Foo } from "./file"
106
+ const exportPattern = /export\s*\{([^}]+)\}/g;
107
+ let match: RegExpExecArray | null;
108
+
109
+ const namedExports: string[] = [];
110
+ const typeExports: string[] = [];
111
+
112
+ while ((match = exportPattern.exec(content)) !== null) {
113
+ const exportList = match[1];
114
+ // Split by comma and process each export
115
+ const items = exportList
116
+ .split(",")
117
+ .map((s) => s.trim())
118
+ .filter(Boolean);
119
+
120
+ for (const item of items) {
121
+ // Check if it's a type export: "type FooProps" or "type Foo as Bar"
122
+ const typeMatch = item.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?/);
123
+ if (typeMatch) {
124
+ // Use aliased name if present, otherwise original name
125
+ typeExports.push(typeMatch[2] || typeMatch[1]);
126
+ } else {
127
+ // Regular named export, could have "as" alias: "Foo as Bar"
128
+ const nameMatch = item.match(/^(\w+)(?:\s+as\s+(\w+))?/);
129
+ if (nameMatch) {
130
+ // Use aliased name if present, otherwise original name
131
+ namedExports.push(nameMatch[2] || nameMatch[1]);
132
+ }
133
+ }
134
+ }
135
+ }
136
+
137
+ // Also match direct exports: export const Foo = ...
138
+ const directExportPattern = /export\s+(?:const|function)\s+(\w+)/g;
139
+ while ((match = directExportPattern.exec(content)) !== null) {
140
+ namedExports.push(match[1]);
141
+ }
142
+
143
+ // Find main component: first PascalCase export that's not a type/hook/constant
144
+ for (const name of namedExports) {
145
+ // Skip hooks (useXxx), constants (SCREAMING_CASE), and lowercase names
146
+ if (
147
+ name.startsWith("use") ||
148
+ name === name.toUpperCase() ||
149
+ name[0] !== name[0].toUpperCase()
150
+ ) {
151
+ continue;
152
+ }
153
+ // Skip variant functions (xxxVariants)
154
+ if (name.endsWith("Variants")) {
155
+ continue;
156
+ }
157
+ result.componentName = name;
158
+ break;
159
+ }
160
+
161
+ // Find props type: look for ComponentNameProps or any *Props export
162
+ if (result.componentName) {
163
+ // First try exact match: ComponentNameProps
164
+ const exactPropsType = `${result.componentName}Props`;
165
+ if (typeExports.includes(exactPropsType)) {
166
+ result.propsType = exactPropsType;
167
+ }
168
+ }
169
+
170
+ // If no exact match, look for any *Props type
171
+ if (!result.propsType) {
172
+ const propsType = typeExports.find((t) => t.endsWith("Props"));
173
+ if (propsType) {
174
+ result.propsType = propsType;
175
+ }
176
+ }
177
+
178
+ return result;
179
+ } catch {
180
+ return result;
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Detect props type from the main component file by looking for interfaces/types.
186
+ * Checks both exported and non-exported types since many components use internal type aliases.
187
+ * Falls back to standard naming convention if not found in index.ts.
188
+ */
189
+ export function detectPropsTypeFromFile(
190
+ filePath: string,
191
+ componentName: string,
192
+ ): string | null {
193
+ try {
194
+ const content = readFileSync(filePath, "utf-8");
195
+
196
+ // Look for interface/type that ends with Props (both exported and non-exported)
197
+ // Pattern: [export] interface FooProps or [export] type FooProps
198
+ const exportedPropsPattern = /export\s+(?:interface|type)\s+(\w+Props)/g;
199
+ const nonExportedPropsPattern =
200
+ /(?:^|\n)\s*(?:interface|type)\s+(\w+Props)\s*[=<{]/g;
201
+
202
+ const exportedTypes: string[] = [];
203
+ const nonExportedTypes: string[] = [];
204
+ let match: RegExpExecArray | null;
205
+
206
+ while ((match = exportedPropsPattern.exec(content)) !== null) {
207
+ exportedTypes.push(match[1]);
208
+ }
209
+
210
+ while ((match = nonExportedPropsPattern.exec(content)) !== null) {
211
+ // Skip if it's actually exported (already captured above)
212
+ if (!exportedTypes.includes(match[1])) {
213
+ nonExportedTypes.push(match[1]);
214
+ }
215
+ }
216
+
217
+ // Prefer exact match: ComponentNameProps (check exported first, then non-exported)
218
+ const exactMatch = `${componentName}Props`;
219
+ if (exportedTypes.includes(exactMatch)) {
220
+ return exactMatch;
221
+ }
222
+ if (nonExportedTypes.includes(exactMatch)) {
223
+ return exactMatch;
224
+ }
225
+
226
+ // Otherwise return first Props type found (prefer exported)
227
+ return exportedTypes[0] || nonExportedTypes[0] || null;
228
+ } catch {
229
+ return null;
230
+ }
231
+ }
232
+
233
+ // =============================================================================
234
+ // Description Extraction
235
+ // =============================================================================
236
+
237
+ /**
238
+ * Extract description text from JSDoc content.
239
+ * Stops at first @tag (like @example, @see, @param, etc.)
240
+ */
241
+ function extractDescriptionFromJSDoc(jsdocContent: string): string | null {
242
+ const lines: string[] = [];
243
+
244
+ for (const rawLine of jsdocContent.split("\n")) {
245
+ const line = rawLine.replace(/^\s*\*\s?/, "").trim();
246
+
247
+ // Stop at any @tag
248
+ if (line.startsWith("@")) {
249
+ break;
250
+ }
251
+
252
+ // Skip empty lines at the start, but allow them in the middle
253
+ if (line.length > 0 || lines.length > 0) {
254
+ lines.push(line);
255
+ }
256
+ }
257
+
258
+ // Trim trailing empty lines and join
259
+ while (lines.length > 0 && lines[lines.length - 1] === "") {
260
+ lines.pop();
261
+ }
262
+
263
+ if (lines.length > 0) {
264
+ return lines.join(" ").trim();
265
+ }
266
+
267
+ return null;
268
+ }
269
+
270
+ /**
271
+ * Extract component description from JSDoc comment or generate a default one.
272
+ * Looks for JSDoc directly before the component function/const declaration.
273
+ *
274
+ * Handles multiple patterns:
275
+ * - export function ComponentName
276
+ * - export const ComponentName = forwardRef
277
+ * - export const ComponentName = Object.assign (compound components)
278
+ *
279
+ * Excludes:
280
+ * - @example blocks and code
281
+ * - @see and other JSDoc tags
282
+ */
283
+ export function extractDescription(
284
+ filePath: string,
285
+ componentName: string,
286
+ ): string {
287
+ try {
288
+ const content = readFileSync(filePath, "utf-8");
289
+
290
+ // First, find the position of the component declaration
291
+ // Handles: export function X, export const X =, function X(
292
+ const componentDeclPattern = new RegExp(
293
+ `(?:export\\s+)?(?:function|const)\\s+${componentName}\\s*(?:=|\\()`,
294
+ );
295
+ const componentMatch = content.match(componentDeclPattern);
296
+
297
+ if (!componentMatch?.index) {
298
+ return `${componentName} component`;
299
+ }
300
+
301
+ const componentPos = componentMatch.index;
302
+
303
+ // Find all JSDoc comments in the file
304
+ const jsdocPattern = /\/\*\*\s*\n([\s\S]*?)\*\//g;
305
+ let lastJSDoc: { content: string; endPos: number } | null = null;
306
+ let match: RegExpExecArray | null;
307
+
308
+ while ((match = jsdocPattern.exec(content)) !== null) {
309
+ const jsdocEndPos = match.index + match[0].length;
310
+
311
+ // Only consider JSDoc comments that appear before the component
312
+ if (jsdocEndPos > componentPos) {
313
+ break;
314
+ }
315
+
316
+ // Check if this JSDoc is immediately before the component
317
+ // (only whitespace/newlines between JSDoc end and component declaration)
318
+ const textBetween = content.slice(jsdocEndPos, componentPos);
319
+ if (/^\s*$/.test(textBetween)) {
320
+ lastJSDoc = { content: match[1], endPos: jsdocEndPos };
321
+ }
322
+ }
323
+
324
+ // Extract description from the closest JSDoc
325
+ if (lastJSDoc) {
326
+ const description = extractDescriptionFromJSDoc(lastJSDoc.content);
327
+ if (description) {
328
+ return description;
329
+ }
330
+ }
331
+
332
+ // Generate default description from component name
333
+ return `${componentName} component`;
334
+ } catch {
335
+ return `${componentName} component`;
336
+ }
337
+ }
338
+
339
+ // =============================================================================
340
+ // Directory Discovery
341
+ // =============================================================================
342
+
343
+ /**
344
+ * Discover all component directories in a given source directory.
345
+ * Returns array of directory names (kebab-case)
346
+ */
347
+ export function discoverDirs(sourceDir: string): string[] {
348
+ const entries = readdirSync(sourceDir);
349
+ return entries.filter((entry) => {
350
+ const fullPath = join(sourceDir, entry);
351
+ if (!statSync(fullPath).isDirectory()) return false;
352
+ // Check if main component file exists
353
+ const mainFile = join(fullPath, `${entry}.tsx`);
354
+ return existsSync(mainFile);
355
+ });
356
+ }
357
+
358
+ // =============================================================================
359
+ // Component Configuration Building
360
+ // =============================================================================
361
+
362
+ /**
363
+ * Auto-discover and build configurations from a source directory.
364
+ * Component/block names and props types are detected from index.ts exports.
365
+ */
366
+ export async function discoverFromDir(
367
+ sourceDir: string,
368
+ type: ComponentType,
369
+ ): Promise<ComponentConfig[]> {
370
+ const dirs = discoverDirs(sourceDir);
371
+ const configs: ComponentConfig[] = [];
372
+
373
+ console.log(`Discovering ${type}s from ${sourceDir}...`);
374
+
375
+ for (const dirName of dirs) {
376
+ const dirPath = join(sourceDir, dirName);
377
+ const mainFile = join(dirPath, `${dirName}.tsx`);
378
+ const override = COMPONENT_OVERRIDES[dirName] || {};
379
+
380
+ // Auto-detect component name and props type from index.ts
381
+ const detected = detectExportsFromIndex(dirPath);
382
+
383
+ // Determine component name: detected from index.ts, or fallback to PascalCase of dir name
384
+ const baseName = toPascalCase(dirName);
385
+ const componentName = detected.componentName || baseName;
386
+
387
+ // Determine props type: detected from index.ts, then from main file, then convention
388
+ let propsType = detected.propsType;
389
+ if (!propsType) {
390
+ propsType = detectPropsTypeFromFile(mainFile, componentName);
391
+ }
392
+ // Final fallback: standard convention
393
+ if (!propsType) {
394
+ propsType = `${componentName}Props`;
395
+ }
396
+
397
+ // Extract variants from file (may be empty for components without variant props)
398
+ // Layouts and pages may not have KUMO_*_VARIANTS exports
399
+ const variantsData = extractVariantsFromFile(mainFile);
400
+ if (!variantsData && type === "component") {
401
+ console.warn(
402
+ `Warning: Could not find KUMO_*_VARIANTS exports in ${dirName}, skipping...`,
403
+ );
404
+ continue;
405
+ }
406
+
407
+ // Determine category
408
+ const category = override.category || CATEGORY_MAP[dirName] || "Other";
409
+
410
+ // Extract or generate description
411
+ const description =
412
+ override.description || extractDescription(mainFile, componentName);
413
+
414
+ // Extract styling metadata from KUMO_*_STYLING if present
415
+ const styling = extractStylingFromFile(mainFile);
416
+
417
+ console.log(
418
+ ` ${dirName} → ${componentName} (props: ${propsType}, type: ${type})`,
419
+ );
420
+
421
+ configs.push({
422
+ name: componentName,
423
+ propsType,
424
+ sourceFile: `${dirName}/${dirName}.tsx`,
425
+ dirName,
426
+ sourceDir,
427
+ type,
428
+ description,
429
+ category,
430
+ variants: variantsData?.variants ?? {},
431
+ defaults: variantsData?.defaults ?? {},
432
+ ...(variantsData?.baseStyles && { baseStyles: variantsData.baseStyles }),
433
+ ...(styling && { styling }),
434
+ // Note: subComponents are added later by processComponent in index.ts
435
+ });
436
+ }
437
+
438
+ return configs;
439
+ }
440
+
441
+ /**
442
+ * Auto-discover and build component configurations from filesystem.
443
+ * Discovers both components and blocks.
444
+ */
445
+ export async function discoverComponents(
446
+ componentsDir: string,
447
+ ): Promise<ComponentConfig[]> {
448
+ const componentConfigs = await discoverFromDir(componentsDir, "component");
449
+
450
+ console.log(`Discovered ${componentConfigs.length} components`);
451
+
452
+ // Sort by name for consistent output
453
+ return componentConfigs.sort((a, b) => a.name.localeCompare(b.name));
454
+ }
455
+
456
+ /**
457
+ * Auto-discover and build block configurations from filesystem.
458
+ * Blocks are composite components installed via CLI.
459
+ */
460
+ export async function discoverBlocks(
461
+ blocksDir: string,
462
+ ): Promise<ComponentConfig[]> {
463
+ const blockConfigs = await discoverFromDir(blocksDir, "block");
464
+
465
+ console.log(`Discovered ${blockConfigs.length} blocks`);
466
+
467
+ // Sort by name for consistent output
468
+ return blockConfigs.sort((a, b) => a.name.localeCompare(b.name));
469
+ }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Example cleanup utilities for component registry generation.
3
+ *
4
+ * Cleans up extracted examples to fix common issues and filters
5
+ * out problematic examples.
6
+ */
7
+
8
+ // =============================================================================
9
+ // Example Cleanup
10
+ // =============================================================================
11
+
12
+ /**
13
+ * Clean up extracted examples to fix common issues:
14
+ * - Stringified functions: setPage="() => {}" -> setPage={() => {}}
15
+ * - Stringified arrays: tabs={`[...]`} -> tabs={[...]}
16
+ * - Escaped template literals: code={\`...\`} -> code={`...`}
17
+ * - Unquoted identifiers used as strings: label={Checked} -> label="Checked"
18
+ * - Double backticks from escaping: {``content``} -> {`content`}
19
+ */
20
+ export function cleanupExample(example: string): string {
21
+ let cleaned = example;
22
+
23
+ // Fix stringified functions: prop="() => {}" -> prop={() => {}}
24
+ cleaned = cleaned.replace(/(\w+)="(\(\)\s*=>\s*\{[^}]*\})"/g, "$1={$2}");
25
+
26
+ // Fix stringified arrays: prop={`[...]`} -> prop={[...]}
27
+ // Match prop={`[...multiline content...]`}
28
+ cleaned = cleaned.replace(/(\w+)=\{`(\[[\s\S]*?\])`\}/g, "$1={$2}");
29
+
30
+ // Fix escaped template literals: \` -> `
31
+ cleaned = cleaned.replace(/\\`/g, "`");
32
+
33
+ // Fix double backticks that result from escaping: {``content``} -> {`content`}
34
+ // This happens when template literals get double-escaped
35
+ cleaned = cleaned.replace(/\{``/g, "{`");
36
+ cleaned = cleaned.replace(/``\}/g, "`}");
37
+
38
+ // Fix unquoted identifiers that should be strings (common in Checkbox labels)
39
+ // label={Checked} -> label="Checked" (when it's clearly meant to be a string)
40
+ const identifierAsStringProps = ["label"];
41
+ for (const prop of identifierAsStringProps) {
42
+ // Match prop={SingleWord} where SingleWord is a simple identifier (not a component or expression)
43
+ const pattern = new RegExp(`(${prop})=\\{([A-Z][a-z]+)\\}(?![\\w.])`, "g");
44
+ cleaned = cleaned.replace(pattern, '$1="$2"');
45
+ }
46
+
47
+ return cleaned;
48
+ }
49
+
50
+ // =============================================================================
51
+ // Example Filtering
52
+ // =============================================================================
53
+
54
+ /**
55
+ * Components that should be filtered out of examples (undefined in the generated code)
56
+ */
57
+ const UNDEFINED_COMPONENTS = [
58
+ "RefreshButton",
59
+ "LinkButton",
60
+ "DefaultMenuBar",
61
+ "ToastTriggerButton",
62
+ ];
63
+
64
+ /**
65
+ * Variables that indicate an example can't be used standalone
66
+ */
67
+ const UNDEFINED_VARS = [
68
+ "args.placeholder",
69
+ "args.inputSide",
70
+ "botList",
71
+ "INITIAL_BOT_LIST",
72
+ ];
73
+
74
+ /**
75
+ * Filter out problematic examples that can't be easily fixed
76
+ */
77
+ export function shouldIncludeExample(
78
+ example: string,
79
+ componentName: string,
80
+ ): boolean {
81
+ // Skip examples that reference undefined components
82
+ for (const comp of UNDEFINED_COMPONENTS) {
83
+ if (example.includes(`<${comp}`)) {
84
+ return false;
85
+ }
86
+ }
87
+
88
+ // Skip empty or near-empty examples
89
+ if (example.trim().length < 10) {
90
+ return false;
91
+ }
92
+
93
+ // Skip examples that are just the component with no props (not useful)
94
+ const emptyPattern = new RegExp(`^<${componentName}\\s*/>$`);
95
+ if (emptyPattern.test(example.trim())) {
96
+ return false;
97
+ }
98
+
99
+ // Skip examples with undefined variables (common in story extractions)
100
+ for (const varName of UNDEFINED_VARS) {
101
+ if (example.includes(varName)) {
102
+ return false;
103
+ }
104
+ }
105
+
106
+ return true;
107
+ }
108
+
109
+ // =============================================================================
110
+ // Near-Duplicate Detection
111
+ // =============================================================================
112
+
113
+ /**
114
+ * Track seen examples to filter near-duplicates.
115
+ * Key is component name, value is set of "signature" strings.
116
+ */
117
+ const seenExampleSignatures = new Map<string, Set<string>>();
118
+
119
+ /**
120
+ * Generate a signature for an example to detect near-duplicates.
121
+ * Extracts the prop names being demonstrated.
122
+ */
123
+ export function getExampleSignature(example: string): string {
124
+ // Extract prop assignments like variant="primary" or size="sm"
125
+ const propPattern = /(\w+)=["'{]/g;
126
+ const props: string[] = [];
127
+ let match: RegExpExecArray | null;
128
+ while ((match = propPattern.exec(example)) !== null) {
129
+ props.push(match[1]);
130
+ }
131
+ // Sort for consistent comparison
132
+ return props.sort().join(",");
133
+ }
134
+
135
+ /**
136
+ * Check if this example is a near-duplicate of one we've already seen.
137
+ * Returns true if we should skip this example.
138
+ */
139
+ export function isNearDuplicateExample(
140
+ example: string,
141
+ componentName: string,
142
+ ): boolean {
143
+ const signature = getExampleSignature(example);
144
+
145
+ // Get or create the set for this component
146
+ let signatures = seenExampleSignatures.get(componentName);
147
+ if (!signatures) {
148
+ signatures = new Set();
149
+ seenExampleSignatures.set(componentName, signatures);
150
+ }
151
+
152
+ // If we've seen this signature, it's a duplicate
153
+ if (signatures.has(signature)) {
154
+ return true;
155
+ }
156
+
157
+ // Mark as seen
158
+ signatures.add(signature);
159
+ return false;
160
+ }
161
+
162
+ /**
163
+ * Clear the example signature cache.
164
+ * Call this before processing a new registry to get fresh duplicate detection.
165
+ */
166
+ export function clearExampleSignatureCache(): void {
167
+ seenExampleSignatures.clear();
168
+ }