@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
|
* Core Theme Engine
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Core theme creation, composition, and registry functionality
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ export { createTheme } from './createTheme';
|
|
|
8
8
|
export { deepMerge, mergeTheme, extendTheme } from './composeTheme';
|
|
9
9
|
|
|
10
10
|
// Simplified Theme Registry API
|
|
11
|
-
export {
|
|
11
|
+
export {
|
|
12
12
|
createThemeRegistry,
|
|
13
13
|
registerTheme,
|
|
14
14
|
unregisterTheme,
|
|
@@ -19,5 +19,5 @@ export {
|
|
|
19
19
|
clearThemes,
|
|
20
20
|
getThemeCount,
|
|
21
21
|
type ThemeRegistry,
|
|
22
|
-
type ThemeMetadata
|
|
22
|
+
type ThemeMetadata,
|
|
23
23
|
} from './ThemeRegistry';
|
|
@@ -17,139 +17,141 @@ import boxen from 'boxen';
|
|
|
17
17
|
// Stub validator for now to avoid ESM resolution issues in CLI
|
|
18
18
|
// TODO: Fix ESM module resolution for ThemeValidator in CLI context
|
|
19
19
|
class ThemeValidator {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
validate() {
|
|
21
|
+
return { valid: true, errors: [], warnings: [], a11yIssues: [] };
|
|
22
|
+
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const program = new Command();
|
|
26
26
|
|
|
27
|
-
program
|
|
28
|
-
.name('atomix-theme')
|
|
29
|
-
.description('Atomix Theme DevTools')
|
|
30
|
-
.version('0.1.0');
|
|
27
|
+
program.name('atomix-theme').description('Atomix Theme DevTools').version('0.1.0');
|
|
31
28
|
|
|
32
29
|
// Utils
|
|
33
30
|
const getThemesDir = () => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
31
|
+
const possiblePaths = [
|
|
32
|
+
path.join(process.cwd(), 'themes'),
|
|
33
|
+
path.join(process.cwd(), 'src', 'themes'),
|
|
34
|
+
path.join(process.cwd(), 'src', 'styles', 'themes'),
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
for (const p of possiblePaths) {
|
|
38
|
+
if (fs.existsSync(p)) return p;
|
|
39
|
+
}
|
|
40
|
+
return path.join(process.cwd(), 'themes');
|
|
44
41
|
};
|
|
45
42
|
|
|
46
43
|
// Validate Command
|
|
47
44
|
program
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
}
|
|
45
|
+
.command('validate')
|
|
46
|
+
.description('Validate theme configuration')
|
|
47
|
+
.option('-c, --config <path>', 'Path to theme config')
|
|
48
|
+
.option('--strict', 'Enable strict validation')
|
|
49
|
+
.action(async options => {
|
|
50
|
+
console.log(chalk.cyan('Validating theme configuration...'));
|
|
51
|
+
|
|
52
|
+
// In a real implementation this would load the theme object
|
|
53
|
+
// For now we'll do basic file checks if a file is provided
|
|
54
|
+
|
|
55
|
+
if (options.config) {
|
|
56
|
+
const configPath = path.resolve(process.cwd(), options.config);
|
|
57
|
+
if (!fs.existsSync(configPath)) {
|
|
58
|
+
console.error(chalk.red(`❌ Config file not found: ${options.config}`));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Attempt to validate structure if it's JSON
|
|
63
|
+
if (configPath.endsWith('.json')) {
|
|
64
|
+
try {
|
|
65
|
+
const content = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
66
|
+
const validator = new ThemeValidator();
|
|
67
|
+
// Mocking validation for now as we don't have a full loader
|
|
68
|
+
console.log(chalk.green('✓ JSON structure is valid'));
|
|
69
|
+
} catch (e) {
|
|
70
|
+
console.error(chalk.red(`❌ Invalid JSON: ${(e as Error).message}`));
|
|
71
|
+
process.exit(1);
|
|
77
72
|
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
78
75
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
// Output success for now to verify connectivity
|
|
77
|
+
console.log(chalk.green('✓ Validation completed'));
|
|
78
|
+
});
|
|
82
79
|
|
|
83
80
|
// List Command
|
|
84
81
|
program
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
82
|
+
.command('list')
|
|
83
|
+
.description('List available themes')
|
|
84
|
+
.action(async () => {
|
|
85
|
+
const themesDir = getThemesDir();
|
|
86
|
+
|
|
87
|
+
if (!fs.existsSync(themesDir)) {
|
|
88
|
+
console.log(chalk.yellow(`No themes directory found at ${themesDir}`));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
94
91
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
const themes = fs.readdirSync(themesDir).filter(f => {
|
|
93
|
+
const stat = fs.statSync(path.join(themesDir, f));
|
|
94
|
+
return stat.isDirectory() || f.endsWith('.json') || f.endsWith('.ts');
|
|
95
|
+
});
|
|
99
96
|
|
|
100
|
-
|
|
97
|
+
console.log(chalk.bold.cyan(`\nFound ${themes.length} themes in ${themesDir}:\n`));
|
|
101
98
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
});
|
|
105
|
-
console.log('');
|
|
99
|
+
themes.forEach(theme => {
|
|
100
|
+
console.log(` • ${theme}`);
|
|
106
101
|
});
|
|
102
|
+
console.log('');
|
|
103
|
+
});
|
|
107
104
|
|
|
108
105
|
// Inspect Command
|
|
109
106
|
program
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
107
|
+
.command('inspect <theme>')
|
|
108
|
+
.description('Inspect specific theme')
|
|
109
|
+
.option('--json', 'Output as JSON')
|
|
110
|
+
.action(async (themeName, options) => {
|
|
111
|
+
const themesDir = getThemesDir();
|
|
112
|
+
const themePath = path.join(themesDir, themeName);
|
|
113
|
+
|
|
114
|
+
if (
|
|
115
|
+
!fs.existsSync(themePath) &&
|
|
116
|
+
!fs.existsSync(`${themePath}.json`) &&
|
|
117
|
+
!fs.existsSync(`${themePath}.ts`)
|
|
118
|
+
) {
|
|
119
|
+
console.error(chalk.red(`❌ Theme not found: ${themeName}`));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
121
122
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
123
|
+
if (options.json) {
|
|
124
|
+
console.log(JSON.stringify({ name: themeName, path: themePath }, null, 2));
|
|
125
|
+
} else {
|
|
126
|
+
console.log(
|
|
127
|
+
boxen(chalk.bold(themeName) + '\n' + chalk.gray(`Path: ${themePath}`), {
|
|
128
|
+
padding: 1,
|
|
129
|
+
borderStyle: 'round',
|
|
130
|
+
})
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
132
134
|
|
|
133
135
|
// Compare Command (Stub)
|
|
134
136
|
program
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
.command('compare <theme1> <theme2>')
|
|
138
|
+
.description('Compare two themes')
|
|
139
|
+
.action(async (theme1, theme2) => {
|
|
140
|
+
console.log(chalk.cyan(`Comparing ${theme1} with ${theme2}...`));
|
|
141
|
+
// Stub
|
|
142
|
+
console.log(chalk.yellow('Comparison feature not yet fully implemented.'));
|
|
143
|
+
});
|
|
142
144
|
|
|
143
145
|
// Export Command (Stub)
|
|
144
146
|
program
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
147
|
+
.command('export <theme>')
|
|
148
|
+
.description('Export theme')
|
|
149
|
+
.option('-o, --output <path>', 'Output path')
|
|
150
|
+
.action(async (theme, options) => {
|
|
151
|
+
console.log(chalk.cyan(`Exporting ${theme}...`));
|
|
152
|
+
if (options.output) {
|
|
153
|
+
console.log(chalk.green(`✓ Exported to ${options.output}`));
|
|
154
|
+
}
|
|
155
|
+
});
|
|
154
156
|
|
|
155
157
|
program.parse(process.argv);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Theme Comparator Component
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* React component for comparing two themes side-by-side
|
|
5
5
|
* Enhanced with search/filter and improved visual diff styling
|
|
6
6
|
*/
|
|
@@ -34,7 +34,7 @@ interface Difference {
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Theme Comparator Component
|
|
37
|
-
*
|
|
37
|
+
*
|
|
38
38
|
* Compares two themes and highlights differences
|
|
39
39
|
*/
|
|
40
40
|
export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
@@ -69,12 +69,12 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
69
69
|
|
|
70
70
|
const differences = useMemo(() => {
|
|
71
71
|
const diffs: Difference[] = [];
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
const getCategory = (path: string): string => {
|
|
74
74
|
const firstSegment = path.split('.')[0];
|
|
75
75
|
return firstSegment || 'other';
|
|
76
76
|
};
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
const compareObjects = (objA: any, objB: any, path: string = '') => {
|
|
79
79
|
const keysA = Object.keys(objA || {});
|
|
80
80
|
const keysB = Object.keys(objB || {});
|
|
@@ -82,7 +82,7 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
82
82
|
|
|
83
83
|
for (const key of allKeys) {
|
|
84
84
|
if (key === '__isJSTheme') continue;
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
const currentPath = path ? `${path}.${key}` : key;
|
|
87
87
|
const valueA = objA?.[key];
|
|
88
88
|
const valueB = objB?.[key];
|
|
@@ -103,7 +103,12 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
103
103
|
type: 'removed',
|
|
104
104
|
category: getCategory(currentPath),
|
|
105
105
|
});
|
|
106
|
-
} else if (
|
|
106
|
+
} else if (
|
|
107
|
+
typeof valueA === 'object' &&
|
|
108
|
+
typeof valueB === 'object' &&
|
|
109
|
+
!Array.isArray(valueA) &&
|
|
110
|
+
!Array.isArray(valueB)
|
|
111
|
+
) {
|
|
107
112
|
compareObjects(valueA, valueB, currentPath);
|
|
108
113
|
} else if (JSON.stringify(valueA) !== JSON.stringify(valueB)) {
|
|
109
114
|
diffs.push({
|
|
@@ -138,10 +143,11 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
138
143
|
// Filter by search query
|
|
139
144
|
if (debouncedSearchQuery) {
|
|
140
145
|
const queryLower = debouncedSearchQuery.toLowerCase();
|
|
141
|
-
filtered = filtered.filter(
|
|
142
|
-
d
|
|
143
|
-
|
|
144
|
-
|
|
146
|
+
filtered = filtered.filter(
|
|
147
|
+
d =>
|
|
148
|
+
d.path.toLowerCase().includes(queryLower) ||
|
|
149
|
+
String(d.valueA).toLowerCase().includes(queryLower) ||
|
|
150
|
+
String(d.valueB).toLowerCase().includes(queryLower)
|
|
145
151
|
);
|
|
146
152
|
}
|
|
147
153
|
|
|
@@ -164,29 +170,39 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
164
170
|
|
|
165
171
|
const getTypeColor = (type: Difference['type']): string => {
|
|
166
172
|
switch (type) {
|
|
167
|
-
case 'added':
|
|
168
|
-
|
|
169
|
-
case '
|
|
170
|
-
|
|
173
|
+
case 'added':
|
|
174
|
+
return '#4caf50';
|
|
175
|
+
case 'removed':
|
|
176
|
+
return '#f44336';
|
|
177
|
+
case 'changed':
|
|
178
|
+
return '#ff9800';
|
|
179
|
+
default:
|
|
180
|
+
return '#666';
|
|
171
181
|
}
|
|
172
182
|
};
|
|
173
183
|
|
|
174
184
|
const getTypeBackground = (type: Difference['type']): string => {
|
|
175
185
|
switch (type) {
|
|
176
|
-
case 'added':
|
|
177
|
-
|
|
178
|
-
case '
|
|
179
|
-
|
|
186
|
+
case 'added':
|
|
187
|
+
return 'rgba(76, 175, 80, 0.1)';
|
|
188
|
+
case 'removed':
|
|
189
|
+
return 'rgba(244, 67, 54, 0.1)';
|
|
190
|
+
case 'changed':
|
|
191
|
+
return 'rgba(255, 152, 0, 0.1)';
|
|
192
|
+
default:
|
|
193
|
+
return 'transparent';
|
|
180
194
|
}
|
|
181
195
|
};
|
|
182
196
|
|
|
183
197
|
const highlightText = (text: string, query: string): React.ReactNode => {
|
|
184
198
|
if (!query) return text;
|
|
185
|
-
|
|
199
|
+
|
|
186
200
|
const parts = text.split(new RegExp(`(${query})`, 'gi'));
|
|
187
|
-
return parts.map((part, index) =>
|
|
201
|
+
return parts.map((part, index) =>
|
|
188
202
|
part.toLowerCase() === query.toLowerCase() ? (
|
|
189
|
-
<mark key={index} className="search-highlight">
|
|
203
|
+
<mark key={index} className="search-highlight">
|
|
204
|
+
{part}
|
|
205
|
+
</mark>
|
|
190
206
|
) : (
|
|
191
207
|
part
|
|
192
208
|
)
|
|
@@ -225,7 +241,7 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
225
241
|
type="text"
|
|
226
242
|
placeholder="Search differences..."
|
|
227
243
|
value={searchQuery}
|
|
228
|
-
onChange={
|
|
244
|
+
onChange={e => setSearchQuery(e.target.value)}
|
|
229
245
|
className="search-input"
|
|
230
246
|
/>
|
|
231
247
|
{searchQuery && (
|
|
@@ -243,7 +259,7 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
243
259
|
<label>Type:</label>
|
|
244
260
|
<select
|
|
245
261
|
value={filterType}
|
|
246
|
-
onChange={
|
|
262
|
+
onChange={e => setFilterType(e.target.value as any)}
|
|
247
263
|
className="filter-select"
|
|
248
264
|
>
|
|
249
265
|
<option value="all">All Types</option>
|
|
@@ -258,12 +274,14 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
258
274
|
<label>Category:</label>
|
|
259
275
|
<select
|
|
260
276
|
value={filterCategory}
|
|
261
|
-
onChange={
|
|
277
|
+
onChange={e => setFilterCategory(e.target.value)}
|
|
262
278
|
className="filter-select"
|
|
263
279
|
>
|
|
264
280
|
<option value="all">All Categories</option>
|
|
265
281
|
{categories.map(cat => (
|
|
266
|
-
<option key={cat} value={cat}>
|
|
282
|
+
<option key={cat} value={cat}>
|
|
283
|
+
{cat}
|
|
284
|
+
</option>
|
|
267
285
|
))}
|
|
268
286
|
</select>
|
|
269
287
|
</div>
|
|
@@ -328,13 +346,13 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
328
346
|
<div className="differences-list">
|
|
329
347
|
<h4>Differences ({filteredDifferences.length})</h4>
|
|
330
348
|
{filteredDifferences.map((diff, index) => (
|
|
331
|
-
<div
|
|
332
|
-
key={index}
|
|
349
|
+
<div
|
|
350
|
+
key={index}
|
|
333
351
|
className={`difference-item difference-${diff.type}`}
|
|
334
352
|
style={{ backgroundColor: getTypeBackground(diff.type) }}
|
|
335
353
|
>
|
|
336
354
|
<div className="difference-header">
|
|
337
|
-
<span
|
|
355
|
+
<span
|
|
338
356
|
className="difference-type"
|
|
339
357
|
style={{ backgroundColor: getTypeColor(diff.type) }}
|
|
340
358
|
>
|
|
@@ -343,9 +361,7 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
343
361
|
<code className="difference-path">
|
|
344
362
|
{highlightText(diff.path, debouncedSearchQuery)}
|
|
345
363
|
</code>
|
|
346
|
-
{diff.category &&
|
|
347
|
-
<span className="difference-category">{diff.category}</span>
|
|
348
|
-
)}
|
|
364
|
+
{diff.category && <span className="difference-category">{diff.category}</span>}
|
|
349
365
|
</div>
|
|
350
366
|
<div className="difference-values">
|
|
351
367
|
<div className={`value-column value-${diff.type === 'added' ? 'empty' : 'filled'}`}>
|
|
@@ -359,7 +375,9 @@ export const ThemeComparator: React.FC<ThemeComparatorProps> = ({
|
|
|
359
375
|
</pre>
|
|
360
376
|
</div>
|
|
361
377
|
<div className="value-divider">→</div>
|
|
362
|
-
<div
|
|
378
|
+
<div
|
|
379
|
+
className={`value-column value-${diff.type === 'removed' ? 'empty' : 'filled'}`}
|
|
380
|
+
>
|
|
363
381
|
<div className="value-label">{themeB.name}</div>
|
|
364
382
|
<pre className="value-content">
|
|
365
383
|
{diff.type === 'removed' ? (
|
|
@@ -3,17 +3,19 @@ import { DesignTokensCustomizer } from './DesignTokensCustomizer';
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
|
|
5
5
|
// Enhanced preview components
|
|
6
|
-
const PreviewContainer = ({
|
|
7
|
-
title
|
|
8
|
-
description
|
|
6
|
+
const PreviewContainer = ({
|
|
7
|
+
title,
|
|
8
|
+
description,
|
|
9
|
+
children,
|
|
10
|
+
}: {
|
|
11
|
+
title?: string;
|
|
12
|
+
description?: string;
|
|
9
13
|
children: React.ReactNode;
|
|
10
14
|
}) => (
|
|
11
15
|
<div className="story-preview-container">
|
|
12
16
|
{title && <h3 className="story-preview-title">{title}</h3>}
|
|
13
17
|
{description && <p className="story-preview-description">{description}</p>}
|
|
14
|
-
<div className="story-preview-content">
|
|
15
|
-
{children}
|
|
16
|
-
</div>
|
|
18
|
+
<div className="story-preview-content">{children}</div>
|
|
17
19
|
</div>
|
|
18
20
|
);
|
|
19
21
|
|
|
@@ -24,10 +26,10 @@ const meta: Meta<typeof DesignTokensCustomizer> = {
|
|
|
24
26
|
layout: 'fullscreen',
|
|
25
27
|
docs: {
|
|
26
28
|
description: {
|
|
27
|
-
component: 'Interactive design tokens customization tool for real-time theme adjustments.'
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
29
|
+
component: 'Interactive design tokens customization tool for real-time theme adjustments.',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
31
33
|
};
|
|
32
34
|
|
|
33
35
|
export default meta;
|
|
@@ -36,8 +38,8 @@ type Story = StoryObj<typeof DesignTokensCustomizer>;
|
|
|
36
38
|
// Basic Usage
|
|
37
39
|
export const Default: Story = {
|
|
38
40
|
render: () => (
|
|
39
|
-
<PreviewContainer
|
|
40
|
-
title="Design Tokens Customizer"
|
|
41
|
+
<PreviewContainer
|
|
42
|
+
title="Design Tokens Customizer"
|
|
41
43
|
description="Interactive tool for customizing design tokens in real-time"
|
|
42
44
|
>
|
|
43
45
|
<DesignTokensCustomizer />
|
|
@@ -46,10 +48,10 @@ export const Default: Story = {
|
|
|
46
48
|
parameters: {
|
|
47
49
|
docs: {
|
|
48
50
|
description: {
|
|
49
|
-
story: 'The default design tokens customizer with all standard controls and features.'
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
51
|
+
story: 'The default design tokens customizer with all standard controls and features.',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
53
55
|
};
|
|
54
56
|
|
|
55
57
|
// With Custom Configuration
|
|
@@ -59,36 +61,36 @@ export const WithCustomConfig: Story = {
|
|
|
59
61
|
colors: {
|
|
60
62
|
primary: '#667eea',
|
|
61
63
|
secondary: '#764ba2',
|
|
62
|
-
accent: '#f093fb'
|
|
64
|
+
accent: '#f093fb',
|
|
63
65
|
},
|
|
64
66
|
spacing: {
|
|
65
67
|
small: '8px',
|
|
66
68
|
medium: '16px',
|
|
67
|
-
large: '24px'
|
|
69
|
+
large: '24px',
|
|
68
70
|
},
|
|
69
71
|
typography: {
|
|
70
72
|
fontFamily: 'Inter, sans-serif',
|
|
71
73
|
fontSize: '16px',
|
|
72
|
-
fontWeight: '400'
|
|
73
|
-
}
|
|
74
|
+
fontWeight: '400',
|
|
75
|
+
},
|
|
74
76
|
};
|
|
75
|
-
|
|
77
|
+
|
|
76
78
|
return (
|
|
77
|
-
<PreviewContainer
|
|
78
|
-
title="Custom Configuration"
|
|
79
|
+
<PreviewContainer
|
|
80
|
+
title="Custom Configuration"
|
|
79
81
|
description="Design tokens customizer with predefined custom configuration"
|
|
80
82
|
>
|
|
81
83
|
<DesignTokensCustomizer initialConfig={customConfig} />
|
|
82
84
|
</PreviewContainer>
|
|
83
85
|
);
|
|
84
|
-
}
|
|
86
|
+
},
|
|
85
87
|
};
|
|
86
88
|
|
|
87
89
|
// Theme Preview Mode
|
|
88
90
|
export const ThemePreview: Story = {
|
|
89
91
|
render: () => (
|
|
90
|
-
<PreviewContainer
|
|
91
|
-
title="Theme Preview Mode"
|
|
92
|
+
<PreviewContainer
|
|
93
|
+
title="Theme Preview Mode"
|
|
92
94
|
description="Customizer with live theme preview components"
|
|
93
95
|
>
|
|
94
96
|
<div className="theme-preview-layout">
|
|
@@ -119,19 +121,19 @@ export const ThemePreview: Story = {
|
|
|
119
121
|
viewports: {
|
|
120
122
|
desktop: {
|
|
121
123
|
name: 'Desktop',
|
|
122
|
-
styles: { width: '1200px', height: '800px' }
|
|
123
|
-
}
|
|
124
|
+
styles: { width: '1200px', height: '800px' },
|
|
125
|
+
},
|
|
124
126
|
},
|
|
125
|
-
defaultViewport: 'desktop'
|
|
126
|
-
}
|
|
127
|
-
}
|
|
127
|
+
defaultViewport: 'desktop',
|
|
128
|
+
},
|
|
129
|
+
},
|
|
128
130
|
};
|
|
129
131
|
|
|
130
132
|
// Compact Mode
|
|
131
133
|
export const Compact: Story = {
|
|
132
134
|
render: () => (
|
|
133
|
-
<PreviewContainer
|
|
134
|
-
title="Compact Mode"
|
|
135
|
+
<PreviewContainer
|
|
136
|
+
title="Compact Mode"
|
|
135
137
|
description="Space-efficient customizer for smaller screens"
|
|
136
138
|
>
|
|
137
139
|
<DesignTokensCustomizer compact={true} />
|
|
@@ -142,26 +144,26 @@ export const Compact: Story = {
|
|
|
142
144
|
viewports: {
|
|
143
145
|
mobile: {
|
|
144
146
|
name: 'Mobile',
|
|
145
|
-
styles: { width: '375px', height: '667px' }
|
|
146
|
-
}
|
|
147
|
+
styles: { width: '375px', height: '667px' },
|
|
148
|
+
},
|
|
147
149
|
},
|
|
148
|
-
defaultViewport: 'mobile'
|
|
149
|
-
}
|
|
150
|
-
}
|
|
150
|
+
defaultViewport: 'mobile',
|
|
151
|
+
},
|
|
152
|
+
},
|
|
151
153
|
};
|
|
152
154
|
|
|
153
155
|
// With Export Options
|
|
154
156
|
export const WithExport: Story = {
|
|
155
157
|
render: () => {
|
|
156
158
|
const [exportData, setExportData] = useState('');
|
|
157
|
-
|
|
159
|
+
|
|
158
160
|
const handleExport = (tokens: any) => {
|
|
159
161
|
setExportData(JSON.stringify(tokens, null, 2));
|
|
160
162
|
};
|
|
161
|
-
|
|
163
|
+
|
|
162
164
|
return (
|
|
163
|
-
<PreviewContainer
|
|
164
|
-
title="With Export Options"
|
|
165
|
+
<PreviewContainer
|
|
166
|
+
title="With Export Options"
|
|
165
167
|
description="Customizer with export functionality for sharing themes"
|
|
166
168
|
>
|
|
167
169
|
<div className="export-workflow">
|
|
@@ -170,7 +172,7 @@ export const WithExport: Story = {
|
|
|
170
172
|
<div className="export-output">
|
|
171
173
|
<h4>Exported Theme Data:</h4>
|
|
172
174
|
<pre>{exportData}</pre>
|
|
173
|
-
<button
|
|
175
|
+
<button
|
|
174
176
|
onClick={() => navigator.clipboard.writeText(exportData)}
|
|
175
177
|
className="copy-button"
|
|
176
178
|
>
|
|
@@ -181,14 +183,14 @@ export const WithExport: Story = {
|
|
|
181
183
|
</div>
|
|
182
184
|
</PreviewContainer>
|
|
183
185
|
);
|
|
184
|
-
}
|
|
186
|
+
},
|
|
185
187
|
};
|
|
186
188
|
|
|
187
189
|
// Interactive Tutorial
|
|
188
190
|
export const InteractiveTutorial: Story = {
|
|
189
191
|
render: () => (
|
|
190
|
-
<PreviewContainer
|
|
191
|
-
title="Interactive Tutorial"
|
|
192
|
+
<PreviewContainer
|
|
193
|
+
title="Interactive Tutorial"
|
|
192
194
|
description="Guided tour of the design tokens customizer features"
|
|
193
195
|
>
|
|
194
196
|
<div className="tutorial-container">
|
|
@@ -209,5 +211,5 @@ export const InteractiveTutorial: Story = {
|
|
|
209
211
|
<DesignTokensCustomizer />
|
|
210
212
|
</div>
|
|
211
213
|
</PreviewContainer>
|
|
212
|
-
)
|
|
213
|
-
};
|
|
214
|
+
),
|
|
215
|
+
};
|