@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
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Testing Utilities and Mocks
3
+ * Common testing helpers for generated components
4
+ */
5
+
6
+ import { fireEvent } from '@testing-library/react';
7
+
8
+ /**
9
+ * Create mock event object for testing
10
+ * @param {string} type - Event type
11
+ * @param {Object} payload - Additional event properties
12
+ * @returns {Object} Mock event object
13
+ */
14
+ export const createMockEvent = (type, payload = {}) => ({
15
+ type,
16
+ preventDefault: vi.fn(),
17
+ stopPropagation: vi.fn(),
18
+ target: {},
19
+ ...payload
20
+ });
21
+
22
+ /**
23
+ * Mock IntersectionObserver for testing intersection-based components
24
+ * @returns {Object} Mock IntersectionObserver instance
25
+ */
26
+ export const mockIntersectionObserver = () => {
27
+ const mockInstance = {
28
+ observe: vi.fn(),
29
+ unobserve: vi.fn(),
30
+ disconnect: vi.fn()
31
+ };
32
+
33
+ global.IntersectionObserver = vi.fn(() => mockInstance);
34
+ return mockInstance;
35
+ };
36
+
37
+ /**
38
+ * Mock ResizeObserver for testing resize-based components
39
+ * @returns {Object} Mock ResizeObserver instance
40
+ */
41
+ export const mockResizeObserver = () => {
42
+ const mockInstance = {
43
+ observe: vi.fn(),
44
+ unobserve: vi.fn(),
45
+ disconnect: vi.fn()
46
+ };
47
+
48
+ global.ResizeObserver = vi.fn(() => mockInstance);
49
+ return mockInstance;
50
+ };
51
+
52
+ /**
53
+ * Mock window.matchMedia for testing responsive components
54
+ * @param {boolean} matches - Whether media query should match
55
+ * @returns {Function} Mock matchMedia function
56
+ */
57
+ export const mockMatchMedia = (matches = true) => {
58
+ Object.defineProperty(window, 'matchMedia', {
59
+ writable: true,
60
+ value: vi.fn().mockImplementation(query => ({
61
+ matches,
62
+ media: query,
63
+ onchange: null,
64
+ addListener: vi.fn(),
65
+ removeListener: vi.fn(),
66
+ addEventListener: vi.fn(),
67
+ removeEventListener: vi.fn(),
68
+ dispatchEvent: vi.fn(),
69
+ })),
70
+ });
71
+ };
72
+
73
+ /**
74
+ * Mock scrollIntoView for testing scroll behavior
75
+ */
76
+ export const mockScrollIntoView = () => {
77
+ Element.prototype.scrollIntoView = vi.fn();
78
+ };
79
+
80
+ /**
81
+ * Create mock ref object
82
+ * @param {any} current - Current ref value
83
+ * @returns {Object} Mock ref object
84
+ */
85
+ export const createMockRef = (current = null) => ({
86
+ current
87
+ });
88
+
89
+ /**
90
+ * Mock console methods for testing
91
+ * @param {string[]} methods - Console methods to mock
92
+ * @returns {Object} Mock implementations
93
+ */
94
+ export const mockConsole = (methods = ['log', 'warn', 'error']) => {
95
+ const mocks = {};
96
+
97
+ methods.forEach(method => {
98
+ mocks[method] = vi.spyOn(console, method).mockImplementation(() => {});
99
+ });
100
+
101
+ return mocks;
102
+ };
103
+
104
+ /**
105
+ * Wait for component to be stable
106
+ * @param {number} ms - Milliseconds to wait
107
+ * @returns {Promise} Resolves after delay
108
+ */
109
+ export const waitForStable = (ms = 100) => {
110
+ return new Promise(resolve => {
111
+ setTimeout(resolve, ms);
112
+ });
113
+ };
114
+
115
+ /**
116
+ * Create mock media query list
117
+ * @param {boolean} matches - Whether query matches
118
+ * @param {string} media - Media query string
119
+ * @returns {Object} Mock MediaQueryList
120
+ */
121
+ export const createMockMediaQueryList = (matches = false, media = '(max-width: 768px)') => ({
122
+ matches,
123
+ media,
124
+ onchange: null,
125
+ addListener: vi.fn(),
126
+ removeListener: vi.fn(),
127
+ addEventListener: vi.fn(),
128
+ removeEventListener: vi.fn(),
129
+ dispatchEvent: vi.fn(),
130
+ });
131
+
132
+ /**
133
+ * Mock CSS custom properties
134
+ * @param {Object} properties - CSS custom properties to mock
135
+ */
136
+ export const mockCSSCustomProperties = (properties = {}) => {
137
+ const originalGetPropertyValue = window.getComputedStyle;
138
+
139
+ window.getComputedStyle = vi.fn().mockImplementation((element) => ({
140
+ ...originalGetPropertyValue(element),
141
+ getPropertyValue: (property) => {
142
+ return properties[property] || '';
143
+ }
144
+ }));
145
+ };
146
+
147
+ /**
148
+ * Mock fetch API
149
+ * @param {Object} response - Mock response object
150
+ * @returns {Function} Mock fetch function
151
+ */
152
+ export const mockFetch = (response = {}) => {
153
+ const mockResponse = {
154
+ ok: true,
155
+ status: 200,
156
+ json: vi.fn().mockResolvedValue(response),
157
+ text: vi.fn().mockResolvedValue(JSON.stringify(response)),
158
+ ...response
159
+ };
160
+
161
+ global.fetch = vi.fn().mockResolvedValue(mockResponse);
162
+ return global.fetch;
163
+ };
164
+
165
+ /**
166
+ * Create mock context provider
167
+ * @param {React.Context} Context - React context
168
+ * @param {any} value - Context value
169
+ * @returns {Function} Provider component
170
+ */
171
+ export const createMockContextProvider = (Context, value) => {
172
+ return ({ children }) => (
173
+ <Context.Provider value={value}>
174
+ {children}
175
+ </Context.Provider>
176
+ );
177
+ };
178
+
179
+ /**
180
+ * Test component rendering with different props
181
+ * @param {React.Component} Component - Component to test
182
+ * @param {Object} props - Props to test
183
+ * @param {Function} testFn - Test function to run
184
+ */
185
+ export const testComponentWithProps = (Component, props, testFn) => {
186
+ Object.entries(props).forEach(([propName, propValue]) => {
187
+ it(`renders correctly with ${propName}=${JSON.stringify(propValue)}`, () => {
188
+ testFn(Component, { [propName]: propValue });
189
+ });
190
+ });
191
+ };
192
+
193
+ /**
194
+ * Test accessibility with axe-core
195
+ * @param {HTMLElement} container - Container element to test
196
+ * @param {Object} options - Axe configuration options
197
+ * @returns {Promise} Axe results
198
+ */
199
+ export const testAccessibility = async (container, options = {}) => {
200
+ const axe = (await import('jest-axe')).axe;
201
+ return axe(container, options);
202
+ };
203
+
204
+ /**
205
+ * Test keyboard navigation
206
+ * @param {HTMLElement} element - Element to test
207
+ * @param {string[]} keys - Keys to simulate
208
+ */
209
+ export const testKeyboardNavigation = (element, keys = ['Tab', 'Enter', 'Escape']) => {
210
+ keys.forEach(key => {
211
+ fireEvent.keyDown(element, { key });
212
+ fireEvent.keyUp(element, { key });
213
+ });
214
+ };
215
+
216
+ /**
217
+ * Test focus management
218
+ * @param {HTMLElement} element - Element to test
219
+ * @param {boolean} shouldBeFocusable - Whether element should be focusable
220
+ */
221
+ export const testFocusManagement = (element, shouldBeFocusable = true) => {
222
+ if (shouldBeFocusable) {
223
+ element.focus();
224
+ expect(element).toHaveFocus();
225
+ } else {
226
+ expect(() => element.focus()).not.toThrow();
227
+ }
228
+ };
229
+
230
+ /**
231
+ * Test responsive behavior
232
+ * @param {Function} setup - Setup function
233
+ * @param {Object[]} breakpoints - Breakpoint configurations
234
+ */
235
+ export const testResponsiveBehavior = (setup, breakpoints = [
236
+ { width: 320, name: 'mobile' },
237
+ { width: 768, name: 'tablet' },
238
+ { width: 1024, name: 'desktop' }
239
+ ]) => {
240
+ breakpoints.forEach(({ width, name }) => {
241
+ describe(`${name} (${width}px)`, () => {
242
+ beforeEach(() => {
243
+ // Mock viewport size
244
+ Object.defineProperty(window, 'innerWidth', {
245
+ writable: true,
246
+ configurable: true,
247
+ value: width
248
+ });
249
+
250
+ // Trigger resize event
251
+ window.dispatchEvent(new Event('resize'));
252
+ });
253
+
254
+ setup(width, name);
255
+ });
256
+ });
257
+ };
258
+
259
+ // Export all utilities
260
+ export default {
261
+ createMockEvent,
262
+ mockIntersectionObserver,
263
+ mockResizeObserver,
264
+ mockMatchMedia,
265
+ mockScrollIntoView,
266
+ createMockRef,
267
+ mockConsole,
268
+ waitForStable,
269
+ createMockMediaQueryList,
270
+ mockCSSCustomProperties,
271
+ mockFetch,
272
+ createMockContextProvider,
273
+ testComponentWithProps,
274
+ testAccessibility,
275
+ testKeyboardNavigation,
276
+ testFocusManagement,
277
+ testResponsiveBehavior
278
+ };
@@ -10,118 +10,132 @@ export const typesTemplate = (name) => `// ${name} Component Types
10
10
  // Generated by Atomix CLI
11
11
  // These should be added to src/lib/types/components.ts
12
12
 
13
- import type { BaseComponentProps } from './base';
14
-
15
13
  /**
16
14
  * ${name} component props
17
15
  */
18
- export interface ${name}Props extends BaseComponentProps {
16
+ export interface ${name}Props {
19
17
  /**
20
- * Whether the ${name.toLowerCase()} is open
18
+ * Content to be rendered
21
19
  */
22
- isOpen?: boolean;
20
+ children?: React.ReactNode;
23
21
 
24
22
  /**
25
- * Whether the ${name.toLowerCase()} is open by default (uncontrolled mode)
23
+ * Additional CSS classes
26
24
  */
27
- defaultIsOpen?: boolean;
25
+ className?: string;
28
26
 
29
27
  /**
30
- * Callback fired when ${name.toLowerCase()} is toggled
28
+ * Component variant
31
29
  */
32
- onToggle?: (isOpen: boolean) => void;
30
+ variant?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info';
33
31
 
34
32
  /**
35
- * Content to be rendered inside the ${name.toLowerCase()}
33
+ * Component size
36
34
  */
37
- children?: React.ReactNode;
35
+ size?: 'sm' | 'md' | 'lg';
38
36
 
39
37
  /**
40
- * Size variant
38
+ * Disabled state
41
39
  */
42
- size?: 'sm' | 'md' | 'lg';
43
-
40
+ disabled?: boolean;
41
+
44
42
  /**
45
- * Visual variant
43
+ * Glass effect options
46
44
  */
47
- variant?: 'primary' | 'secondary';
48
-
45
+ glass?: boolean | AtomixGlassProps;
46
+
49
47
  /**
50
- * Whether the ${name.toLowerCase()} is disabled
48
+ * Click handler
51
49
  */
52
- disabled?: boolean;
53
- }
50
+ onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
54
51
 
55
- /**
56
- * ${name} component state type
57
- */
58
- export type ${name}State = {
59
- isOpen: boolean;
60
- isControlled: boolean;
61
- };
52
+ /**
53
+ * Hover handler
54
+ */
55
+ onHover?: (event: React.MouseEvent<HTMLDivElement>) => void;
62
56
 
63
- /**
64
- * ${name} context interface
65
- */
66
- export interface ${name}Context {
67
- component?: ${name}Props;
68
- state: ${name}State;
69
- actions: {
70
- toggle: () => void;
71
- open: () => void;
72
- close: () => void;
73
- setIsOpen: (isOpen: boolean) => void;
74
- };
75
- }
57
+ /**
58
+ * Focus handler
59
+ */
60
+ onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
61
+
62
+ /**
63
+ * Blur handler
64
+ */
65
+ onBlur?: (event: React.FocusEvent<HTMLDivElement>) => void;
66
+
67
+ /**
68
+ * ARIA label
69
+ */
70
+ 'aria-label'?: string;
71
+
72
+ /**
73
+ * ARIA described by
74
+ */
75
+ 'aria-describedby'?: string;
76
76
 
77
- // Legacy types for backward compatibility
78
- export type ${name}Ref = HTMLDivElement;
77
+ /**
78
+ * Tab index
79
+ */
80
+ tabIndex?: number;
81
+
82
+ /**
83
+ * Inline styles
84
+ */
85
+ style?: React.CSSProperties;
86
+ }
79
87
  `;
