@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 Variable Mapper
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Utilities for generating and managing CSS custom properties from SCSS tokens
|
|
5
5
|
* and component configurations.
|
|
6
6
|
*/
|
|
@@ -35,7 +35,7 @@ export interface CSSVariableNamingOptions {
|
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Generate CSS variable name from parts
|
|
38
|
-
*
|
|
38
|
+
*
|
|
39
39
|
* @example
|
|
40
40
|
* generateCSSVariableName('button', 'bg', { prefix: 'atomix' })
|
|
41
41
|
* // Returns: '--atomix-button-bg'
|
|
@@ -45,26 +45,22 @@ export function generateCSSVariableName(
|
|
|
45
45
|
property: string,
|
|
46
46
|
options: CSSVariableNamingOptions = {}
|
|
47
47
|
): string {
|
|
48
|
-
const {
|
|
49
|
-
prefix = 'atomix',
|
|
50
|
-
separator = '-',
|
|
51
|
-
includeComponent = true,
|
|
52
|
-
} = options;
|
|
48
|
+
const { prefix = 'atomix', separator = '-', includeComponent = true } = options;
|
|
53
49
|
|
|
54
50
|
const parts = [prefix];
|
|
55
|
-
|
|
51
|
+
|
|
56
52
|
if (includeComponent) {
|
|
57
53
|
parts.push(component);
|
|
58
54
|
}
|
|
59
|
-
|
|
55
|
+
|
|
60
56
|
parts.push(property);
|
|
61
|
-
|
|
57
|
+
|
|
62
58
|
return `--${parts.join(separator)}`;
|
|
63
59
|
}
|
|
64
60
|
|
|
65
61
|
/**
|
|
66
62
|
* Generate CSS variables object from configuration
|
|
67
|
-
*
|
|
63
|
+
*
|
|
68
64
|
* @example
|
|
69
65
|
* const vars = generateComponentCSSVars({
|
|
70
66
|
* component: 'button',
|
|
@@ -89,11 +85,7 @@ export function generateComponentCSSVars(
|
|
|
89
85
|
if (parts) {
|
|
90
86
|
Object.entries(parts).forEach(([partName, partProps]) => {
|
|
91
87
|
Object.entries(partProps).forEach(([key, value]) => {
|
|
92
|
-
const varName = generateCSSVariableName(
|
|
93
|
-
component,
|
|
94
|
-
`${partName}-${key}`,
|
|
95
|
-
options
|
|
96
|
-
);
|
|
88
|
+
const varName = generateCSSVariableName(component, `${partName}-${key}`, options);
|
|
97
89
|
vars[varName] = String(value);
|
|
98
90
|
});
|
|
99
91
|
});
|
|
@@ -103,11 +95,7 @@ export function generateComponentCSSVars(
|
|
|
103
95
|
if (states) {
|
|
104
96
|
Object.entries(states).forEach(([stateName, stateProps]) => {
|
|
105
97
|
Object.entries(stateProps).forEach(([key, value]) => {
|
|
106
|
-
const varName = generateCSSVariableName(
|
|
107
|
-
component,
|
|
108
|
-
`${stateName}-${key}`,
|
|
109
|
-
options
|
|
110
|
-
);
|
|
98
|
+
const varName = generateCSSVariableName(component, `${stateName}-${key}`, options);
|
|
111
99
|
vars[varName] = String(value);
|
|
112
100
|
});
|
|
113
101
|
});
|
|
@@ -117,11 +105,7 @@ export function generateComponentCSSVars(
|
|
|
117
105
|
if (variants) {
|
|
118
106
|
Object.entries(variants).forEach(([variantName, variantProps]) => {
|
|
119
107
|
Object.entries(variantProps).forEach(([key, value]) => {
|
|
120
|
-
const varName = generateCSSVariableName(
|
|
121
|
-
component,
|
|
122
|
-
`${variantName}-${key}`,
|
|
123
|
-
options
|
|
124
|
-
);
|
|
108
|
+
const varName = generateCSSVariableName(component, `${variantName}-${key}`, options);
|
|
125
109
|
vars[varName] = String(value);
|
|
126
110
|
});
|
|
127
111
|
});
|
|
@@ -132,7 +116,7 @@ export function generateComponentCSSVars(
|
|
|
132
116
|
|
|
133
117
|
/**
|
|
134
118
|
* Map SCSS tokens to CSS custom properties
|
|
135
|
-
*
|
|
119
|
+
*
|
|
136
120
|
* @example
|
|
137
121
|
* const tokens = { '$primary-color': '#7AFFD7', '$spacing-md': '16px' }
|
|
138
122
|
* const vars = mapSCSSTokensToCSSVars(tokens)
|
|
@@ -148,13 +132,13 @@ export function mapSCSSTokensToCSSVars(
|
|
|
148
132
|
Object.entries(tokens).forEach(([key, value]) => {
|
|
149
133
|
// Remove $ prefix from SCSS variables
|
|
150
134
|
const cleanKey = key.startsWith('$') ? key.slice(1) : key;
|
|
151
|
-
|
|
135
|
+
|
|
152
136
|
// Convert underscores to separators
|
|
153
137
|
const normalizedKey = cleanKey.replace(/_/g, separator);
|
|
154
|
-
|
|
138
|
+
|
|
155
139
|
// Generate variable name
|
|
156
140
|
const varName = `--${prefix}${separator}${normalizedKey}`;
|
|
157
|
-
|
|
141
|
+
|
|
158
142
|
vars[varName] = String(value);
|
|
159
143
|
});
|
|
160
144
|
|
|
@@ -163,74 +147,66 @@ export function mapSCSSTokensToCSSVars(
|
|
|
163
147
|
|
|
164
148
|
/**
|
|
165
149
|
* Apply CSS variables to an element
|
|
166
|
-
*
|
|
150
|
+
*
|
|
167
151
|
* @param vars - CSS variables to apply
|
|
168
152
|
* @param element - Target element (defaults to document.documentElement)
|
|
169
153
|
*/
|
|
170
154
|
export function applyCSSVariables(
|
|
171
|
-
|
|
172
|
-
|
|
155
|
+
vars: Record<string, string | number>,
|
|
156
|
+
element?: HTMLElement
|
|
173
157
|
): void {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
158
|
+
if (typeof window === 'undefined') {
|
|
159
|
+
return; // SSR safety
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const target = element || document.documentElement;
|
|
163
|
+
Object.entries(vars).forEach(([key, value]) => {
|
|
164
|
+
target.style.setProperty(key, String(value));
|
|
165
|
+
});
|
|
182
166
|
}
|
|
183
167
|
|
|
184
168
|
/**
|
|
185
169
|
* Remove CSS variables from an element
|
|
186
|
-
*
|
|
170
|
+
*
|
|
187
171
|
* @param varNames - Variable names to remove
|
|
188
172
|
* @param element - Target element (defaults to document.documentElement)
|
|
189
173
|
*/
|
|
190
|
-
export function removeCSSVariables(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
varNames.forEach((varName) => {
|
|
200
|
-
target.style.removeProperty(varName);
|
|
201
|
-
});
|
|
174
|
+
export function removeCSSVariables(varNames: string[], element?: HTMLElement): void {
|
|
175
|
+
if (typeof window === 'undefined') {
|
|
176
|
+
return; // SSR safety
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const target = element || document.documentElement;
|
|
180
|
+
varNames.forEach(varName => {
|
|
181
|
+
target.style.removeProperty(varName);
|
|
182
|
+
});
|
|
202
183
|
}
|
|
203
184
|
|
|
204
185
|
/**
|
|
205
186
|
* Get CSS variable value from an element
|
|
206
|
-
*
|
|
187
|
+
*
|
|
207
188
|
* @param varName - Variable name to get
|
|
208
189
|
* @param element - Target element (defaults to document.documentElement)
|
|
209
190
|
* @returns Variable value or null if not found
|
|
210
191
|
*/
|
|
211
|
-
export function getCSSVariable(
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const target = element || document.documentElement;
|
|
220
|
-
return getComputedStyle(target).getPropertyValue(varName).trim() || null;
|
|
192
|
+
export function getCSSVariable(varName: string, element?: HTMLElement): string | null {
|
|
193
|
+
if (typeof window === 'undefined') {
|
|
194
|
+
return null; // SSR safety
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const target = element || document.documentElement;
|
|
198
|
+
return getComputedStyle(target).getPropertyValue(varName).trim() || null;
|
|
221
199
|
}
|
|
222
200
|
|
|
223
201
|
/**
|
|
224
202
|
* Convert CSS variable object to inline style object
|
|
225
|
-
*
|
|
203
|
+
*
|
|
226
204
|
* @example
|
|
227
205
|
* const vars = { '--atomix-button-bg': '#000' }
|
|
228
206
|
* const style = cssVarsToStyle(vars)
|
|
229
207
|
* // Returns: { '--atomix-button-bg': '#000' } as React.CSSProperties
|
|
230
208
|
*/
|
|
231
|
-
export function cssVarsToStyle(
|
|
232
|
-
vars: Record<string, string | number>
|
|
233
|
-
): React.CSSProperties {
|
|
209
|
+
export function cssVarsToStyle(vars: Record<string, string | number>): React.CSSProperties {
|
|
234
210
|
return Object.entries(vars).reduce((acc, [key, value]) => {
|
|
235
211
|
(acc as any)[key] = typeof value === 'number' ? `${value}px` : value;
|
|
236
212
|
return acc;
|
|
@@ -261,15 +237,12 @@ export function isValidCSSVariableName(name: string): boolean {
|
|
|
261
237
|
|
|
262
238
|
/**
|
|
263
239
|
* Extract component name from CSS variable name
|
|
264
|
-
*
|
|
240
|
+
*
|
|
265
241
|
* @example
|
|
266
242
|
* extractComponentName('--atomix-button-bg')
|
|
267
243
|
* // Returns: 'button'
|
|
268
244
|
*/
|
|
269
|
-
export function extractComponentName(
|
|
270
|
-
varName: string,
|
|
271
|
-
prefix: string = 'atomix'
|
|
272
|
-
): string | null {
|
|
245
|
+
export function extractComponentName(varName: string, prefix: string = 'atomix'): string | null {
|
|
273
246
|
const regex = new RegExp(`^--${prefix}-([a-z0-9]+)-`);
|
|
274
247
|
const match = varName.match(regex);
|
|
275
248
|
return match ? (match[1] ?? null) : null;
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme Adapters
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Adapters for working with DesignTokens and CSS variables
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
export {
|
|
8
|
-
designTokensToCSSVars,
|
|
9
|
-
} from './themeAdapter';
|
|
7
|
+
export { designTokensToCSSVars } from './themeAdapter';
|
|
10
8
|
|
|
11
9
|
export {
|
|
12
10
|
generateCSSVariableName,
|
|
@@ -21,8 +19,4 @@ export {
|
|
|
21
19
|
extractComponentName,
|
|
22
20
|
} from './cssVariableMapper';
|
|
23
21
|
|
|
24
|
-
export type {
|
|
25
|
-
CSSVariableConfig,
|
|
26
|
-
CSSVariableNamingOptions,
|
|
27
|
-
} from './cssVariableMapper';
|
|
28
|
-
|
|
22
|
+
export type { CSSVariableConfig, CSSVariableNamingOptions } from './cssVariableMapper';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme Adapter
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Converts between Theme objects and DesignTokens.
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -11,12 +11,12 @@ import { hexToRgb } from '../utils/themeUtils';
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Convert Theme object to DesignTokens
|
|
14
|
-
*
|
|
14
|
+
*
|
|
15
15
|
* Extracts values from a Theme object and converts them to flat DesignTokens format.
|
|
16
|
-
*
|
|
16
|
+
*
|
|
17
17
|
* @param theme - Theme object to convert
|
|
18
18
|
* @returns Partial DesignTokens object
|
|
19
|
-
*
|
|
19
|
+
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```typescript
|
|
22
22
|
* const theme = createTheme({ palette: { primary: { main: '#7c3aed' } } });
|
|
@@ -150,14 +150,14 @@ export function themeToDesignTokens(theme: Theme): Partial<DesignTokens> {
|
|
|
150
150
|
tokens['font-sans-serif'] = theme.typography.fontFamily;
|
|
151
151
|
tokens['body-font-size'] = `${theme.typography.fontSize}px`;
|
|
152
152
|
tokens['body-font-weight'] = String(theme.typography.fontWeightRegular);
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
// Font weights
|
|
155
155
|
tokens['font-weight-light'] = String(theme.typography.fontWeightLight);
|
|
156
156
|
tokens['font-weight-normal'] = String(theme.typography.fontWeightRegular);
|
|
157
157
|
tokens['font-weight-medium'] = String(theme.typography.fontWeightMedium);
|
|
158
158
|
tokens['font-weight-semibold'] = String(theme.typography.fontWeightSemiBold);
|
|
159
159
|
tokens['font-weight-bold'] = String(theme.typography.fontWeightBold);
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
// Line heights
|
|
162
162
|
if (theme.typography.h1?.lineHeight) {
|
|
163
163
|
tokens['line-height-base'] = String(theme.typography.h1.lineHeight);
|
|
@@ -165,7 +165,11 @@ export function themeToDesignTokens(theme: Theme): Partial<DesignTokens> {
|
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
// Convert spacing (if available as object)
|
|
168
|
-
if (
|
|
168
|
+
if (
|
|
169
|
+
theme.spacing &&
|
|
170
|
+
typeof theme.spacing === 'object' &&
|
|
171
|
+
!('__isSpacingFunction' in theme.spacing)
|
|
172
|
+
) {
|
|
169
173
|
const spacing = theme.spacing as Record<string, string | number>;
|
|
170
174
|
Object.entries(spacing).forEach(([key, value]) => {
|
|
171
175
|
tokens[`spacing-${key}` as keyof DesignTokens] = String(value);
|
|
@@ -175,12 +179,18 @@ export function themeToDesignTokens(theme: Theme): Partial<DesignTokens> {
|
|
|
175
179
|
// Convert border radius
|
|
176
180
|
if (theme.borderRadius) {
|
|
177
181
|
Object.entries(theme.borderRadius).forEach(([key, value]) => {
|
|
178
|
-
const tokenKey =
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
const tokenKey =
|
|
183
|
+
key === 'sm'
|
|
184
|
+
? 'border-radius-sm'
|
|
185
|
+
: key === 'md'
|
|
186
|
+
? 'border-radius'
|
|
187
|
+
: key === 'lg'
|
|
188
|
+
? 'border-radius-lg'
|
|
189
|
+
: key === 'xl'
|
|
190
|
+
? 'border-radius-xl'
|
|
191
|
+
: key === 'xxl'
|
|
192
|
+
? 'border-radius-xxl'
|
|
193
|
+
: `border-radius-${key}`;
|
|
184
194
|
tokens[tokenKey as keyof DesignTokens] = String(value);
|
|
185
195
|
});
|
|
186
196
|
}
|
|
@@ -188,12 +198,18 @@ export function themeToDesignTokens(theme: Theme): Partial<DesignTokens> {
|
|
|
188
198
|
// Convert shadows
|
|
189
199
|
if (theme.shadows) {
|
|
190
200
|
Object.entries(theme.shadows).forEach(([key, value]) => {
|
|
191
|
-
const tokenKey =
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
201
|
+
const tokenKey =
|
|
202
|
+
key === 'xs'
|
|
203
|
+
? 'box-shadow-xs'
|
|
204
|
+
: key === 'sm'
|
|
205
|
+
? 'box-shadow-sm'
|
|
206
|
+
: key === 'md'
|
|
207
|
+
? 'box-shadow'
|
|
208
|
+
: key === 'lg'
|
|
209
|
+
? 'box-shadow-lg'
|
|
210
|
+
: key === 'xl'
|
|
211
|
+
? 'box-shadow-xl'
|
|
212
|
+
: `box-shadow-${key}`;
|
|
197
213
|
tokens[tokenKey as keyof DesignTokens] = String(value);
|
|
198
214
|
});
|
|
199
215
|
}
|
|
@@ -240,13 +256,13 @@ export function themeToDesignTokens(theme: Theme): Partial<DesignTokens> {
|
|
|
240
256
|
|
|
241
257
|
/**
|
|
242
258
|
* Convert DesignTokens to Theme-compatible CSS variables
|
|
243
|
-
*
|
|
259
|
+
*
|
|
244
260
|
* @param tokens - DesignTokens object
|
|
245
261
|
* @returns CSS variables object compatible with Theme.cssVars
|
|
246
262
|
*/
|
|
247
263
|
export function designTokensToCSSVars(tokens: Partial<DesignTokens>): Record<string, string> {
|
|
248
264
|
const cssVars: Record<string, string> = {};
|
|
249
|
-
|
|
265
|
+
|
|
250
266
|
Object.entries(tokens).forEach(([key, value]) => {
|
|
251
267
|
if (value !== undefined) {
|
|
252
268
|
cssVars[`--atomix-${key}`] = String(value);
|
|
@@ -258,9 +274,9 @@ export function designTokensToCSSVars(tokens: Partial<DesignTokens>): Record<str
|
|
|
258
274
|
|
|
259
275
|
/**
|
|
260
276
|
* Create DesignTokens from Theme with defaults
|
|
261
|
-
*
|
|
277
|
+
*
|
|
262
278
|
* Converts a Theme to DesignTokens and merges with default tokens.
|
|
263
|
-
*
|
|
279
|
+
*
|
|
264
280
|
* @param theme - Theme object to convert
|
|
265
281
|
* @returns Complete DesignTokens object
|
|
266
282
|
*/
|
|
@@ -271,17 +287,16 @@ export function createDesignTokensFromTheme(theme: Theme): DesignTokens {
|
|
|
271
287
|
|
|
272
288
|
/**
|
|
273
289
|
* Create a minimal Theme object from DesignTokens
|
|
274
|
-
*
|
|
290
|
+
*
|
|
275
291
|
* @param tokens - DesignTokens to convert
|
|
276
292
|
* @returns Minimal Theme object with cssVars populated
|
|
277
293
|
*/
|
|
278
294
|
export function designTokensToTheme(tokens: Partial<DesignTokens>): Partial<Theme> {
|
|
279
295
|
const cssVars = designTokensToCSSVars(tokens);
|
|
280
|
-
|
|
296
|
+
|
|
281
297
|
return {
|
|
282
298
|
name: 'Design Tokens Theme',
|
|
283
299
|
cssVars,
|
|
284
300
|
__isJSTheme: true,
|
|
285
301
|
} as Partial<Theme>;
|
|
286
302
|
}
|
|
287
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme Configuration Validator
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Validates theme configuration structure and values
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ import type { ConfigValidationResult } from './types';
|
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Validate theme configuration
|
|
11
|
-
*
|
|
11
|
+
*
|
|
12
12
|
* @param config - Configuration to validate
|
|
13
13
|
* @returns Validation result with errors and warnings
|
|
14
14
|
*/
|
|
@@ -117,8 +117,14 @@ function validateThemes(themes: Record<string, any>): ConfigValidationResult {
|
|
|
117
117
|
|
|
118
118
|
// Validate accessibility (only critical checks)
|
|
119
119
|
if (theme.a11y?.contrastTarget) {
|
|
120
|
-
if (
|
|
121
|
-
|
|
120
|
+
if (
|
|
121
|
+
typeof theme.a11y.contrastTarget !== 'number' ||
|
|
122
|
+
theme.a11y.contrastTarget < 1 ||
|
|
123
|
+
theme.a11y.contrastTarget > 21
|
|
124
|
+
) {
|
|
125
|
+
warnings.push(
|
|
126
|
+
`Theme "${themeId}" has invalid contrast target: ${theme.a11y.contrastTarget}`
|
|
127
|
+
);
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
}
|
|
@@ -247,4 +253,3 @@ function validateDependencies(
|
|
|
247
253
|
|
|
248
254
|
return { valid: errors.length === 0, errors, warnings };
|
|
249
255
|
}
|
|
250
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme System Constants
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Centralized constants for the theme system to avoid magic numbers and strings.
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -121,7 +121,7 @@ export const DEFAULT_ANALYTICS_CONFIG = {
|
|
|
121
121
|
* Logger default configuration
|
|
122
122
|
*/
|
|
123
123
|
export const DEFAULT_LOGGER_CONFIG = {
|
|
124
|
-
level:
|
|
124
|
+
level: typeof process !== 'undefined' && process.env?.NODE_ENV === 'production' ? 1 : 2, // WARN in prod, INFO in dev
|
|
125
125
|
enableConsole: true,
|
|
126
126
|
} as const;
|
|
127
127
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* createTheme Tests
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Tests for createTheme function including automatic config loading
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@ describe('createTheme', () => {
|
|
|
19
19
|
// createTheme() should work even if config is not available
|
|
20
20
|
// It will fall back to default tokens
|
|
21
21
|
const css = createTheme();
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
expect(typeof css).toBe('string');
|
|
24
24
|
expect(css.length).toBeGreaterThan(0);
|
|
25
25
|
expect(css).toContain(':root');
|
|
@@ -27,7 +27,7 @@ describe('createTheme', () => {
|
|
|
27
27
|
|
|
28
28
|
it('should generate valid CSS with default tokens', () => {
|
|
29
29
|
const css = createTheme();
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
// Should contain CSS variable declarations
|
|
32
32
|
expect(css).toMatch(/--atomix-[a-z-]+:\s*[^;]+;/);
|
|
33
33
|
});
|
|
@@ -36,13 +36,13 @@ describe('createTheme', () => {
|
|
|
36
36
|
describe('DesignTokens Input', () => {
|
|
37
37
|
it('should accept DesignTokens and generate CSS', () => {
|
|
38
38
|
const tokens: Partial<DesignTokens> = {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
primary: '#7AFFD7',
|
|
40
|
+
secondary: '#FF5733',
|
|
41
41
|
'spacing-4': '1rem',
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
const css = createTheme(tokens);
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
expect(css).toContain('--atomix-primary');
|
|
47
47
|
expect(css).toContain('#7AFFD7');
|
|
48
48
|
expect(css).toContain('--atomix-secondary');
|
|
@@ -53,15 +53,15 @@ describe('createTheme', () => {
|
|
|
53
53
|
|
|
54
54
|
it('should merge with default tokens', () => {
|
|
55
55
|
const tokens: Partial<DesignTokens> = {
|
|
56
|
-
|
|
56
|
+
primary: '#CUSTOM',
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
const css = createTheme(tokens);
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
// Should contain custom primary
|
|
62
62
|
expect(css).toContain('--atomix-primary');
|
|
63
63
|
expect(css).toContain('#CUSTOM');
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
// Should also contain default tokens
|
|
66
66
|
expect(css).toContain('--atomix-secondary');
|
|
67
67
|
});
|
|
@@ -70,33 +70,33 @@ describe('createTheme', () => {
|
|
|
70
70
|
describe('Options', () => {
|
|
71
71
|
it('should respect prefix option', () => {
|
|
72
72
|
const tokens: Partial<DesignTokens> = {
|
|
73
|
-
|
|
73
|
+
primary: '#7AFFD7',
|
|
74
74
|
};
|
|
75
75
|
|
|
76
76
|
const css = createTheme(tokens, { prefix: 'myapp' });
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
expect(css).toContain('--myapp-primary');
|
|
79
79
|
expect(css).not.toContain('--atomix-primary');
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
it('should respect selector option', () => {
|
|
83
83
|
const tokens: Partial<DesignTokens> = {
|
|
84
|
-
|
|
84
|
+
primary: '#7AFFD7',
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
const css = createTheme(tokens, { selector: '[data-theme="dark"]' });
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
expect(css).toContain('[data-theme="dark"]');
|
|
90
90
|
expect(css).not.toContain(':root');
|
|
91
91
|
});
|
|
92
92
|
|
|
93
93
|
it('should use default prefix when not provided', () => {
|
|
94
94
|
const tokens: Partial<DesignTokens> = {
|
|
95
|
-
|
|
95
|
+
primary: '#7AFFD7',
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
const css = createTheme(tokens);
|
|
99
|
-
|
|
99
|
+
|
|
100
100
|
expect(css).toContain('--atomix-primary');
|
|
101
101
|
});
|
|
102
102
|
});
|
|
@@ -104,11 +104,11 @@ describe('createTheme', () => {
|
|
|
104
104
|
describe('CSS Output Format', () => {
|
|
105
105
|
it('should generate valid CSS syntax', () => {
|
|
106
106
|
const tokens: Partial<DesignTokens> = {
|
|
107
|
-
|
|
107
|
+
primary: '#7AFFD7',
|
|
108
108
|
};
|
|
109
109
|
|
|
110
110
|
const css = createTheme(tokens);
|
|
111
|
-
|
|
111
|
+
|
|
112
112
|
// Should be valid CSS
|
|
113
113
|
expect(css).toMatch(/^[^{]*\{[^}]*\}/s);
|
|
114
114
|
expect(css).toContain(':');
|
|
@@ -117,16 +117,14 @@ describe('createTheme', () => {
|
|
|
117
117
|
|
|
118
118
|
it('should format CSS with proper indentation', () => {
|
|
119
119
|
const tokens: Partial<DesignTokens> = {
|
|
120
|
-
|
|
121
|
-
|
|
120
|
+
primary: '#7AFFD7',
|
|
121
|
+
secondary: '#FF5733',
|
|
122
122
|
};
|
|
123
123
|
|
|
124
124
|
const css = createTheme(tokens);
|
|
125
|
-
|
|
125
|
+
|
|
126
126
|
// Should have proper formatting
|
|
127
127
|
expect(css).toContain('\n');
|
|
128
128
|
});
|
|
129
129
|
});
|
|
130
130
|
});
|
|
131
|
-
|
|
132
|
-
|