@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
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Utilities and Mocks
|
|
3
|
+
* Common testing helpers for generated components
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { fireEvent } from '@testing-library/react';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Create mock event object for testing
|
|
10
|
+
* @param {string} type - Event type
|
|
11
|
+
* @param {Object} payload - Additional event properties
|
|
12
|
+
* @returns {Object} Mock event object
|
|
13
|
+
*/
|
|
14
|
+
export const createMockEvent = (type, payload = {}) => ({
|
|
15
|
+
type,
|
|
16
|
+
preventDefault: vi.fn(),
|
|
17
|
+
stopPropagation: vi.fn(),
|
|
18
|
+
target: {},
|
|
19
|
+
...payload
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Mock IntersectionObserver for testing intersection-based components
|
|
24
|
+
* @returns {Object} Mock IntersectionObserver instance
|
|
25
|
+
*/
|
|
26
|
+
export const mockIntersectionObserver = () => {
|
|
27
|
+
const mockInstance = {
|
|
28
|
+
observe: vi.fn(),
|
|
29
|
+
unobserve: vi.fn(),
|
|
30
|
+
disconnect: vi.fn()
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
global.IntersectionObserver = vi.fn(() => mockInstance);
|
|
34
|
+
return mockInstance;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Mock ResizeObserver for testing resize-based components
|
|
39
|
+
* @returns {Object} Mock ResizeObserver instance
|
|
40
|
+
*/
|
|
41
|
+
export const mockResizeObserver = () => {
|
|
42
|
+
const mockInstance = {
|
|
43
|
+
observe: vi.fn(),
|
|
44
|
+
unobserve: vi.fn(),
|
|
45
|
+
disconnect: vi.fn()
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
global.ResizeObserver = vi.fn(() => mockInstance);
|
|
49
|
+
return mockInstance;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Mock window.matchMedia for testing responsive components
|
|
54
|
+
* @param {boolean} matches - Whether media query should match
|
|
55
|
+
* @returns {Function} Mock matchMedia function
|
|
56
|
+
*/
|
|
57
|
+
export const mockMatchMedia = (matches = true) => {
|
|
58
|
+
Object.defineProperty(window, 'matchMedia', {
|
|
59
|
+
writable: true,
|
|
60
|
+
value: vi.fn().mockImplementation(query => ({
|
|
61
|
+
matches,
|
|
62
|
+
media: query,
|
|
63
|
+
onchange: null,
|
|
64
|
+
addListener: vi.fn(),
|
|
65
|
+
removeListener: vi.fn(),
|
|
66
|
+
addEventListener: vi.fn(),
|
|
67
|
+
removeEventListener: vi.fn(),
|
|
68
|
+
dispatchEvent: vi.fn(),
|
|
69
|
+
})),
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Mock scrollIntoView for testing scroll behavior
|
|
75
|
+
*/
|
|
76
|
+
export const mockScrollIntoView = () => {
|
|
77
|
+
Element.prototype.scrollIntoView = vi.fn();
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Create mock ref object
|
|
82
|
+
* @param {any} current - Current ref value
|
|
83
|
+
* @returns {Object} Mock ref object
|
|
84
|
+
*/
|
|
85
|
+
export const createMockRef = (current = null) => ({
|
|
86
|
+
current
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Mock console methods for testing
|
|
91
|
+
* @param {string[]} methods - Console methods to mock
|
|
92
|
+
* @returns {Object} Mock implementations
|
|
93
|
+
*/
|
|
94
|
+
export const mockConsole = (methods = ['log', 'warn', 'error']) => {
|
|
95
|
+
const mocks = {};
|
|
96
|
+
|
|
97
|
+
methods.forEach(method => {
|
|
98
|
+
mocks[method] = vi.spyOn(console, method).mockImplementation(() => {});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
return mocks;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Wait for component to be stable
|
|
106
|
+
* @param {number} ms - Milliseconds to wait
|
|
107
|
+
* @returns {Promise} Resolves after delay
|
|
108
|
+
*/
|
|
109
|
+
export const waitForStable = (ms = 100) => {
|
|
110
|
+
return new Promise(resolve => {
|
|
111
|
+
setTimeout(resolve, ms);
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create mock media query list
|
|
117
|
+
* @param {boolean} matches - Whether query matches
|
|
118
|
+
* @param {string} media - Media query string
|
|
119
|
+
* @returns {Object} Mock MediaQueryList
|
|
120
|
+
*/
|
|
121
|
+
export const createMockMediaQueryList = (matches = false, media = '(max-width: 768px)') => ({
|
|
122
|
+
matches,
|
|
123
|
+
media,
|
|
124
|
+
onchange: null,
|
|
125
|
+
addListener: vi.fn(),
|
|
126
|
+
removeListener: vi.fn(),
|
|
127
|
+
addEventListener: vi.fn(),
|
|
128
|
+
removeEventListener: vi.fn(),
|
|
129
|
+
dispatchEvent: vi.fn(),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Mock CSS custom properties
|
|
134
|
+
* @param {Object} properties - CSS custom properties to mock
|
|
135
|
+
*/
|
|
136
|
+
export const mockCSSCustomProperties = (properties = {}) => {
|
|
137
|
+
const originalGetPropertyValue = window.getComputedStyle;
|
|
138
|
+
|
|
139
|
+
window.getComputedStyle = vi.fn().mockImplementation((element) => ({
|
|
140
|
+
...originalGetPropertyValue(element),
|
|
141
|
+
getPropertyValue: (property) => {
|
|
142
|
+
return properties[property] || '';
|
|
143
|
+
}
|
|
144
|
+
}));
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Mock fetch API
|
|
149
|
+
* @param {Object} response - Mock response object
|
|
150
|
+
* @returns {Function} Mock fetch function
|
|
151
|
+
*/
|
|
152
|
+
export const mockFetch = (response = {}) => {
|
|
153
|
+
const mockResponse = {
|
|
154
|
+
ok: true,
|
|
155
|
+
status: 200,
|
|
156
|
+
json: vi.fn().mockResolvedValue(response),
|
|
157
|
+
text: vi.fn().mockResolvedValue(JSON.stringify(response)),
|
|
158
|
+
...response
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
global.fetch = vi.fn().mockResolvedValue(mockResponse);
|
|
162
|
+
return global.fetch;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Create mock context provider
|
|
167
|
+
* @param {React.Context} Context - React context
|
|
168
|
+
* @param {any} value - Context value
|
|
169
|
+
* @returns {Function} Provider component
|
|
170
|
+
*/
|
|
171
|
+
export const createMockContextProvider = (Context, value) => {
|
|
172
|
+
return ({ children }) => (
|
|
173
|
+
<Context.Provider value={value}>
|
|
174
|
+
{children}
|
|
175
|
+
</Context.Provider>
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Test component rendering with different props
|
|
181
|
+
* @param {React.Component} Component - Component to test
|
|
182
|
+
* @param {Object} props - Props to test
|
|
183
|
+
* @param {Function} testFn - Test function to run
|
|
184
|
+
*/
|
|
185
|
+
export const testComponentWithProps = (Component, props, testFn) => {
|
|
186
|
+
Object.entries(props).forEach(([propName, propValue]) => {
|
|
187
|
+
it(`renders correctly with ${propName}=${JSON.stringify(propValue)}`, () => {
|
|
188
|
+
testFn(Component, { [propName]: propValue });
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Test accessibility with axe-core
|
|
195
|
+
* @param {HTMLElement} container - Container element to test
|
|
196
|
+
* @param {Object} options - Axe configuration options
|
|
197
|
+
* @returns {Promise} Axe results
|
|
198
|
+
*/
|
|
199
|
+
export const testAccessibility = async (container, options = {}) => {
|
|
200
|
+
const axe = (await import('jest-axe')).axe;
|
|
201
|
+
return axe(container, options);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Test keyboard navigation
|
|
206
|
+
* @param {HTMLElement} element - Element to test
|
|
207
|
+
* @param {string[]} keys - Keys to simulate
|
|
208
|
+
*/
|
|
209
|
+
export const testKeyboardNavigation = (element, keys = ['Tab', 'Enter', 'Escape']) => {
|
|
210
|
+
keys.forEach(key => {
|
|
211
|
+
fireEvent.keyDown(element, { key });
|
|
212
|
+
fireEvent.keyUp(element, { key });
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Test focus management
|
|
218
|
+
* @param {HTMLElement} element - Element to test
|
|
219
|
+
* @param {boolean} shouldBeFocusable - Whether element should be focusable
|
|
220
|
+
*/
|
|
221
|
+
export const testFocusManagement = (element, shouldBeFocusable = true) => {
|
|
222
|
+
if (shouldBeFocusable) {
|
|
223
|
+
element.focus();
|
|
224
|
+
expect(element).toHaveFocus();
|
|
225
|
+
} else {
|
|
226
|
+
expect(() => element.focus()).not.toThrow();
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Test responsive behavior
|
|
232
|
+
* @param {Function} setup - Setup function
|
|
233
|
+
* @param {Object[]} breakpoints - Breakpoint configurations
|
|
234
|
+
*/
|
|
235
|
+
export const testResponsiveBehavior = (setup, breakpoints = [
|
|
236
|
+
{ width: 320, name: 'mobile' },
|
|
237
|
+
{ width: 768, name: 'tablet' },
|
|
238
|
+
{ width: 1024, name: 'desktop' }
|
|
239
|
+
]) => {
|
|
240
|
+
breakpoints.forEach(({ width, name }) => {
|
|
241
|
+
describe(`${name} (${width}px)`, () => {
|
|
242
|
+
beforeEach(() => {
|
|
243
|
+
// Mock viewport size
|
|
244
|
+
Object.defineProperty(window, 'innerWidth', {
|
|
245
|
+
writable: true,
|
|
246
|
+
configurable: true,
|
|
247
|
+
value: width
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Trigger resize event
|
|
251
|
+
window.dispatchEvent(new Event('resize'));
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
setup(width, name);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// Export all utilities
|
|
260
|
+
export default {
|
|
261
|
+
createMockEvent,
|
|
262
|
+
mockIntersectionObserver,
|
|
263
|
+
mockResizeObserver,
|
|
264
|
+
mockMatchMedia,
|
|
265
|
+
mockScrollIntoView,
|
|
266
|
+
createMockRef,
|
|
267
|
+
mockConsole,
|
|
268
|
+
waitForStable,
|
|
269
|
+
createMockMediaQueryList,
|
|
270
|
+
mockCSSCustomProperties,
|
|
271
|
+
mockFetch,
|
|
272
|
+
createMockContextProvider,
|
|
273
|
+
testComponentWithProps,
|
|
274
|
+
testAccessibility,
|
|
275
|
+
testKeyboardNavigation,
|
|
276
|
+
testFocusManagement,
|
|
277
|
+
testResponsiveBehavior
|
|
278
|
+
};
|
|
@@ -10,118 +10,132 @@ export const typesTemplate = (name) => `// ${name} Component Types
|
|
|
10
10
|
// Generated by Atomix CLI
|
|
11
11
|
// These should be added to src/lib/types/components.ts
|
|
12
12
|
|
|
13
|
-
import type { BaseComponentProps } from './base';
|
|
14
|
-
|
|
15
13
|
/**
|
|
16
14
|
* ${name} component props
|
|
17
15
|
*/
|
|
18
|
-
export interface ${name}Props
|
|
16
|
+
export interface ${name}Props {
|
|
19
17
|
/**
|
|
20
|
-
*
|
|
18
|
+
* Content to be rendered
|
|
21
19
|
*/
|
|
22
|
-
|
|
20
|
+
children?: React.ReactNode;
|
|
23
21
|
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
23
|
+
* Additional CSS classes
|
|
26
24
|
*/
|
|
27
|
-
|
|
25
|
+
className?: string;
|
|
28
26
|
|
|
29
27
|
/**
|
|
30
|
-
*
|
|
28
|
+
* Component variant
|
|
31
29
|
*/
|
|
32
|
-
|
|
30
|
+
variant?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info';
|
|
33
31
|
|
|
34
32
|
/**
|
|
35
|
-
*
|
|
33
|
+
* Component size
|
|
36
34
|
*/
|
|
37
|
-
|
|
35
|
+
size?: 'sm' | 'md' | 'lg';
|
|
38
36
|
|
|
39
37
|
/**
|
|
40
|
-
*
|
|
38
|
+
* Disabled state
|
|
41
39
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
disabled?: boolean;
|
|
41
|
+
|
|
44
42
|
/**
|
|
45
|
-
*
|
|
43
|
+
* Glass effect options
|
|
46
44
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
glass?: boolean | AtomixGlassProps;
|
|
46
|
+
|
|
49
47
|
/**
|
|
50
|
-
*
|
|
48
|
+
* Click handler
|
|
51
49
|
*/
|
|
52
|
-
|
|
53
|
-
}
|
|
50
|
+
onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
54
51
|
|
|
55
|
-
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
isOpen: boolean;
|
|
60
|
-
isControlled: boolean;
|
|
61
|
-
};
|
|
52
|
+
/**
|
|
53
|
+
* Hover handler
|
|
54
|
+
*/
|
|
55
|
+
onHover?: (event: React.MouseEvent<HTMLDivElement>) => void;
|
|
62
56
|
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Focus handler
|
|
59
|
+
*/
|
|
60
|
+
onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Blur handler
|
|
64
|
+
*/
|
|
65
|
+
onBlur?: (event: React.FocusEvent<HTMLDivElement>) => void;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* ARIA label
|
|
69
|
+
*/
|
|
70
|
+
'aria-label'?: string;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* ARIA described by
|
|
74
|
+
*/
|
|
75
|
+
'aria-describedby'?: string;
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
/**
|
|
78
|
+
* Tab index
|
|
79
|
+
*/
|
|
80
|
+
tabIndex?: number;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Inline styles
|
|
84
|
+
*/
|
|
85
|
+
style?: React.CSSProperties;
|
|
86
|
+
}
|
|
79
87
|
`;
|
|
80
88
|
|
|
81
89
|
/**
|
|
82
90
|
* Constants template for component-specific constants
|
|
83
91
|
*/
|
|
84
|
-
export const constantsTemplate = (name) =>
|
|
92
|
+
export const constantsTemplate = (name) => {
|
|
93
|
+
const componentPrefix = name.toLowerCase().replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '');
|
|
94
|
+
|
|
95
|
+
return `// ${name} Component Constants
|
|
85
96
|
// Generated by Atomix CLI
|
|
86
97
|
// These should be added to src/lib/constants/components.ts
|
|
87
98
|
|
|
88
99
|
export const ${name.toUpperCase()} = {
|
|
100
|
+
BASE_CLASS: 'c-${componentPrefix}',
|
|
89
101
|
SELECTORS: {
|
|
90
|
-
${name.toUpperCase()}: '.c-${
|
|
91
|
-
|
|
92
|
-
PANEL: '.c-${name.toLowerCase()}__panel',
|
|
93
|
-
CONTENT: '.c-${name.toLowerCase()}-content',
|
|
102
|
+
${name.toUpperCase()}: '.c-${componentPrefix}',
|
|
103
|
+
// Add more selectors as needed for complex components
|
|
94
104
|
},
|
|
95
105
|
CLASSES: {
|
|
106
|
+
BASE: 'c-${componentPrefix}',
|
|
96
107
|
IS_OPEN: 'is-open',
|
|
97
108
|
IS_DISABLED: 'is-disabled',
|
|
98
|
-
|
|
109
|
+
IS_LOADING: 'is-loading',
|
|
110
|
+
// Add more classes as needed
|
|
99
111
|
},
|
|
100
112
|
DATA_ATTRIBUTES: {
|
|
101
|
-
COMPONENT: 'data-${
|
|
113
|
+
COMPONENT: 'data-${componentPrefix}',
|
|
102
114
|
STATE: 'data-state',
|
|
103
115
|
DISABLED: 'data-disabled',
|
|
116
|
+
// Add more data attributes as needed
|
|
117
|
+
},
|
|
118
|
+
CSS_VARS: {
|
|
119
|
+
// Add CSS custom properties as needed
|
|
104
120
|
},
|
|
105
121
|
DEFAULT_PROPS: {
|
|
106
|
-
|
|
122
|
+
variant: 'primary',
|
|
123
|
+
size: 'md',
|
|
124
|
+
disabled: false,
|
|
107
125
|
},
|
|
108
126
|
ANIMATIONS: {
|
|
109
127
|
DURATION: '200ms',
|
|
110
128
|
EASING: 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
111
129
|
},
|
|
112
130
|
} as const;
|
|
113
|
-
|
|
114
|
-
// Type exports for ${name} component
|
|
115
|
-
export type ${name}State = 'open' | 'closed';
|
|
116
|
-
export type ${name}Size = 'sm' | 'md' | 'lg';
|
|
117
|
-
export type ${name}Variant = 'primary' | 'secondary';
|
|
118
131
|
`;
|
|
132
|
+
};
|
|
119
133
|
|
|
120
134
|
/**
|
|
121
135
|
* Index template for component exports
|
|
122
136
|
*/
|
|
123
137
|
export const indexTemplate = (name) => `export { default as ${name} } from './${name}';
|
|
124
|
-
export type { ${name}Props } from '
|
|
138
|
+
export type { ${name}Props } from './${name}';`;
|
|
125
139
|
|
|
126
140
|
/**
|
|
127
141
|
* TypeScript templates object
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme CLI Bridge
|
|
3
|
-
*
|
|
4
|
-
* Bridges the TypeScript theme devtools CLI with the main JavaScript CLI
|
|
3
|
+
*
|
|
4
|
+
* Bridges the TypeScript theme devtools CLI (src/lib/theme/devtools/CLI.ts) with the main JavaScript CLI.
|
|
5
|
+
*
|
|
6
|
+
* @dependency ts-node
|
|
7
|
+
* Theme subcommands (atomix theme validate|list|inspect|compare|export|create) run the TypeScript
|
|
8
|
+
* theme CLI via ts-node. Ensure ts-node is installed in the project when using these commands:
|
|
9
|
+
* npm install --save-dev ts-node
|
|
10
|
+
* If ts-node is missing, theme subcommands will fail; run `atomix doctor` to check availability.
|
|
5
11
|
*/
|
|
6
12
|
|
|
7
13
|
import { spawn } from 'child_process';
|