@shohojdhara/atomix 0.3.14 → 0.4.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 +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +44 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +50 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +21044 -2618
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +77 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +44 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +50 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +152 -78
- package/dist/index.esm.js +346 -340
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +359 -353
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +358 -850
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +6 -5
- package/src/components/AtomixGlass/shader-utils.ts +133 -52
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +195 -0
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +122 -352
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +30 -11
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +454 -1126
- package/src/components/Button/Button.test.tsx +123 -0
- package/src/components/Button/Button.tsx +88 -60
- package/src/components/Button/ButtonGroup.stories.tsx +376 -215
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +316 -568
- package/src/components/Card/Card.stories.tsx +292 -81
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +153 -16
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +114 -7
- package/src/components/DataTable/DataTable.stories.tsx +349 -144
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +396 -327
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +122 -78
- package/src/components/Form/Form.stories.tsx +110 -19
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +146 -17
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +372 -38
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +183 -43
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +354 -97
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +160 -7
- package/src/components/River/River.stories.tsx +3 -2
- package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +104 -8
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +173 -42
- package/src/components/Tabs/Tabs.stories.tsx +141 -12
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +137 -36
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +241 -150
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +219 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +126 -97
- package/src/lib/composables/useChartExport.ts +3 -8
- package/src/lib/composables/useDataTable.ts +72 -43
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/components.ts +9 -32
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +107 -105
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +19 -0
- package/src/lib/utils/dataTableExport.ts +2 -15
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +1 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +4 -4
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +38 -12
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +25 -17
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +2 -0
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CSS Variables Constants
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Comprehensive CSS custom property definitions for all components.
|
|
5
5
|
* These provide type-safe access to component styling variables.
|
|
6
6
|
*/
|
|
@@ -24,7 +24,7 @@ export const BUTTON_CSS_VARS = {
|
|
|
24
24
|
'--atomix-button-min-width': 'minimum width',
|
|
25
25
|
'--atomix-button-min-height': 'minimum height',
|
|
26
26
|
'--atomix-button-transition': 'transition',
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
// State properties
|
|
29
29
|
'--atomix-button-hover-bg': 'hover background',
|
|
30
30
|
'--atomix-button-hover-color': 'hover text color',
|
|
@@ -35,7 +35,7 @@ export const BUTTON_CSS_VARS = {
|
|
|
35
35
|
'--atomix-button-focus-ring-width': 'focus ring width',
|
|
36
36
|
'--atomix-button-disabled-opacity': 'disabled opacity',
|
|
37
37
|
'--atomix-button-disabled-bg': 'disabled background',
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
// Part properties
|
|
40
40
|
'--atomix-button-icon-size': 'icon size',
|
|
41
41
|
'--atomix-button-icon-gap': 'icon spacing',
|
|
@@ -57,32 +57,32 @@ export const CARD_CSS_VARS = {
|
|
|
57
57
|
'--atomix-card-box-shadow': 'box shadow',
|
|
58
58
|
'--atomix-card-width': 'width',
|
|
59
59
|
'--atomix-card-max-width': 'maximum width',
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
// State properties
|
|
62
62
|
'--atomix-card-hover-bg': 'hover background',
|
|
63
63
|
'--atomix-card-hover-shadow': 'hover shadow',
|
|
64
64
|
'--atomix-card-hover-transform': 'hover transform',
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
// Part properties - Header
|
|
67
67
|
'--atomix-card-header-padding': 'header padding',
|
|
68
68
|
'--atomix-card-header-bg': 'header background',
|
|
69
69
|
'--atomix-card-header-border-bottom': 'header border bottom',
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
// Part properties - Body
|
|
72
72
|
'--atomix-card-body-padding': 'body padding',
|
|
73
73
|
'--atomix-card-body-font-size': 'body font size',
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
// Part properties - Footer
|
|
76
76
|
'--atomix-card-footer-padding': 'footer padding',
|
|
77
77
|
'--atomix-card-footer-bg': 'footer background',
|
|
78
78
|
'--atomix-card-footer-border-top': 'footer border top',
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
// Part properties - Title
|
|
81
81
|
'--atomix-card-title-font-size': 'title font size',
|
|
82
82
|
'--atomix-card-title-font-weight': 'title font weight',
|
|
83
83
|
'--atomix-card-title-color': 'title color',
|
|
84
84
|
'--atomix-card-title-margin-bottom': 'title margin bottom',
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
// Part properties - Image
|
|
87
87
|
'--atomix-card-image-border-radius': 'image border radius',
|
|
88
88
|
'--atomix-card-image-max-height': 'image max height',
|
|
@@ -105,7 +105,7 @@ export const INPUT_CSS_VARS = {
|
|
|
105
105
|
'--atomix-input-line-height': 'line height',
|
|
106
106
|
'--atomix-input-height': 'height',
|
|
107
107
|
'--atomix-input-placeholder-color': 'placeholder color',
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
// State properties
|
|
110
110
|
'--atomix-input-hover-border-color': 'hover border color',
|
|
111
111
|
'--atomix-input-focus-border-color': 'focus border color',
|
|
@@ -130,27 +130,27 @@ export const MODAL_CSS_VARS = {
|
|
|
130
130
|
'--atomix-modal-width': 'width',
|
|
131
131
|
'--atomix-modal-max-width': 'maximum width',
|
|
132
132
|
'--atomix-modal-max-height': 'maximum height',
|
|
133
|
-
|
|
133
|
+
|
|
134
134
|
// Backdrop properties
|
|
135
135
|
'--atomix-modal-backdrop-bg': 'backdrop background',
|
|
136
136
|
'--atomix-modal-backdrop-opacity': 'backdrop opacity',
|
|
137
137
|
'--atomix-modal-backdrop-blur': 'backdrop blur',
|
|
138
|
-
|
|
138
|
+
|
|
139
139
|
// Part properties - Header
|
|
140
140
|
'--atomix-modal-header-padding': 'header padding',
|
|
141
141
|
'--atomix-modal-header-border-bottom': 'header border bottom',
|
|
142
142
|
'--atomix-modal-title-font-size': 'title font size',
|
|
143
143
|
'--atomix-modal-title-font-weight': 'title font weight',
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
// Part properties - Body
|
|
146
146
|
'--atomix-modal-body-padding': 'body padding',
|
|
147
147
|
'--atomix-modal-body-font-size': 'body font size',
|
|
148
|
-
|
|
148
|
+
|
|
149
149
|
// Part properties - Footer
|
|
150
150
|
'--atomix-modal-footer-padding': 'footer padding',
|
|
151
151
|
'--atomix-modal-footer-border-top': 'footer border top',
|
|
152
152
|
'--atomix-modal-footer-gap': 'footer button gap',
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
// Part properties - Close button
|
|
155
155
|
'--atomix-modal-close-size': 'close button size',
|
|
156
156
|
'--atomix-modal-close-color': 'close button color',
|
|
@@ -171,7 +171,7 @@ export const DROPDOWN_CSS_VARS = {
|
|
|
171
171
|
'--atomix-dropdown-min-width': 'minimum width',
|
|
172
172
|
'--atomix-dropdown-max-height': 'maximum height',
|
|
173
173
|
'--atomix-dropdown-padding': 'padding',
|
|
174
|
-
|
|
174
|
+
|
|
175
175
|
// Part properties - Item
|
|
176
176
|
'--atomix-dropdown-item-padding': 'item padding',
|
|
177
177
|
'--atomix-dropdown-item-font-size': 'item font size',
|
|
@@ -180,11 +180,11 @@ export const DROPDOWN_CSS_VARS = {
|
|
|
180
180
|
'--atomix-dropdown-item-active-bg': 'item active background',
|
|
181
181
|
'--atomix-dropdown-item-active-color': 'item active color',
|
|
182
182
|
'--atomix-dropdown-item-disabled-opacity': 'item disabled opacity',
|
|
183
|
-
|
|
183
|
+
|
|
184
184
|
// Part properties - Divider
|
|
185
185
|
'--atomix-dropdown-divider-color': 'divider color',
|
|
186
186
|
'--atomix-dropdown-divider-margin': 'divider margin',
|
|
187
|
-
|
|
187
|
+
|
|
188
188
|
// Part properties - Header
|
|
189
189
|
'--atomix-dropdown-header-padding': 'header padding',
|
|
190
190
|
'--atomix-dropdown-header-font-size': 'header font size',
|
|
@@ -205,7 +205,7 @@ export const BADGE_CSS_VARS = {
|
|
|
205
205
|
'--atomix-badge-font-size': 'font size',
|
|
206
206
|
'--atomix-badge-font-weight': 'font weight',
|
|
207
207
|
'--atomix-badge-line-height': 'line height',
|
|
208
|
-
|
|
208
|
+
|
|
209
209
|
// Part properties
|
|
210
210
|
'--atomix-badge-icon-size': 'icon size',
|
|
211
211
|
'--atomix-badge-icon-gap': 'icon spacing',
|
|
@@ -219,11 +219,11 @@ export const TABS_CSS_VARS = {
|
|
|
219
219
|
'--atomix-tabs-bg': 'background color',
|
|
220
220
|
'--atomix-tabs-border-color': 'border color',
|
|
221
221
|
'--atomix-tabs-border-width': 'border width',
|
|
222
|
-
|
|
222
|
+
|
|
223
223
|
// Part properties - Nav
|
|
224
224
|
'--atomix-tabs-nav-gap': 'nav gap',
|
|
225
225
|
'--atomix-tabs-nav-padding': 'nav padding',
|
|
226
|
-
|
|
226
|
+
|
|
227
227
|
// Part properties - Tab button
|
|
228
228
|
'--atomix-tabs-btn-padding-x': 'button horizontal padding',
|
|
229
229
|
'--atomix-tabs-btn-padding-y': 'button vertical padding',
|
|
@@ -234,7 +234,7 @@ export const TABS_CSS_VARS = {
|
|
|
234
234
|
'--atomix-tabs-btn-active-color': 'button active color',
|
|
235
235
|
'--atomix-tabs-btn-active-border-color': 'button active border color',
|
|
236
236
|
'--atomix-tabs-btn-active-border-width': 'button active border width',
|
|
237
|
-
|
|
237
|
+
|
|
238
238
|
// Part properties - Panel
|
|
239
239
|
'--atomix-tabs-panel-padding': 'panel padding',
|
|
240
240
|
'--atomix-tabs-panel-bg': 'panel background',
|
|
@@ -248,7 +248,7 @@ export const PROGRESS_CSS_VARS = {
|
|
|
248
248
|
'--atomix-progress-bg': 'background color',
|
|
249
249
|
'--atomix-progress-height': 'height',
|
|
250
250
|
'--atomix-progress-border-radius': 'border radius',
|
|
251
|
-
|
|
251
|
+
|
|
252
252
|
// Part properties - Bar
|
|
253
253
|
'--atomix-progress-bar-bg': 'bar background',
|
|
254
254
|
'--atomix-progress-bar-transition': 'bar transition',
|
|
@@ -268,7 +268,7 @@ export const TOOLTIP_CSS_VARS = {
|
|
|
268
268
|
'--atomix-tooltip-max-width': 'maximum width',
|
|
269
269
|
'--atomix-tooltip-box-shadow': 'box shadow',
|
|
270
270
|
'--atomix-tooltip-z-index': 'z-index',
|
|
271
|
-
|
|
271
|
+
|
|
272
272
|
// Arrow properties
|
|
273
273
|
'--atomix-tooltip-arrow-size': 'arrow size',
|
|
274
274
|
'--atomix-tooltip-arrow-color': 'arrow color',
|
|
@@ -285,7 +285,7 @@ export const CHECKBOX_CSS_VARS = {
|
|
|
285
285
|
'--atomix-checkbox-border-width': 'border width',
|
|
286
286
|
'--atomix-checkbox-border-radius': 'border radius',
|
|
287
287
|
'--atomix-checkbox-transition': 'transition',
|
|
288
|
-
|
|
288
|
+
|
|
289
289
|
// State properties
|
|
290
290
|
'--atomix-checkbox-checked-bg': 'checked background',
|
|
291
291
|
'--atomix-checkbox-checked-border-color': 'checked border color',
|
|
@@ -294,7 +294,7 @@ export const CHECKBOX_CSS_VARS = {
|
|
|
294
294
|
'--atomix-checkbox-focus-ring-width': 'focus ring width',
|
|
295
295
|
'--atomix-checkbox-disabled-opacity': 'disabled opacity',
|
|
296
296
|
'--atomix-checkbox-invalid-border-color': 'invalid border color',
|
|
297
|
-
|
|
297
|
+
|
|
298
298
|
// Part properties
|
|
299
299
|
'--atomix-checkbox-icon-size': 'icon size',
|
|
300
300
|
'--atomix-checkbox-icon-color': 'icon color',
|
|
@@ -313,7 +313,7 @@ export const RADIO_CSS_VARS = {
|
|
|
313
313
|
'--atomix-radio-border-color': 'border color',
|
|
314
314
|
'--atomix-radio-border-width': 'border width',
|
|
315
315
|
'--atomix-radio-transition': 'transition',
|
|
316
|
-
|
|
316
|
+
|
|
317
317
|
// State properties
|
|
318
318
|
'--atomix-radio-checked-bg': 'checked background',
|
|
319
319
|
'--atomix-radio-checked-border-color': 'checked border color',
|
|
@@ -322,7 +322,7 @@ export const RADIO_CSS_VARS = {
|
|
|
322
322
|
'--atomix-radio-focus-ring-width': 'focus ring width',
|
|
323
323
|
'--atomix-radio-disabled-opacity': 'disabled opacity',
|
|
324
324
|
'--atomix-radio-invalid-border-color': 'invalid border color',
|
|
325
|
-
|
|
325
|
+
|
|
326
326
|
// Part properties
|
|
327
327
|
'--atomix-radio-dot-size': 'dot size',
|
|
328
328
|
'--atomix-radio-dot-color': 'dot color',
|
|
@@ -385,6 +385,6 @@ export type ComponentCSSVariables = {
|
|
|
385
385
|
*/
|
|
386
386
|
export function getComponentCSSVars<T extends keyof typeof COMPONENT_CSS_VARS>(
|
|
387
387
|
component: T
|
|
388
|
-
): typeof COMPONENT_CSS_VARS[T] {
|
|
388
|
+
): (typeof COMPONENT_CSS_VARS)[T] {
|
|
389
389
|
return COMPONENT_CSS_VARS[component];
|
|
390
390
|
}
|
|
@@ -25,9 +25,7 @@ describe('useComponentCustomization', () => {
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
it('should handle empty cssVars', () => {
|
|
28
|
-
const { result } = renderHook(() =>
|
|
29
|
-
useComponentCustomization('Button', {})
|
|
30
|
-
);
|
|
28
|
+
const { result } = renderHook(() => useComponentCustomization('Button', {}));
|
|
31
29
|
|
|
32
30
|
expect(result.current.cssVars).toEqual({});
|
|
33
31
|
});
|
|
@@ -77,9 +75,7 @@ describe('useComponentCustomization', () => {
|
|
|
77
75
|
});
|
|
78
76
|
|
|
79
77
|
it('should handle empty parts', () => {
|
|
80
|
-
const { result } = renderHook(() =>
|
|
81
|
-
useComponentCustomization('Button', {})
|
|
82
|
-
);
|
|
78
|
+
const { result } = renderHook(() => useComponentCustomization('Button', {}));
|
|
83
79
|
|
|
84
80
|
expect(result.current.parts).toEqual({});
|
|
85
81
|
});
|
package/src/lib/hooks/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Component Customization Hook
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Merges theme-level component overrides with component-level props
|
|
5
5
|
* for comprehensive customization support.
|
|
6
6
|
*/
|
|
@@ -23,7 +23,7 @@ export type ComponentName = keyof ComponentPartsMap;
|
|
|
23
23
|
*/
|
|
24
24
|
export interface CustomizableComponentProps<T extends ComponentName> {
|
|
25
25
|
/** CSS variable overrides */
|
|
26
|
-
cssVars?: T extends keyof ComponentCSSVariables
|
|
26
|
+
cssVars?: T extends keyof ComponentCSSVariables
|
|
27
27
|
? Partial<Record<ComponentCSSVariables[T], string | number>>
|
|
28
28
|
: Record<string, string | number>;
|
|
29
29
|
/** Part-based styling */
|
|
@@ -52,13 +52,13 @@ export interface ComponentCustomization<T extends ComponentName> {
|
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
54
|
* Hook to merge theme overrides with component props
|
|
55
|
-
*
|
|
55
|
+
*
|
|
56
56
|
* @example
|
|
57
57
|
* function Button(props: ButtonProps) {
|
|
58
58
|
* const customization = useComponentCustomization('Button', props);
|
|
59
|
-
*
|
|
59
|
+
*
|
|
60
60
|
* return (
|
|
61
|
-
* <button
|
|
61
|
+
* <button
|
|
62
62
|
* className={customization.className}
|
|
63
63
|
* style={customization.style}
|
|
64
64
|
* >
|
|
@@ -84,18 +84,12 @@ export function useComponentCustomization<T extends ComponentName>(
|
|
|
84
84
|
const parts = useMemo(() => {
|
|
85
85
|
const themeParts = (theme as any)?.components?.[component]?.parts || {};
|
|
86
86
|
const propParts = (props.parts || {}) as Record<string, any>;
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
const merged: Record<string, any> = {};
|
|
89
|
-
const allPartNames = new Set([
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
allPartNames.forEach((partName) => {
|
|
95
|
-
merged[partName] = mergePartStyles(
|
|
96
|
-
themeParts[partName] as any,
|
|
97
|
-
propParts[partName] as any
|
|
98
|
-
);
|
|
89
|
+
const allPartNames = new Set([...Object.keys(themeParts), ...Object.keys(propParts)]);
|
|
90
|
+
|
|
91
|
+
allPartNames.forEach(partName => {
|
|
92
|
+
merged[partName] = mergePartStyles(themeParts[partName] as any, propParts[partName] as any);
|
|
99
93
|
});
|
|
100
94
|
|
|
101
95
|
return merged as ComponentPartsMap[T];
|
|
@@ -137,7 +131,7 @@ export function useComponentDefaultProps<T extends ComponentName>(
|
|
|
137
131
|
component: T
|
|
138
132
|
): Record<string, any> {
|
|
139
133
|
const { theme } = useTheme();
|
|
140
|
-
|
|
134
|
+
|
|
141
135
|
return useMemo(() => {
|
|
142
136
|
return (theme as any)?.components?.[component]?.defaultProps || {};
|
|
143
137
|
}, [theme, component]);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Performance Monitoring Hook
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Tracks component render times and re-render counts
|
|
5
5
|
* for performance analysis and optimization
|
|
6
6
|
*/
|
|
@@ -58,10 +58,10 @@ export interface UsePerformanceMonitorOptions {
|
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
60
|
* Hook to monitor component performance
|
|
61
|
-
*
|
|
61
|
+
*
|
|
62
62
|
* @param options - Performance monitoring options
|
|
63
63
|
* @returns Performance metrics
|
|
64
|
-
*
|
|
64
|
+
*
|
|
65
65
|
* @example
|
|
66
66
|
* ```tsx
|
|
67
67
|
* function MyComponent() {
|
|
@@ -69,7 +69,7 @@ export interface UsePerformanceMonitorOptions {
|
|
|
69
69
|
* componentName: 'MyComponent',
|
|
70
70
|
* warnThreshold: 16, // Warn if render takes > 16ms (1 frame)
|
|
71
71
|
* });
|
|
72
|
-
*
|
|
72
|
+
*
|
|
73
73
|
* return <div>Content</div>;
|
|
74
74
|
* }
|
|
75
75
|
* ```
|
|
@@ -77,7 +77,7 @@ export interface UsePerformanceMonitorOptions {
|
|
|
77
77
|
export function usePerformanceMonitor(options: UsePerformanceMonitorOptions) {
|
|
78
78
|
const {
|
|
79
79
|
componentName,
|
|
80
|
-
logToConsole =
|
|
80
|
+
logToConsole = typeof process === 'undefined' || process.env?.NODE_ENV === 'development',
|
|
81
81
|
warnThreshold = 16,
|
|
82
82
|
onMetrics,
|
|
83
83
|
} = options;
|
|
@@ -114,7 +114,7 @@ export function usePerformanceMonitor(options: UsePerformanceMonitorOptions) {
|
|
|
114
114
|
if (renderTime > warnThreshold && logToConsole) {
|
|
115
115
|
console.warn(
|
|
116
116
|
`[Performance] ${componentName} render took ${renderTime.toFixed(2)}ms ` +
|
|
117
|
-
|
|
117
|
+
`(threshold: ${warnThreshold}ms)`
|
|
118
118
|
);
|
|
119
119
|
}
|
|
120
120
|
|
|
@@ -146,4 +146,3 @@ export function getPerformanceMetrics(): PerformanceMetrics[] {
|
|
|
146
146
|
// For now, this is a placeholder
|
|
147
147
|
return [];
|
|
148
148
|
}
|
|
149
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Slot Pattern System
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Provides render props and slot-based customization for components.
|
|
5
5
|
* Allows complete control over component rendering and structure.
|
|
6
6
|
*/
|
|
@@ -21,13 +21,13 @@ export interface SlotProps<T = any> {
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Render a slot with the given props
|
|
24
|
-
*
|
|
24
|
+
*
|
|
25
25
|
* Priority order:
|
|
26
26
|
* 1. render function
|
|
27
27
|
* 2. component
|
|
28
28
|
* 3. children
|
|
29
29
|
* 4. fallback
|
|
30
|
-
*
|
|
30
|
+
*
|
|
31
31
|
* @example
|
|
32
32
|
* renderSlot(
|
|
33
33
|
* { render: (props) => <CustomButton {...props} /> },
|
|
@@ -87,11 +87,9 @@ export function isSlot<T>(value: any): value is SlotProps<T> {
|
|
|
87
87
|
* Merge multiple slot configurations
|
|
88
88
|
* Later slots override earlier ones
|
|
89
89
|
*/
|
|
90
|
-
export function mergeSlots<T>(
|
|
91
|
-
...slots: Array<SlotProps<T> | undefined>
|
|
92
|
-
): SlotProps<T> | undefined {
|
|
90
|
+
export function mergeSlots<T>(...slots: Array<SlotProps<T> | undefined>): SlotProps<T> | undefined {
|
|
93
91
|
const filtered = slots.filter((s): s is SlotProps<T> => s !== undefined);
|
|
94
|
-
|
|
92
|
+
|
|
95
93
|
if (filtered.length === 0) return undefined;
|
|
96
94
|
if (filtered.length === 1) return filtered[0];
|
|
97
95
|
|
|
@@ -103,10 +101,10 @@ export function mergeSlots<T>(
|
|
|
103
101
|
|
|
104
102
|
/**
|
|
105
103
|
* Create a slot wrapper component
|
|
106
|
-
*
|
|
104
|
+
*
|
|
107
105
|
* @example
|
|
108
106
|
* const ButtonSlot = createSlotComponent<ButtonSlotProps>('button')
|
|
109
|
-
*
|
|
107
|
+
*
|
|
110
108
|
* <ButtonSlot slot={customSlot} {...props}>
|
|
111
109
|
* Default content
|
|
112
110
|
* </ButtonSlot>
|
|
@@ -414,8 +412,5 @@ export function useSlot<T>(
|
|
|
414
412
|
props: T,
|
|
415
413
|
fallback?: React.ReactNode
|
|
416
414
|
): React.ReactNode {
|
|
417
|
-
return React.useMemo(
|
|
418
|
-
() => renderSlot(slot, props, fallback),
|
|
419
|
-
[slot, props, fallback]
|
|
420
|
-
);
|
|
415
|
+
return React.useMemo(() => renderSlot(slot, props, fallback), [slot, props, fallback]);
|
|
421
416
|
}
|
|
@@ -16,13 +16,10 @@ interface InteractiveDemoProps {
|
|
|
16
16
|
children: React.ReactNode;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
20
|
-
controls,
|
|
21
|
-
children,
|
|
22
|
-
}) => {
|
|
19
|
+
export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({ controls, children }) => {
|
|
23
20
|
const renderControl = (control: ControlOption, index: number) => {
|
|
24
21
|
const baseId = `control-${index}`;
|
|
25
|
-
|
|
22
|
+
|
|
26
23
|
switch (control.type) {
|
|
27
24
|
case 'select':
|
|
28
25
|
return (
|
|
@@ -33,10 +30,10 @@ export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
|
33
30
|
<select
|
|
34
31
|
id={baseId}
|
|
35
32
|
value={control.value}
|
|
36
|
-
onChange={
|
|
33
|
+
onChange={e => control.onChange(e.target.value)}
|
|
37
34
|
className="w-full px-3 py-2 border rounded-lg"
|
|
38
35
|
>
|
|
39
|
-
{control.options?.map(
|
|
36
|
+
{control.options?.map(option => (
|
|
40
37
|
<option key={option} value={option}>
|
|
41
38
|
{option}
|
|
42
39
|
</option>
|
|
@@ -44,7 +41,7 @@ export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
|
44
41
|
</select>
|
|
45
42
|
</div>
|
|
46
43
|
);
|
|
47
|
-
|
|
44
|
+
|
|
48
45
|
case 'slider':
|
|
49
46
|
return (
|
|
50
47
|
<div key={baseId} className="mb-4">
|
|
@@ -58,12 +55,12 @@ export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
|
58
55
|
max={control.max}
|
|
59
56
|
step={control.step}
|
|
60
57
|
value={control.value}
|
|
61
|
-
onChange={
|
|
58
|
+
onChange={e => control.onChange(Number(e.target.value))}
|
|
62
59
|
className="w-full"
|
|
63
60
|
/>
|
|
64
61
|
</div>
|
|
65
62
|
);
|
|
66
|
-
|
|
63
|
+
|
|
67
64
|
case 'text':
|
|
68
65
|
return (
|
|
69
66
|
<div key={baseId} className="mb-4">
|
|
@@ -74,12 +71,12 @@ export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
|
74
71
|
id={baseId}
|
|
75
72
|
type="text"
|
|
76
73
|
value={control.value}
|
|
77
|
-
onChange={
|
|
74
|
+
onChange={e => control.onChange(e.target.value)}
|
|
78
75
|
className="w-full px-3 py-2 border rounded-lg"
|
|
79
76
|
/>
|
|
80
77
|
</div>
|
|
81
78
|
);
|
|
82
|
-
|
|
79
|
+
|
|
83
80
|
case 'checkbox':
|
|
84
81
|
return (
|
|
85
82
|
<div key={baseId} className="mb-4">
|
|
@@ -87,14 +84,14 @@ export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
|
87
84
|
<input
|
|
88
85
|
type="checkbox"
|
|
89
86
|
checked={control.value}
|
|
90
|
-
onChange={
|
|
87
|
+
onChange={e => control.onChange(e.target.checked)}
|
|
91
88
|
className="rounded"
|
|
92
89
|
/>
|
|
93
90
|
<span className="text-sm font-medium">{control.label}</span>
|
|
94
91
|
</label>
|
|
95
92
|
</div>
|
|
96
93
|
);
|
|
97
|
-
|
|
94
|
+
|
|
98
95
|
default:
|
|
99
96
|
return null;
|
|
100
97
|
}
|
|
@@ -105,9 +102,7 @@ export const InteractiveDemo: React.FC<InteractiveDemoProps> = ({
|
|
|
105
102
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 mb-6">
|
|
106
103
|
{controls.map(renderControl)}
|
|
107
104
|
</div>
|
|
108
|
-
<div className="border-t pt-6">
|
|
109
|
-
{children}
|
|
110
|
-
</div>
|
|
105
|
+
<div className="border-t pt-6">{children}</div>
|
|
111
106
|
</div>
|
|
112
107
|
);
|
|
113
|
-
};
|
|
108
|
+
};
|
|
@@ -12,10 +12,6 @@ export const VariantsGrid: React.FC<VariantsGridProps> = ({
|
|
|
12
12
|
gap = 'gap-4',
|
|
13
13
|
}) => {
|
|
14
14
|
const gridClass = `grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-${columns} ${gap}`;
|
|
15
|
-
|
|
16
|
-
return
|
|
17
|
-
|
|
18
|
-
{children}
|
|
19
|
-
</div>
|
|
20
|
-
);
|
|
21
|
-
};
|
|
15
|
+
|
|
16
|
+
return <div className={gridClass}>{children}</div>;
|
|
17
|
+
};
|