@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.
- package/CHANGELOG.md +510 -0
- package/LICENSE +21 -0
- package/README.md +521 -0
- package/ai/component-registry.json +3754 -0
- package/ai/component-registry.md +4022 -0
- package/ai/schemas.ts +594 -0
- package/dist/badge-Dc99vsfo.js +51 -0
- package/dist/badge-Dc99vsfo.js.map +1 -0
- package/dist/banner-4fkH6Sbt.js +51 -0
- package/dist/banner-4fkH6Sbt.js.map +1 -0
- package/dist/breadcrumbs-B5SY2CWj.js +132 -0
- package/dist/breadcrumbs-B5SY2CWj.js.map +1 -0
- package/dist/button-E2-hZMZE.js +191 -0
- package/dist/button-E2-hZMZE.js.map +1 -0
- package/dist/catalog.js +229 -0
- package/dist/catalog.js.map +1 -0
- package/dist/checkbox-BexIU_lZ.js +224 -0
- package/dist/checkbox-BexIU_lZ.js.map +1 -0
- package/dist/clipboard-text-BFHWMjmr.js +108 -0
- package/dist/clipboard-text-BFHWMjmr.js.map +1 -0
- package/dist/cn-Bhsu1vx2.js +26 -0
- package/dist/cn-Bhsu1vx2.js.map +1 -0
- package/dist/code-T2wPDiM0.js +60 -0
- package/dist/code-T2wPDiM0.js.map +1 -0
- package/dist/collapsible-OBNkTO48.js +56 -0
- package/dist/collapsible-OBNkTO48.js.map +1 -0
- package/dist/combobox-Dld0kS0U.js +228 -0
- package/dist/combobox-Dld0kS0U.js.map +1 -0
- package/dist/command-line/cli.js +764 -0
- package/dist/command-line/commands/add.js +220 -0
- package/dist/command-line/commands/blocks.js +61 -0
- package/dist/command-line/commands/doc.js +167 -0
- package/dist/command-line/commands/init.js +95 -0
- package/dist/command-line/commands/ls.js +53 -0
- package/dist/command-palette-BgQ680BG.js +393 -0
- package/dist/command-palette-BgQ680BG.js.map +1 -0
- package/dist/components/badge.js +7 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/banner.js +7 -0
- package/dist/components/banner.js.map +1 -0
- package/dist/components/breadcrumbs.js +9 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/button.js +9 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/checkbox.js +8 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/clipboard-text.js +6 -0
- package/dist/components/clipboard-text.js.map +1 -0
- package/dist/components/code.js +7 -0
- package/dist/components/code.js.map +1 -0
- package/dist/components/collapsible.js +6 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.js +6 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command-palette.js +8 -0
- package/dist/components/command-palette.js.map +1 -0
- package/dist/components/date-range-picker.js +6 -0
- package/dist/components/date-range-picker.js.map +1 -0
- package/dist/components/dialog.js +11 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown.js +6 -0
- package/dist/components/dropdown.js.map +1 -0
- package/dist/components/empty.js +9 -0
- package/dist/components/empty.js.map +1 -0
- package/dist/components/field.js +9 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/grid.js +11 -0
- package/dist/components/grid.js.map +1 -0
- package/dist/components/input.js +11 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.js +10 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/layer-card.js +6 -0
- package/dist/components/layer-card.js.map +1 -0
- package/dist/components/link.js +9 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/loader.js +8 -0
- package/dist/components/loader.js.map +1 -0
- package/dist/components/menubar.js +7 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/meter.js +6 -0
- package/dist/components/meter.js.map +1 -0
- package/dist/components/pagination.js +6 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.js +14 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/radio.js +10 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/select.js +6 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/sensitive-input.js +8 -0
- package/dist/components/sensitive-input.js.map +1 -0
- package/dist/components/surface.js +6 -0
- package/dist/components/surface.js.map +1 -0
- package/dist/components/switch.js +8 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.js +8 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.js +6 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text.js +6 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/toast.js +8 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/tooltip.js +7 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/date-range-picker-CbKEQ9pi.js +408 -0
- package/dist/date-range-picker-CbKEQ9pi.js.map +1 -0
- package/dist/dialog-B1TaN0oR.js +77 -0
- package/dist/dialog-B1TaN0oR.js.map +1 -0
- package/dist/dropdown-D0rhYKeG.js +263 -0
- package/dist/dropdown-D0rhYKeG.js.map +1 -0
- package/dist/empty-DzCqjea-.js +93 -0
- package/dist/empty-DzCqjea-.js.map +1 -0
- package/dist/field-V3J0Ql_V.js +71 -0
- package/dist/field-V3J0Ql_V.js.map +1 -0
- package/dist/grid-DKajRHh8.js +127 -0
- package/dist/grid-DKajRHh8.js.map +1 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/input-Dqvc2AB_.js +109 -0
- package/dist/input-Dqvc2AB_.js.map +1 -0
- package/dist/input-area-B9qajxvZ.js +57 -0
- package/dist/input-area-B9qajxvZ.js.map +1 -0
- package/dist/input-group-Bl6tgD5-.js +111 -0
- package/dist/input-group-Bl6tgD5-.js.map +1 -0
- package/dist/label-87HQArUG.js +50 -0
- package/dist/label-87HQArUG.js.map +1 -0
- package/dist/layer-card-C8j5Hkkj.js +44 -0
- package/dist/layer-card-C8j5Hkkj.js.map +1 -0
- package/dist/link-6TIZ4JIw.js +73 -0
- package/dist/link-6TIZ4JIw.js.map +1 -0
- package/dist/link-provider-DPBGo-0n.js +22 -0
- package/dist/link-provider-DPBGo-0n.js.map +1 -0
- package/dist/loader-DHGMYlC6.js +105 -0
- package/dist/loader-DHGMYlC6.js.map +1 -0
- package/dist/menubar-DLwLRFB1.js +92 -0
- package/dist/menubar-DLwLRFB1.js.map +1 -0
- package/dist/meter-DKUuvXxS.js +51 -0
- package/dist/meter-DKUuvXxS.js.map +1 -0
- package/dist/pagination-C4HQqodz.js +99 -0
- package/dist/pagination-C4HQqodz.js.map +1 -0
- package/dist/popover-DhdIqrP7.js +178 -0
- package/dist/popover-DhdIqrP7.js.map +1 -0
- package/dist/primitives/accordion.js +6 -0
- package/dist/primitives/accordion.js.map +1 -0
- package/dist/primitives/alert-dialog.js +6 -0
- package/dist/primitives/alert-dialog.js.map +1 -0
- package/dist/primitives/autocomplete.js +6 -0
- package/dist/primitives/autocomplete.js.map +1 -0
- package/dist/primitives/avatar.js +6 -0
- package/dist/primitives/avatar.js.map +1 -0
- package/dist/primitives/button.js +6 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/checkbox-group.js +6 -0
- package/dist/primitives/checkbox-group.js.map +1 -0
- package/dist/primitives/checkbox.js +6 -0
- package/dist/primitives/checkbox.js.map +1 -0
- package/dist/primitives/collapsible.js +6 -0
- package/dist/primitives/collapsible.js.map +1 -0
- package/dist/primitives/combobox.js +6 -0
- package/dist/primitives/combobox.js.map +1 -0
- package/dist/primitives/context-menu.js +6 -0
- package/dist/primitives/context-menu.js.map +1 -0
- package/dist/primitives/dialog.js +6 -0
- package/dist/primitives/dialog.js.map +1 -0
- package/dist/primitives/direction-provider.js +7 -0
- package/dist/primitives/direction-provider.js.map +1 -0
- package/dist/primitives/field.js +6 -0
- package/dist/primitives/field.js.map +1 -0
- package/dist/primitives/fieldset.js +6 -0
- package/dist/primitives/fieldset.js.map +1 -0
- package/dist/primitives/form.js +6 -0
- package/dist/primitives/form.js.map +1 -0
- package/dist/primitives/input.js +6 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/menu.js +6 -0
- package/dist/primitives/menu.js.map +1 -0
- package/dist/primitives/menubar.js +6 -0
- package/dist/primitives/menubar.js.map +1 -0
- package/dist/primitives/meter.js +6 -0
- package/dist/primitives/meter.js.map +1 -0
- package/dist/primitives/navigation-menu.js +6 -0
- package/dist/primitives/navigation-menu.js.map +1 -0
- package/dist/primitives/number-field.js +6 -0
- package/dist/primitives/number-field.js.map +1 -0
- package/dist/primitives/popover.js +6 -0
- package/dist/primitives/popover.js.map +1 -0
- package/dist/primitives/preview-card.js +6 -0
- package/dist/primitives/preview-card.js.map +1 -0
- package/dist/primitives/progress.js +6 -0
- package/dist/primitives/progress.js.map +1 -0
- package/dist/primitives/radio-group.js +6 -0
- package/dist/primitives/radio-group.js.map +1 -0
- package/dist/primitives/radio.js +6 -0
- package/dist/primitives/radio.js.map +1 -0
- package/dist/primitives/scroll-area.js +6 -0
- package/dist/primitives/scroll-area.js.map +1 -0
- package/dist/primitives/select.js +6 -0
- package/dist/primitives/select.js.map +1 -0
- package/dist/primitives/separator.js +6 -0
- package/dist/primitives/separator.js.map +1 -0
- package/dist/primitives/slider.js +6 -0
- package/dist/primitives/slider.js.map +1 -0
- package/dist/primitives/switch.js +6 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/tabs.js +6 -0
- package/dist/primitives/tabs.js.map +1 -0
- package/dist/primitives/toast.js +6 -0
- package/dist/primitives/toast.js.map +1 -0
- package/dist/primitives/toggle-group.js +6 -0
- package/dist/primitives/toggle-group.js.map +1 -0
- package/dist/primitives/toggle.js +6 -0
- package/dist/primitives/toggle.js.map +1 -0
- package/dist/primitives/toolbar.js +6 -0
- package/dist/primitives/toolbar.js.map +1 -0
- package/dist/primitives/tooltip.js +6 -0
- package/dist/primitives/tooltip.js.map +1 -0
- package/dist/primitives.js +43 -0
- package/dist/primitives.js.map +1 -0
- package/dist/radio-BVAG7hNp.js +125 -0
- package/dist/radio-BVAG7hNp.js.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/dist/schemas-BSdA0fz-.js +3210 -0
- package/dist/schemas-BSdA0fz-.js.map +1 -0
- package/dist/select-B5Vb3zou.js +122 -0
- package/dist/select-B5Vb3zou.js.map +1 -0
- package/dist/sensitive-input-D5HCV04N.js +258 -0
- package/dist/sensitive-input-D5HCV04N.js.map +1 -0
- package/dist/skeleton-line-CtpS1u1J.js +28 -0
- package/dist/skeleton-line-CtpS1u1J.js.map +1 -0
- package/dist/src/blocks/page-header/index.d.ts +2 -0
- package/dist/src/blocks/page-header/index.d.ts.map +1 -0
- package/dist/src/blocks/page-header/page-header.d.ts +38 -0
- package/dist/src/blocks/page-header/page-header.d.ts.map +1 -0
- package/dist/src/blocks/resource-list/index.d.ts +2 -0
- package/dist/src/blocks/resource-list/index.d.ts.map +1 -0
- package/dist/src/blocks/resource-list/resource-list.d.ts +18 -0
- package/dist/src/blocks/resource-list/resource-list.d.ts.map +1 -0
- package/dist/src/catalog/catalog.d.ts +75 -0
- package/dist/src/catalog/catalog.d.ts.map +1 -0
- package/dist/src/catalog/data.d.ts +44 -0
- package/dist/src/catalog/data.d.ts.map +1 -0
- package/dist/src/catalog/index.d.ts +39 -0
- package/dist/src/catalog/index.d.ts.map +1 -0
- package/dist/src/catalog/types.d.ts +226 -0
- package/dist/src/catalog/types.d.ts.map +1 -0
- package/dist/src/catalog/visibility.d.ts +37 -0
- package/dist/src/catalog/visibility.d.ts.map +1 -0
- package/dist/src/command-line/build-cli.d.ts +7 -0
- package/dist/src/command-line/build-cli.d.ts.map +1 -0
- package/dist/src/command-line/cli.d.ts +13 -0
- package/dist/src/command-line/cli.d.ts.map +1 -0
- package/dist/src/command-line/commands/add.d.ts +10 -0
- package/dist/src/command-line/commands/add.d.ts.map +1 -0
- package/dist/src/command-line/commands/blocks.d.ts +10 -0
- package/dist/src/command-line/commands/blocks.d.ts.map +1 -0
- package/dist/src/command-line/commands/doc.d.ts +14 -0
- package/dist/src/command-line/commands/doc.d.ts.map +1 -0
- package/dist/src/command-line/commands/init.d.ts +18 -0
- package/dist/src/command-line/commands/init.d.ts.map +1 -0
- package/dist/src/command-line/commands/ls.d.ts +10 -0
- package/dist/src/command-line/commands/ls.d.ts.map +1 -0
- package/dist/src/command-line/commands/migrate.d.ts +10 -0
- package/dist/src/command-line/commands/migrate.d.ts.map +1 -0
- package/dist/src/command-line/utils/config.d.ts +42 -0
- package/dist/src/command-line/utils/config.d.ts.map +1 -0
- package/dist/src/command-line/utils/transformer.d.ts +17 -0
- package/dist/src/command-line/utils/transformer.d.ts.map +1 -0
- package/dist/src/components/badge/badge.d.ts +46 -0
- package/dist/src/components/badge/badge.d.ts.map +1 -0
- package/dist/src/components/badge/index.d.ts +2 -0
- package/dist/src/components/badge/index.d.ts.map +1 -0
- package/dist/src/components/banner/banner.d.ts +45 -0
- package/dist/src/components/banner/banner.d.ts.map +1 -0
- package/dist/src/components/banner/index.d.ts +2 -0
- package/dist/src/components/banner/index.d.ts.map +1 -0
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts +43 -0
- package/dist/src/components/breadcrumbs/breadcrumbs.d.ts.map +1 -0
- package/dist/src/components/breadcrumbs/index.d.ts +2 -0
- package/dist/src/components/breadcrumbs/index.d.ts.map +1 -0
- package/dist/src/components/button/button.d.ts +118 -0
- package/dist/src/components/button/button.d.ts.map +1 -0
- package/dist/src/components/button/index.d.ts +2 -0
- package/dist/src/components/button/index.d.ts.map +1 -0
- package/dist/src/components/checkbox/checkbox.d.ts +167 -0
- package/dist/src/components/checkbox/checkbox.d.ts.map +1 -0
- package/dist/src/components/checkbox/index.d.ts +2 -0
- package/dist/src/components/checkbox/index.d.ts.map +1 -0
- package/dist/src/components/clipboard-text/clipboard-text.d.ts +38 -0
- package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -0
- package/dist/src/components/clipboard-text/index.d.ts +2 -0
- package/dist/src/components/clipboard-text/index.d.ts.map +1 -0
- package/dist/src/components/code/code.d.ts +138 -0
- package/dist/src/components/code/code.d.ts.map +1 -0
- package/dist/src/components/code/index.d.ts +4 -0
- package/dist/src/components/code/index.d.ts.map +1 -0
- package/dist/src/components/collapsible/collapsible.d.ts +62 -0
- package/dist/src/components/collapsible/collapsible.d.ts.map +1 -0
- package/dist/src/components/collapsible/index.d.ts +2 -0
- package/dist/src/components/collapsible/index.d.ts.map +1 -0
- package/dist/src/components/combobox/combobox.d.ts +124 -0
- package/dist/src/components/combobox/combobox.d.ts.map +1 -0
- package/dist/src/components/combobox/index.d.ts +2 -0
- package/dist/src/components/combobox/index.d.ts.map +1 -0
- package/dist/src/components/command-palette/command-palette.d.ts +225 -0
- package/dist/src/components/command-palette/command-palette.d.ts.map +1 -0
- package/dist/src/components/command-palette/index.d.ts +3 -0
- package/dist/src/components/command-palette/index.d.ts.map +1 -0
- package/dist/src/components/command-palette/types.d.ts +149 -0
- package/dist/src/components/command-palette/types.d.ts.map +1 -0
- package/dist/src/components/date-range-picker/date-range-picker.d.ts +65 -0
- package/dist/src/components/date-range-picker/date-range-picker.d.ts.map +1 -0
- package/dist/src/components/date-range-picker/index.d.ts +2 -0
- package/dist/src/components/date-range-picker/index.d.ts.map +1 -0
- package/dist/src/components/dialog/dialog.d.ts +121 -0
- package/dist/src/components/dialog/dialog.d.ts.map +1 -0
- package/dist/src/components/dialog/index.d.ts +2 -0
- package/dist/src/components/dialog/index.d.ts.map +1 -0
- package/dist/src/components/dropdown/dropdown.d.ts +58 -0
- package/dist/src/components/dropdown/dropdown.d.ts.map +1 -0
- package/dist/src/components/dropdown/index.d.ts +2 -0
- package/dist/src/components/dropdown/index.d.ts.map +1 -0
- package/dist/src/components/empty/empty.d.ts +34 -0
- package/dist/src/components/empty/empty.d.ts.map +1 -0
- package/dist/src/components/empty/index.d.ts +2 -0
- package/dist/src/components/empty/index.d.ts.map +1 -0
- package/dist/src/components/field/field.d.ts +38 -0
- package/dist/src/components/field/field.d.ts.map +1 -0
- package/dist/src/components/field/index.d.ts +2 -0
- package/dist/src/components/field/index.d.ts.map +1 -0
- package/dist/src/components/grid/grid.d.ts +107 -0
- package/dist/src/components/grid/grid.d.ts.map +1 -0
- package/dist/src/components/grid/index.d.ts +2 -0
- package/dist/src/components/grid/index.d.ts.map +1 -0
- package/dist/src/components/input/index.d.ts +4 -0
- package/dist/src/components/input/index.d.ts.map +1 -0
- package/dist/src/components/input/input-area.d.ts +46 -0
- package/dist/src/components/input/input-area.d.ts.map +1 -0
- package/dist/src/components/input/input-group.d.ts +39 -0
- package/dist/src/components/input/input-group.d.ts.map +1 -0
- package/dist/src/components/input/input.d.ts +157 -0
- package/dist/src/components/input/input.d.ts.map +1 -0
- package/dist/src/components/label/index.d.ts +2 -0
- package/dist/src/components/label/index.d.ts.map +1 -0
- package/dist/src/components/label/label.d.ts +54 -0
- package/dist/src/components/label/label.d.ts.map +1 -0
- package/dist/src/components/layer-card/index.d.ts +2 -0
- package/dist/src/components/layer-card/index.d.ts.map +1 -0
- package/dist/src/components/layer-card/layer-card.d.ts +16 -0
- package/dist/src/components/layer-card/layer-card.d.ts.map +1 -0
- package/dist/src/components/link/index.d.ts +2 -0
- package/dist/src/components/link/index.d.ts.map +1 -0
- package/dist/src/components/link/link.d.ts +35 -0
- package/dist/src/components/link/link.d.ts.map +1 -0
- package/dist/src/components/loader/index.d.ts +3 -0
- package/dist/src/components/loader/index.d.ts.map +1 -0
- package/dist/src/components/loader/loader.d.ts +30 -0
- package/dist/src/components/loader/loader.d.ts.map +1 -0
- package/dist/src/components/loader/skeleton-line.d.ts +10 -0
- package/dist/src/components/loader/skeleton-line.d.ts.map +1 -0
- package/dist/src/components/menubar/index.d.ts +3 -0
- package/dist/src/components/menubar/index.d.ts.map +1 -0
- package/dist/src/components/menubar/menubar.d.ts +22 -0
- package/dist/src/components/menubar/menubar.d.ts.map +1 -0
- package/dist/src/components/menubar/use-menu-navigation.d.ts +8 -0
- package/dist/src/components/menubar/use-menu-navigation.d.ts.map +1 -0
- package/dist/src/components/meter/index.d.ts +2 -0
- package/dist/src/components/meter/index.d.ts.map +1 -0
- package/dist/src/components/meter/meter.d.ts +18 -0
- package/dist/src/components/meter/meter.d.ts.map +1 -0
- package/dist/src/components/pagination/index.d.ts +2 -0
- package/dist/src/components/pagination/index.d.ts.map +1 -0
- package/dist/src/components/pagination/pagination.d.ts +28 -0
- package/dist/src/components/pagination/pagination.d.ts.map +1 -0
- package/dist/src/components/popover/index.d.ts +3 -0
- package/dist/src/components/popover/index.d.ts.map +1 -0
- package/dist/src/components/popover/popover.d.ts +110 -0
- package/dist/src/components/popover/popover.d.ts.map +1 -0
- package/dist/src/components/radio/index.d.ts +2 -0
- package/dist/src/components/radio/index.d.ts.map +1 -0
- package/dist/src/components/radio/radio.d.ts +141 -0
- package/dist/src/components/radio/radio.d.ts.map +1 -0
- package/dist/src/components/select/index.d.ts +2 -0
- package/dist/src/components/select/index.d.ts.map +1 -0
- package/dist/src/components/select/select.d.ts +128 -0
- package/dist/src/components/select/select.d.ts.map +1 -0
- package/dist/src/components/sensitive-input/index.d.ts +2 -0
- package/dist/src/components/sensitive-input/index.d.ts.map +1 -0
- package/dist/src/components/sensitive-input/sensitive-input.d.ts +70 -0
- package/dist/src/components/sensitive-input/sensitive-input.d.ts.map +1 -0
- package/dist/src/components/surface/index.d.ts +2 -0
- package/dist/src/components/surface/index.d.ts.map +1 -0
- package/dist/src/components/surface/surface.d.ts +48 -0
- package/dist/src/components/surface/surface.d.ts.map +1 -0
- package/dist/src/components/switch/index.d.ts +2 -0
- package/dist/src/components/switch/index.d.ts.map +1 -0
- package/dist/src/components/switch/switch.d.ts +155 -0
- package/dist/src/components/switch/switch.d.ts.map +1 -0
- package/dist/src/components/table/index.d.ts +2 -0
- package/dist/src/components/table/index.d.ts.map +1 -0
- package/dist/src/components/table/table.d.ts +54 -0
- package/dist/src/components/table/table.d.ts.map +1 -0
- package/dist/src/components/tabs/index.d.ts +3 -0
- package/dist/src/components/tabs/index.d.ts.map +1 -0
- package/dist/src/components/tabs/tabs.d.ts +64 -0
- package/dist/src/components/tabs/tabs.d.ts.map +1 -0
- package/dist/src/components/text/index.d.ts +2 -0
- package/dist/src/components/text/index.d.ts.map +1 -0
- package/dist/src/components/text/text.d.ts +153 -0
- package/dist/src/components/text/text.d.ts.map +1 -0
- package/dist/src/components/toast/index.d.ts +3 -0
- package/dist/src/components/toast/index.d.ts.map +1 -0
- package/dist/src/components/toast/toast.d.ts +66 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -0
- package/dist/src/components/tooltip/index.d.ts +2 -0
- package/dist/src/components/tooltip/index.d.ts.map +1 -0
- package/dist/src/components/tooltip/tooltip.d.ts +43 -0
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/src/index.d.ts +39 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/primitives/accordion.d.ts +13 -0
- package/dist/src/primitives/accordion.d.ts.map +1 -0
- package/dist/src/primitives/alert-dialog.d.ts +13 -0
- package/dist/src/primitives/alert-dialog.d.ts.map +1 -0
- package/dist/src/primitives/autocomplete.d.ts +13 -0
- package/dist/src/primitives/autocomplete.d.ts.map +1 -0
- package/dist/src/primitives/avatar.d.ts +13 -0
- package/dist/src/primitives/avatar.d.ts.map +1 -0
- package/dist/src/primitives/button.d.ts +13 -0
- package/dist/src/primitives/button.d.ts.map +1 -0
- package/dist/src/primitives/checkbox-group.d.ts +13 -0
- package/dist/src/primitives/checkbox-group.d.ts.map +1 -0
- package/dist/src/primitives/checkbox.d.ts +13 -0
- package/dist/src/primitives/checkbox.d.ts.map +1 -0
- package/dist/src/primitives/collapsible.d.ts +13 -0
- package/dist/src/primitives/collapsible.d.ts.map +1 -0
- package/dist/src/primitives/combobox.d.ts +13 -0
- package/dist/src/primitives/combobox.d.ts.map +1 -0
- package/dist/src/primitives/context-menu.d.ts +13 -0
- package/dist/src/primitives/context-menu.d.ts.map +1 -0
- package/dist/src/primitives/dialog.d.ts +13 -0
- package/dist/src/primitives/dialog.d.ts.map +1 -0
- package/dist/src/primitives/direction-provider.d.ts +13 -0
- package/dist/src/primitives/direction-provider.d.ts.map +1 -0
- package/dist/src/primitives/field.d.ts +13 -0
- package/dist/src/primitives/field.d.ts.map +1 -0
- package/dist/src/primitives/fieldset.d.ts +13 -0
- package/dist/src/primitives/fieldset.d.ts.map +1 -0
- package/dist/src/primitives/form.d.ts +13 -0
- package/dist/src/primitives/form.d.ts.map +1 -0
- package/dist/src/primitives/index.d.ts +52 -0
- package/dist/src/primitives/index.d.ts.map +1 -0
- package/dist/src/primitives/input.d.ts +13 -0
- package/dist/src/primitives/input.d.ts.map +1 -0
- package/dist/src/primitives/menu.d.ts +13 -0
- package/dist/src/primitives/menu.d.ts.map +1 -0
- package/dist/src/primitives/menubar.d.ts +13 -0
- package/dist/src/primitives/menubar.d.ts.map +1 -0
- package/dist/src/primitives/meter.d.ts +13 -0
- package/dist/src/primitives/meter.d.ts.map +1 -0
- package/dist/src/primitives/navigation-menu.d.ts +13 -0
- package/dist/src/primitives/navigation-menu.d.ts.map +1 -0
- package/dist/src/primitives/number-field.d.ts +13 -0
- package/dist/src/primitives/number-field.d.ts.map +1 -0
- package/dist/src/primitives/popover.d.ts +13 -0
- package/dist/src/primitives/popover.d.ts.map +1 -0
- package/dist/src/primitives/preview-card.d.ts +13 -0
- package/dist/src/primitives/preview-card.d.ts.map +1 -0
- package/dist/src/primitives/progress.d.ts +13 -0
- package/dist/src/primitives/progress.d.ts.map +1 -0
- package/dist/src/primitives/radio-group.d.ts +13 -0
- package/dist/src/primitives/radio-group.d.ts.map +1 -0
- package/dist/src/primitives/radio.d.ts +13 -0
- package/dist/src/primitives/radio.d.ts.map +1 -0
- package/dist/src/primitives/scroll-area.d.ts +13 -0
- package/dist/src/primitives/scroll-area.d.ts.map +1 -0
- package/dist/src/primitives/select.d.ts +13 -0
- package/dist/src/primitives/select.d.ts.map +1 -0
- package/dist/src/primitives/separator.d.ts +13 -0
- package/dist/src/primitives/separator.d.ts.map +1 -0
- package/dist/src/primitives/slider.d.ts +13 -0
- package/dist/src/primitives/slider.d.ts.map +1 -0
- package/dist/src/primitives/switch.d.ts +13 -0
- package/dist/src/primitives/switch.d.ts.map +1 -0
- package/dist/src/primitives/tabs.d.ts +13 -0
- package/dist/src/primitives/tabs.d.ts.map +1 -0
- package/dist/src/primitives/toast.d.ts +13 -0
- package/dist/src/primitives/toast.d.ts.map +1 -0
- package/dist/src/primitives/toggle-group.d.ts +13 -0
- package/dist/src/primitives/toggle-group.d.ts.map +1 -0
- package/dist/src/primitives/toggle.d.ts +13 -0
- package/dist/src/primitives/toggle.d.ts.map +1 -0
- package/dist/src/primitives/toolbar.d.ts +13 -0
- package/dist/src/primitives/toolbar.d.ts.map +1 -0
- package/dist/src/primitives/tooltip.d.ts +13 -0
- package/dist/src/primitives/tooltip.d.ts.map +1 -0
- package/dist/src/registry/index.d.ts +8 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/types.d.ts +191 -0
- package/dist/src/registry/types.d.ts.map +1 -0
- package/dist/src/utils/cn.d.ts +4 -0
- package/dist/src/utils/cn.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +3 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/link-provider.d.ts +12 -0
- package/dist/src/utils/link-provider.d.ts.map +1 -0
- package/dist/src/utils/prop-examples.d.ts +36 -0
- package/dist/src/utils/prop-examples.d.ts.map +1 -0
- package/dist/styles/kumo-binding.css +190 -0
- package/dist/styles/kumo-standalone.css +2 -0
- package/dist/styles/kumo.css +55 -0
- package/dist/styles/theme-fedramp.css +20 -0
- package/dist/styles/theme-kumo.css +186 -0
- package/dist/surface-BIC6CXiz.js +21 -0
- package/dist/surface-BIC6CXiz.js.map +1 -0
- package/dist/switch-D4duMhJ0.js +257 -0
- package/dist/switch-D4duMhJ0.js.map +1 -0
- package/dist/table-KuvHGpL8.js +153 -0
- package/dist/table-KuvHGpL8.js.map +1 -0
- package/dist/tabs-lQup-IbT.js +85 -0
- package/dist/tabs-lQup-IbT.js.map +1 -0
- package/dist/text-BEhqwMfe.js +97 -0
- package/dist/text-BEhqwMfe.js.map +1 -0
- package/dist/toast-8YyyQuqZ.js +69 -0
- package/dist/toast-8YyyQuqZ.js.map +1 -0
- package/dist/tooltip-DJWsDTWJ.js +85 -0
- package/dist/tooltip-DJWsDTWJ.js.map +1 -0
- package/dist/utils.js +10 -0
- package/dist/utils.js.map +1 -0
- package/dist/vendor-base-ui-DWIDNgE1.js +20446 -0
- package/dist/vendor-base-ui-DWIDNgE1.js.map +1 -0
- package/dist/vendor-floating-ui-BgbEw62H.js +1286 -0
- package/dist/vendor-floating-ui-BgbEw62H.js.map +1 -0
- package/dist/vendor-styling-BQbxAbdS.js +2775 -0
- package/dist/vendor-styling-BQbxAbdS.js.map +1 -0
- package/dist/vendor-utils-DD8jNJwD.js +741 -0
- package/dist/vendor-utils-DD8jNJwD.js.map +1 -0
- package/package.json +444 -0
- package/scripts/component-registry/cache.ts +123 -0
- package/scripts/component-registry/discovery.ts +469 -0
- package/scripts/component-registry/example-cleanup.ts +168 -0
- package/scripts/component-registry/index.test.ts +680 -0
- package/scripts/component-registry/index.ts +874 -0
- package/scripts/component-registry/markdown-generator.ts +222 -0
- package/scripts/component-registry/metadata.ts +643 -0
- package/scripts/component-registry/props-filter.ts +310 -0
- package/scripts/component-registry/schema-generator.ts +326 -0
- package/scripts/component-registry/sub-components.ts +349 -0
- package/scripts/component-registry/types.ts +156 -0
- package/scripts/component-registry/utils.ts +280 -0
- package/scripts/component-registry/variant-parser.ts +261 -0
- package/scripts/css-build.ts +55 -0
- package/scripts/generate-primitives.ts +178 -0
- package/scripts/theme-generator/config.ts +392 -0
- package/scripts/theme-generator/generate-css.ts +250 -0
- package/scripts/theme-generator/index.ts +159 -0
- package/scripts/theme-generator/migrate.ts +560 -0
- 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
|
+
}
|