@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.
Files changed (343) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +44 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +50 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +21044 -2618
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +77 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +44 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +50 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +152 -78
  53. package/dist/index.esm.js +346 -340
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +359 -353
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/dist/layout.js.map +1 -1
  60. package/dist/theme.d.ts +9 -9
  61. package/dist/theme.js.map +1 -1
  62. package/package.json +23 -8
  63. package/scripts/atomix-cli.js +170 -73
  64. package/scripts/cli/__tests__/README.md +81 -0
  65. package/scripts/cli/__tests__/basic.test.js +115 -0
  66. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  67. package/scripts/cli/__tests__/integration.test.js +327 -0
  68. package/scripts/cli/__tests__/test-setup.js +133 -0
  69. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  70. package/scripts/cli/__tests__/utils.test.js +161 -0
  71. package/scripts/cli/component-generator.js +253 -299
  72. package/scripts/cli/dependency-checker.js +355 -0
  73. package/scripts/cli/interactive-init.js +46 -5
  74. package/scripts/cli/template-manager.js +0 -2
  75. package/scripts/cli/templates/common-templates.js +636 -0
  76. package/scripts/cli/templates/composable-templates.js +148 -126
  77. package/scripts/cli/templates/index.js +23 -16
  78. package/scripts/cli/templates/project-templates.js +151 -23
  79. package/scripts/cli/templates/react-templates.js +280 -210
  80. package/scripts/cli/templates/scss-templates.js +90 -91
  81. package/scripts/cli/templates/testing-templates.js +206 -27
  82. package/scripts/cli/templates/testing-utils.js +278 -0
  83. package/scripts/cli/templates/types-templates.js +70 -56
  84. package/scripts/cli/theme-bridge.js +8 -2
  85. package/scripts/cli/token-manager.js +318 -206
  86. package/scripts/cli/utils.js +0 -1
  87. package/src/components/Accordion/Accordion.stories.tsx +358 -850
  88. package/src/components/Accordion/Accordion.test.tsx +70 -50
  89. package/src/components/Accordion/Accordion.tsx +99 -94
  90. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  91. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  92. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  93. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  94. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  95. package/src/components/AtomixGlass/glass-utils.ts +6 -5
  96. package/src/components/AtomixGlass/shader-utils.ts +133 -52
  97. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  98. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  99. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  100. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  101. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  102. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
  103. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
  104. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  105. package/src/components/Avatar/Avatar.stories.tsx +195 -0
  106. package/src/components/Avatar/Avatar.tsx +58 -56
  107. package/src/components/Badge/Badge.stories.tsx +122 -352
  108. package/src/components/Badge/Badge.test.tsx +41 -41
  109. package/src/components/Badge/Badge.tsx +64 -62
  110. package/src/components/Block/Block.stories.tsx +30 -11
  111. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
  112. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  113. package/src/components/Button/Button.stories.tsx +454 -1126
  114. package/src/components/Button/Button.test.tsx +123 -0
  115. package/src/components/Button/Button.tsx +88 -60
  116. package/src/components/Button/ButtonGroup.stories.tsx +376 -215
  117. package/src/components/Button/ButtonGroup.tsx +4 -15
  118. package/src/components/Callout/Callout.stories.tsx +316 -568
  119. package/src/components/Card/Card.stories.tsx +292 -81
  120. package/src/components/Card/Card.tsx +30 -14
  121. package/src/components/Chart/AreaChart.tsx +1 -1
  122. package/src/components/Chart/CandlestickChart.tsx +23 -16
  123. package/src/components/Chart/Chart.stories.tsx +153 -16
  124. package/src/components/Chart/Chart.tsx +40 -44
  125. package/src/components/Chart/ChartRenderer.tsx +39 -12
  126. package/src/components/Chart/ChartToolbar.tsx +21 -5
  127. package/src/components/Chart/DonutChart.tsx +1 -1
  128. package/src/components/Chart/FunnelChart.tsx +4 -1
  129. package/src/components/Chart/GaugeChart.tsx +3 -1
  130. package/src/components/Chart/HeatmapChart.tsx +50 -37
  131. package/src/components/Chart/LineChart.tsx +3 -2
  132. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  133. package/src/components/Chart/RadarChart.tsx +19 -17
  134. package/src/components/Chart/ScatterChart.tsx +29 -21
  135. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
  136. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  137. package/src/components/Countdown/Countdown.stories.tsx +114 -7
  138. package/src/components/DataTable/DataTable.stories.tsx +349 -144
  139. package/src/components/DataTable/DataTable.test.tsx +26 -148
  140. package/src/components/DataTable/DataTable.tsx +485 -456
  141. package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
  142. package/src/components/DatePicker/DatePicker.tsx +31 -26
  143. package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
  144. package/src/components/Dropdown/Dropdown.tsx +313 -299
  145. package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
  146. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  147. package/src/components/Footer/Footer.stories.tsx +396 -327
  148. package/src/components/Footer/Footer.tsx +130 -128
  149. package/src/components/Footer/FooterLink.tsx +2 -2
  150. package/src/components/Form/Checkbox.stories.tsx +140 -6
  151. package/src/components/Form/Checkbox.test.tsx +63 -0
  152. package/src/components/Form/Checkbox.tsx +122 -78
  153. package/src/components/Form/Form.stories.tsx +110 -19
  154. package/src/components/Form/FormGroup.stories.tsx +127 -4
  155. package/src/components/Form/Input.stories.tsx +22 -39
  156. package/src/components/Form/Input.test.tsx +38 -44
  157. package/src/components/Form/Radio.stories.tsx +146 -17
  158. package/src/components/Form/Radio.tsx +68 -66
  159. package/src/components/Form/Select.stories.tsx +140 -8
  160. package/src/components/Form/Select.tsx +184 -182
  161. package/src/components/Form/Textarea.stories.tsx +149 -6
  162. package/src/components/Form/Textarea.test.tsx +27 -32
  163. package/src/components/Hero/Hero.stories.tsx +372 -38
  164. package/src/components/Hero/Hero.tsx +201 -55
  165. package/src/components/Icon/index.ts +7 -1
  166. package/src/components/List/List.stories.tsx +141 -3
  167. package/src/components/List/List.tsx +19 -23
  168. package/src/components/Modal/Modal.stories.tsx +183 -43
  169. package/src/components/Modal/Modal.tsx +130 -127
  170. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  171. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  172. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  173. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  174. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  175. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  176. package/src/components/Pagination/Pagination.tsx +199 -202
  177. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  178. package/src/components/Popover/Popover.stories.tsx +354 -97
  179. package/src/components/Popover/Popover.tsx +41 -37
  180. package/src/components/Progress/Progress.stories.tsx +160 -7
  181. package/src/components/River/River.stories.tsx +3 -2
  182. package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
  183. package/src/components/Slider/Slider.stories.tsx +12 -4
  184. package/src/components/Spinner/Spinner.stories.tsx +104 -8
  185. package/src/components/Spinner/Spinner.test.tsx +23 -23
  186. package/src/components/Spinner/Spinner.tsx +43 -46
  187. package/src/components/Steps/Steps.stories.tsx +173 -42
  188. package/src/components/Tabs/Tabs.stories.tsx +141 -12
  189. package/src/components/Tabs/Tabs.tsx +74 -72
  190. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  191. package/src/components/Todo/Todo.stories.tsx +198 -9
  192. package/src/components/Toggle/Toggle.stories.tsx +137 -36
  193. package/src/components/Toggle/Toggle.test.tsx +65 -70
  194. package/src/components/Toggle/Toggle.tsx +4 -1
  195. package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
  196. package/src/components/Tooltip/Tooltip.tsx +104 -106
  197. package/src/components/Upload/Upload.stories.tsx +241 -150
  198. package/src/components/Upload/Upload.tsx +287 -283
  199. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  200. package/src/components/index.ts +13 -2
  201. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  202. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  203. package/src/lib/README.md +2 -2
  204. package/src/lib/__tests__/theme-tools.test.ts +219 -0
  205. package/src/lib/composables/index.ts +2 -2
  206. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  207. package/src/lib/composables/useAtomixGlass.ts +126 -97
  208. package/src/lib/composables/useChartExport.ts +3 -8
  209. package/src/lib/composables/useDataTable.ts +72 -43
  210. package/src/lib/composables/useHero.ts +58 -14
  211. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  212. package/src/lib/composables/useInput.ts +10 -8
  213. package/src/lib/composables/useSideMenu.ts +6 -5
  214. package/src/lib/composables/useTooltip.ts +1 -2
  215. package/src/lib/composables/useVideoPlayer.ts +44 -35
  216. package/src/lib/config/index.ts +154 -154
  217. package/src/lib/constants/components.ts +9 -32
  218. package/src/lib/constants/cssVariables.ts +29 -29
  219. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  220. package/src/lib/hooks/index.ts +1 -1
  221. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  222. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  223. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  224. package/src/lib/patterns/index.ts +1 -1
  225. package/src/lib/patterns/slots.tsx +8 -13
  226. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  227. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  228. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  229. package/src/lib/storybook/index.ts +1 -1
  230. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  231. package/src/lib/theme/adapters/index.ts +3 -9
  232. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  233. package/src/lib/theme/config/index.ts +1 -1
  234. package/src/lib/theme/config/types.ts +2 -2
  235. package/src/lib/theme/config/validator.ts +10 -5
  236. package/src/lib/theme/constants/constants.ts +2 -2
  237. package/src/lib/theme/constants/index.ts +1 -2
  238. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  239. package/src/lib/theme/core/composeTheme.ts +32 -26
  240. package/src/lib/theme/core/createTheme.ts +1 -1
  241. package/src/lib/theme/core/createThemeObject.ts +308 -301
  242. package/src/lib/theme/core/index.ts +3 -3
  243. package/src/lib/theme/devtools/CLI.ts +107 -105
  244. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  245. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  246. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  247. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  248. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  249. package/src/lib/theme/devtools/Preview.tsx +150 -106
  250. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  251. package/src/lib/theme/devtools/index.ts +3 -9
  252. package/src/lib/theme/devtools/useHistory.ts +23 -21
  253. package/src/lib/theme/errors/errors.ts +12 -11
  254. package/src/lib/theme/errors/index.ts +2 -7
  255. package/src/lib/theme/generators/generateCSS.ts +9 -13
  256. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  257. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  258. package/src/lib/theme/generators/index.ts +1 -4
  259. package/src/lib/theme/i18n/index.ts +1 -1
  260. package/src/lib/theme/i18n/rtl.ts +13 -13
  261. package/src/lib/theme/index.ts +7 -16
  262. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  263. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  264. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  265. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  266. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  267. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  268. package/src/lib/theme/runtime/index.ts +2 -5
  269. package/src/lib/theme/runtime/useTheme.ts +18 -18
  270. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  271. package/src/lib/theme/test/testTheme.ts +15 -16
  272. package/src/lib/theme/tokens/index.ts +2 -7
  273. package/src/lib/theme/tokens/tokens.ts +25 -24
  274. package/src/lib/theme/types.ts +428 -411
  275. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  276. package/src/lib/theme/utils/componentTheming.ts +18 -18
  277. package/src/lib/theme/utils/domUtils.ts +277 -289
  278. package/src/lib/theme/utils/index.ts +1 -2
  279. package/src/lib/theme/utils/injectCSS.ts +10 -14
  280. package/src/lib/theme/utils/naming.ts +20 -16
  281. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  282. package/src/lib/theme/utils/themeUtils.ts +85 -86
  283. package/src/lib/theme/utils/themeValidation.ts +82 -33
  284. package/src/lib/theme-tools.ts +8 -6
  285. package/src/lib/types/components.ts +172 -71
  286. package/src/lib/types/partProps.ts +1 -1
  287. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  288. package/src/lib/utils/componentUtils.ts +8 -12
  289. package/src/lib/utils/csv.ts +19 -0
  290. package/src/lib/utils/dataTableExport.ts +2 -15
  291. package/src/lib/utils/fontPreloader.ts +10 -19
  292. package/src/lib/utils/icons.ts +4 -1
  293. package/src/lib/utils/index.ts +2 -6
  294. package/src/lib/utils/memoryMonitor.ts +10 -8
  295. package/src/lib/utils/themeNaming.ts +2 -2
  296. package/src/styles/01-settings/_index.scss +1 -1
  297. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  298. package/src/styles/01-settings/_settings.colors.scss +11 -11
  299. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  300. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  301. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  302. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  303. package/src/styles/01-settings/_settings.typography.scss +4 -4
  304. package/src/styles/02-tools/_tools.button.scss +51 -21
  305. package/src/styles/02-tools/_tools.utility-api.scss +38 -12
  306. package/src/styles/03-generic/_generic.root.scss +4 -3
  307. package/src/styles/06-components/_components.accordion.scss +56 -14
  308. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  309. package/src/styles/06-components/_components.button.scss +16 -4
  310. package/src/styles/06-components/_components.callout.scss +27 -21
  311. package/src/styles/06-components/_components.card.scss +5 -14
  312. package/src/styles/06-components/_components.chart.scss +22 -19
  313. package/src/styles/06-components/_components.checkbox.scss +25 -17
  314. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  315. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  316. package/src/styles/06-components/_components.footer.scss +1 -1
  317. package/src/styles/06-components/_components.side-menu.scss +5 -5
  318. package/src/styles/06-components/_components.toggle.scss +18 -0
  319. package/src/styles/06-components/_index.scss +1 -1
  320. package/src/styles/06-components/old.chart.styles.scss +0 -2
  321. package/src/styles/99-utilities/_index.scss +2 -0
  322. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  323. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  324. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  325. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  326. package/src/styles/99-utilities/_utilities.scss +2 -0
  327. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  328. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  329. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  330. package/src/styles/99-utilities/_utilities.text.scss +67 -46
  331. package/themes/dark-complementary/README.md +98 -0
  332. package/themes/dark-complementary/index.scss +158 -0
  333. package/themes/default-light/README.md +81 -0
  334. package/themes/default-light/index.scss +154 -0
  335. package/themes/high-contrast/README.md +105 -0
  336. package/themes/high-contrast/index.scss +172 -0
  337. package/themes/test-theme/README.md +38 -0
  338. package/themes/test-theme/index.scss +47 -0
  339. package/scripts/cli/templates-original-backup.js +0 -1655
  340. package/scripts/cli/templates_backup.js +0 -684
  341. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  342. package/src/lib/composables/useButton.ts +0 -93
  343. 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
- 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' ? (