@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,84 +1,81 @@
1
1
  /**
2
- * SCSS Templates
3
- * Templates for styling components with SCSS
2
+ * SCSS Component and Settings Templates
3
+ * Templates for SCSS files generation following ITCSS methodology
4
4
  */
5
5
 
6
6
  /**
7
- * Main SCSS component template
7
+ * SCSS component template
8
8
  */
9
- export const scssTemplate = (name) => `// =============================================================================
10
- // ${name.toUpperCase()}
11
- // =============================================================================
9
+ export const scssComponentTemplate = (name) => `// ${name} Component Styles
10
+ // Generated by Atomix CLI
11
+ // Located in src/styles/06-components/_components.${name.toLowerCase()}.scss
12
12
 
13
- @use '../01-settings/settings.${name.toLowerCase()}' as ${name.toLowerCase()};
13
+ @use '../01-settings/settings.config' as config;
14
14
 
15
15
  .c-${name.toLowerCase()} {
16
- // CSS Custom Properties (from settings)
17
- --#{config.$prefix}${name.toLowerCase()}-width: #{${name.toLowerCase()}.$${name.toLowerCase()}-width};
18
- --#{config.$prefix}${name.toLowerCase()}-padding-x: #{${name.toLowerCase()}.$${name.toLowerCase()}-padding-x};
19
- --#{config.$prefix}${name.toLowerCase()}-padding-y: #{${name.toLowerCase()}.$${name.toLowerCase()}-padding-y};
20
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-bg};
21
- --#{config.$prefix}${name.toLowerCase()}-color: #{${name.toLowerCase()}.$${name.toLowerCase()}-color};
22
- --#{config.$prefix}${name.toLowerCase()}-border: #{${name.toLowerCase()}.$${name.toLowerCase()}-border};
23
- --#{config.$prefix}${name.toLowerCase()}-border-radius: #{${name.toLowerCase()}.$${name.toLowerCase()}-border-radius};
24
- --#{config.$prefix}${name.toLowerCase()}-transition: #{${name.toLowerCase()}.$${name.toLowerCase()}-transition};
25
-
26
- // Base styles
27
- width: var(#{config.$prefix}${name.toLowerCase()}-width);
28
- padding: var(#{config.$prefix}${name.toLowerCase()}-padding-y) var(#{config.$prefix}${name.toLowerCase()}-padding-x);
29
- background-color: var(#{config.$prefix}${name.toLowerCase()}-bg);
30
- color: var(#{config.$prefix}${name.toLowerCase()}-color);
31
- border: var(#{config.$prefix}${name.toLowerCase()}-border);
32
- border-radius: var(#{config.$prefix}${name.toLowerCase()}-border-radius);
33
- transition: var(#{config.$prefix}${name.toLowerCase()}-transition);
16
+ // Using CSS custom properties defined in settings
17
+ --#{config.$prefix}${name.toLowerCase()}-padding: var(--atomix-spacing-4);
18
+ --#{config.$prefix}${name.toLowerCase()}-margin: var(--atomix-spacing-2);
19
+ --#{config.$prefix}${name.toLowerCase()}-border: var(--atomix-border-default);
20
+ --#{config.$prefix}${name.toLowerCase()}-border-radius: var(--atomix-border-radius-md);
21
+ --#{config.$prefix}${name.toLowerCase()}-bg: var(--atomix-bg-surface);
22
+ --#{config.$prefix}${name.toLowerCase()}-color: var(--atomix-text-primary);
23
+ --#{config.$prefix}${name.toLowerCase()}-font-size: var(--atomix-font-size-base);
24
+ --#{config.$prefix}${name.toLowerCase()}-transition: var(--atomix-transition-all);
34
25
 
35
- // Reset and base
36
- box-sizing: border-box;
37
- margin: 0;
38
- font-family: inherit;
39
- font-size: var(#{config.$prefix}${name.toLowerCase()}-font-size);
40
- line-height: var(#{config.$prefix}${name.toLowerCase()}-line-height);
41
- font-weight: var(#{config.$prefix}${name.toLowerCase()}-font-weight);
26
+ // State-specific properties
27
+ --#{config.$prefix}${name.toLowerCase()}-hover-bg: var(--atomix-bg-surface-hover);
28
+ --#{config.$prefix}${name.toLowerCase()}-focus-bg: var(--atomix-bg-surface-focus);
29
+ --#{config.$prefix}${name.toLowerCase()}-disabled-bg: var(--atomix-bg-surface-disabled);
30
+ --#{config.$prefix}${name.toLowerCase()}-disabled-color: var(--atomix-text-disabled);
31
+ --#{config.$prefix}${name.toLowerCase()}-disabled-opacity: var(--atomix-opacity-disabled);
32
+
33
+ padding: var(--#{config.$prefix}${name.toLowerCase()}-padding);
34
+ margin: var(--#{config.$prefix}${name.toLowerCase()}-margin);
35
+ border: var(--#{config.$prefix}${name.toLowerCase()}-border);
36
+ border-radius: var(--#{config.$prefix}${name.toLowerCase()}-border-radius);
37
+ background: var(--#{config.$prefix}${name.toLowerCase()}-bg);
38
+ color: var(--#{config.$prefix}${name.toLowerCase()}-color);
39
+ font-size: var(--#{config.$prefix}${name.toLowerCase()}-font-size);
40
+ transition: var(--#{config.$prefix}${name.toLowerCase()}-transition);
42
41
 
43
42
  // Size variants
44
43
  &--sm {
45
- --#{config.$prefix}${name.toLowerCase()}-padding-x: #{${name.toLowerCase()}.$${name.toLowerCase()}-sm-padding-x};
46
- --#{config.$prefix}${name.toLowerCase()}-padding-y: #{${name.toLowerCase()}.$${name.toLowerCase()}-sm-padding-y};
47
- --#{config.$prefix}${name.toLowerCase()}-font-size: #{${name.toLowerCase()}.$${name.toLowerCase()}-sm-font-size};
44
+ --#{config.$prefix}${name.toLowerCase()}-padding: var(--atomix-spacing-2);
45
+ --#{config.$prefix}${name.toLowerCase()}-font-size: var(--atomix-font-size-sm);
48
46
  }
49
47
 
50
48
  &--lg {
51
- --#{config.$prefix}${name.toLowerCase()}-padding-x: #{${name.toLowerCase()}.$${name.toLowerCase()}-lg-padding-x};
52
- --#{config.$prefix}${name.toLowerCase()}-padding-y: #{${name.toLowerCase()}.$${name.toLowerCase()}-lg-padding-y};
53
- --#{config.$prefix}${name.toLowerCase()}-font-size: #{${name.toLowerCase()}.$${name.toLowerCase()}-lg-font-size};
49
+ --#{config.$prefix}${name.toLowerCase()}-padding: var(--atomix-spacing-6);
50
+ --#{config.$prefix}${name.toLowerCase()}-font-size: var(--atomix-font-size-lg);
54
51
  }
55
52
 
56
53
  // Interactive states
57
54
  &:hover {
58
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-hover-bg};
55
+ background: var(--#{config.$prefix}${name.toLowerCase()}-hover-bg);
59
56
  cursor: pointer;
60
57
  }
61
58
 
62
59
  &:focus {
63
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-focus-bg};
60
+ background: var(--#{config.$prefix}${name.toLowerCase()}-focus-bg);
64
61
  outline: 2px solid var(--atomix-focus-color);
65
62
  outline-offset: 2px;
66
63
  }
67
64
 
68
65
  // Disabled state
69
66
  &.is-disabled {
70
- --#{config.$prefix}${name.toLowerCase()}-bg: #{${name.toLowerCase()}.$${name.toLowerCase()}-disabled-bg};
71
- --#{config.$prefix}${name.toLowerCase()}-color: #{${name.toLowerCase()}.$${name.toLowerCase()}-disabled-color};
72
- opacity: var(#{config.$prefix}${name.toLowerCase()}-disabled-opacity);
67
+ background: var(--#{config.$prefix}${name.toLowerCase()}-disabled-bg);
68
+ color: var(--#{config.$prefix}${name.toLowerCase()}-disabled-color);
69
+ opacity: var(--#{config.$prefix}${name.toLowerCase()}-disabled-opacity);
73
70
  cursor: not-allowed;
74
71
  pointer-events: none;
75
72
  }
76
73
 
77
74
  // Glass variant
78
75
  &--glass {
79
- background: #{${name.toLowerCase()}.$${name.toLowerCase()}-glass-bg};
80
- backdrop-filter: #{${name.toLowerCase()}.$${name.toLowerCase()}-glass-backdrop};
81
- border-color: #{${name.toLowerCase()}.$${name.toLowerCase()}-glass-border};
76
+ background: var(--#{config.$prefix}${name.toLowerCase()}-glass-bg, rgba(255, 255, 255, 0.1));
77
+ backdrop-filter: var(--#{config.$prefix}${name.toLowerCase()}-glass-backdrop, blur(10px));
78
+ border-color: var(--#{config.$prefix}${name.toLowerCase()}-glass-border, rgba(255, 255, 255, 0.2));
82
79
  }
83
80
 
84
81
  // Data states for JavaScript interaction
@@ -97,60 +94,62 @@ export const scssTemplate = (name) => `// ======================================
97
94
  */
98
95
  export const scssSettingsTemplate = (name) => `// ${name} Component Settings
99
96
  // Generated by Atomix CLI
100
-
101
- // Core component dimensions
102
- $${name.toLowerCase()}-width: 100% !default;
103
- $${name.toLowerCase()}-padding-x: map.get($spacing-sizes, 5) !default;
104
- $${name.toLowerCase()}-padding-y: map.get($spacing-sizes, 3) !default;
105
- $${name.toLowerCase()}-margin-bottom: map.get($spacing-sizes, 2) !default;
106
-
107
- // Typography settings
108
- $${name.toLowerCase()}-font-size: map.get($font-sizes, base) !default;
109
- $${name.toLowerCase()}-font-weight: map.get($font-weights, normal) !default;
110
- $${name.toLowerCase()}-line-height: map.get($line-heights, base) !default;
111
-
112
- // Border and radius
113
- $${name.toLowerCase()}-border: 1px solid var(--atomix-border-default) !default;
114
- $${name.toLowerCase()}-border-radius: var(--atomix-border-radius-md) !default;
115
- $${name.toLowerCase()}-border-style: solid !default;
116
-
117
- // Colors (using CSS custom properties)
118
- $${name.toLowerCase()}-bg: var(--atomix-bg-surface) !default;
119
- $${name.toLowerCase()}-color: var(--atomix-text-primary) !default;
120
- $${name.toLowerCase()}-border-color: var(--atomix-border-default) !default;
121
-
122
- // Transitions
123
- $${name.toLowerCase()}-transition: var(--atomix-transition-all) !default;
124
- $${name.toLowerCase()}-transition-duration: var(--atomix-duration-base) !default;
125
- $${name.toLowerCase()}-transition-timing: var(--atomix-easing-smooth) !default;
126
-
127
- // State-specific settings
128
- $${name.toLowerCase()}-hover-bg: var(--atomix-bg-surface-hover) !default;
129
- $${name.toLowerCase()}-focus-bg: var(--atomix-bg-surface-focus) !default;
130
- $${name.toLowerCase()}-disabled-bg: var(--atomix-bg-surface-disabled) !default;
131
- $${name.toLowerCase()}-disabled-color: var(--atomix-text-disabled) !default;
132
- $${name.toLowerCase()}-disabled-opacity: var(--atomix-opacity-disabled) !default;
97
+ // Located in src/styles/01-settings/_settings.${name.toLowerCase()}.scss
98
+
99
+ @use 'sass:map';
100
+ @use 'settings.colors' as *;
101
+ @use 'settings.spacing' as spacing;
102
+ @use 'settings.border-radius' as *;
103
+ @use 'settings.typography' as *;
104
+ @use '../02-tools/tools.color-functions' as *;
105
+
106
+ // Component-specific variables
107
+ $${name.toLowerCase()}-padding-x: map.get(spacing.$spacing-sizes, 3) !default;
108
+ $${name.toLowerCase()}-padding-y: map.get(spacing.$spacing-sizes, 2) !default;
109
+ $${name.toLowerCase()}-gap: map.get(spacing.$spacing-sizes, 2) !default;
110
+ $${name.toLowerCase()}-border-radius: $border-radius-md !default;
111
+ $${name.toLowerCase()}-transition: all 0.2s ease !default;
133
112
 
134
113
  // Size variants
135
- $${name.toLowerCase()}-sm-padding-x: map.get($spacing-sizes, 3) !default;
136
- $${name.toLowerCase()}-sm-padding-y: map.get($spacing-sizes, 2) !default;
137
- $${name.toLowerCase()}-sm-font-size: map.get($font-sizes, sm) !default;
114
+ $${name.toLowerCase()}-sm-padding-x: map.get(spacing.$spacing-sizes, 2) !default;
115
+ $${name.toLowerCase()}-sm-padding-y: map.get(spacing.$spacing-sizes, 1) !default;
116
+ $${name.toLowerCase()}-sm-font-size: $font-size-sm !default;
117
+
118
+ $${name.toLowerCase()}-lg-padding-x: map.get(spacing.$spacing-sizes, 4) !default;
119
+ $${name.toLowerCase()}-lg-padding-y: map.get(spacing.$spacing-sizes, 3) !default;
120
+ $${name.toLowerCase()}-lg-font-size: $font-size-lg !default;
121
+
122
+ // Color variants
123
+ $${name.toLowerCase()}-primary-bg: $primary !default;
124
+ $${name.toLowerCase()}-primary-color: color-contrast($primary) !default;
125
+ $${name.toLowerCase()}-primary-border: shade($primary, 10%) !default;
138
126
 
139
- $${name.toLowerCase()}-lg-padding-x: map.get($spacing-sizes, 7) !default;
140
- $${name.toLowerCase()}-lg-padding-y: map.get($spacing-sizes, 4) !default;
141
- $${name.toLowerCase()}-lg-font-size: map.get($font-sizes, lg) !default;
127
+ $${name.toLowerCase()}-secondary-bg: $secondary !default;
128
+ $${name.toLowerCase()}-secondary-color: color-contrast($secondary) !default;
129
+ $${name.toLowerCase()}-secondary-border: shade($secondary, 10%) !default;
142
130
 
143
- // Glass variant settings
131
+ // State variables
132
+ $${name.toLowerCase()}-disabled-opacity: 0.6 !default;
133
+ $${name.toLowerCase()}-disabled-cursor: not-allowed !default;
134
+
135
+ // Glass variant
144
136
  $${name.toLowerCase()}-glass-bg: rgba(255, 255, 255, 0.1) !default;
145
- $${name.toLowerCase()}-glass-backdrop: blur(10px) !default;
146
137
  $${name.toLowerCase()}-glass-border: rgba(255, 255, 255, 0.2) !default;
138
+ $${name.toLowerCase()}-glass-backdrop: blur(10px) !default;
147
139
  `;
148
140
 
149
141
  /**
150
- * SCSS templates object
142
+ * SCSS template combining both
151
143
  */
144
+ export const scssTemplate = (name) => {
145
+ return {
146
+ component: scssComponentTemplate(name),
147
+ settings: scssSettingsTemplate(name)
148
+ };
149
+ };
150
+
152
151
  export const scssTemplates = {
153
- scss: scssTemplate,
154
- scssModule: () => '', // Disabled/Empty as we prefer global SCSS
155
- scssSettings: scssSettingsTemplate,
152
+ component: scssComponentTemplate,
153
+ settings: scssSettingsTemplate,
154
+ full: scssTemplate
156
155
  };
@@ -1,38 +1,217 @@
1
1
  /**
2
- * Testing Templates
3
- * Templates for component testing
2
+ * Enhanced Testing Templates
3
+ * Comprehensive test templates with accessibility and advanced patterns
4
4
  */
5
5
 
6
6
  /**
7
- * Vitest test template for React components
7
+ * Enhanced Vitest test template for React components
8
8
  */
9
- export const testTemplate = (name) => `import { describe, it, expect } from 'vitest';
10
- import { render, screen } from '@testing-library/react';
9
+ export const testTemplate = (name) => `import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
10
+ import { render, screen, fireEvent, act } from '@testing-library/react';
11
+ import { axe, toHaveNoViolations } from 'jest-axe';
11
12
  import { ${name} } from './${name}';
12
13
 
14
+ // Extend Vitest matchers
15
+ expect.extend(toHaveNoViolations);
16
+
17
+ // Mock IntersectionObserver
18
+ global.IntersectionObserver = vi.fn(() => ({
19
+ observe: vi.fn(),
20
+ unobserve: vi.fn(),
21
+ disconnect: vi.fn()
22
+ }));
23
+
24
+ // Mock ResizeObserver
25
+ global.ResizeObserver = vi.fn().mockImplementation(() => ({
26
+ observe: vi.fn(),
27
+ unobserve: vi.fn(),
28
+ disconnect: vi.fn()
29
+ }));
30
+
13
31
  describe('${name}', () => {
14
- it('renders children correctly', () => {
15
- render(<${name}>Test Content</${name}>);
16
- expect(screen.getByText('Test Content')).toBeInTheDocument();
17
- });
18
-
19
- it('applies size variant classes', () => {
20
- const { container } = render(<${name} size="lg">Content</${name}>);
21
- const element = container.firstChild;
22
- expect(element).toHaveClass('c-${name.toLowerCase()}--lg');
23
- });
24
-
25
- it('handles disabled state', () => {
26
- const { container } = render(<${name} disabled>Content</${name}>);
27
- const element = container.firstChild;
28
- expect(element).toHaveAttribute('aria-disabled', 'true');
29
- expect(element).toHaveClass('is-disabled');
30
- });
31
-
32
- it('forwards ref correctly', () => {
33
- const ref = React.createRef<HTMLDivElement>();
34
- render(<${name} ref={ref}>Content</${name}>);
35
- expect(ref.current).toBeInstanceOf(HTMLDivElement);
32
+ // Accessibility Tests
33
+ describe('Accessibility', () => {
34
+ it('should have no accessibility violations', async () => {
35
+ const { container } = render(<${name}>Accessible Content</${name}>);
36
+ const results = await axe(container);
37
+ expect(results).toHaveNoViolations();
38
+ });
39
+
40
+ it('should have proper aria attributes', () => {
41
+ render(<${name} aria-label="Test component">Content</${name}>);
42
+ const element = screen.getByLabelText('Test component');
43
+ expect(element).toBeInTheDocument();
44
+ });
45
+
46
+ it('should support keyboard navigation', () => {
47
+ render(<${name}>Focusable Content</${name}>);
48
+ const element = screen.getByText('Focusable Content');
49
+ element.focus();
50
+ expect(element).toHaveFocus();
51
+ });
52
+ });
53
+
54
+ // Rendering Tests
55
+ describe('Rendering', () => {
56
+ it('renders children correctly', () => {
57
+ render(<${name}>Test Content</${name}>);
58
+ expect(screen.getByText('Test Content')).toBeInTheDocument();
59
+ });
60
+
61
+ it('applies className prop', () => {
62
+ const { container } = render(<${name} className="custom-class">Content</${name}>);
63
+ const element = container.firstChild;
64
+ expect(element).toHaveClass('custom-class');
65
+ });
66
+
67
+ it('renders with custom attributes', () => {
68
+ render(<${name} data-testid="test-${name.toLowerCase()}">Content</${name}>);
69
+ expect(screen.getByTestId('test-${name.toLowerCase()}')).toBeInTheDocument();
70
+ });
71
+ });
72
+
73
+ // Props Tests
74
+ describe('Props', () => {
75
+ it('applies size variant classes', () => {
76
+ const { container } = render(<${name} size="lg">Content</${name}>);
77
+ const element = container.firstChild;
78
+ expect(element).toHaveClass('c-${name.toLowerCase()}--lg');
79
+ });
80
+
81
+ it('handles disabled state', () => {
82
+ const { container } = render(<${name} disabled>Content</${name}>);
83
+ const element = container.firstChild;
84
+ expect(element).toHaveAttribute('aria-disabled', 'true');
85
+ expect(element).toHaveClass('is-disabled');
86
+ });
87
+
88
+ it('passes through data attributes', () => {
89
+ const { container } = render(<${name} data-custom="value">Content</${name}>);
90
+ const element = container.firstChild;
91
+ expect(element).toHaveAttribute('data-custom', 'value');
92
+ });
93
+ });
94
+
95
+ // Event Handling Tests
96
+ describe('Event Handling', () => {
97
+ it('calls onClick handler when clicked', () => {
98
+ const handleClick = vi.fn();
99
+ render(<${name} onClick={handleClick}>Clickable</${name}>);
100
+
101
+ fireEvent.click(screen.getByText('Clickable'));
102
+ expect(handleClick).toHaveBeenCalledTimes(1);
103
+ });
104
+
105
+ it('does not call onClick when disabled', () => {
106
+ const handleClick = vi.fn();
107
+ render(<${name} onClick={handleClick} disabled>Disabled</${name}>);
108
+
109
+ fireEvent.click(screen.getByText('Disabled'));
110
+ expect(handleClick).not.toHaveBeenCalled();
111
+ });
112
+
113
+ it('handles mouse events', () => {
114
+ const handleMouseEnter = vi.fn();
115
+ const handleMouseLeave = vi.fn();
116
+
117
+ render(
118
+ <${name}
119
+ onMouseEnter={handleMouseEnter}
120
+ onMouseLeave={handleMouseLeave}
121
+ >
122
+ Hoverable
123
+ </${name}>
124
+ );
125
+
126
+ const element = screen.getByText('Hoverable');
127
+ fireEvent.mouseEnter(element);
128
+ fireEvent.mouseLeave(element);
129
+
130
+ expect(handleMouseEnter).toHaveBeenCalledTimes(1);
131
+ expect(handleMouseLeave).toHaveBeenCalledTimes(1);
132
+ });
133
+ });
134
+
135
+ // Ref Forwarding Tests
136
+ describe('Ref Forwarding', () => {
137
+ it('forwards ref correctly', () => {
138
+ const ref = React.createRef<HTMLDivElement>();
139
+ render(<${name} ref={ref}>Content</${name}>);
140
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
141
+ });
142
+
143
+ it('allows imperative methods access', () => {
144
+ const ref = React.createRef<{ focus: () => void }>();
145
+ render(<${name} ref={ref}>Focusable</${name}>);
146
+
147
+ // Assuming component exposes focus method
148
+ if (ref.current && ref.current.focus) {
149
+ const spy = vi.spyOn(ref.current, 'focus');
150
+ ref.current.focus();
151
+ expect(spy).toHaveBeenCalled();
152
+ }
153
+ });
154
+ });
155
+
156
+ // Performance Tests
157
+ describe('Performance', () => {
158
+ it('renders efficiently without unnecessary re-renders', () => {
159
+ const renderSpy = vi.fn();
160
+ const TestWrapper = () => {
161
+ renderSpy();
162
+ return <${name}>Performance Test</${name}>;
163
+ };
164
+
165
+ render(<TestWrapper />);
166
+ expect(renderSpy).toHaveBeenCalledTimes(1);
167
+ });
168
+ });
169
+
170
+ // Edge Cases
171
+ describe('Edge Cases', () => {
172
+ it('handles empty children gracefully', () => {
173
+ const { container } = render(<${name}></${name}>);
174
+ expect(container.firstChild).toBeInTheDocument();
175
+ });
176
+
177
+ it('handles null children', () => {
178
+ const { container } = render(<${name}>{null}</${name}>);
179
+ expect(container.firstChild).toBeInTheDocument();
180
+ });
181
+
182
+ it('handles undefined props', () => {
183
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
184
+
185
+ expect(() => {
186
+ render(<${name} size={undefined}>Content</${name}>);
187
+ }).not.toThrow();
188
+
189
+ consoleSpy.mockRestore();
190
+ });
191
+ });
192
+
193
+ // Async Behavior Tests
194
+ describe('Async Behavior', () => {
195
+ it('handles async state changes', async () => {
196
+ const AsyncComponent = () => {
197
+ const [loaded, setLoaded] = React.useState(false);
198
+
199
+ React.useEffect(() => {
200
+ setTimeout(() => setLoaded(true), 100);
201
+ }, []);
202
+
203
+ return <${name}>{loaded ? 'Loaded' : 'Loading...'}</${name}>;
204
+ };
205
+
206
+ render(<AsyncComponent />);
207
+ expect(screen.getByText('Loading...')).toBeInTheDocument();
208
+
209
+ await act(async () => {
210
+ await new Promise(resolve => setTimeout(resolve, 150));
211
+ });
212
+
213
+ expect(screen.getByText('Loaded')).toBeInTheDocument();
214
+ });
36
215
  });
37
216
  });
38
217
  `;