80
88
 
81
89
  /**
82
90
  * Constants template for component-specific constants
83
91
  */
84
- export const constantsTemplate = (name) => `// ${name} Component Constants
92
+ export const constantsTemplate = (name) => {
93
+ const componentPrefix = name.toLowerCase().replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '');
94
+
95
+ return `// ${name} Component Constants
85
96
  // Generated by Atomix CLI
86
97
  // These should be added to src/lib/constants/components.ts
87
98
 
88
99
  export const ${name.toUpperCase()} = {
100
+ BASE_CLASS: 'c-${componentPrefix}',
89
101
  SELECTORS: {
90
- ${name.toUpperCase()}: '.c-${name.toLowerCase()}',
91
- HEADER: '.c-${name.toLowerCase()}__header',
92
- PANEL: '.c-${name.toLowerCase()}__panel',
93
- CONTENT: '.c-${name.toLowerCase()}-content',
102
+ ${name.toUpperCase()}: '.c-${componentPrefix}',
103
+ // Add more selectors as needed for complex components
94
104
  },
95
105
  CLASSES: {
106
+ BASE: 'c-${componentPrefix}',
96
107
  IS_OPEN: 'is-open',
97
108
  IS_DISABLED: 'is-disabled',
98
- IS_ANIMATED: 'is-animated',
109
+ IS_LOADING: 'is-loading',
110
+ // Add more classes as needed
99
111
  },
100
112
  DATA_ATTRIBUTES: {
101
- COMPONENT: 'data-${name.toLowerCase()}',
113
+ COMPONENT: 'data-${componentPrefix}',
102
114
  STATE: 'data-state',
103
115
  DISABLED: 'data-disabled',
116
+ // Add more data attributes as needed
117
+ },
118
+ CSS_VARS: {
119
+ // Add CSS custom properties as needed
104
120
  },
105
121
  DEFAULT_PROPS: {
106
- // Add default props specific to ${name}
122
+ variant: 'primary',
123
+ size: 'md',
124
+ disabled: false,
107
125
  },
108
126
  ANIMATIONS: {
109
127
  DURATION: '200ms',
110
128
  EASING: 'cubic-bezier(0.4, 0, 0.2, 1)',
111
129
  },
112
130
  } as const;
