@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,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for component registry generation.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions for string transformations and common operations.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
|
+
import { join, dirname } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// String Transformation Utilities
|
|
15
|
+
// =============================================================================
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Convert kebab-case to PascalCase.
|
|
19
|
+
* Example: "clipboard-text" -> "ClipboardText"
|
|
20
|
+
*/
|
|
21
|
+
export function toPascalCase(str: string): string {
|
|
22
|
+
return str
|
|
23
|
+
.split("-")
|
|
24
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
25
|
+
.join("");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Convert PascalCase to SCREAMING_SNAKE_CASE.
|
|
30
|
+
* Example: "ClipboardText" -> "CLIPBOARD_TEXT"
|
|
31
|
+
*/
|
|
32
|
+
export function toScreamingSnakeCase(str: string): string {
|
|
33
|
+
return str
|
|
34
|
+
.replace(/([a-z])([A-Z])/g, "$1_$2")
|
|
35
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
|
|
36
|
+
.toUpperCase();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// Balanced Brace Extraction
|
|
41
|
+
// =============================================================================
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Extract a balanced brace block starting from a position in the string.
|
|
45
|
+
* Returns the content between the outermost braces, or null if unbalanced.
|
|
46
|
+
*/
|
|
47
|
+
export function extractBalancedBraces(
|
|
48
|
+
content: string,
|
|
49
|
+
startIndex: number,
|
|
50
|
+
): string | null {
|
|
51
|
+
let depth = 0;
|
|
52
|
+
let start = -1;
|
|
53
|
+
|
|
54
|
+
for (let i = startIndex; i < content.length; i++) {
|
|
55
|
+
if (content[i] === "{") {
|
|
56
|
+
if (depth === 0) start = i;
|
|
57
|
+
depth++;
|
|
58
|
+
} else if (content[i] === "}") {
|
|
59
|
+
depth--;
|
|
60
|
+
if (depth === 0 && start !== -1) {
|
|
61
|
+
return content.substring(start, i + 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// Semantic Color Parsing
|
|
70
|
+
// =============================================================================
|
|
71
|
+
|
|
72
|
+
let _semanticColorNames: string[] | null = null;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Parse theme-kumo.css to extract semantic color names from --color-* and --text-color-* variables.
|
|
76
|
+
* Excludes raw palette colors (e.g., --color-red-650, --color-neutral-50) which have numeric suffixes.
|
|
77
|
+
* Results are cached for performance.
|
|
78
|
+
*/
|
|
79
|
+
export function parseSemanticColorNames(): string[] {
|
|
80
|
+
if (_semanticColorNames) {
|
|
81
|
+
return _semanticColorNames;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const themePath = join(__dirname, "../../src/styles/theme-kumo.css");
|
|
85
|
+
const content = readFileSync(themePath, "utf-8");
|
|
86
|
+
|
|
87
|
+
const colorNames = new Set<string>();
|
|
88
|
+
|
|
89
|
+
// Match semantic color variable declarations that use light-dark()
|
|
90
|
+
// Pattern: "--color-<name>: light-dark(" or "--text-color-<name>: light-dark("
|
|
91
|
+
// This excludes raw palette colors which are defined with direct values like "oklch(...)"
|
|
92
|
+
const semanticColorPattern =
|
|
93
|
+
/--(?:text-)?color-([a-zA-Z][a-zA-Z0-9-]*)\s*:\s*light-dark\(/g;
|
|
94
|
+
let match: RegExpExecArray | null;
|
|
95
|
+
|
|
96
|
+
while ((match = semanticColorPattern.exec(content)) !== null) {
|
|
97
|
+
colorNames.add(match[1]);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
_semanticColorNames = [...colorNames].sort();
|
|
101
|
+
return _semanticColorNames;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Utility prefixes that use color tokens
|
|
105
|
+
const COLOR_UTILITY_PREFIXES = [
|
|
106
|
+
"text",
|
|
107
|
+
"bg",
|
|
108
|
+
"ring",
|
|
109
|
+
"outline",
|
|
110
|
+
"fill",
|
|
111
|
+
"border",
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Extract semantic color classes used in a source file.
|
|
116
|
+
* Returns array of Tailwind classes like ["bg-kumo-base", "text-kumo-subtle"].
|
|
117
|
+
*/
|
|
118
|
+
export function extractSemanticColors(sourceFile: string): string[] {
|
|
119
|
+
try {
|
|
120
|
+
const content = readFileSync(sourceFile, "utf-8");
|
|
121
|
+
const matches: string[] = [];
|
|
122
|
+
const semanticColorNames = parseSemanticColorNames();
|
|
123
|
+
|
|
124
|
+
// Build regex pattern for each prefix + semantic color combination
|
|
125
|
+
// Match patterns like: text-surface, bg-primary, border-color, ring-kumo-line
|
|
126
|
+
// Also handles variants like: hover:bg-primary, disabled:text-kumo-subtle
|
|
127
|
+
for (const prefix of COLOR_UTILITY_PREFIXES) {
|
|
128
|
+
for (const colorName of semanticColorNames) {
|
|
129
|
+
// Escape hyphens for regex and create pattern
|
|
130
|
+
const pattern = new RegExp(
|
|
131
|
+
`(?:[\\w\\[\\]=_-]+:)*(${prefix}-${colorName})(?![a-zA-Z0-9-])`,
|
|
132
|
+
"g",
|
|
133
|
+
);
|
|
134
|
+
let match: RegExpExecArray | null;
|
|
135
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
136
|
+
matches.push(match[1]);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return [...new Set(matches)].sort();
|
|
142
|
+
} catch {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// =============================================================================
|
|
148
|
+
// State Class Extraction
|
|
149
|
+
// =============================================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Extract state-specific classes from a class string.
|
|
153
|
+
* Identifies hover:*, focus:*, active:*, disabled:*, not-disabled:* prefixes.
|
|
154
|
+
* Also handles complex selectors like [&:hover>span], [&:focus-within>span].
|
|
155
|
+
*/
|
|
156
|
+
export function extractStateClasses(
|
|
157
|
+
classString: string,
|
|
158
|
+
): Record<string, string> {
|
|
159
|
+
const states: Record<string, string> = {};
|
|
160
|
+
|
|
161
|
+
// Split by whitespace to process each class individually
|
|
162
|
+
const classes = classString.split(/\s+/);
|
|
163
|
+
|
|
164
|
+
for (const cls of classes) {
|
|
165
|
+
if (!cls) continue;
|
|
166
|
+
|
|
167
|
+
// Check for hover states
|
|
168
|
+
if (cls.startsWith("hover:") || cls.match(/^\[&:hover[^\]]*\]:/)) {
|
|
169
|
+
states.hover = states.hover ? `${states.hover} ${cls}` : cls;
|
|
170
|
+
}
|
|
171
|
+
// Check for focus states (focus, focus-visible, focus-within)
|
|
172
|
+
else if (
|
|
173
|
+
cls.match(/^(focus|focus-visible|focus-within):/) ||
|
|
174
|
+
cls.match(/^\[&:focus(-visible|-within)?[^\]]*\]:/)
|
|
175
|
+
) {
|
|
176
|
+
states.focus = states.focus ? `${states.focus} ${cls}` : cls;
|
|
177
|
+
}
|
|
178
|
+
// Check for active state
|
|
179
|
+
else if (cls.startsWith("active:")) {
|
|
180
|
+
states.active = states.active ? `${states.active} ${cls}` : cls;
|
|
181
|
+
}
|
|
182
|
+
// Check for disabled state
|
|
183
|
+
else if (cls.startsWith("disabled:")) {
|
|
184
|
+
states.disabled = states.disabled ? `${states.disabled} ${cls}` : cls;
|
|
185
|
+
}
|
|
186
|
+
// Check for not-disabled state
|
|
187
|
+
else if (cls.startsWith("not-disabled:")) {
|
|
188
|
+
states["not-disabled"] = states["not-disabled"]
|
|
189
|
+
? `${states["not-disabled"]} ${cls}`
|
|
190
|
+
: cls;
|
|
191
|
+
}
|
|
192
|
+
// Check for data-state
|
|
193
|
+
else if (cls.match(/^data-\[state=[^\]]+\]:/)) {
|
|
194
|
+
states["data-state"] = states["data-state"]
|
|
195
|
+
? `${states["data-state"]} ${cls}`
|
|
196
|
+
: cls;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return states;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// =============================================================================
|
|
204
|
+
// Block Dependency Extraction
|
|
205
|
+
// =============================================================================
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Extract component dependencies from a block file.
|
|
209
|
+
* Returns array of component names imported from "../../components/*"
|
|
210
|
+
* Example: import { Tabs } from "../../components/tabs" -> ["Tabs"]
|
|
211
|
+
*/
|
|
212
|
+
export function extractBlockDependencies(sourceFile: string): string[] {
|
|
213
|
+
try {
|
|
214
|
+
const content = readFileSync(sourceFile, "utf-8");
|
|
215
|
+
const dependencies = new Set<string>();
|
|
216
|
+
|
|
217
|
+
// Match imports from ../../components/* or ../../blocks/*
|
|
218
|
+
// Pattern: import { Foo, Bar } from "../../components/something"
|
|
219
|
+
// Pattern: import { Foo } from "../../blocks/something"
|
|
220
|
+
const importPattern =
|
|
221
|
+
/import\s+(?:type\s+)?\{([^}]+)\}\s+from\s+["']\.\.\/\.\.\/(?:components|blocks)\/[^"']+["']/g;
|
|
222
|
+
let match: RegExpExecArray | null;
|
|
223
|
+
|
|
224
|
+
while ((match = importPattern.exec(content)) !== null) {
|
|
225
|
+
const importList = match[1];
|
|
226
|
+
// Split by comma and extract component names
|
|
227
|
+
const items = importList
|
|
228
|
+
.split(",")
|
|
229
|
+
.map((s) => s.trim())
|
|
230
|
+
.filter(Boolean);
|
|
231
|
+
|
|
232
|
+
for (const item of items) {
|
|
233
|
+
// Skip type imports
|
|
234
|
+
if (item.startsWith("type ")) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// Extract name (handle "Foo as Bar" -> "Foo")
|
|
238
|
+
const nameMatch = item.match(/^(\w+)(?:\s+as\s+\w+)?/);
|
|
239
|
+
if (nameMatch) {
|
|
240
|
+
dependencies.add(nameMatch[1]);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return [...dependencies].sort();
|
|
246
|
+
} catch {
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Get all files for a block (main file + stories + tests if they exist)
|
|
253
|
+
* Returns array of file paths relative to the blocks directory
|
|
254
|
+
*/
|
|
255
|
+
export function getBlockFiles(blockDir: string, dirName: string): string[] {
|
|
256
|
+
const files: string[] = [];
|
|
257
|
+
|
|
258
|
+
// Main file (always exists)
|
|
259
|
+
files.push(`${dirName}/${dirName}.tsx`);
|
|
260
|
+
|
|
261
|
+
// Check for stories
|
|
262
|
+
const storiesPath = join(blockDir, dirName, `${dirName}.stories.tsx`);
|
|
263
|
+
try {
|
|
264
|
+
readFileSync(storiesPath);
|
|
265
|
+
files.push(`${dirName}/${dirName}.stories.tsx`);
|
|
266
|
+
} catch {
|
|
267
|
+
// Stories file doesn't exist
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Check for tests
|
|
271
|
+
const testPath = join(blockDir, dirName, `${dirName}.test.tsx`);
|
|
272
|
+
try {
|
|
273
|
+
readFileSync(testPath);
|
|
274
|
+
files.push(`${dirName}/${dirName}.test.tsx`);
|
|
275
|
+
} catch {
|
|
276
|
+
// Test file doesn't exist
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return files;
|
|
280
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Variant parsing for component registry generation.
|
|
3
|
+
*
|
|
4
|
+
* Extracts KUMO_*_VARIANTS, KUMO_*_DEFAULT_VARIANTS, and KUMO_*_STYLING from component files
|
|
5
|
+
* using regex parsing to avoid import issues with JSX/React dependencies.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { extractBalancedBraces, extractStateClasses } from "./utils.js";
|
|
10
|
+
import type { ComponentStyling } from "./types.js";
|
|
11
|
+
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Types
|
|
14
|
+
// =============================================================================
|
|
15
|
+
|
|
16
|
+
export interface ExtractedVariants {
|
|
17
|
+
// biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
|
|
18
|
+
variants: Record<string, Record<string, any>>;
|
|
19
|
+
defaults: Record<string, string>;
|
|
20
|
+
baseStyles: string | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// Base Styles Extraction
|
|
25
|
+
// =============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Extract KUMO_*_BASE_STYLES from a component file.
|
|
29
|
+
* Returns the base styles string or null if not found.
|
|
30
|
+
*/
|
|
31
|
+
export function extractBaseStylesFromFile(filePath: string): string | null {
|
|
32
|
+
try {
|
|
33
|
+
const content = readFileSync(filePath, "utf-8");
|
|
34
|
+
|
|
35
|
+
// Match: export const KUMO_*_BASE_STYLES = "..." or '...' or `...`
|
|
36
|
+
// Handles multi-line strings with template literals
|
|
37
|
+
const baseStylesMatch = content.match(
|
|
38
|
+
/export\s+const\s+KUMO_\w+_BASE_STYLES\s*=\s*["'`]([^"'`]+)["'`]/,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
if (baseStylesMatch) {
|
|
42
|
+
return baseStylesMatch[1].trim();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return null;
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// =============================================================================
|
|
52
|
+
// Variants Object Parsing
|
|
53
|
+
// =============================================================================
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Parse a variants object string into a structured object.
|
|
57
|
+
* Extracts variant keys and their descriptions.
|
|
58
|
+
*/
|
|
59
|
+
// biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
|
|
60
|
+
export function parseVariantsObject(
|
|
61
|
+
objStr: string,
|
|
62
|
+
): Record<string, Record<string, any>> {
|
|
63
|
+
// biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
|
|
64
|
+
const result: Record<string, Record<string, any>> = {};
|
|
65
|
+
|
|
66
|
+
// Find top-level property names (e.g., shape, size, variant)
|
|
67
|
+
// These are identifiers followed by `: {` at the first nesting level
|
|
68
|
+
const topLevelPropPattern = /^\s*(\w+)\s*:\s*\{/gm;
|
|
69
|
+
let propMatch: RegExpExecArray | null;
|
|
70
|
+
|
|
71
|
+
while ((propMatch = topLevelPropPattern.exec(objStr)) !== null) {
|
|
72
|
+
const propName = propMatch[1];
|
|
73
|
+
|
|
74
|
+
// Skip nested properties like classes, description
|
|
75
|
+
if (["classes", "description"].includes(propName)) continue;
|
|
76
|
+
|
|
77
|
+
// Extract the balanced brace block for this property
|
|
78
|
+
const propStartIndex = propMatch.index + propMatch[0].length - 1; // Start at the {
|
|
79
|
+
const propBlock = extractBalancedBraces(objStr, propStartIndex);
|
|
80
|
+
|
|
81
|
+
if (!propBlock) continue;
|
|
82
|
+
|
|
83
|
+
// Now parse the variant values within this block
|
|
84
|
+
// biome-ignore lint/suspicious/noExplicitAny: Variants have varying shapes
|
|
85
|
+
const variants: Record<string, any> = {};
|
|
86
|
+
// Match variant names including quoted keys like "secondary-destructive"
|
|
87
|
+
const variantPropPattern = /^\s*(?:"([^"]+)"|'([^']+)'|(\w+))\s*:\s*\{/gm;
|
|
88
|
+
let variantMatch: RegExpExecArray | null;
|
|
89
|
+
|
|
90
|
+
while ((variantMatch = variantPropPattern.exec(propBlock)) !== null) {
|
|
91
|
+
// Capture group 1 = double-quoted, 2 = single-quoted, 3 = unquoted
|
|
92
|
+
const variantName = variantMatch[1] || variantMatch[2] || variantMatch[3];
|
|
93
|
+
|
|
94
|
+
// Skip nested properties
|
|
95
|
+
if (["classes", "description"].includes(variantName)) continue;
|
|
96
|
+
|
|
97
|
+
// Extract the balanced brace block for this variant
|
|
98
|
+
const variantStartIndex = variantMatch.index + variantMatch[0].length - 1;
|
|
99
|
+
const variantBlock = extractBalancedBraces(propBlock, variantStartIndex);
|
|
100
|
+
|
|
101
|
+
if (!variantBlock) continue;
|
|
102
|
+
|
|
103
|
+
// Extract description if present
|
|
104
|
+
const descMatch = variantBlock.match(
|
|
105
|
+
/description\s*:\s*["']([^"']*)["']/,
|
|
106
|
+
);
|
|
107
|
+
// Extract classes if present (for Figma plugin consumption)
|
|
108
|
+
const classesMatch = variantBlock.match(/classes\s*:\s*["']([^"']*)["']/);
|
|
109
|
+
|
|
110
|
+
// Extract state classes from the classes string
|
|
111
|
+
const stateClasses = classesMatch
|
|
112
|
+
? extractStateClasses(classesMatch[1])
|
|
113
|
+
: {};
|
|
114
|
+
|
|
115
|
+
variants[variantName] = {
|
|
116
|
+
description: descMatch ? descMatch[1] : undefined,
|
|
117
|
+
...(classesMatch && { classes: classesMatch[1] }),
|
|
118
|
+
...(Object.keys(stateClasses).length > 0 && { stateClasses }),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (Object.keys(variants).length > 0) {
|
|
123
|
+
result[propName] = variants;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Parse a defaults object string into a key-value map.
|
|
132
|
+
*/
|
|
133
|
+
export function parseDefaultsObject(objStr: string): Record<string, string> {
|
|
134
|
+
const result: Record<string, string> = {};
|
|
135
|
+
|
|
136
|
+
// Match properties like: variant: "primary", size: "base"
|
|
137
|
+
const propPattern = /(\w+)\s*:\s*["']([^"']*)["']/g;
|
|
138
|
+
let match: RegExpExecArray | null;
|
|
139
|
+
|
|
140
|
+
while ((match = propPattern.exec(objStr)) !== null) {
|
|
141
|
+
result[match[1]] = match[2];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// =============================================================================
|
|
148
|
+
// Main Extraction
|
|
149
|
+
// =============================================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Extract KUMO_*_VARIANTS and KUMO_*_DEFAULT_VARIANTS from a component file.
|
|
153
|
+
* Uses regex parsing to avoid import issues with JSX/React dependencies.
|
|
154
|
+
*/
|
|
155
|
+
export function extractVariantsFromFile(
|
|
156
|
+
filePath: string,
|
|
157
|
+
): ExtractedVariants | null {
|
|
158
|
+
try {
|
|
159
|
+
const content = readFileSync(filePath, "utf-8");
|
|
160
|
+
|
|
161
|
+
// Find KUMO_*_VARIANTS export start position
|
|
162
|
+
const variantsStartMatch = content.match(
|
|
163
|
+
/export\s+const\s+KUMO_\w+_VARIANTS\s*=\s*/,
|
|
164
|
+
);
|
|
165
|
+
// Find KUMO_*_DEFAULT_VARIANTS export start position
|
|
166
|
+
const defaultsStartMatch = content.match(
|
|
167
|
+
/export\s+const\s+KUMO_\w+_DEFAULT_VARIANTS\s*=\s*/,
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
if (!variantsStartMatch || !defaultsStartMatch) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Extract balanced brace content for variants
|
|
175
|
+
const variantsStartIndex =
|
|
176
|
+
(variantsStartMatch.index ?? 0) + variantsStartMatch[0].length;
|
|
177
|
+
const variantsBlock = extractBalancedBraces(content, variantsStartIndex);
|
|
178
|
+
|
|
179
|
+
// Extract balanced brace content for defaults
|
|
180
|
+
const defaultsStartIndex =
|
|
181
|
+
(defaultsStartMatch.index ?? 0) + defaultsStartMatch[0].length;
|
|
182
|
+
const defaultsBlock = extractBalancedBraces(content, defaultsStartIndex);
|
|
183
|
+
|
|
184
|
+
if (!variantsBlock || !defaultsBlock) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Parse the variants object (may be empty for components without variants)
|
|
189
|
+
const variants = parseVariantsObject(variantsBlock);
|
|
190
|
+
const defaults = parseDefaultsObject(defaultsBlock);
|
|
191
|
+
|
|
192
|
+
// Extract base styles if present
|
|
193
|
+
const baseStyles = extractBaseStylesFromFile(filePath);
|
|
194
|
+
|
|
195
|
+
// Return even if variants is empty - component still has props to document
|
|
196
|
+
return { variants, defaults, baseStyles };
|
|
197
|
+
} catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// =============================================================================
|
|
203
|
+
// Styling Extraction
|
|
204
|
+
// =============================================================================
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Parse a styling object string into a ComponentStyling object.
|
|
208
|
+
* Handles nested objects like container, title, description, closeButton, etc.
|
|
209
|
+
*/
|
|
210
|
+
function parseStylingObject(objStr: string): ComponentStyling | null {
|
|
211
|
+
try {
|
|
212
|
+
// Remove 'as const' suffix if present
|
|
213
|
+
const cleanedStr = objStr.replace(/\s*as\s+const\s*$/, "");
|
|
214
|
+
|
|
215
|
+
// Use Function constructor to safely evaluate the object literal
|
|
216
|
+
// This is safe because we control the input (it comes from our own source files)
|
|
217
|
+
// biome-ignore lint/security/noGlobalEval: Safe evaluation of known source file content
|
|
218
|
+
const parsed = new Function(`return ${cleanedStr}`)();
|
|
219
|
+
|
|
220
|
+
return parsed as ComponentStyling;
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Extract KUMO_*_STYLING from a component file.
|
|
228
|
+
* Returns the styling object or null if not found.
|
|
229
|
+
*
|
|
230
|
+
* This allows components to define Figma-specific styling metadata
|
|
231
|
+
* that gets automatically picked up by the registry generator.
|
|
232
|
+
*/
|
|
233
|
+
export function extractStylingFromFile(
|
|
234
|
+
filePath: string,
|
|
235
|
+
): ComponentStyling | null {
|
|
236
|
+
try {
|
|
237
|
+
const content = readFileSync(filePath, "utf-8");
|
|
238
|
+
|
|
239
|
+
// Find KUMO_*_STYLING export start position
|
|
240
|
+
const stylingStartMatch = content.match(
|
|
241
|
+
/export\s+const\s+KUMO_\w+_STYLING\s*=\s*/,
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
if (!stylingStartMatch) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Extract balanced brace content for styling
|
|
249
|
+
const stylingStartIndex =
|
|
250
|
+
(stylingStartMatch.index ?? 0) + stylingStartMatch[0].length;
|
|
251
|
+
const stylingBlock = extractBalancedBraces(content, stylingStartIndex);
|
|
252
|
+
|
|
253
|
+
if (!stylingBlock) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return parseStylingObject(stylingBlock);
|
|
258
|
+
} catch {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { copyFileSync, mkdirSync, existsSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
|
|
9
|
+
const srcDir = join(__dirname, "../src/styles");
|
|
10
|
+
const distDir = join(__dirname, "../dist/styles");
|
|
11
|
+
|
|
12
|
+
// Create dist/styles directory if it doesn't exist
|
|
13
|
+
if (!existsSync(distDir)) {
|
|
14
|
+
mkdirSync(distDir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Copy CSS files for Tailwind users (raw CSS with Tailwind directives)
|
|
18
|
+
const cssFiles: string[] = [
|
|
19
|
+
"kumo.css",
|
|
20
|
+
"kumo-binding.css",
|
|
21
|
+
"theme-kumo.css",
|
|
22
|
+
"theme-fedramp.css",
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
cssFiles.forEach((file) => {
|
|
26
|
+
const srcPath = join(srcDir, file);
|
|
27
|
+
const distPath = join(distDir, file);
|
|
28
|
+
|
|
29
|
+
if (existsSync(srcPath)) {
|
|
30
|
+
copyFileSync(srcPath, distPath);
|
|
31
|
+
console.log(`✓ Copied ${file} to dist/styles/ (Tailwind version)`);
|
|
32
|
+
} else {
|
|
33
|
+
console.warn(`⚠ Warning: ${file} not found in src/styles/`);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Compile standalone CSS for non-Tailwind users
|
|
38
|
+
console.log("📦 Compiling standalone CSS...");
|
|
39
|
+
try {
|
|
40
|
+
const standaloneInput = join(srcDir, "kumo-standalone.css");
|
|
41
|
+
const standaloneOutput = join(distDir, "kumo-standalone.css");
|
|
42
|
+
|
|
43
|
+
// Use Tailwind CLI to compile the CSS
|
|
44
|
+
execSync(
|
|
45
|
+
`npx tailwindcss -i ${standaloneInput} -o ${standaloneOutput} --minify`,
|
|
46
|
+
{ stdio: "inherit" },
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
console.log("✓ Compiled kumo-standalone.css");
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error("❌ Failed to compile standalone CSS:", error);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
console.log("✅ CSS build complete");
|