gladvn 0.2.14
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/README.md +112 -0
- package/bin/cli.js +326 -0
- package/dist/components/macro/accordion-preset.d.ts +14 -0
- package/dist/components/macro/accordion-preset.d.ts.map +1 -0
- package/dist/components/macro/alert-dialog-preset.d.ts +26 -0
- package/dist/components/macro/alert-dialog-preset.d.ts.map +1 -0
- package/dist/components/macro/alert-preset.d.ts +14 -0
- package/dist/components/macro/alert-preset.d.ts.map +1 -0
- package/dist/components/macro/avatar-preset.d.ts +11 -0
- package/dist/components/macro/avatar-preset.d.ts.map +1 -0
- package/dist/components/macro/breadcrumb-preset.d.ts +12 -0
- package/dist/components/macro/breadcrumb-preset.d.ts.map +1 -0
- package/dist/components/macro/card-preset.d.ts +10 -0
- package/dist/components/macro/card-preset.d.ts.map +1 -0
- package/dist/components/macro/carousel-preset.d.ts +18 -0
- package/dist/components/macro/carousel-preset.d.ts.map +1 -0
- package/dist/components/macro/checkbox-preset.d.ts +14 -0
- package/dist/components/macro/checkbox-preset.d.ts.map +1 -0
- package/dist/components/macro/combobox-preset.d.ts +27 -0
- package/dist/components/macro/combobox-preset.d.ts.map +1 -0
- package/dist/components/macro/command-preset.d.ts +16 -0
- package/dist/components/macro/command-preset.d.ts.map +1 -0
- package/dist/components/macro/date-picker.d.ts +62 -0
- package/dist/components/macro/date-picker.d.ts.map +1 -0
- package/dist/components/macro/dialog-preset.d.ts +24 -0
- package/dist/components/macro/dialog-preset.d.ts.map +1 -0
- package/dist/components/macro/empty-preset.d.ts +15 -0
- package/dist/components/macro/empty-preset.d.ts.map +1 -0
- package/dist/components/macro/field-preset.d.ts +15 -0
- package/dist/components/macro/field-preset.d.ts.map +1 -0
- package/dist/components/macro/index.d.ts +22 -0
- package/dist/components/macro/index.d.ts.map +1 -0
- package/dist/components/macro/input-otp-preset.d.ts +13 -0
- package/dist/components/macro/input-otp-preset.d.ts.map +1 -0
- package/dist/components/macro/input-preset.d.ts +21 -0
- package/dist/components/macro/input-preset.d.ts.map +1 -0
- package/dist/components/macro/pagination-preset.d.ts +13 -0
- package/dist/components/macro/pagination-preset.d.ts.map +1 -0
- package/dist/components/macro/progress-preset.d.ts +10 -0
- package/dist/components/macro/progress-preset.d.ts.map +1 -0
- package/dist/components/macro/radio-group-preset.d.ts +22 -0
- package/dist/components/macro/radio-group-preset.d.ts.map +1 -0
- package/dist/components/macro/select-preset.d.ts +42 -0
- package/dist/components/macro/select-preset.d.ts.map +1 -0
- package/dist/components/macro/slider-preset.d.ts +12 -0
- package/dist/components/macro/slider-preset.d.ts.map +1 -0
- package/dist/components/macro/switch-preset.d.ts +12 -0
- package/dist/components/macro/switch-preset.d.ts.map +1 -0
- package/dist/components/macro/tabs-preset.d.ts +17 -0
- package/dist/components/macro/tabs-preset.d.ts.map +1 -0
- package/dist/components/macro/textarea-preset.d.ts +17 -0
- package/dist/components/macro/textarea-preset.d.ts.map +1 -0
- package/dist/components/micro/accordion.d.ts +8 -0
- package/dist/components/micro/accordion.d.ts.map +1 -0
- package/dist/components/micro/alert-dialog.d.ts +33 -0
- package/dist/components/micro/alert-dialog.d.ts.map +1 -0
- package/dist/components/micro/alert.d.ts +28 -0
- package/dist/components/micro/alert.d.ts.map +1 -0
- package/dist/components/micro/aspect-ratio.d.ts +13 -0
- package/dist/components/micro/aspect-ratio.d.ts.map +1 -0
- package/dist/components/micro/avatar.d.ts +23 -0
- package/dist/components/micro/avatar.d.ts.map +1 -0
- package/dist/components/micro/badge.d.ts +16 -0
- package/dist/components/micro/badge.d.ts.map +1 -0
- package/dist/components/micro/breadcrumb.d.ts +24 -0
- package/dist/components/micro/breadcrumb.d.ts.map +1 -0
- package/dist/components/micro/button.d.ts +39 -0
- package/dist/components/micro/button.d.ts.map +1 -0
- package/dist/components/micro/calendar.d.ts +28 -0
- package/dist/components/micro/calendar.d.ts.map +1 -0
- package/dist/components/micro/card.d.ts +28 -0
- package/dist/components/micro/card.d.ts.map +1 -0
- package/dist/components/micro/carousel.d.ts +29 -0
- package/dist/components/micro/carousel.d.ts.map +1 -0
- package/dist/components/micro/chart.d.ts +49 -0
- package/dist/components/micro/chart.d.ts.map +1 -0
- package/dist/components/micro/checkbox.d.ts +17 -0
- package/dist/components/micro/checkbox.d.ts.map +1 -0
- package/dist/components/micro/collapsible.d.ts +15 -0
- package/dist/components/micro/collapsible.d.ts.map +1 -0
- package/dist/components/micro/combobox.d.ts +33 -0
- package/dist/components/micro/combobox.d.ts.map +1 -0
- package/dist/components/micro/command.d.ts +79 -0
- package/dist/components/micro/command.d.ts.map +1 -0
- package/dist/components/micro/context-menu.d.ts +60 -0
- package/dist/components/micro/context-menu.d.ts.map +1 -0
- package/dist/components/micro/dialog.d.ts +14 -0
- package/dist/components/micro/dialog.d.ts.map +1 -0
- package/dist/components/micro/direction.d.ts +2 -0
- package/dist/components/micro/direction.d.ts.map +1 -0
- package/dist/components/micro/drawer.d.ts +17 -0
- package/dist/components/micro/drawer.d.ts.map +1 -0
- package/dist/components/micro/dropdown-menu.d.ts +37 -0
- package/dist/components/micro/dropdown-menu.d.ts.map +1 -0
- package/dist/components/micro/empty.d.ts +23 -0
- package/dist/components/micro/empty.d.ts.map +1 -0
- package/dist/components/micro/field.d.ts +29 -0
- package/dist/components/micro/field.d.ts.map +1 -0
- package/dist/components/micro/hover-card.d.ts +17 -0
- package/dist/components/micro/hover-card.d.ts.map +1 -0
- package/dist/components/micro/input-group.d.ts +17 -0
- package/dist/components/micro/input-group.d.ts.map +1 -0
- package/dist/components/micro/input-otp.d.ts +44 -0
- package/dist/components/micro/input-otp.d.ts.map +1 -0
- package/dist/components/micro/input.d.ts +22 -0
- package/dist/components/micro/input.d.ts.map +1 -0
- package/dist/components/micro/item.d.ts +31 -0
- package/dist/components/micro/item.d.ts.map +1 -0
- package/dist/components/micro/kbd.d.ts +9 -0
- package/dist/components/micro/kbd.d.ts.map +1 -0
- package/dist/components/micro/label.d.ts +15 -0
- package/dist/components/micro/label.d.ts.map +1 -0
- package/dist/components/micro/menubar.d.ts +41 -0
- package/dist/components/micro/menubar.d.ts.map +1 -0
- package/dist/components/micro/navigation-menu.d.ts +18 -0
- package/dist/components/micro/navigation-menu.d.ts.map +1 -0
- package/dist/components/micro/pagination.d.ts +33 -0
- package/dist/components/micro/pagination.d.ts.map +1 -0
- package/dist/components/micro/popover.d.ts +23 -0
- package/dist/components/micro/popover.d.ts.map +1 -0
- package/dist/components/micro/progress.d.ts +19 -0
- package/dist/components/micro/progress.d.ts.map +1 -0
- package/dist/components/micro/radio-group.d.ts +13 -0
- package/dist/components/micro/radio-group.d.ts.map +1 -0
- package/dist/components/micro/resizable.d.ts +12 -0
- package/dist/components/micro/resizable.d.ts.map +1 -0
- package/dist/components/micro/scroll-area.d.ts +12 -0
- package/dist/components/micro/scroll-area.d.ts.map +1 -0
- package/dist/components/micro/select.d.ts +21 -0
- package/dist/components/micro/select.d.ts.map +1 -0
- package/dist/components/micro/separator.d.ts +9 -0
- package/dist/components/micro/separator.d.ts.map +1 -0
- package/dist/components/micro/sheet.d.ts +17 -0
- package/dist/components/micro/sheet.d.ts.map +1 -0
- package/dist/components/micro/sidebar.d.ts +28 -0
- package/dist/components/micro/sidebar.d.ts.map +1 -0
- package/dist/components/micro/skeleton.d.ts +9 -0
- package/dist/components/micro/skeleton.d.ts.map +1 -0
- package/dist/components/micro/slider.d.ts +14 -0
- package/dist/components/micro/slider.d.ts.map +1 -0
- package/dist/components/micro/sonner.d.ts +5 -0
- package/dist/components/micro/sonner.d.ts.map +1 -0
- package/dist/components/micro/spinner.d.ts +21 -0
- package/dist/components/micro/spinner.d.ts.map +1 -0
- package/dist/components/micro/switch.d.ts +13 -0
- package/dist/components/micro/switch.d.ts.map +1 -0
- package/dist/components/micro/table.d.ts +17 -0
- package/dist/components/micro/table.d.ts.map +1 -0
- package/dist/components/micro/tabs.d.ts +13 -0
- package/dist/components/micro/tabs.d.ts.map +1 -0
- package/dist/components/micro/textarea.d.ts +17 -0
- package/dist/components/micro/textarea.d.ts.map +1 -0
- package/dist/components/micro/theme-provider.d.ts +76 -0
- package/dist/components/micro/theme-provider.d.ts.map +1 -0
- package/dist/components/micro/toggle-group.d.ts +22 -0
- package/dist/components/micro/toggle-group.d.ts.map +1 -0
- package/dist/components/micro/toggle.d.ts +16 -0
- package/dist/components/micro/toggle.d.ts.map +1 -0
- package/dist/components/micro/tooltip.d.ts +20 -0
- package/dist/components/micro/tooltip.d.ts.map +1 -0
- package/dist/dev/App.d.ts +3 -0
- package/dist/dev/App.d.ts.map +1 -0
- package/dist/dev/components/GladcnLogo.d.ts +10 -0
- package/dist/dev/components/GladcnLogo.d.ts.map +1 -0
- package/dist/dev/components/code-highlighter.d.ts +5 -0
- package/dist/dev/components/code-highlighter.d.ts.map +1 -0
- package/dist/dev/components/dev-context.d.ts +12 -0
- package/dist/dev/components/dev-context.d.ts.map +1 -0
- package/dist/dev/components/showcase.d.ts +72 -0
- package/dist/dev/components/showcase.d.ts.map +1 -0
- package/dist/dev/data.d.ts +68 -0
- package/dist/dev/data.d.ts.map +1 -0
- package/dist/dev/main.d.ts +1 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/dev/sections/buttons.d.ts +2 -0
- package/dist/dev/sections/buttons.d.ts.map +1 -0
- package/dist/dev/sections/display.d.ts +2 -0
- package/dist/dev/sections/display.d.ts.map +1 -0
- package/dist/dev/sections/feedback.d.ts +2 -0
- package/dist/dev/sections/feedback.d.ts.map +1 -0
- package/dist/dev/sections/forms.d.ts +2 -0
- package/dist/dev/sections/forms.d.ts.map +1 -0
- package/dist/dev/sections/interactive.d.ts +2 -0
- package/dist/dev/sections/interactive.d.ts.map +1 -0
- package/dist/dev/sections/overview.d.ts +2 -0
- package/dist/dev/sections/overview.d.ts.map +1 -0
- package/dist/dev/showcase/accordion.d.ts +2 -0
- package/dist/dev/showcase/accordion.d.ts.map +1 -0
- package/dist/dev/showcase/alert-dialog.d.ts +2 -0
- package/dist/dev/showcase/alert-dialog.d.ts.map +1 -0
- package/dist/dev/showcase/alert.d.ts +2 -0
- package/dist/dev/showcase/alert.d.ts.map +1 -0
- package/dist/dev/showcase/aspect-ratio.d.ts +2 -0
- package/dist/dev/showcase/aspect-ratio.d.ts.map +1 -0
- package/dist/dev/showcase/avatar.d.ts +2 -0
- package/dist/dev/showcase/avatar.d.ts.map +1 -0
- package/dist/dev/showcase/badge.d.ts +2 -0
- package/dist/dev/showcase/badge.d.ts.map +1 -0
- package/dist/dev/showcase/breadcrumb.d.ts +2 -0
- package/dist/dev/showcase/breadcrumb.d.ts.map +1 -0
- package/dist/dev/showcase/button.d.ts +2 -0
- package/dist/dev/showcase/button.d.ts.map +1 -0
- package/dist/dev/showcase/calendar.d.ts +2 -0
- package/dist/dev/showcase/calendar.d.ts.map +1 -0
- package/dist/dev/showcase/card.d.ts +2 -0
- package/dist/dev/showcase/card.d.ts.map +1 -0
- package/dist/dev/showcase/carousel.d.ts +2 -0
- package/dist/dev/showcase/carousel.d.ts.map +1 -0
- package/dist/dev/showcase/chart.d.ts +2 -0
- package/dist/dev/showcase/chart.d.ts.map +1 -0
- package/dist/dev/showcase/checkbox.d.ts +2 -0
- package/dist/dev/showcase/checkbox.d.ts.map +1 -0
- package/dist/dev/showcase/collapsible.d.ts +3 -0
- package/dist/dev/showcase/collapsible.d.ts.map +1 -0
- package/dist/dev/showcase/combobox.d.ts +2 -0
- package/dist/dev/showcase/combobox.d.ts.map +1 -0
- package/dist/dev/showcase/command.d.ts +2 -0
- package/dist/dev/showcase/command.d.ts.map +1 -0
- package/dist/dev/showcase/context-menu.d.ts +2 -0
- package/dist/dev/showcase/context-menu.d.ts.map +1 -0
- package/dist/dev/showcase/dialog.d.ts +2 -0
- package/dist/dev/showcase/dialog.d.ts.map +1 -0
- package/dist/dev/showcase/drawer.d.ts +2 -0
- package/dist/dev/showcase/drawer.d.ts.map +1 -0
- package/dist/dev/showcase/dropdown-menu.d.ts +2 -0
- package/dist/dev/showcase/dropdown-menu.d.ts.map +1 -0
- package/dist/dev/showcase/empty.d.ts +2 -0
- package/dist/dev/showcase/empty.d.ts.map +1 -0
- package/dist/dev/showcase/hover-card.d.ts +2 -0
- package/dist/dev/showcase/hover-card.d.ts.map +1 -0
- package/dist/dev/showcase/input-group.d.ts +2 -0
- package/dist/dev/showcase/input-group.d.ts.map +1 -0
- package/dist/dev/showcase/input-otp.d.ts +2 -0
- package/dist/dev/showcase/input-otp.d.ts.map +1 -0
- package/dist/dev/showcase/input.d.ts +2 -0
- package/dist/dev/showcase/input.d.ts.map +1 -0
- package/dist/dev/showcase/item.d.ts +2 -0
- package/dist/dev/showcase/item.d.ts.map +1 -0
- package/dist/dev/showcase/kbd.d.ts +2 -0
- package/dist/dev/showcase/kbd.d.ts.map +1 -0
- package/dist/dev/showcase/label.d.ts +2 -0
- package/dist/dev/showcase/label.d.ts.map +1 -0
- package/dist/dev/showcase/menubar.d.ts +2 -0
- package/dist/dev/showcase/menubar.d.ts.map +1 -0
- package/dist/dev/showcase/navigation-menu.d.ts +3 -0
- package/dist/dev/showcase/navigation-menu.d.ts.map +1 -0
- package/dist/dev/showcase/overview.d.ts +2 -0
- package/dist/dev/showcase/overview.d.ts.map +1 -0
- package/dist/dev/showcase/pagination.d.ts +2 -0
- package/dist/dev/showcase/pagination.d.ts.map +1 -0
- package/dist/dev/showcase/popover.d.ts +2 -0
- package/dist/dev/showcase/popover.d.ts.map +1 -0
- package/dist/dev/showcase/progress.d.ts +2 -0
- package/dist/dev/showcase/progress.d.ts.map +1 -0
- package/dist/dev/showcase/radio-group.d.ts +2 -0
- package/dist/dev/showcase/radio-group.d.ts.map +1 -0
- package/dist/dev/showcase/resizable.d.ts +2 -0
- package/dist/dev/showcase/resizable.d.ts.map +1 -0
- package/dist/dev/showcase/scroll-area.d.ts +2 -0
- package/dist/dev/showcase/scroll-area.d.ts.map +1 -0
- package/dist/dev/showcase/select.d.ts +2 -0
- package/dist/dev/showcase/select.d.ts.map +1 -0
- package/dist/dev/showcase/separator.d.ts +2 -0
- package/dist/dev/showcase/separator.d.ts.map +1 -0
- package/dist/dev/showcase/sheet.d.ts +2 -0
- package/dist/dev/showcase/sheet.d.ts.map +1 -0
- package/dist/dev/showcase/sidebar.d.ts +2 -0
- package/dist/dev/showcase/sidebar.d.ts.map +1 -0
- package/dist/dev/showcase/skeleton.d.ts +2 -0
- package/dist/dev/showcase/skeleton.d.ts.map +1 -0
- package/dist/dev/showcase/slider.d.ts +2 -0
- package/dist/dev/showcase/slider.d.ts.map +1 -0
- package/dist/dev/showcase/sonner.d.ts +2 -0
- package/dist/dev/showcase/sonner.d.ts.map +1 -0
- package/dist/dev/showcase/spinner.d.ts +2 -0
- package/dist/dev/showcase/spinner.d.ts.map +1 -0
- package/dist/dev/showcase/switch.d.ts +2 -0
- package/dist/dev/showcase/switch.d.ts.map +1 -0
- package/dist/dev/showcase/table.d.ts +2 -0
- package/dist/dev/showcase/table.d.ts.map +1 -0
- package/dist/dev/showcase/tabs.d.ts +2 -0
- package/dist/dev/showcase/tabs.d.ts.map +1 -0
- package/dist/dev/showcase/textarea.d.ts +2 -0
- package/dist/dev/showcase/textarea.d.ts.map +1 -0
- package/dist/dev/showcase/theme-provider.d.ts +2 -0
- package/dist/dev/showcase/theme-provider.d.ts.map +1 -0
- package/dist/dev/showcase/toast.d.ts +2 -0
- package/dist/dev/showcase/toast.d.ts.map +1 -0
- package/dist/dev/showcase/toggle-group.d.ts +2 -0
- package/dist/dev/showcase/toggle-group.d.ts.map +1 -0
- package/dist/dev/showcase/toggle.d.ts +2 -0
- package/dist/dev/showcase/toggle.d.ts.map +1 -0
- package/dist/dev/showcase/tooltip.d.ts +2 -0
- package/dist/dev/showcase/tooltip.d.ts.map +1 -0
- package/dist/hooks/use-controllable-state.d.ts +14 -0
- package/dist/hooks/use-controllable-state.d.ts.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/index.cjs +5099 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4740 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/types.d.ts +4 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/preset.d.ts +18 -0
- package/dist/preset.d.ts.map +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/llms.txt +74 -0
- package/package.json +117 -0
- package/scripts/add-icononly-prop.ts +84 -0
- package/scripts/audit-best-practices.ts +114 -0
- package/scripts/audit-showcase.ts +262 -0
- package/scripts/audit-showcases.ts +83 -0
- package/scripts/clean-imports.ts +21 -0
- package/scripts/count_missing.ts +24 -0
- package/scripts/find-css-vars.ts +62 -0
- package/scripts/fix-portals.ts +90 -0
- package/scripts/full-audit.ts +89 -0
- package/scripts/merge-components.cjs +65 -0
- package/scripts/merge-components.js +64 -0
- package/scripts/optimize-barrel.ts +116 -0
- package/scripts/postinstall.cjs +228 -0
- package/scripts/refactor_divs.ts +39 -0
- package/scripts/remove_div_wrappers.ts +17 -0
- package/scripts/update-gaps.ts +83 -0
- package/scripts/update_showcase_codestrings.ts +87 -0
- package/src/components/macro/accordion-preset.test.tsx +37 -0
- package/src/components/macro/accordion-preset.tsx +41 -0
- package/src/components/macro/alert-dialog-preset.tsx +116 -0
- package/src/components/macro/alert-preset.tsx +94 -0
- package/src/components/macro/avatar-preset.tsx +54 -0
- package/src/components/macro/breadcrumb-preset.tsx +50 -0
- package/src/components/macro/card-preset.tsx +44 -0
- package/src/components/macro/carousel-preset.tsx +150 -0
- package/src/components/macro/checkbox-preset.test.tsx +49 -0
- package/src/components/macro/checkbox-preset.tsx +84 -0
- package/src/components/macro/combobox-preset.tsx +171 -0
- package/src/components/macro/command-preset.tsx +74 -0
- package/src/components/macro/date-picker.tsx +289 -0
- package/src/components/macro/dialog-preset.tsx +105 -0
- package/src/components/macro/empty-preset.tsx +46 -0
- package/src/components/macro/field-preset.test.tsx +69 -0
- package/src/components/macro/field-preset.tsx +65 -0
- package/src/components/macro/index.ts +21 -0
- package/src/components/macro/input-otp-preset.tsx +98 -0
- package/src/components/macro/input-preset.test.tsx +52 -0
- package/src/components/macro/input-preset.tsx +139 -0
- package/src/components/macro/pagination-preset.tsx +153 -0
- package/src/components/macro/progress-preset.test.tsx +65 -0
- package/src/components/macro/progress-preset.tsx +45 -0
- package/src/components/macro/radio-group-preset.tsx +115 -0
- package/src/components/macro/select-preset.tsx +168 -0
- package/src/components/macro/slider-preset.test.tsx +43 -0
- package/src/components/macro/slider-preset.tsx +86 -0
- package/src/components/macro/switch-preset.test.tsx +53 -0
- package/src/components/macro/switch-preset.tsx +70 -0
- package/src/components/macro/tabs-preset.test.tsx +31 -0
- package/src/components/macro/tabs-preset.tsx +51 -0
- package/src/components/macro/textarea-preset.test.tsx +39 -0
- package/src/components/macro/textarea-preset.tsx +55 -0
- package/src/components/micro/accordion.tsx +76 -0
- package/src/components/micro/alert-dialog.tsx +213 -0
- package/src/components/micro/alert.tsx +146 -0
- package/src/components/micro/aspect-ratio.tsx +38 -0
- package/src/components/micro/avatar.tsx +143 -0
- package/src/components/micro/badge.tsx +207 -0
- package/src/components/micro/breadcrumb.tsx +162 -0
- package/src/components/micro/button.test.tsx +25 -0
- package/src/components/micro/button.tsx +361 -0
- package/src/components/micro/calendar.tsx +383 -0
- package/src/components/micro/card.tsx +112 -0
- package/src/components/micro/carousel.tsx +341 -0
- package/src/components/micro/chart.tsx +392 -0
- package/src/components/micro/checkbox.tsx +74 -0
- package/src/components/micro/collapsible.tsx +65 -0
- package/src/components/micro/combobox.tsx +349 -0
- package/src/components/micro/command.tsx +238 -0
- package/src/components/micro/context-menu.tsx +285 -0
- package/src/components/micro/dialog.tsx +143 -0
- package/src/components/micro/direction.tsx +13 -0
- package/src/components/micro/drawer.tsx +149 -0
- package/src/components/micro/dropdown-menu.tsx +305 -0
- package/src/components/micro/empty.tsx +144 -0
- package/src/components/micro/field.tsx +311 -0
- package/src/components/micro/hover-card.tsx +86 -0
- package/src/components/micro/input-group.tsx +269 -0
- package/src/components/micro/input-otp.tsx +130 -0
- package/src/components/micro/input.tsx +56 -0
- package/src/components/micro/item.tsx +206 -0
- package/src/components/micro/kbd.tsx +38 -0
- package/src/components/micro/label.tsx +48 -0
- package/src/components/micro/menubar.tsx +302 -0
- package/src/components/micro/navigation-menu.tsx +197 -0
- package/src/components/micro/pagination.tsx +162 -0
- package/src/components/micro/popover.tsx +131 -0
- package/src/components/micro/progress.tsx +144 -0
- package/src/components/micro/radio-group.tsx +73 -0
- package/src/components/micro/resizable.tsx +64 -0
- package/src/components/micro/scroll-area.tsx +68 -0
- package/src/components/micro/select.tsx +234 -0
- package/src/components/micro/separator.tsx +37 -0
- package/src/components/micro/sheet.tsx +144 -0
- package/src/components/micro/sidebar.tsx +238 -0
- package/src/components/micro/skeleton.tsx +29 -0
- package/src/components/micro/slider.tsx +135 -0
- package/src/components/micro/sonner.tsx +85 -0
- package/src/components/micro/spinner.tsx +44 -0
- package/src/components/micro/switch.tsx +70 -0
- package/src/components/micro/table.tsx +210 -0
- package/src/components/micro/tabs.tsx +100 -0
- package/src/components/micro/textarea.tsx +53 -0
- package/src/components/micro/theme-provider.tsx +163 -0
- package/src/components/micro/toggle-group.tsx +121 -0
- package/src/components/micro/toggle.tsx +55 -0
- package/src/components/micro/tooltip.tsx +105 -0
- package/src/dev/App.tsx +322 -0
- package/src/dev/_debug_select.html +29 -0
- package/src/dev/components/GladcnLogo.tsx +80 -0
- package/src/dev/components/code-highlighter.tsx +67 -0
- package/src/dev/components/dev-context.tsx +31 -0
- package/src/dev/components/showcase.tsx +413 -0
- package/src/dev/data.ts +341 -0
- package/src/dev/index.css +55 -0
- package/src/dev/main.tsx +30 -0
- package/src/dev/sections/buttons.tsx +303 -0
- package/src/dev/sections/display.tsx +270 -0
- package/src/dev/sections/feedback.tsx +371 -0
- package/src/dev/sections/forms.tsx +652 -0
- package/src/dev/sections/interactive.tsx +51 -0
- package/src/dev/sections/overview.tsx +396 -0
- package/src/dev/showcase/accordion.tsx +947 -0
- package/src/dev/showcase/alert-dialog.tsx +1056 -0
- package/src/dev/showcase/alert.tsx +756 -0
- package/src/dev/showcase/aspect-ratio.tsx +339 -0
- package/src/dev/showcase/avatar.tsx +470 -0
- package/src/dev/showcase/badge.tsx +227 -0
- package/src/dev/showcase/breadcrumb.tsx +269 -0
- package/src/dev/showcase/button.tsx +309 -0
- package/src/dev/showcase/calendar.tsx +380 -0
- package/src/dev/showcase/card.tsx +448 -0
- package/src/dev/showcase/carousel.tsx +562 -0
- package/src/dev/showcase/chart.tsx +130 -0
- package/src/dev/showcase/checkbox.tsx +611 -0
- package/src/dev/showcase/collapsible.tsx +298 -0
- package/src/dev/showcase/combobox.tsx +777 -0
- package/src/dev/showcase/command.tsx +245 -0
- package/src/dev/showcase/context-menu.tsx +239 -0
- package/src/dev/showcase/dialog.tsx +1141 -0
- package/src/dev/showcase/drawer.tsx +392 -0
- package/src/dev/showcase/dropdown-menu.tsx +420 -0
- package/src/dev/showcase/empty.tsx +493 -0
- package/src/dev/showcase/hover-card.tsx +336 -0
- package/src/dev/showcase/input-group.tsx +511 -0
- package/src/dev/showcase/input-otp.tsx +404 -0
- package/src/dev/showcase/input.tsx +530 -0
- package/src/dev/showcase/item.tsx +295 -0
- package/src/dev/showcase/kbd.tsx +276 -0
- package/src/dev/showcase/label.tsx +121 -0
- package/src/dev/showcase/menubar.tsx +392 -0
- package/src/dev/showcase/navigation-menu.tsx +304 -0
- package/src/dev/showcase/overview.tsx +1106 -0
- package/src/dev/showcase/pagination.tsx +312 -0
- package/src/dev/showcase/popover.tsx +374 -0
- package/src/dev/showcase/progress.tsx +299 -0
- package/src/dev/showcase/radio-group.tsx +612 -0
- package/src/dev/showcase/resizable.tsx +237 -0
- package/src/dev/showcase/scroll-area.tsx +157 -0
- package/src/dev/showcase/select.tsx +628 -0
- package/src/dev/showcase/separator.tsx +126 -0
- package/src/dev/showcase/sheet.tsx +566 -0
- package/src/dev/showcase/sidebar.tsx +120 -0
- package/src/dev/showcase/skeleton.tsx +213 -0
- package/src/dev/showcase/slider.tsx +506 -0
- package/src/dev/showcase/sonner.tsx +376 -0
- package/src/dev/showcase/spinner.tsx +124 -0
- package/src/dev/showcase/switch.tsx +602 -0
- package/src/dev/showcase/table.tsx +196 -0
- package/src/dev/showcase/tabs.tsx +662 -0
- package/src/dev/showcase/textarea.tsx +498 -0
- package/src/dev/showcase/theme-provider.tsx +894 -0
- package/src/dev/showcase/toast.tsx +119 -0
- package/src/dev/showcase/toggle-group.tsx +223 -0
- package/src/dev/showcase/toggle.tsx +171 -0
- package/src/dev/showcase/tooltip.tsx +372 -0
- package/src/hooks/use-controllable-state.ts +87 -0
- package/src/hooks/use-mobile.ts +21 -0
- package/src/index.ts +62 -0
- package/src/lib/types.ts +14 -0
- package/src/lib/utils.test.ts +14 -0
- package/src/lib/utils.ts +6 -0
- package/src/preset.ts +17 -0
- package/src/styles/gladcn.css +116 -0
- package/src/styles/tokens.css +213 -0
- package/src/test/setup.ts +8 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type Size = "sm" | "md" | "lg";
|
|
2
|
+
export type Color = "primary" | "secondary" | "destructive" | "success" | "warning" | "info" | "tertiary" | "muted" | "accent";
|
|
3
|
+
export type Variant = "solid" | "outline" | "ghost" | "soft" | "link";
|
|
4
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,KAAK,GACb,SAAS,GACT,WAAW,GACX,aAAa,GACb,SAAS,GACT,SAAS,GACT,MAAM,GACN,UAAU,GACV,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
|
package/dist/preset.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './components/macro/accordion-preset';
|
|
2
|
+
export * from './components/macro/avatar-preset';
|
|
3
|
+
export * from './components/macro/breadcrumb-preset';
|
|
4
|
+
export * from './components/macro/carousel-preset';
|
|
5
|
+
export * from './components/macro/checkbox-preset';
|
|
6
|
+
export * from './components/macro/combobox-preset';
|
|
7
|
+
export * from './components/macro/field-preset';
|
|
8
|
+
export * from './components/macro/input-otp-preset';
|
|
9
|
+
export * from './components/macro/input-preset';
|
|
10
|
+
export * from './components/macro/pagination-preset';
|
|
11
|
+
export * from './components/macro/progress-preset';
|
|
12
|
+
export * from './components/macro/radio-group-preset';
|
|
13
|
+
export * from './components/macro/select-preset';
|
|
14
|
+
export * from './components/macro/slider-preset';
|
|
15
|
+
export * from './components/macro/switch-preset';
|
|
16
|
+
export * from './components/macro/tabs-preset';
|
|
17
|
+
export * from './components/macro/textarea-preset';
|
|
18
|
+
//# sourceMappingURL=preset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../src/preset.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# gladcn UI - AI Guidelines
|
|
2
|
+
|
|
3
|
+
You are an AI Coding Assistant helping a developer use the `gladcn` UI library.
|
|
4
|
+
`gladcn` is a React component library built on top of Radix UI and Tailwind CSS, focusing on beautiful, accessible, and highly composable components.
|
|
5
|
+
|
|
6
|
+
Follow these strict guidelines when generating or modifying code that uses `gladcn`:
|
|
7
|
+
|
|
8
|
+
## 1. Imports
|
|
9
|
+
- **Always** import components directly from the package root:
|
|
10
|
+
`import { Button, Card, Dialog } from "@duongy96/gladcn";`
|
|
11
|
+
- **Never** import from internal paths like `@duongy96/gladcn/dist/...` or `src/components/ui/...`.
|
|
12
|
+
|
|
13
|
+
## 2. Composition over Configuration
|
|
14
|
+
`gladcn` heavily uses a composable architecture. When building complex UI, always use the provided sub-components rather than passing large configuration objects.
|
|
15
|
+
|
|
16
|
+
**Correct (Composition):**
|
|
17
|
+
```tsx
|
|
18
|
+
import { Card, CardHeader, CardTitle, CardContent } from "@duongy96/gladcn";
|
|
19
|
+
|
|
20
|
+
<Card>
|
|
21
|
+
<CardHeader>
|
|
22
|
+
<CardTitle>Hello World</CardTitle>
|
|
23
|
+
</CardHeader>
|
|
24
|
+
<CardContent>
|
|
25
|
+
Some content here.
|
|
26
|
+
</CardContent>
|
|
27
|
+
</Card>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Incorrect (Do not hallucinate props):**
|
|
31
|
+
```tsx
|
|
32
|
+
// ā DO NOT DO THIS
|
|
33
|
+
<Card title="Hello World" content="Some content here" />
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 3. Form Fields
|
|
37
|
+
When building forms, use the `Field` wrapper to automatically handle accessibility, labels, and error messages.
|
|
38
|
+
```tsx
|
|
39
|
+
import { Field, FieldLabel, FieldContent, FieldError, Input } from "@duongy96/gladcn";
|
|
40
|
+
|
|
41
|
+
<Field error={errors.email?.message}>
|
|
42
|
+
<FieldLabel>Email Address</FieldLabel>
|
|
43
|
+
<FieldContent>
|
|
44
|
+
<Input type="email" placeholder="name@example.com" />
|
|
45
|
+
</FieldContent>
|
|
46
|
+
<FieldError>{errors.email?.message}</FieldError>
|
|
47
|
+
</Field>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 4. Styling
|
|
51
|
+
- Components are fully styled by default.
|
|
52
|
+
- If you need to override or extend styles, pass Tailwind CSS classes via the `className` prop.
|
|
53
|
+
- Example: `<Button className="w-full mt-4" variant="solid" color="primary">Submit</Button>`
|
|
54
|
+
|
|
55
|
+
## 5. Overlay Components (Dialog, Popover, Sheet, DropdownMenu)
|
|
56
|
+
Overlay components are unmounted by default and use portals.
|
|
57
|
+
Always structure them with their respective Trigger and Content wrappers.
|
|
58
|
+
```tsx
|
|
59
|
+
<Dialog>
|
|
60
|
+
<DialogTrigger>Open</DialogTrigger>
|
|
61
|
+
<DialogContent>
|
|
62
|
+
<DialogHeader>
|
|
63
|
+
<DialogTitle>Title</DialogTitle>
|
|
64
|
+
</DialogHeader>
|
|
65
|
+
Content
|
|
66
|
+
</DialogContent>
|
|
67
|
+
</Dialog>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 6. Icons
|
|
71
|
+
`gladcn` does not bundle an icon library by default, but relies on standard SVG icons (like `lucide-react`). When adding icons inside components like `Button` or `Empty`, use standard SVG elements or Lucide components.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
*Note to AI: Always prioritize reading the JSDoc/TSDoc definitions of the imported components if you are unsure of the props.*
|
package/package.json
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gladvn",
|
|
3
|
+
"version": "0.2.14",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "DO NOT 'npm install'. Use 'npx gladvn init' instead! A highly composable React component library built with Tailwind CSS.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"react",
|
|
8
|
+
"components",
|
|
9
|
+
"ui",
|
|
10
|
+
"shadcn",
|
|
11
|
+
"tailwindcss",
|
|
12
|
+
"radix-ui"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"main": "./dist/index.cjs",
|
|
16
|
+
"module": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"bin": {
|
|
19
|
+
"gladcn": "bin/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"import": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"default": "./dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"require": {
|
|
28
|
+
"types": "./dist/index.d.cts",
|
|
29
|
+
"default": "./dist/index.cjs"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"./gladcn.css": "./src/styles/gladcn.css",
|
|
33
|
+
"./tokens.css": "./src/styles/tokens.css"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"src",
|
|
38
|
+
"bin",
|
|
39
|
+
"scripts",
|
|
40
|
+
"llms.txt"
|
|
41
|
+
],
|
|
42
|
+
"sideEffects": [
|
|
43
|
+
"**/*.css"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"dev": "vite",
|
|
47
|
+
"build": "vite build",
|
|
48
|
+
"lint": "oxlint",
|
|
49
|
+
"preview": "vite preview",
|
|
50
|
+
"postinstall": "node scripts/postinstall.cjs || true",
|
|
51
|
+
"prepublishOnly": "npm run build",
|
|
52
|
+
"build:app": "vite build -c vite.config.app.ts",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"prepare": "husky"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"react": ">=18",
|
|
58
|
+
"react-dom": ">=18",
|
|
59
|
+
"tailwindcss": ">=4"
|
|
60
|
+
},
|
|
61
|
+
"peerDependenciesMeta": {
|
|
62
|
+
"tailwindcss": {
|
|
63
|
+
"optional": false
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@base-ui/react": "^1.6.0",
|
|
68
|
+
"class-variance-authority": "^0.7.1",
|
|
69
|
+
"clsx": "^2.1.1",
|
|
70
|
+
"cmdk": "^1.1.1",
|
|
71
|
+
"date-fns": "^4.4.0",
|
|
72
|
+
"embla-carousel-react": "^8.6.0",
|
|
73
|
+
"input-otp": "^1.4.2",
|
|
74
|
+
"lucide-react": "^1.24.0",
|
|
75
|
+
"next-themes": "^0.4.6",
|
|
76
|
+
"react-day-picker": "^10.0.1",
|
|
77
|
+
"react-resizable-panels": "^4.12.1",
|
|
78
|
+
"recharts": "^3.9.2",
|
|
79
|
+
"shiki": "^4.3.1",
|
|
80
|
+
"sonner": "^2.0.7",
|
|
81
|
+
"tailwind-merge": "^3.6.0",
|
|
82
|
+
"tw-animate-css": "^1.4.0",
|
|
83
|
+
"vaul": "^1.1.2"
|
|
84
|
+
},
|
|
85
|
+
"devDependencies": {
|
|
86
|
+
"@hookform/resolvers": "^5.4.0",
|
|
87
|
+
"@playwright/test": "^1.61.1",
|
|
88
|
+
"@radix-ui/react-dialog": "^1.1.18",
|
|
89
|
+
"@tailwindcss/vite": "^4.3.1",
|
|
90
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
91
|
+
"@testing-library/react": "^16.3.2",
|
|
92
|
+
"@testing-library/user-event": "^14.6.1",
|
|
93
|
+
"@types/node": "^24.13.2",
|
|
94
|
+
"@types/react": "^19.2.17",
|
|
95
|
+
"@types/react-dom": "^19.2.3",
|
|
96
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
97
|
+
"husky": "^9.1.7",
|
|
98
|
+
"jsdom": "^29.1.1",
|
|
99
|
+
"lint-staged": "^16.4.0",
|
|
100
|
+
"oxlint": "^1.69.0",
|
|
101
|
+
"react": "^19.2.7",
|
|
102
|
+
"react-dom": "^19.2.7",
|
|
103
|
+
"react-hook-form": "^7.80.0",
|
|
104
|
+
"tailwindcss": "^4.3.1",
|
|
105
|
+
"ts-morph": "^28.0.0",
|
|
106
|
+
"typescript": "~6.0.2",
|
|
107
|
+
"vite": "^8.1.0",
|
|
108
|
+
"vite-plugin-dts": "^5.0.3",
|
|
109
|
+
"vitest": "^4.1.9",
|
|
110
|
+
"zod": "^4.4.3"
|
|
111
|
+
},
|
|
112
|
+
"lint-staged": {
|
|
113
|
+
"*.{ts,tsx}": [
|
|
114
|
+
"oxlint"
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Project, SyntaxKind, JsxElement, JsxSelfClosingElement } from "ts-morph";
|
|
2
|
+
|
|
3
|
+
const project = new Project({
|
|
4
|
+
tsConfigFilePath: "tsconfig.json",
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
const sourceFiles = project.getSourceFiles("src/**/*.tsx");
|
|
8
|
+
|
|
9
|
+
let changed = 0;
|
|
10
|
+
|
|
11
|
+
for (const sf of sourceFiles) {
|
|
12
|
+
let fileChanged = false;
|
|
13
|
+
|
|
14
|
+
const jsxElements = sf.getDescendantsOfKind(SyntaxKind.JsxElement);
|
|
15
|
+
|
|
16
|
+
for (const jsx of jsxElements) {
|
|
17
|
+
const opening = jsx.getOpeningElement();
|
|
18
|
+
const tagName = opening.getTagNameNode().getText();
|
|
19
|
+
|
|
20
|
+
if (tagName === "Button") {
|
|
21
|
+
// check if it already has iconOnly
|
|
22
|
+
const hasIconOnly = opening.getAttributes().some(attr => {
|
|
23
|
+
if (attr.getKind() === SyntaxKind.JsxAttribute) {
|
|
24
|
+
return attr.asKind(SyntaxKind.JsxAttribute)?.getNameNode().getText() === "iconOnly";
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// also check if it has data-icon="true" manually passed
|
|
30
|
+
const hasDataIcon = opening.getAttributes().some(attr => {
|
|
31
|
+
if (attr.getKind() === SyntaxKind.JsxAttribute) {
|
|
32
|
+
return attr.asKind(SyntaxKind.JsxAttribute)?.getNameNode().getText() === "data-icon";
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (!hasIconOnly && !hasDataIcon) {
|
|
38
|
+
// check children
|
|
39
|
+
const children = jsx.getJsxChildren();
|
|
40
|
+
// filter out whitespace text
|
|
41
|
+
const significantChildren = children.filter(c => {
|
|
42
|
+
if (c.getKind() === SyntaxKind.JsxText) {
|
|
43
|
+
return c.getText().trim() !== "";
|
|
44
|
+
}
|
|
45
|
+
if (c.getKind() === SyntaxKind.JsxExpression) {
|
|
46
|
+
// Sometimes it's a comment { /* comment */ }, ignore empty expressions if no actual elements.
|
|
47
|
+
// But actually an expression like {icon} might be an icon.
|
|
48
|
+
// Let's assume expressions might be text, so we skip auto-adding if there are expressions unless it's just one expression.
|
|
49
|
+
// Actually, to be safe, only add if the child is explicitly an Icon component.
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
if (significantChildren.length === 1) {
|
|
55
|
+
const child = significantChildren[0];
|
|
56
|
+
let isIcon = false;
|
|
57
|
+
|
|
58
|
+
if (child.getKind() === SyntaxKind.JsxElement) {
|
|
59
|
+
const childTag = child.asKind(SyntaxKind.JsxElement)?.getOpeningElement().getTagNameNode().getText();
|
|
60
|
+
if (childTag && (childTag.endsWith("Icon") || childTag === "svg")) isIcon = true;
|
|
61
|
+
} else if (child.getKind() === SyntaxKind.JsxSelfClosingElement) {
|
|
62
|
+
const childTag = child.asKind(SyntaxKind.JsxSelfClosingElement)?.getTagNameNode().getText();
|
|
63
|
+
if (childTag && (childTag.endsWith("Icon") || childTag === "svg")) isIcon = true;
|
|
64
|
+
} else if (child.getKind() === SyntaxKind.JsxExpression) {
|
|
65
|
+
// {icon} or something. We can't safely know if it's an icon. So skip.
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (isIcon) {
|
|
69
|
+
opening.addAttribute({ name: "iconOnly" });
|
|
70
|
+
fileChanged = true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (fileChanged) {
|
|
78
|
+
sf.saveSync();
|
|
79
|
+
changed++;
|
|
80
|
+
console.log("Updated", sf.getFilePath());
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
console.log(`Updated ${changed} files.`);
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Project, SyntaxKind } from "ts-morph";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
|
|
5
|
+
const project = new Project({
|
|
6
|
+
tsConfigFilePath: "tsconfig.json",
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const sourceFiles = project.getSourceFiles("src/components/micro/*.tsx");
|
|
10
|
+
|
|
11
|
+
interface Violation {
|
|
12
|
+
file: string;
|
|
13
|
+
type: string;
|
|
14
|
+
message: string;
|
|
15
|
+
line: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const violations: Violation[] = [];
|
|
19
|
+
|
|
20
|
+
// Regular expressions for anti-patterns
|
|
21
|
+
const MAGIC_CSS_REGEX =
|
|
22
|
+
/\[&_?[a-zA-Z0-9\->\+~]\]|\*:\[?[a-zA-Z0-9\->\+~]\]?|has-\[>?[a-zA-Z0-9\->\+~]\]/;
|
|
23
|
+
const ARBITRARY_VAR_REGEX = /var\(--[a-zA-Z0-9-]+\)|-\[--[a-zA-Z0-9-]+\]/;
|
|
24
|
+
// Exclude semantic colors (primary, muted, etc.), find raw colors
|
|
25
|
+
const HARDCODED_COLOR_REGEX =
|
|
26
|
+
/(bg|text|border|ring)-(slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-[1-9]00/;
|
|
27
|
+
|
|
28
|
+
for (const sf of sourceFiles) {
|
|
29
|
+
const fileName = sf.getBaseName();
|
|
30
|
+
|
|
31
|
+
// 1. Check for "default" variants/sizes statically
|
|
32
|
+
const text = sf.getFullText();
|
|
33
|
+
const lines = text.split("\n");
|
|
34
|
+
|
|
35
|
+
lines.forEach((line, index) => {
|
|
36
|
+
const lineNum = index + 1;
|
|
37
|
+
|
|
38
|
+
// Check for Magic CSS
|
|
39
|
+
if (MAGIC_CSS_REGEX.test(line) && !line.includes("eslint-disable")) {
|
|
40
|
+
// Small exception for specific radix states if needed, but let's flag them all first
|
|
41
|
+
violations.push({
|
|
42
|
+
file: fileName,
|
|
43
|
+
type: "Magic CSS",
|
|
44
|
+
message:
|
|
45
|
+
"Found descendant/magic CSS combinator: " +
|
|
46
|
+
line.trim().substring(0, 50),
|
|
47
|
+
line: lineNum,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Check for Arbitrary Variables
|
|
52
|
+
if (
|
|
53
|
+
ARBITRARY_VAR_REGEX.test(line) &&
|
|
54
|
+
!line.includes("radix-") &&
|
|
55
|
+
!line.includes("collapsible-") &&
|
|
56
|
+
!line.includes("accordion-")
|
|
57
|
+
) {
|
|
58
|
+
violations.push({
|
|
59
|
+
file: fileName,
|
|
60
|
+
type: "Arbitrary CSS Variable",
|
|
61
|
+
message:
|
|
62
|
+
"Found arbitrary CSS variable not from Headless UI: " +
|
|
63
|
+
line.trim().substring(0, 50),
|
|
64
|
+
line: lineNum,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Check for Hardcoded Colors
|
|
69
|
+
if (HARDCODED_COLOR_REGEX.test(line)) {
|
|
70
|
+
violations.push({
|
|
71
|
+
file: fileName,
|
|
72
|
+
type: "Hardcoded Color",
|
|
73
|
+
message:
|
|
74
|
+
"Found raw Tailwind color instead of semantic token: " +
|
|
75
|
+
line.trim().substring(0, 50),
|
|
76
|
+
line: lineNum,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Check for default variants
|
|
81
|
+
if (/(variant|size|color):\s*["']default["']/.test(line)) {
|
|
82
|
+
violations.push({
|
|
83
|
+
file: fileName,
|
|
84
|
+
type: "Default Variant",
|
|
85
|
+
message: "Found 'default' as a variant/size/color value",
|
|
86
|
+
line: lineNum,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Group violations by file
|
|
93
|
+
const grouped: Record<string, Violation[]> = {};
|
|
94
|
+
for (const v of violations) {
|
|
95
|
+
if (!grouped[v.file]) grouped[v.file] = [];
|
|
96
|
+
grouped[v.file].push(v);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log("=== COMPONENT BEST PRACTICES AUDIT ===");
|
|
100
|
+
if (violations.length === 0) {
|
|
101
|
+
console.log(
|
|
102
|
+
"ā
All components passed the Best Practices Audit with 100% compliance!",
|
|
103
|
+
);
|
|
104
|
+
} else {
|
|
105
|
+
console.log(
|
|
106
|
+
`ā Found ${violations.length} violations across ${Object.keys(grouped).length} components.\n`,
|
|
107
|
+
);
|
|
108
|
+
for (const file of Object.keys(grouped)) {
|
|
109
|
+
console.log(`\nš ${file}`);
|
|
110
|
+
for (const v of grouped[file]) {
|
|
111
|
+
console.log(` - [${v.type}] Line ${v.line}: ${v.message}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|