@shohojdhara/atomix 0.3.14 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +44 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +50 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +21044 -2618
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +77 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +44 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +50 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +152 -78
- package/dist/index.esm.js +346 -340
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +359 -353
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +358 -850
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +6 -5
- package/src/components/AtomixGlass/shader-utils.ts +133 -52
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +195 -0
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +122 -352
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +30 -11
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +454 -1126
- package/src/components/Button/Button.test.tsx +123 -0
- package/src/components/Button/Button.tsx +88 -60
- package/src/components/Button/ButtonGroup.stories.tsx +376 -215
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +316 -568
- package/src/components/Card/Card.stories.tsx +292 -81
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +153 -16
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +114 -7
- package/src/components/DataTable/DataTable.stories.tsx +349 -144
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +396 -327
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +122 -78
- package/src/components/Form/Form.stories.tsx +110 -19
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +146 -17
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +372 -38
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +183 -43
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +354 -97
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +160 -7
- package/src/components/River/River.stories.tsx +3 -2
- package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +104 -8
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +173 -42
- package/src/components/Tabs/Tabs.stories.tsx +141 -12
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +137 -36
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +241 -150
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +219 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +126 -97
- package/src/lib/composables/useChartExport.ts +3 -8
- package/src/lib/composables/useDataTable.ts +72 -43
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/components.ts +9 -32
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +107 -105
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +19 -0
- package/src/lib/utils/dataTableExport.ts +2 -15
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +1 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +4 -4
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +38 -12
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +25 -17
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +2 -0
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 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';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Atomix Theme DevTools CLI
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* Internal CLI for theme validation and management.
|
|
7
7
|
* This is called by the main atomix-cli.js via theme-bridge.js.
|
|
8
8
|
*/
|
|
@@ -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' ? (
|