@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
@@ -39,7 +39,7 @@ const smoothStep = (a: number, b: number, t: number): number => {
39
39
  if (typeof a !== 'number' || typeof b !== 'number' || typeof t !== 'number') {
40
40
  return 0;
41
41
  }
42
-
42
+
43
43
  const clamped = Math.max(0, Math.min(1, (t - a) / (b - a)));
44
44
  return clamped * clamped * (3 - 2 * clamped);
45
45
  };
@@ -49,11 +49,11 @@ const calculateLength = (x: number, y: number): number => {
49
49
  if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) {
50
50
  return 0;
51
51
  }
52
-
52
+
53
53
  // Prevent potential overflow
54
54
  const maxX = Math.max(Math.abs(x), Math.abs(y));
55
55
  if (maxX === 0) return 0;
56
-
56
+
57
57
  const scaledX = x / maxX;
58
58
  const scaledY = y / maxX;
59
59
  return maxX * Math.sqrt(scaledX * scaledX + scaledY * scaledY);
@@ -67,12 +67,16 @@ const roundedRectSDF = (
67
67
  radius: number
68
68
  ): number => {
69
69
  // Add input validation
70
- if (typeof x !== 'number' || typeof y !== 'number' ||
71
- typeof width !== 'number' || typeof height !== 'number' ||
72
- typeof radius !== 'number') {
70
+ if (
71
+ typeof x !== 'number' ||
72
+ typeof y !== 'number' ||
73
+ typeof width !== 'number' ||
74
+ typeof height !== 'number' ||
75
+ typeof radius !== 'number'
76
+ ) {
73
77
  return 0;
74
78
  }
75
-
79
+
76
80
  const qx = Math.abs(x) - width + radius;
77
81
  const qy = Math.abs(y) - height + radius;
78
82
  return Math.min(Math.max(qx, qy), 0) + calculateLength(Math.max(qx, 0), Math.max(qy, 0)) - radius;
@@ -97,11 +101,11 @@ const clampValue = (value: number, min: number, max: number): number => {
97
101
  if (typeof value !== 'number' || typeof min !== 'number' || typeof max !== 'number') {
98
102
  return min;
99
103
  }
100
-
104
+
101
105
  if (isNaN(value)) return min;
102
106
  if (isNaN(min)) return 0;
103
107
  if (isNaN(max)) return 1;
104
-
108
+
105
109
  return Math.max(min, Math.min(max, value));
106
110
  };
107
111
 
@@ -111,9 +115,11 @@ const easeInOutCubic = (t: number): number => {
111
115
  if (typeof t !== 'number' || isNaN(t)) {
112
116
  return 0;
113
117
  }
114
-
118
+
115
119
  const clampedT = Math.max(0, Math.min(1, t));
116
- return clampedT < 0.5 ? 4 * clampedT * clampedT * clampedT : 1 - Math.pow(-2 * clampedT + 2, 3) / 2;
120
+ return clampedT < 0.5
121
+ ? 4 * clampedT * clampedT * clampedT
122
+ : 1 - Math.pow(-2 * clampedT + 2, 3) / 2;
117
123
  };
118
124
 
119
125
  const easeOutQuart = (t: number): number => {
@@ -121,7 +127,7 @@ const easeOutQuart = (t: number): number => {
121
127
  if (typeof t !== 'number' || isNaN(t)) {
122
128
  return 0;
123
129
  }
124
-
130
+
125
131
  const clampedT = Math.max(0, Math.min(1, t));
126
132
  return 1 - Math.pow(1 - clampedT, 4);
127
133
  };
@@ -132,7 +138,7 @@ const noise2D = (x: number, y: number): number => {
132
138
  if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) {
133
139
  return 0;
134
140
  }
135
-
141
+
136
142
  const X = Math.floor(x) & 255;
137
143
  const Y = Math.floor(y) & 255;
138
144
 
@@ -148,7 +154,7 @@ const noise2D = (x: number, y: number): number => {
148
154
  if (typeof i !== 'number' || typeof j !== 'number') {
149
155
  return 0;
150
156
  }
151
-
157
+
152
158
  const n = i + j * 57;
153
159
  // Use a more stable hash function
154
160
  const hashed = Math.sin(n * 12.9898 + 78.233) * 43758.5453;
@@ -172,10 +178,10 @@ const fbm = (x: number, y: number, octaves: number = 4): number => {
172
178
  if (typeof x !== 'number' || typeof y !== 'number' || isNaN(x) || isNaN(y)) {
173
179
  return 0;
174
180
  }
175
-
181
+
176
182
  // Clamp octaves to prevent performance issues
177
183
  const clampedOctaves = Math.max(1, Math.min(8, Math.floor(octaves)));
178
-
184
+
179
185
  let value = 0;
180
186
  let amplitude = 0.5;
181
187
  let frequency = 1;
@@ -192,11 +198,17 @@ const fbm = (x: number, y: number, octaves: number = 4): number => {
192
198
  // Radial distortion for glass-like refraction
193
199
  const calculateRadialDistortion = (x: number, y: number, strength: number): Vec2 => {
194
200
  // Add input validation
195
- if (typeof x !== 'number' || typeof y !== 'number' || typeof strength !== 'number' ||
196
- isNaN(x) || isNaN(y) || isNaN(strength)) {
201
+ if (
202
+ typeof x !== 'number' ||
203
+ typeof y !== 'number' ||
204
+ typeof strength !== 'number' ||
205
+ isNaN(x) ||
206
+ isNaN(y) ||
207
+ isNaN(strength)
208
+ ) {
197
209
  return { x: 0, y: 0 };
198
210
  }
199
-
211
+
200
212
  const distance = calculateLength(x, y);
201
213
  const distortion = Math.pow(Math.min(distance, 10), 2) * strength; // Limit distance to prevent extreme values
202
214
 
@@ -209,17 +221,23 @@ const calculateRadialDistortion = (x: number, y: number, strength: number): Vec2
209
221
  // Chromatic aberration calculation
210
222
  const calculateChromaticOffset = (x: number, y: number, intensity: number): Vec2 => {
211
223
  // Add input validation
212
- if (typeof x !== 'number' || typeof y !== 'number' || typeof intensity !== 'number' ||
213
- isNaN(x) || isNaN(y) || isNaN(intensity)) {
224
+ if (
225
+ typeof x !== 'number' ||
226
+ typeof y !== 'number' ||
227
+ typeof intensity !== 'number' ||
228
+ isNaN(x) ||
229
+ isNaN(y) ||
230
+ isNaN(intensity)
231
+ ) {
214
232
  return { x: 0, y: 0 };
215
233
  }
216
-
234
+
217
235
  const distance = calculateLength(x, y);
218
236
  // Prevent division by zero and extreme values
219
237
  if (distance === 0) {
220
238
  return { x: 0, y: 0 };
221
239
  }
222
-
240
+
223
241
  const angle = Math.atan2(y, x);
224
242
 
225
243
  return {
@@ -231,11 +249,19 @@ const calculateChromaticOffset = (x: number, y: number, intensity: number): Vec2
231
249
  // Advanced caustic pattern generator for glass refraction
232
250
  const calculateCaustics = (x: number, y: number, time: number, intensity: number = 1): number => {
233
251
  // Add input validation
234
- if (typeof x !== 'number' || typeof y !== 'number' || typeof time !== 'number' ||
235
- typeof intensity !== 'number' || isNaN(x) || isNaN(y) || isNaN(time) || isNaN(intensity)) {
252
+ if (
253
+ typeof x !== 'number' ||
254
+ typeof y !== 'number' ||
255
+ typeof time !== 'number' ||
256
+ typeof intensity !== 'number' ||
257
+ isNaN(x) ||
258
+ isNaN(y) ||
259
+ isNaN(time) ||
260
+ isNaN(intensity)
261
+ ) {
236
262
  return 0.5; // Return middle value on error
237
263
  }
238
-
264
+
239
265
  const scale = 8;
240
266
  const speed = 2;
241
267
 
@@ -263,15 +289,23 @@ const calculateSpectralDispersion = (
263
289
  intensity: number
264
290
  ): { r: Vec2; g: Vec2; b: Vec2 } => {
265
291
  // Add input validation
266
- if (typeof x !== 'number' || typeof y !== 'number' || typeof angle !== 'number' ||
267
- typeof intensity !== 'number' || isNaN(x) || isNaN(y) || isNaN(angle) || isNaN(intensity)) {
292
+ if (
293
+ typeof x !== 'number' ||
294
+ typeof y !== 'number' ||
295
+ typeof angle !== 'number' ||
296
+ typeof intensity !== 'number' ||
297
+ isNaN(x) ||
298
+ isNaN(y) ||
299
+ isNaN(angle) ||
300
+ isNaN(intensity)
301
+ ) {
268
302
  return {
269
303
  r: { x: 0, y: 0 },
270
304
  g: { x: 0, y: 0 },
271
- b: { x: 0, y: 0 }
305
+ b: { x: 0, y: 0 },
272
306
  };
273
307
  }
274
-
308
+
275
309
  const distance = calculateLength(x, y);
276
310
  const dispersionStrength = Math.min(distance * intensity, 1); // Limit strength to prevent extreme values
277
311
 
@@ -305,12 +339,21 @@ const calculateParallaxOffset = (
305
339
  mouseY: number = 0
306
340
  ): Vec2 => {
307
341
  // Add input validation
308
- if (typeof x !== 'number' || typeof y !== 'number' || typeof depth !== 'number' ||
309
- typeof mouseX !== 'number' || typeof mouseY !== 'number' ||
310
- isNaN(x) || isNaN(y) || isNaN(depth) || isNaN(mouseX) || isNaN(mouseY)) {
342
+ if (
343
+ typeof x !== 'number' ||
344
+ typeof y !== 'number' ||
345
+ typeof depth !== 'number' ||
346
+ typeof mouseX !== 'number' ||
347
+ typeof mouseY !== 'number' ||
348
+ isNaN(x) ||
349
+ isNaN(y) ||
350
+ isNaN(depth) ||
351
+ isNaN(mouseX) ||
352
+ isNaN(mouseY)
353
+ ) {
311
354
  return { x: 0, y: 0 };
312
355
  }
313
-
356
+
314
357
  const parallaxStrength = Math.min(0.02 * depth, 0.1); // Limit strength to prevent extreme values
315
358
 
316
359
  // Calculate offset based on view angle (simulated by mouse position)
@@ -323,11 +366,19 @@ const calculateParallaxOffset = (
323
366
  // Volumetric density for depth perception and scattering
324
367
  const calculateVolumetricDensity = (x: number, y: number, depth: number, time: number): number => {
325
368
  // Add input validation
326
- if (typeof x !== 'number' || typeof y !== 'number' || typeof depth !== 'number' ||
327
- typeof time !== 'number' || isNaN(x) || isNaN(y) || isNaN(depth) || isNaN(time)) {
369
+ if (
370
+ typeof x !== 'number' ||
371
+ typeof y !== 'number' ||
372
+ typeof depth !== 'number' ||
373
+ typeof time !== 'number' ||
374
+ isNaN(x) ||
375
+ isNaN(y) ||
376
+ isNaN(depth) ||
377
+ isNaN(time)
378
+ ) {
328
379
  return 0.5; // Return middle value on error
329
380
  }
330
-
381
+
331
382
  const noiseValue = fbm(x * 5 + time * 0.5, y * 5 - time * 0.5, 3);
332
383
  const depthFalloff = Math.exp(-Math.max(0, depth) * 2); // Ensure depth is not negative
333
384
 
@@ -337,14 +388,22 @@ const calculateVolumetricDensity = (x: number, y: number, depth: number, time: n
337
388
  // Advanced turbulence for organic glass distortion
338
389
  const calculateTurbulence = (x: number, y: number, time: number, octaves: number = 5): number => {
339
390
  // Add input validation
340
- if (typeof x !== 'number' || typeof y !== 'number' || typeof time !== 'number' ||
341
- typeof octaves !== 'number' || isNaN(x) || isNaN(y) || isNaN(time) || isNaN(octaves)) {
391
+ if (
392
+ typeof x !== 'number' ||
393
+ typeof y !== 'number' ||
394
+ typeof time !== 'number' ||
395
+ typeof octaves !== 'number' ||
396
+ isNaN(x) ||
397
+ isNaN(y) ||
398
+ isNaN(time) ||
399
+ isNaN(octaves)
400
+ ) {
342
401
  return 0;
343
402
  }
344
-
403
+
345
404
  // Clamp octaves to prevent performance issues
346
405
  const clampedOctaves = Math.max(1, Math.min(8, Math.floor(octaves)));
347
-
406
+
348
407
  let turbulence = 0;
349
408
  let amplitude = 1;
350
409
  let frequency = 1;
@@ -362,11 +421,17 @@ const calculateTurbulence = (x: number, y: number, time: number, octaves: number
362
421
  // Micro-surface detail for high-quality glass texture
363
422
  const calculateMicroSurface = (x: number, y: number, time: number): number => {
364
423
  // Add input validation
365
- if (typeof x !== 'number' || typeof y !== 'number' || typeof time !== 'number' ||
366
- isNaN(x) || isNaN(y) || isNaN(time)) {
424
+ if (
425
+ typeof x !== 'number' ||
426
+ typeof y !== 'number' ||
427
+ typeof time !== 'number' ||
428
+ isNaN(x) ||
429
+ isNaN(y) ||
430
+ isNaN(time)
431
+ ) {
367
432
  return 0.5; // Return middle value on error
368
433
  }
369
-
434
+
370
435
  const highFreqNoise = fbm(x * 40 + time * 0.3, y * 40 - time * 0.3, 6);
371
436
  const microDetail = fbm(x * 80, y * 80, 4);
372
437
 
@@ -721,6 +786,11 @@ export const fragmentShaders = {
721
786
 
722
787
  return createTexture(clampValue(finalX + 0.5, 0, 1), clampValue(finalY + 0.5, 0, 1));
723
788
  },
789
+
790
+ // Aliases for compatibility
791
+ plasma: (uv: Vec2, mousePosition?: Vec2): Vec2 => fragmentShaders.premiumGlass(uv, mousePosition),
792
+ waves: (uv: Vec2, mousePosition?: Vec2): Vec2 => fragmentShaders.liquidMetal(uv, mousePosition),
793
+ noise: (uv: Vec2, mousePosition?: Vec2): Vec2 => fragmentShaders.appleFluid(uv, mousePosition),
724
794
  };
725
795
 
726
796
  export type FragmentShaderType = keyof typeof fragmentShaders;
@@ -737,12 +807,20 @@ export class ShaderDisplacementGenerator {
737
807
 
738
808
  this.canvas = document.createElement('canvas');
739
809
  // Enhanced validation for canvas dimensions
740
- this.canvas.width = Math.max(MIN_CANVAS_DIMENSION,
741
- Math.min(MAX_CANVAS_DIMENSION,
742
- Math.round(options.width * this.canvasDPI || DEFAULT_CANVAS_WIDTH)));
743
- this.canvas.height = Math.max(MIN_CANVAS_DIMENSION,
744
- Math.min(MAX_CANVAS_DIMENSION,
745
- Math.round(options.height * this.canvasDPI || DEFAULT_CANVAS_HEIGHT)));
810
+ this.canvas.width = Math.max(
811
+ MIN_CANVAS_DIMENSION,
812
+ Math.min(
813
+ MAX_CANVAS_DIMENSION,
814
+ Math.round(options.width * this.canvasDPI || DEFAULT_CANVAS_WIDTH)
815
+ )
816
+ );
817
+ this.canvas.height = Math.max(
818
+ MIN_CANVAS_DIMENSION,
819
+ Math.min(
820
+ MAX_CANVAS_DIMENSION,
821
+ Math.round(options.height * this.canvasDPI || DEFAULT_CANVAS_HEIGHT)
822
+ )
823
+ );
746
824
  this.canvas.style.display = 'none';
747
825
 
748
826
  const context = this.canvas.getContext('2d');
@@ -844,7 +922,10 @@ export class ShaderDisplacementGenerator {
844
922
  return this.canvas.toDataURL();
845
923
  } catch (error) {
846
924
  // Graceful fallback on error
847
- console.warn('ShaderDisplacementGenerator: Error generating shader map, using fallback', error);
925
+ console.warn(
926
+ 'ShaderDisplacementGenerator: Error generating shader map, using fallback',
927
+ error
928
+ );
848
929
  return ''; // Return empty string as fallback
849
930
  }
850
931
  }
@@ -869,4 +950,4 @@ export class ShaderDisplacementGenerator {
869
950
  getScale(): number {
870
951
  return this.canvasDPI;
871
952
  }
872
- }
953
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Customization.stories.tsx
3
+ *
4
+ * Stories showcasing customization options and integration with other components.
5
+ *
6
+ * @package Atomix
7
+ * @component AtomixGlass
8
+ */
9
+
10
+ import React from 'react';
11
+ import type { Meta, StoryObj } from '@storybook/react';
12
+ import AtomixGlass from '../AtomixGlass';
13
+ import Button from '../../Button/Button';
14
+ import Badge from '../../Badge/Badge';
15
+ import { BackgroundWrapper, backgroundImages } from './shared-components';
16
+ import { Icon } from '../../Icon/Icon'; // Assuming Icon is used or might be useful, added from Examples
17
+
18
+ const meta: Meta<typeof AtomixGlass> = {
19
+ title: 'Components/AtomixGlass/Features/Customization',
20
+ component: AtomixGlass,
21
+ parameters: {
22
+ layout: 'fullscreen',
23
+ docs: {
24
+ description: {
25
+ component:
26
+ 'Examples of how to customize AtomixGlass with styles and integrate it with other Atomix components.',
27
+ },
28
+ },
29
+ },
30
+ };
31
+
32
+ export default meta;
33
+ type Story = StoryObj<typeof AtomixGlass>;
34
+
35
+ export const WithCustomStyling: Story = {
36
+ args: {
37
+ children: (
38
+ <div className="u-text-center">
39
+ <h2 className="u-text-4 u-font-semibold u-mb-4 u-text-white">Custom Styled Glass</h2>
40
+ <p className="u-text-base u-mb-6 u-text-white">
41
+ This glass uses custom styling properties.
42
+ </p>
43
+ <Button
44
+ variant="primary"
45
+ className="u-rounded-lg u-py-3 u-px-6"
46
+ style={{ boxShadow: '0 5px 15px rgba(0,0,0,0.2)' }}
47
+ >
48
+ Premium Effect
49
+ </Button>
50
+ </div>
51
+ ),
52
+ displacementScale: 70,
53
+ blurAmount: 0.4,
54
+ saturation: 160,
55
+ aberrationIntensity: 1.8,
56
+ cornerRadius: 30,
57
+ padding: '40px',
58
+ style: {
59
+ width: '100%',
60
+ maxWidth: '400px',
61
+ margin: '0 auto',
62
+ boxShadow: '0 10px 30px rgba(0,0,0,0.3)',
63
+ transition: 'transform 0.3s ease-in-out',
64
+ },
65
+ },
66
+ render: args => (
67
+ <BackgroundWrapper backgroundImage={backgroundImages[2]}>
68
+ <div className="u-flex u-justify-center u-items-center u-w-full u-h-full">
69
+ <AtomixGlass {...args} />
70
+ </div>
71
+ </BackgroundWrapper>
72
+ ),
73
+ parameters: {
74
+ docs: {
75
+ description: {
76
+ story:
77
+ 'Shows how to customize the AtomixGlass component with additional CSS styles and enhanced interactivity.',
78
+ },
79
+ },
80
+ },
81
+ };
82
+
83
+ export const WithOtherComponents: Story = {
84
+ parameters: {
85
+ docs: {
86
+ description: {
87
+ story:
88
+ 'Demonstrates how AtomixGlass integrates with other components in the design system.',
89
+ },
90
+ },
91
+ },
92
+ render: () => {
93
+ return (
94
+ <BackgroundWrapper backgroundImage={backgroundImages[0]}>
95
+ <div className="u-flex u-items-center u-justify-center u-w-full u-h-full">
96
+ <AtomixGlass
97
+ displacementScale={85}
98
+ blurAmount={0.6}
99
+ saturation={170}
100
+ aberrationIntensity={2.2}
101
+ elasticity={0.18}
102
+ cornerRadius={28}
103
+ padding="36px"
104
+ className="u-w-11/12 u-max-w-2xl"
105
+ >
106
+ <div className="u-mb-6">
107
+ <h2 className="u-m-0 u-text-white u-text-28 u-mb-2">Integrated UI</h2>
108
+ <p className="u-m-0 u-text-white u-opacity-90">
109
+ Glass effect with multiple components
110
+ </p>
111
+ </div>
112
+
113
+ <div className="u-flex u-flex-col u-gap-4 u-items-center">
114
+ <Button variant="primary" glass className="u-w-full">
115
+ Primary Action
116
+ </Button>
117
+ <Button variant="secondary" glass className="u-w-full">
118
+ Secondary Action
119
+ </Button>
120
+
121
+ <div className="u-flex u-gap-3 u-mt-4">
122
+ <Badge variant="success" label="Success" glass />
123
+ <Badge variant="warning" label="Warning" glass />
124
+ </div>
125
+ </div>
126
+ </AtomixGlass>
127
+ </div>
128
+ </BackgroundWrapper>
129
+ );
130
+ },
131
+ };