@shohojdhara/atomix 0.3.15 → 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/build-tools/index.d.ts +31 -30
- package/build-tools/package.json +4 -21
- package/dist/atomix.css +20924 -2611
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +76 -2
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/index.d.ts +31 -30
- package/dist/build-tools/package.json +4 -21
- package/dist/charts.js.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +144 -18
- package/dist/index.esm.js +110 -55
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +110 -55
- 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 +1 -1
- package/src/components/Accordion/Accordion.stories.tsx +32 -23
- 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/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/glass-utils.ts +4 -3
- package/src/components/AtomixGlass/shader-utils.ts +128 -52
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
- package/src/components/Avatar/Avatar.stories.tsx +45 -62
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +20 -9
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +14 -4
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +13 -22
- package/src/components/Button/Button.test.tsx +97 -81
- package/src/components/Button/Button.tsx +46 -14
- package/src/components/Button/ButtonGroup.stories.tsx +37 -32
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +109 -16
- package/src/components/Card/Card.stories.tsx +67 -36
- 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 +4 -9
- 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 +6 -2
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +7 -7
- package/src/components/DataTable/DataTable.stories.tsx +43 -38
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +21 -16
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.test.tsx +49 -49
- package/src/components/Form/Checkbox.tsx +108 -100
- package/src/components/Form/Form.stories.tsx +2 -10
- 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 +6 -12
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +56 -23
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +2 -1
- 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 +99 -192
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +35 -44
- package/src/components/River/River.stories.tsx +2 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +3 -1
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +8 -6
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Toggle/Toggle.stories.tsx +27 -13
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +129 -127
- 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/__tests__/theme-tools.test.ts +32 -6
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +106 -49
- package/src/lib/composables/useChartExport.ts +1 -1
- package/src/lib/composables/useDataTable.ts +29 -17
- 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/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 +106 -104
- 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 +1 -1
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +3 -1
- package/src/lib/utils/dataTableExport.ts +1 -5
- 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 +0 -1
- package/src/styles/01-settings/_settings.colors.scss +8 -8
- 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 +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +30 -18
- package/src/styles/03-generic/_generic.root.scss +4 -3
- 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 +3 -1
- 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/_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 +1 -1
- 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 +30 -30
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
|
@@ -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
|
+
};
|
|
@@ -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';
|