@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.
Files changed (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. 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
- validate() {
21
- return { valid: true, errors: [], warnings: [], a11yIssues: [] };
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
- const possiblePaths = [
35
- path.join(process.cwd(), 'themes'),
36
- path.join(process.cwd(), 'src', 'themes'),
37
- path.join(process.cwd(), 'src', 'styles', 'themes')
38
- ];
39
-
40
- for (const p of possiblePaths) {
41
- if (fs.existsSync(p)) return p;
42
- }
43
- return path.join(process.cwd(), 'themes');
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
- .command('validate')
49
- .description('Validate theme configuration')
50
- .option('-c, --config <path>', 'Path to theme config')
51
- .option('--strict', 'Enable strict validation')
52
- .action(async (options) => {
53
- console.log(chalk.cyan('Validating theme configuration...'));
54
-
55
- // In a real implementation this would load the theme object
56
- // For now we'll do basic file checks if a file is provided
57
-
58
- if (options.config) {
59
- const configPath = path.resolve(process.cwd(), options.config);
60
- if (!fs.existsSync(configPath)) {
61
- console.error(chalk.red(`❌ Config file not found: ${options.config}`));
62
- process.exit(1);
63
- }
64
-
65
- // Attempt to validate structure if it's JSON
66
- if (configPath.endsWith('.json')) {
67
- try {
68
- const content = JSON.parse(fs.readFileSync(configPath, 'utf8'));
69
- const validator = new ThemeValidator();
70
- // Mocking validation for now as we don't have a full loader
71
- console.log(chalk.green('✓ JSON structure is valid'));
72
- } catch (e) {
73
- console.error(chalk.red(`❌ Invalid JSON: ${(e as Error).message}`));
74
- process.exit(1);
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
- // Output success for now to verify connectivity
80
- console.log(chalk.green('✓ Validation completed'));
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
- .command('list')
86
- .description('List available themes')
87
- .action(async () => {
88
- const themesDir = getThemesDir();
89
-
90
- if (!fs.existsSync(themesDir)) {
91
- console.log(chalk.yellow(`No themes directory found at ${themesDir}`));
92
- return;
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
- const themes = fs.readdirSync(themesDir).filter(f => {
96
- const stat = fs.statSync(path.join(themesDir, f));
97
- return stat.isDirectory() || f.endsWith('.json') || f.endsWith('.ts');
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
- console.log(chalk.bold.cyan(`\nFound ${themes.length} themes in ${themesDir}:\n`));
97
+ console.log(chalk.bold.cyan(`\nFound ${themes.length} themes in ${themesDir}:\n`));
101
98
 
102
- themes.forEach(theme => {
103
- console.log(` • ${theme}`);
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
- .command('inspect <theme>')
111
- .description('Inspect specific theme')
112
- .option('--json', 'Output as JSON')
113
- .action(async (themeName, options) => {
114
- const themesDir = getThemesDir();
115
- const themePath = path.join(themesDir, themeName);
116
-
117
- if (!fs.existsSync(themePath) && !fs.existsSync(`${themePath}.json`) && !fs.existsSync(`${themePath}.ts`)) {
118
- console.error(chalk.red(`❌ Theme not found: ${themeName}`));
119
- process.exit(1);
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
- if (options.json) {
123
- console.log(JSON.stringify({ name: themeName, path: themePath }, null, 2));
124
- } else {
125
- console.log(boxen(
126
- chalk.bold(themeName) + '\n' +
127
- chalk.gray(`Path: ${themePath}`),
128
- { padding: 1, borderStyle: 'round' }
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
- .command('compare <theme1> <theme2>')
136
- .description('Compare two themes')
137
- .action(async (theme1, theme2) => {
138
- console.log(chalk.cyan(`Comparing ${theme1} with ${theme2}...`));
139
- // Stub
140
- console.log(chalk.yellow('Comparison feature not yet fully implemented.'));
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
- .command('export <theme>')
146
- .description('Export theme')
147
- .option('-o, --output <path>', 'Output path')
148
- .action(async (theme, options) => {
149
- console.log(chalk.cyan(`Exporting ${theme}...`));
150
- if (options.output) {
151
- console.log(chalk.green(`✓ Exported to ${options.output}`));
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 (typeof valueA === 'object' && typeof valueB === 'object' && !Array.isArray(valueA) && !Array.isArray(valueB)) {
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(d =>
142
- d.path.toLowerCase().includes(queryLower) ||
143
- String(d.valueA).toLowerCase().includes(queryLower) ||
144
- String(d.valueB).toLowerCase().includes(queryLower)
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': return '#4caf50';
168
- case 'removed': return '#f44336';
169
- case 'changed': return '#ff9800';
170
- default: return '#666';
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': return 'rgba(76, 175, 80, 0.1)';
177
- case 'removed': return 'rgba(244, 67, 54, 0.1)';
178
- case 'changed': return 'rgba(255, 152, 0, 0.1)';
179
- default: return 'transparent';
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">{part}</mark>
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={(e) => setSearchQuery(e.target.value)}
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={(e) => setFilterType(e.target.value as any)}
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={(e) => setFilterCategory(e.target.value)}
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}>{cat}</option>
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 className={`value-column value-${diff.type === 'removed' ? 'empty' : 'filled'}`}>
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 = ({ title, description, children }: {
7
- title?: string;
8
- description?: string;
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
+ };