@shohojdhara/atomix 0.3.15 → 0.4.1
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 +20234 -2027
- 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 +4 -5
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +87 -10
- package/dist/core.js +673 -480
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +15 -3
- package/dist/forms.js +530 -97
- package/dist/forms.js.map +1 -1
- package/dist/heavy.js +5 -6
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +644 -277
- package/dist/index.esm.js +1948 -1347
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +3333 -2728
- 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 +2 -2
- package/scripts/atomix-cli.js +10 -1
- package/scripts/cli/__tests__/utils.test.js +6 -2
- package/scripts/cli/migration-tools.js +2 -2
- package/scripts/cli/theme-bridge.js +7 -9
- package/scripts/cli/utils.js +2 -1
- package/src/components/Accordion/Accordion.stories.tsx +72 -23
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +219 -96
- package/src/components/Accordion/AccordionCompound.test.tsx +70 -0
- 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 +173 -65
- package/src/components/Breadcrumb/BreadcrumbCompound.test.tsx +84 -0
- 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 +166 -918
- package/src/components/Callout/Callout.tsx +196 -84
- package/src/components/Callout/CalloutCompound.test.tsx +72 -0
- 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 +425 -298
- package/src/components/Dropdown/DropdownCompound.test.tsx +64 -0
- package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
- package/src/components/EdgePanel/EdgePanel.tsx +163 -113
- package/src/components/EdgePanel/EdgePanelCompound.test.tsx +53 -0
- 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.stories.tsx +23 -0
- package/src/components/Form/Select.test.tsx +99 -0
- package/src/components/Form/Select.tsx +239 -186
- package/src/components/Form/SelectOption.tsx +88 -0
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +93 -23
- package/src/components/Hero/Hero.test.tsx +142 -0
- package/src/components/Hero/Hero.tsx +343 -58
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.test.tsx +62 -0
- package/src/components/List/List.tsx +32 -25
- package/src/components/List/ListItem.tsx +20 -0
- package/src/components/Modal/Modal.stories.tsx +67 -2
- package/src/components/Modal/Modal.tsx +208 -125
- package/src/components/Modal/ModalCompound.test.tsx +94 -0
- 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/Steps/Steps.tsx +124 -21
- package/src/components/Steps/StepsCompound.test.tsx +81 -0
- package/src/components/Tabs/Tabs.stories.tsx +12 -9
- package/src/components/Tabs/Tabs.tsx +230 -75
- package/src/components/Tabs/TabsCompound.test.tsx +64 -0
- 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/index.ts +0 -4
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +102 -60
- 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 +105 -111
- 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 +180 -73
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/componentUtils.test.ts +57 -2
- package/src/lib/utils/__tests__/csv.test.ts +1 -1
- package/src/lib/utils/__tests__/themeNaming.test.ts +117 -0
- 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 +3 -3
- 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.breakpoints.scss +1 -1
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +36 -24
- 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 -47
|
@@ -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';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Atomix Theme DevTools CLI
|
|
@@ -11,145 +11,139 @@ import { Command } from 'commander';
|
|
|
11
11
|
import chalk from 'chalk';
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import * as path from 'path';
|
|
14
|
-
|
|
14
|
+
import { ThemeValidator } from './ThemeValidator';
|
|
15
15
|
import boxen from 'boxen';
|
|
16
16
|
|
|
17
|
-
// Stub validator for now to avoid ESM resolution issues in CLI
|
|
18
|
-
// TODO: Fix ESM module resolution for ThemeValidator in CLI context
|
|
19
|
-
class ThemeValidator {
|
|
20
|
-
validate() {
|
|
21
|
-
return { valid: true, errors: [], warnings: [], a11yIssues: [] };
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
17
|
const program = new Command();
|
|
26
18
|
|
|
27
|
-
program
|
|
28
|
-
.name('atomix-theme')
|
|
29
|
-
.description('Atomix Theme DevTools')
|
|
30
|
-
.version('0.1.0');
|
|
19
|
+
program.name('atomix-theme').description('Atomix Theme DevTools').version('0.1.0');
|
|
31
20
|
|
|
32
21
|
// Utils
|
|
33
22
|
const getThemesDir = () => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
23
|
+
const possiblePaths = [
|
|
24
|
+
path.join(process.cwd(), 'themes'),
|
|
25
|
+
path.join(process.cwd(), 'src', 'themes'),
|
|
26
|
+
path.join(process.cwd(), 'src', 'styles', 'themes'),
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
for (const p of possiblePaths) {
|
|
30
|
+
if (fs.existsSync(p)) return p;
|
|
31
|
+
}
|
|
32
|
+
return path.join(process.cwd(), 'themes');
|
|
44
33
|
};
|
|
45
34
|
|
|
46
35
|
// Validate Command
|
|
47
36
|
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
|
-
}
|
|
37
|
+
.command('validate')
|
|
38
|
+
.description('Validate theme configuration')
|
|
39
|
+
.option('-c, --config <path>', 'Path to theme config')
|
|
40
|
+
.option('--strict', 'Enable strict validation')
|
|
41
|
+
.action(async options => {
|
|
42
|
+
console.log(chalk.cyan('Validating theme configuration...'));
|
|
43
|
+
|
|
44
|
+
// In a real implementation this would load the theme object
|
|
45
|
+
// For now we'll do basic file checks if a file is provided
|
|
46
|
+
|
|
47
|
+
if (options.config) {
|
|
48
|
+
const configPath = path.resolve(process.cwd(), options.config);
|
|
49
|
+
if (!fs.existsSync(configPath)) {
|
|
50
|
+
console.error(chalk.red(`❌ Config file not found: ${options.config}`));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Attempt to validate structure if it's JSON
|
|
55
|
+
if (configPath.endsWith('.json')) {
|
|
56
|
+
try {
|
|
57
|
+
const content = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
58
|
+
const validator = new ThemeValidator();
|
|
59
|
+
// Mocking validation for now as we don't have a full loader
|
|
60
|
+
console.log(chalk.green('✓ JSON structure is valid'));
|
|
61
|
+
} catch (e) {
|
|
62
|
+
console.error(chalk.red(`❌ Invalid JSON: ${(e as Error).message}`));
|
|
63
|
+
process.exit(1);
|
|
77
64
|
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
78
67
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
// Output success for now to verify connectivity
|
|
69
|
+
console.log(chalk.green('✓ Validation completed'));
|
|
70
|
+
});
|
|
82
71
|
|
|
83
72
|
// List Command
|
|
84
73
|
program
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
74
|
+
.command('list')
|
|
75
|
+
.description('List available themes')
|
|
76
|
+
.action(async () => {
|
|
77
|
+
const themesDir = getThemesDir();
|
|
78
|
+
|
|
79
|
+
if (!fs.existsSync(themesDir)) {
|
|
80
|
+
console.log(chalk.yellow(`No themes directory found at ${themesDir}`));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
94
83
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
84
|
+
const themes = fs.readdirSync(themesDir).filter(f => {
|
|
85
|
+
const stat = fs.statSync(path.join(themesDir, f));
|
|
86
|
+
return stat.isDirectory() || f.endsWith('.json') || f.endsWith('.ts');
|
|
87
|
+
});
|
|
99
88
|
|
|
100
|
-
|
|
89
|
+
console.log(chalk.bold.cyan(`\nFound ${themes.length} themes in ${themesDir}:\n`));
|
|
101
90
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
});
|
|
105
|
-
console.log('');
|
|
91
|
+
themes.forEach(theme => {
|
|
92
|
+
console.log(` • ${theme}`);
|
|
106
93
|
});
|
|
94
|
+
console.log('');
|
|
95
|
+
});
|
|
107
96
|
|
|
108
97
|
// Inspect Command
|
|
109
98
|
program
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
99
|
+
.command('inspect <theme>')
|
|
100
|
+
.description('Inspect specific theme')
|
|
101
|
+
.option('--json', 'Output as JSON')
|
|
102
|
+
.action(async (themeName, options) => {
|
|
103
|
+
const themesDir = getThemesDir();
|
|
104
|
+
const themePath = path.join(themesDir, themeName);
|
|
105
|
+
|
|
106
|
+
if (
|
|
107
|
+
!fs.existsSync(themePath) &&
|
|
108
|
+
!fs.existsSync(`${themePath}.json`) &&
|
|
109
|
+
!fs.existsSync(`${themePath}.ts`)
|
|
110
|
+
) {
|
|
111
|
+
console.error(chalk.red(`❌ Theme not found: ${themeName}`));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
121
114
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
115
|
+
if (options.json) {
|
|
116
|
+
console.log(JSON.stringify({ name: themeName, path: themePath }, null, 2));
|
|
117
|
+
} else {
|
|
118
|
+
console.log(
|
|
119
|
+
boxen(chalk.bold(themeName) + '\n' + chalk.gray(`Path: ${themePath}`), {
|
|
120
|
+
padding: 1,
|
|
121
|
+
borderStyle: 'round',
|
|
122
|
+
})
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
132
126
|
|
|
133
127
|
// Compare Command (Stub)
|
|
134
128
|
program
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
129
|
+
.command('compare <theme1> <theme2>')
|
|
130
|
+
.description('Compare two themes')
|
|
131
|
+
.action(async (theme1, theme2) => {
|
|
132
|
+
console.log(chalk.cyan(`Comparing ${theme1} with ${theme2}...`));
|
|
133
|
+
// Stub
|
|
134
|
+
console.log(chalk.yellow('Comparison feature not yet fully implemented.'));
|
|
135
|
+
});
|
|
142
136
|
|
|
143
137
|
// Export Command (Stub)
|
|
144
138
|
program
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
139
|
+
.command('export <theme>')
|
|
140
|
+
.description('Export theme')
|
|
141
|
+
.option('-o, --output <path>', 'Output path')
|
|
142
|
+
.action(async (theme, options) => {
|
|
143
|
+
console.log(chalk.cyan(`Exporting ${theme}...`));
|
|
144
|
+
if (options.output) {
|
|
145
|
+
console.log(chalk.green(`✓ Exported to ${options.output}`));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
154
148
|
|
|
155
149
|
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' ? (
|