@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
@@ -4,54 +4,74 @@ import { Accordion } from './Accordion';
4
4
  import React from 'react';
5
5
 
6
6
  describe('Accordion Component', () => {
7
- it('renders correctly with title', () => {
8
- render(<Accordion title="Test Accordion">Content</Accordion>);
9
- expect(screen.getByText('Test Accordion')).toBeInTheDocument();
10
- expect(screen.getByText('Content')).toBeInTheDocument();
11
- });
12
-
13
- it('toggles when clicked', () => {
14
- const onOpenChange = vi.fn();
15
- render(<Accordion title="Test" onOpenChange={onOpenChange}>Content</Accordion>);
16
- const button = screen.getByRole('button');
17
-
18
- fireEvent.click(button);
19
- expect(onOpenChange).toHaveBeenCalledWith(true);
20
- expect(button).toHaveAttribute('aria-expanded', 'true');
21
-
22
- fireEvent.click(button);
23
- expect(onOpenChange).toHaveBeenCalledWith(false);
24
- expect(button).toHaveAttribute('aria-expanded', 'false');
25
- });
26
-
27
- it('calls legacy onOpen/onClose handlers', () => {
28
- const onOpen = vi.fn();
29
- const onClose = vi.fn();
30
- render(<Accordion title="Test" onOpen={onOpen} onClose={onClose}>Content</Accordion>);
31
- const button = screen.getByRole('button');
32
-
33
- fireEvent.click(button);
34
- expect(onOpen).toHaveBeenCalled();
35
-
36
- fireEvent.click(button);
37
- expect(onClose).toHaveBeenCalled();
38
- });
39
-
40
- it('handles controlled state', () => {
41
- const onOpenChange = vi.fn();
42
- const { rerender } = render(<Accordion title="Test" isOpen={false} onOpenChange={onOpenChange}>Content</Accordion>);
43
- const button = screen.getByRole('button');
44
-
45
- fireEvent.click(button);
46
- expect(onOpenChange).toHaveBeenCalledWith(true);
47
- expect(button).toHaveAttribute('aria-expanded', 'false'); // Should not change internally
48
-
49
- rerender(<Accordion title="Test" isOpen={true} onOpenChange={onOpenChange}>Content</Accordion>);
50
- expect(button).toHaveAttribute('aria-expanded', 'true');
51
- });
52
-
53
- it('supports glass effect', () => {
54
- const { container } = render(<Accordion title="Test" glass>Content</Accordion>);
55
- expect(container.querySelector('.c-accordion--glass')).toBeInTheDocument();
56
- });
7
+ it('renders correctly with title', () => {
8
+ render(<Accordion title="Test Accordion">Content</Accordion>);
9
+ expect(screen.getByText('Test Accordion')).toBeInTheDocument();
10
+ expect(screen.getByText('Content')).toBeInTheDocument();
11
+ });
12
+
13
+ it('toggles when clicked', () => {
14
+ const onOpenChange = vi.fn();
15
+ render(
16
+ <Accordion title="Test" onOpenChange={onOpenChange}>
17
+ Content
18
+ </Accordion>
19
+ );
20
+ const button = screen.getByRole('button');
21
+
22
+ fireEvent.click(button);
23
+ expect(onOpenChange).toHaveBeenCalledWith(true);
24
+ expect(button).toHaveAttribute('aria-expanded', 'true');
25
+
26
+ fireEvent.click(button);
27
+ expect(onOpenChange).toHaveBeenCalledWith(false);
28
+ expect(button).toHaveAttribute('aria-expanded', 'false');
29
+ });
30
+
31
+ it('calls legacy onOpen/onClose handlers', () => {
32
+ const onOpen = vi.fn();
33
+ const onClose = vi.fn();
34
+ render(
35
+ <Accordion title="Test" onOpen={onOpen} onClose={onClose}>
36
+ Content
37
+ </Accordion>
38
+ );
39
+ const button = screen.getByRole('button');
40
+
41
+ fireEvent.click(button);
42
+ expect(onOpen).toHaveBeenCalled();
43
+
44
+ fireEvent.click(button);
45
+ expect(onClose).toHaveBeenCalled();
46
+ });
47
+
48
+ it('handles controlled state', () => {
49
+ const onOpenChange = vi.fn();
50
+ const { rerender } = render(
51
+ <Accordion title="Test" isOpen={false} onOpenChange={onOpenChange}>
52
+ Content
53
+ </Accordion>
54
+ );
55
+ const button = screen.getByRole('button');
56
+
57
+ fireEvent.click(button);
58
+ expect(onOpenChange).toHaveBeenCalledWith(true);
59
+ expect(button).toHaveAttribute('aria-expanded', 'false'); // Should not change internally
60
+
61
+ rerender(
62
+ <Accordion title="Test" isOpen={true} onOpenChange={onOpenChange}>
63
+ Content
64
+ </Accordion>
65
+ );
66
+ expect(button).toHaveAttribute('aria-expanded', 'true');
67
+ });
68
+
69
+ it('supports glass effect', () => {
70
+ const { container } = render(
71
+ <Accordion title="Test" glass>
72
+ Content
73
+ </Accordion>
74
+ );
75
+ expect(container.querySelector('.c-accordion--glass')).toBeInTheDocument();
76
+ });
57
77
  });