113
-
114
- // Type exports for ${name} component
115
- export type ${name}State = 'open' | 'closed';
116
- export type ${name}Size = 'sm' | 'md' | 'lg';
117
- export type ${name}Variant = 'primary' | 'secondary';
118
131
  `;
132
+ };
119
133
 
120
134
  /**
121
135
  * Index template for component exports
122
136
  */
123
137
  export const indexTemplate = (name) => `export { default as ${name} } from './${name}';
124
- export type { ${name}Props } from '../../lib/types/components';`;
138
+ export type { ${name}Props } from './${name}';`;
125
139
 
126
140
  /**
127
141
  * TypeScript templates object
@@ -1,7 +1,13 @@
1
1
  /**
2
2
  * Theme CLI Bridge
3
- *
4
- * Bridges the TypeScript theme devtools CLI with the main JavaScript CLI
3
+ *
4
+ * Bridges the TypeScript theme devtools CLI (src/lib/theme/devtools/CLI.ts) with the main JavaScript CLI.
5
+ *
6
+ * @dependency ts-node
7
+ * Theme subcommands (atomix theme validate|list|inspect|compare|export|create) run the TypeScript
8
+ * theme CLI via ts-node. Ensure ts-node is installed in the project when using these commands:
9
+ * npm install --save-dev ts-node
10
+ * If ts-node is missing, theme subcommands will fail; run `atomix doctor` to check availability.
5
11
  */
6
12
 
7
13
  import { spawn } from 'child_process';