@@ -1,120 +1,125 @@
1
1
  import React, { ReactNode, useId, memo } from 'react';
2
2
  import { ACCORDION } from '../../lib/constants/components';
3
3
  import { useAccordion } from '../../lib/composables/useAccordion';
4
- import type { AccordionProps as AccordionPropsType, AtomixGlassProps } from '../../lib/types/components';
4
+ import type {
5
+ AccordionProps as AccordionPropsType,
6
+ AtomixGlassProps,
7
+ } from '../../lib/types/components';
5
8
  import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
6
9
 
7
10
  export type AccordionProps = AccordionPropsType;
8
11
 
9
- export const Accordion: React.FC<AccordionProps> = memo(({
10
- title,
11
- children,
12
- defaultOpen = false,
13
- isOpen: controlledOpen,
14
- onOpenChange,
15
- onOpen,
16
- onClose,
17
- disabled = false,
18
- iconPosition = 'right',
19
- icon,
20
- className = '',
21
- style,
22
- glass,
23
- }) => {
24
- // Generate unique IDs for accessibility
25
- const instanceId = useId();
26
- const buttonId = `accordion-header-${instanceId}`;
27
- const panelId = `accordion-panel-${instanceId}`;
28
-
29
- // Use composable hook for logic/state
30
- const {
31
- state,
32
- toggle,
33
- updatePanelHeight,
34
- panelRef,
35
- contentRef,
36
- generateClassNames,
37
- generateHeaderClassNames,
38
- } = useAccordion({
39
- defaultOpen,
40
- disabled,
41
- iconPosition,
12
+ export const Accordion: React.FC<AccordionProps> = memo(
13
+ ({
14
+ title,
15
+ children,
16
+ defaultOpen = false,
42
17
  isOpen: controlledOpen,
43
18
  onOpenChange,
44
19
  onOpen,
45
20
  onClose,
46
- });
21
+ disabled = false,
22
+ iconPosition = 'right',
23
+ icon,
24
+ className = '',
25
+ style,
26
+ glass,
27
+ }) => {
28
+ // Generate unique IDs for accessibility
29
+ const instanceId = useId();
30
+ const buttonId = `accordion-header-${instanceId}`;
31
+ const panelId = `accordion-panel-${instanceId}`;
47
32
 
48
- // Default icon
49
- const defaultIcon = (
50
- <i className="c-accordion__icon" aria-hidden="true">
51
- <svg
52
- xmlns="http://www.w3.org/2000/svg"
53
- width="24"
54
- height="24"
55
- viewBox="0 0 24 24"
56
- fill="none"
57
- stroke="currentColor"
58
- strokeWidth="2"
59
- strokeLinecap="round"
60
- strokeLinejoin="round"
61
- aria-hidden="true"
62
- focusable="false"
63
- >
64
- <polyline points="6 9 12 15 18 9"></polyline>
65
- </svg>
66
- </i>
67
- );
33
+ // Use composable hook for logic/state
34
+ const {
35
+ state,
36
+ toggle,
37
+ updatePanelHeight,
38
+ panelRef,
39
+ contentRef,
40
+ generateClassNames,
41
+ generateHeaderClassNames,
42
+ } = useAccordion({
43
+ defaultOpen,
44
+ disabled,
45
+ iconPosition,
46
+ isOpen: controlledOpen,
47
+ onOpenChange,
48
+ onOpen,
49
+ onClose,
50
+ });
68
51
 
69
- const accordionContent = (
70
- <div
71
- className={generateClassNames(className) + (glass ? ' c-accordion--glass' : '')}
72
- style={style}
73
- >
74
- <button
75
- id={buttonId}
76
- className={generateHeaderClassNames()}
77
- onClick={toggle}
78
- aria-expanded={state.isOpen}
79
- aria-controls={panelId}
80
- aria-disabled={disabled}
81
- disabled={disabled}
82
- type="button"
83
- >
84
- <span className="c-accordion__title">{title}</span>
85
- {icon || defaultIcon}
86
- </button>
52
+ // Default icon
53
+ const defaultIcon = (
54
+ <i className="c-accordion__icon" aria-hidden="true">
55
+ <svg
56
+ xmlns="http://www.w3.org/2000/svg"
57
+ width="24"
58
+ height="24"
59
+ viewBox="0 0 24 24"
60
+ fill="none"
61
+ stroke="currentColor"
62
+ strokeWidth="2"
63
+ strokeLinecap="round"
64
+ strokeLinejoin="round"
65
+ aria-hidden="true"
66
+ focusable="false"
67
+ >
68
+ <polyline points="6 9 12 15 18 9"></polyline>
69
+ </svg>
70
+ </i>
71
+ );
72
+
73
+ const accordionContent = (
87
74
  <div
88
- id={panelId}
89
- className={ACCORDION.SELECTORS.PANEL.replace('.', '')}
90
- ref={panelRef as React.RefObject<HTMLDivElement>}
91
- role="region"
92
- aria-labelledby={buttonId}
75
+ className={generateClassNames(className) + (glass ? ' c-accordion--glass' : '')}
76
+ style={style}
93
77
  >
78
+ <button
79
+ id={buttonId}
80
+ className={generateHeaderClassNames()}
81
+ onClick={toggle}
82
+ aria-expanded={state.isOpen}
83
+ aria-controls={panelId}
84
+ aria-disabled={disabled}
85
+ disabled={disabled}
86
+ type="button"
87
+ >
88
+ <span className="c-accordion__title">{title}</span>
89
+ {icon || defaultIcon}
90
+ </button>
94
91
  <div
95
- className={ACCORDION.SELECTORS.BODY.replace('.', '')}
96
- ref={contentRef as React.RefObject<HTMLDivElement>}
92
+ id={panelId}
93
+ className={ACCORDION.SELECTORS.PANEL.replace('.', '')}
94
+ ref={panelRef as React.RefObject<HTMLDivElement>}
95
+ role="region"
96
+ aria-labelledby={buttonId}
97
97
  >
98
- {children}
98
+ <div
99
+ className={ACCORDION.SELECTORS.BODY.replace('.', '')}
100
+ ref={contentRef as React.RefObject<HTMLDivElement>}
101
+ >
102
+ {children}
103
+ </div>
99
104
  </div>
100
105
  </div>
101
- </div>
102
- );
106
+ );
103
107
 
104
- if (glass) {
105
- // Default glass settings for accordions
106
- const defaultGlassProps = {
107
- displacementScale: 20,
108
- elasticity: 0,
109
- };
108
+ if (glass) {
109
+ // Default glass settings for accordions
110
+ const defaultGlassProps = {
111
+ displacementScale: 20,
112
+ elasticity: 0,
113
+ };
110
114
 
111
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
115
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
112
116
 
113
- return <AtomixGlass {...glassProps}>{accordionContent}</AtomixGlass>;
114
- }
117
+ return <AtomixGlass {...glassProps}>{accordionContent}</AtomixGlass>;
118
+ }
115
119
 
116
- return accordionContent;
117
- });
120
+ return accordionContent;
121
+ }
122
+ );
118
123
 
119
124
  // Set display name for debugging
120
125
  Accordion.displayName = 'Accordion';
@@ -10,7 +10,7 @@ vi.mock('./shader-utils', () => ({
10
10
  updateShader() {
11
11
  return 'data:image/png;base64,mockBase64String';
12
12
  }
13
- destroy() { }
13
+ destroy() {}
14
14
  },
15
15
  fragmentShaders: {
16
16
  liquidGlass: vi.fn(),
@@ -57,7 +57,7 @@ import { useAtomixGlass } from '../../lib/composables/useAtomixGlass';
57
57
  *
58
58
  * @example
59
59
  * // OverLight - Object config with custom settings
60
- * <AtomixGlass
60
+ * <AtomixGlass
61
61
  * overLight={{
62
62
  * threshold: 0.8,
63
63
  * opacity: 0.6,
@@ -147,14 +147,16 @@ export function AtomixGlass({
147
147
  children,
148
148
  });
149
149
 
150
- // Use consistent overLight state from hook
151
- const isOverLight = overLightConfig.isOverLight;
150
+ // Calculate isOverLight independently from overLightConfig to prevent displacement changes on hover
151
+ // overLightConfig recalculates with hover/active states, but displacement should remain stable
152
+ const isOverLight = useMemo(() => overLightConfig?.isOverLight, [overLight]);
153
+
152
154
  const shouldRenderOverLightLayers = enableOverLightLayers && isOverLight;
153
155
 
154
156
  // Calculate base style with transforms
155
157
  const baseStyle = {
156
158
  ...style,
157
- ...(elasticity !== 0 && !effectiveDisableEffects && {
159
+ ...(!effectiveDisableEffects && {
158
160
  transform: transformStyle,
159
161
  }),
160
162
  };
@@ -171,26 +173,32 @@ export function AtomixGlass({
171
173
  .join(' ');
172
174
 
173
175
  // Calculate position and size styles
174
- const positionStyles = {
175
- position: (style.position || 'absolute') as React.CSSProperties['position'],
176
- top: style.top || 0,
177
- left: style.left || 0,
178
- };
176
+ const positionStyles = useMemo(
177
+ () => ({
178
+ position: (style.position || 'absolute') as React.CSSProperties['position'],
179
+ top: style.top || 0,
180
+ left: style.left || 0,
181
+ }),
182
+ [style.position, style.top, style.left]
183
+ );
179
184
 
180
- const adjustedSize = {
181
- width:
182
- style.position !== 'fixed'
183
- ? '100%'
184
- : style.width
185
- ? style.width
186
- : Math.max(glassSize.width, 0),
187
- height:
188
- style.position !== 'fixed'
189
- ? '100%'
190
- : style.height
191
- ? style.height
192
- : Math.max(glassSize.height, 0),
193
- };
185
+ const adjustedSize = useMemo(
186
+ () => ({
187
+ width:
188
+ style.position !== 'fixed'
189
+ ? '100%'
190
+ : style.width
191
+ ? style.width
192
+ : Math.max(glassSize.width, 0),
193
+ height:
194
+ style.position !== 'fixed'
195
+ ? '100%'
196
+ : style.height
197
+ ? style.height
198
+ : Math.max(glassSize.height, 0),
199
+ }),
200
+ [style.position, style.width, style.height, glassSize.width, glassSize.height]
201
+ );
194
202
 
195
203
  // Memoize expensive gradient calculations
196
204
  const gradientValues = useMemo(() => {
@@ -252,15 +260,30 @@ export function AtomixGlass({
252
260
  hover2: isActive ? 0.5 : 0,
253
261
  hover3: isHovered ? 0.4 : isActive ? 0.8 : 0,
254
262
  base: isOverLight ? overLightOpacity || BASE_OVER_LIGHT_OPACITY : 0,
255
- over: isOverLight ? (overLightOpacity || BASE_OVER_LIGHT_OPACITY) * OVER_OPACITY_MULTIPLIER : 0,
263
+ over: isOverLight
264
+ ? (overLightOpacity || BASE_OVER_LIGHT_OPACITY) * OVER_OPACITY_MULTIPLIER
265
+ : 0,
256
266
  };
257
267
  }, [isHovered, isActive, isOverLight, overLightConfig.opacity]);
258
268
 
259
269
  // Memoize CSS variables object
260
270
  const glassVars = useMemo(() => {
261
- const whiteColor = '255, 255, 255';
262
- const blackColor = '0, 0, 0';
263
- const { borderGradientAngle, borderStop1, borderStop2, borderOpacities, hoverPositions, basePosition, mx, my, absMx, absMy } = gradientValues;
271
+ const whiteColor = ATOMIX_GLASS.CONSTANTS.PALETTE.WHITE;
272
+ const blackColor = ATOMIX_GLASS.CONSTANTS.PALETTE.BLACK;
273
+ const {
274
+ borderGradientAngle,
275
+ borderStop1,
276
+ borderStop2,
277
+ borderOpacities,
278
+ hoverPositions,
279
+ basePosition,
280
+ mx,
281
+ my,
282
+ absMx,
283
+ absMy,
284
+ } = gradientValues;
285
+
286
+ const configBorderOpacity = overLightConfig?.borderOpacity ?? 1;
264
287
 
265
288
  return {
266
289
  '--atomix-glass-radius': `${effectiveCornerRadius}px`,
@@ -268,12 +291,14 @@ export function AtomixGlass({
268
291
  '--atomix-glass-position': positionStyles.position,
269
292
  '--atomix-glass-top': positionStyles.top !== 'fixed' ? `${positionStyles.top}px` : '0',
270
293
  '--atomix-glass-left': positionStyles.left !== 'fixed' ? `${positionStyles.left}px` : '0',
271
- '--atomix-glass-width': style.position !== 'fixed' ? adjustedSize.width : `${adjustedSize.width}px`,
272
- '--atomix-glass-height': style.position !== 'fixed' ? adjustedSize.height : `${adjustedSize.height}px`,
294
+ '--atomix-glass-width':
295
+ style.position !== 'fixed' ? adjustedSize.width : `${adjustedSize.width}px`,
296
+ '--atomix-glass-height':
297
+ style.position !== 'fixed' ? adjustedSize.height : `${adjustedSize.height}px`,
273
298
  '--atomix-glass-border-width': 'var(--atomix-spacing-0-5, 0.09375rem)',
274
299
  '--atomix-glass-blend-mode': isOverLight ? 'multiply' : 'overlay',
275
- '--atomix-glass-border-gradient-1': `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${borderOpacities[0]}) ${borderStop1}%, rgba(${whiteColor}, ${borderOpacities[1]}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
276
- '--atomix-glass-border-gradient-2': `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${borderOpacities[2]}) ${borderStop1}%, rgba(${whiteColor}, ${borderOpacities[3]}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
300
+ '--atomix-glass-border-gradient-1': `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${(borderOpacities[0] ?? 1) * configBorderOpacity}) ${borderStop1}%, rgba(${whiteColor}, ${(borderOpacities[1] ?? 1) * configBorderOpacity}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
301
+ '--atomix-glass-border-gradient-2': `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${(borderOpacities[2] ?? 1) * configBorderOpacity}) ${borderStop1}%, rgba(${whiteColor}, ${(borderOpacities[3] ?? 1) * configBorderOpacity}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
277
302
  '--atomix-glass-hover-1-opacity': opacityValues.hover1,
278
303
  '--atomix-glass-hover-1-gradient': isOverLight
279
304
  ? `radial-gradient(circle at ${hoverPositions.hover1.x}% ${hoverPositions.hover1.y}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_START}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_STOP}%, rgba(${blackColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_END}%)`
@@ -295,14 +320,26 @@ export function AtomixGlass({
295
320
  ? `radial-gradient(circle at ${basePosition.x}% ${basePosition.y}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_BASE + absMx * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID_STOP}%, rgba(${blackColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_BASE + absMy * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_MULTIPLIER}) 100%)`
296
321
  : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.WHITE_OPACITY})`,
297
322
  } as React.CSSProperties;
298
- }, [gradientValues, opacityValues, effectiveCornerRadius, transformStyle, positionStyles, adjustedSize, style.position, isOverLight]);
323
+ }, [
324
+ gradientValues,
325
+ opacityValues,
326
+ effectiveCornerRadius,
327
+ transformStyle,
328
+ positionStyles,
329
+ adjustedSize,
330
+ style.position,
331
+ isOverLight,
332
+ overLightConfig.borderOpacity,
333
+ ]);
299
334
 
300
335
  // Helper function to render background layers
301
336
  const renderBackgroundLayer = (layerType: 'dark' | 'black') => (
302
337
  <div
303
338
  className={[
304
339
  ATOMIX_GLASS.BACKGROUND_LAYER_CLASS,
305
- layerType === 'dark' ? ATOMIX_GLASS.BACKGROUND_LAYER_DARK_CLASS : ATOMIX_GLASS.BACKGROUND_LAYER_BLACK_CLASS,
340
+ layerType === 'dark'
341
+ ? ATOMIX_GLASS.BACKGROUND_LAYER_DARK_CLASS
342
+ : ATOMIX_GLASS.BACKGROUND_LAYER_BLACK_CLASS,
306
343
  isOverLight
307
344
  ? ATOMIX_GLASS.BACKGROUND_LAYER_OVER_LIGHT_CLASS
308
345
  : ATOMIX_GLASS.BACKGROUND_LAYER_HIDDEN_CLASS,
@@ -342,7 +379,7 @@ export function AtomixGlass({
342
379
  ? 0
343
380
  : mode === 'shader'
344
381
  ? displacementScale * ATOMIX_GLASS.CONSTANTS.MULTIPLIERS.SHADER_DISPLACEMENT
345
- : overLightConfig.isOverLight
382
+ : isOverLight
346
383
  ? displacementScale * ATOMIX_GLASS.CONSTANTS.MULTIPLIERS.OVER_LIGHT_DISPLACEMENT
347
384
  : displacementScale
348
385
  }
@@ -350,7 +387,7 @@ export function AtomixGlass({
350
387
  saturation={
351
388
  effectiveHighContrast
352
389
  ? ATOMIX_GLASS.CONSTANTS.SATURATION.HIGH_CONTRAST
353
- : overLightConfig.isOverLight
390
+ : isOverLight
354
391
  ? saturation * overLightConfig.saturationBoost
355
392
  : saturation
356
393
  }
@@ -369,10 +406,15 @@ export function AtomixGlass({
369
406
  onMouseLeave={handleMouseLeave}
370
407
  onMouseDown={handleMouseDown}
371
408
  onMouseUp={handleMouseUp}
372
- active={isActive}
373
409
  isHovered={isHovered}
374
410
  isActive={isActive}
375
- overLight={overLightConfig.isOverLight}
411
+ overLight={isOverLight}
412
+ overLightConfig={{
413
+ contrast: overLightConfig.contrast,
414
+ brightness: overLightConfig.brightness,
415
+ shadowIntensity: overLightConfig.shadowIntensity,
416
+ borderOpacity: overLightConfig.borderOpacity,
417
+ }}
376
418
  onClick={onClick}
377
419
  mode={mode}
378
420
  transform={baseStyle.transform}
@@ -407,8 +449,7 @@ export function AtomixGlass({
407
449
  className={ATOMIX_GLASS.OVERLAY_HIGHLIGHT_CLASS}
408
450
  style={{
409
451
  opacity:
410
- opacityValues.over *
411
- ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.OPACITY_MULTIPLIER,
452
+ opacityValues.over * ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.OPACITY_MULTIPLIER,
412
453
  background: `radial-gradient(circle at ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.POSITION_X}% ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.POSITION_Y}%, rgba(255, 255, 255, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.WHITE_OPACITY}) 0%, transparent ${ATOMIX_GLASS.CONSTANTS.OVERLAY_HIGHLIGHT.STOP}%)`,
413
454
  }}
414
455
  />