@shohojdhara/atomix 0.3.5 → 0.3.7

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 (182) hide show
  1. package/README.md +101 -199
  2. package/atomix.config.ts +241 -0
  3. package/dist/atomix.css +260 -179
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +250 -179
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/charts.js +69 -166
  8. package/dist/charts.js.map +1 -1
  9. package/dist/core.js +184 -263
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js +55 -131
  12. package/dist/forms.js.map +1 -1
  13. package/dist/heavy.js +184 -263
  14. package/dist/heavy.js.map +1 -1
  15. package/dist/index.d.ts +1831 -1657
  16. package/dist/index.esm.js +4497 -4318
  17. package/dist/index.esm.js.map +1 -1
  18. package/dist/index.js +4510 -4328
  19. package/dist/index.js.map +1 -1
  20. package/dist/index.min.js +1 -1
  21. package/dist/index.min.js.map +1 -1
  22. package/dist/theme.d.ts +1431 -1472
  23. package/dist/theme.js +4175 -4138
  24. package/dist/theme.js.map +1 -1
  25. package/package.json +6 -20
  26. package/src/components/Accordion/Accordion.stories.tsx +50 -17
  27. package/src/components/AtomixGlass/AtomixGlass.tsx +128 -322
  28. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +12 -5
  29. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1 -32
  30. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2 -2
  31. package/src/components/AtomixGlass/stories/shared-components.tsx +0 -31
  32. package/src/components/Avatar/Avatar.stories.tsx +7 -0
  33. package/src/components/Badge/Badge.stories.tsx +91 -13
  34. package/src/components/Block/Block.stories.tsx +7 -23
  35. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +7 -0
  36. package/src/components/Button/Button.stories.tsx +141 -22
  37. package/src/components/Button/Button.tsx +85 -167
  38. package/src/components/Button/ButtonGroup.stories.tsx +315 -0
  39. package/src/components/Button/ButtonGroup.tsx +67 -0
  40. package/src/components/Button/index.ts +2 -0
  41. package/src/components/Callout/Callout.stories.tsx +8 -6
  42. package/src/components/Card/Card.stories.tsx +82 -28
  43. package/src/components/Chart/AnimatedChart.tsx +0 -1
  44. package/src/components/Chart/AreaChart.tsx +0 -1
  45. package/src/components/Chart/BarChart.tsx +0 -1
  46. package/src/components/Chart/BubbleChart.tsx +0 -1
  47. package/src/components/Chart/CandlestickChart.tsx +0 -1
  48. package/src/components/Chart/Chart.stories.tsx +5 -7
  49. package/src/components/Chart/Chart.tsx +0 -16
  50. package/src/components/Chart/ChartRenderer.tsx +1 -1
  51. package/src/components/Chart/DonutChart.tsx +0 -1
  52. package/src/components/Chart/FunnelChart.tsx +0 -1
  53. package/src/components/Chart/GaugeChart.tsx +0 -1
  54. package/src/components/Chart/HeatmapChart.tsx +0 -1
  55. package/src/components/Chart/LineChart.tsx +0 -1
  56. package/src/components/Chart/MultiAxisChart.tsx +0 -1
  57. package/src/components/Chart/PieChart.tsx +0 -1
  58. package/src/components/Chart/RadarChart.tsx +0 -1
  59. package/src/components/Chart/ScatterChart.tsx +0 -1
  60. package/src/components/Chart/WaterfallChart.tsx +0 -1
  61. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +7 -0
  62. package/src/components/DataTable/DataTable.stories.tsx +23 -16
  63. package/src/components/DatePicker/DatePicker.stories.tsx +27 -19
  64. package/src/components/Dropdown/Dropdown.stories.tsx +11 -19
  65. package/src/components/EdgePanel/EdgePanel.stories.tsx +1 -0
  66. package/src/components/Footer/Footer.stories.tsx +8 -6
  67. package/src/components/Footer/FooterLink.tsx +9 -2
  68. package/src/components/Form/Checkbox.stories.tsx +7 -0
  69. package/src/components/Form/Form.stories.tsx +7 -0
  70. package/src/components/Form/FormGroup.stories.tsx +9 -1
  71. package/src/components/Form/Input.stories.tsx +69 -16
  72. package/src/components/Form/Radio.stories.tsx +9 -1
  73. package/src/components/Form/Select.stories.tsx +9 -1
  74. package/src/components/Form/Textarea.stories.tsx +10 -2
  75. package/src/components/Hero/Hero.stories.tsx +7 -0
  76. package/src/components/List/List.stories.tsx +7 -0
  77. package/src/components/Messages/Messages.stories.tsx +8 -7
  78. package/src/components/Modal/Modal.stories.tsx +17 -6
  79. package/src/components/Navigation/Menu/Menu.stories.tsx +7 -0
  80. package/src/components/Navigation/Nav/Nav.stories.tsx +7 -0
  81. package/src/components/Navigation/Navbar/Navbar.stories.tsx +1 -0
  82. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +1 -1
  83. package/src/components/Pagination/Pagination.stories.tsx +188 -111
  84. package/src/components/Pagination/Pagination.tsx +83 -3
  85. package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -5
  86. package/src/components/Popover/Popover.stories.tsx +191 -115
  87. package/src/components/ProductReview/ProductReview.stories.tsx +80 -58
  88. package/src/components/Progress/Progress.stories.tsx +79 -49
  89. package/src/components/Rating/Rating.stories.tsx +109 -84
  90. package/src/components/River/River.stories.tsx +194 -114
  91. package/src/components/SectionIntro/SectionIntro.stories.tsx +19 -9
  92. package/src/components/Slider/Slider.stories.tsx +7 -0
  93. package/src/components/Spinner/Spinner.stories.tsx +15 -11
  94. package/src/components/Steps/Steps.stories.tsx +132 -98
  95. package/src/components/Tabs/Tabs.stories.tsx +163 -112
  96. package/src/components/Testimonial/Testimonial.stories.tsx +114 -68
  97. package/src/components/Todo/Todo.stories.tsx +38 -12
  98. package/src/components/Toggle/Toggle.stories.tsx +61 -28
  99. package/src/components/Tooltip/Tooltip.stories.tsx +318 -200
  100. package/src/components/Upload/Upload.stories.tsx +122 -84
  101. package/src/components/VideoPlayer/VideoPlayer.stories.tsx +7 -24
  102. package/src/components/index.ts +1 -0
  103. package/src/lib/composables/useAtomixGlass.ts +9 -10
  104. package/src/lib/composables/useNavbar.ts +0 -10
  105. package/src/lib/config/loader.ts +4 -4
  106. package/src/lib/constants/components.ts +17 -0
  107. package/src/lib/hooks/useComponentCustomization.ts +1 -1
  108. package/src/lib/hooks/usePerformanceMonitor.ts +1 -1
  109. package/src/lib/hooks/useThemeTokens.ts +105 -0
  110. package/src/lib/theme/README.md +174 -0
  111. package/src/lib/theme/adapters/index.ts +31 -0
  112. package/src/lib/theme/adapters/themeAdapter.ts +287 -0
  113. package/src/lib/theme/config/__tests__/configLoader.test.ts +207 -0
  114. package/src/lib/theme/config/configLoader.ts +95 -0
  115. package/src/lib/theme/config/loader.ts +37 -54
  116. package/src/lib/theme/config/types.ts +2 -2
  117. package/src/lib/theme/config/validator.ts +15 -91
  118. package/src/lib/theme/{constants.ts → constants/constants.ts} +1 -19
  119. package/src/lib/theme/constants/index.ts +8 -0
  120. package/src/lib/theme/core/ThemeRegistry.ts +75 -266
  121. package/src/lib/theme/core/__tests__/createTheme.test.ts +132 -0
  122. package/src/lib/theme/core/composeTheme.ts +105 -0
  123. package/src/lib/theme/core/createTheme.ts +108 -0
  124. package/src/lib/theme/{createTheme.ts → core/createThemeObject.ts} +12 -8
  125. package/src/lib/theme/core/index.ts +19 -19
  126. package/src/lib/theme/devtools/Comparator.tsx +346 -22
  127. package/src/lib/theme/devtools/IMPROVEMENTS.md +139 -38
  128. package/src/lib/theme/devtools/Inspector.tsx +335 -51
  129. package/src/lib/theme/devtools/LiveEditor.tsx +478 -107
  130. package/src/lib/theme/devtools/Preview.tsx +471 -221
  131. package/src/lib/theme/{core → devtools}/ThemeValidator.ts +1 -1
  132. package/src/lib/theme/devtools/index.ts +14 -4
  133. package/src/lib/theme/devtools/useHistory.ts +130 -0
  134. package/src/lib/theme/{errors.ts → errors/errors.ts} +1 -1
  135. package/src/lib/theme/errors/index.ts +12 -0
  136. package/src/lib/theme/generators/cssFile.ts +79 -0
  137. package/src/lib/theme/generators/generateCSS.ts +89 -0
  138. package/src/lib/theme/generators/generateCSSNested.ts +130 -0
  139. package/src/lib/theme/{generateCSSVariables.ts → generators/generateCSSVariables.ts} +3 -13
  140. package/src/lib/theme/generators/index.ts +25 -0
  141. package/src/lib/theme/i18n/rtl.ts +5 -6
  142. package/src/lib/theme/index.ts +149 -19
  143. package/src/lib/theme/runtime/ThemeApplicator.ts +53 -112
  144. package/src/lib/theme/{ThemeContext.tsx → runtime/ThemeContext.tsx} +1 -1
  145. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +5 -5
  146. package/src/lib/theme/runtime/ThemeProvider.tsx +266 -282
  147. package/src/lib/theme/runtime/index.ts +2 -2
  148. package/src/lib/theme/runtime/useTheme.ts +1 -2
  149. package/src/lib/theme/runtime/useThemeTokens.ts +131 -0
  150. package/src/lib/theme/test/testTheme.ts +385 -0
  151. package/src/lib/theme/tokens/index.ts +12 -0
  152. package/src/lib/theme/tokens/tokens.ts +721 -0
  153. package/src/lib/theme/types.ts +6 -42
  154. package/src/lib/theme/utils/componentTheming.ts +132 -0
  155. package/src/lib/theme/{utils.ts → utils/domUtils.ts} +2 -2
  156. package/src/lib/theme/utils/index.ts +11 -0
  157. package/src/lib/theme/utils/injectCSS.ts +90 -0
  158. package/src/lib/theme/utils/naming.ts +100 -0
  159. package/src/lib/theme/utils/themeHelpers.ts +78 -0
  160. package/src/lib/theme/{themeUtils.ts → utils/themeUtils.ts} +7 -7
  161. package/src/lib/theme-tools.ts +7 -8
  162. package/src/lib/types/components.ts +40 -130
  163. package/src/lib/utils/componentUtils.ts +2 -2
  164. package/src/lib/utils/memoryMonitor.ts +3 -3
  165. package/src/lib/utils/themeNaming.ts +135 -0
  166. package/src/styles/01-settings/_settings.design-tokens.scss +4 -1
  167. package/src/styles/02-tools/_tools.button.scss +66 -79
  168. package/src/styles/06-components/_components.atomix-glass.scss +13 -3
  169. package/src/styles/06-components/_components.pagination.scss +88 -0
  170. package/scripts/sync-theme-config.js +0 -309
  171. package/src/lib/theme/composeTheme.ts +0 -370
  172. package/src/lib/theme/core/ThemeCache.ts +0 -283
  173. package/src/lib/theme/core/ThemeEngine.test.ts +0 -146
  174. package/src/lib/theme/core/ThemeEngine.ts +0 -665
  175. package/src/lib/theme/createThemeFromConfig.ts +0 -132
  176. package/src/lib/theme/devtools/CLI.ts +0 -364
  177. package/src/lib/theme/runtime/ThemeManager.test.ts +0 -192
  178. package/src/lib/theme/runtime/ThemeManager.ts +0 -446
  179. package/src/styles/03-generic/_generated-root.css +0 -26
  180. package/src/themes/README.md +0 -442
  181. package/src/themes/themes.config.js +0 -68
  182. /package/src/lib/theme/{cssVariableMapper.ts → adapters/cssVariableMapper.ts} +0 -0
package/dist/charts.js CHANGED
@@ -1730,10 +1730,11 @@ const GlassFilter = memo(GlassFilterComponent, ((prevProps, nextProps) => prevP
1730
1730
  width: 0,
1731
1731
  height: 0
1732
1732
  }, onClick: onClick, mode: mode = "standard", effectiveDisableEffects: effectiveDisableEffects = !1, effectiveReducedMotion: effectiveReducedMotion = !1, shaderVariant: shaderVariant = "liquidGlass", enableLiquidBlur: enableLiquidBlur = !1, elasticity: elasticity = 0, contentRef: contentRef}, ref) => {
1733
- // Use React's useId() for SSR compatibility
1734
- // Note: In Next.js, IDs may differ between server and client
1735
- // We'll suppress hydration warnings on elements that use this ID
1736
- const filterId = useId(), [shaderMapUrl, setShaderMapUrl] = useState(""), shaderGeneratorRef = useRef(null), shaderUtilsRef = useRef(null), shaderDebounceTimeoutRef = useRef(null);
1733
+ // Generate a stable, deterministic ID for SSR compatibility
1734
+ // React's useId() should produce the same ID on server and client for the same
1735
+ // component position in the tree. We use useState to ensure the ID is only
1736
+ // generated once and remains stable across renders.
1737
+ const baseId = useId(), [filterId] = useState((() => `atomix-glass-filter-${baseId.replace(/:/g, "-").replace(/^[^a-z]/i, "atomix-")}`)), [shaderMapUrl, setShaderMapUrl] = useState(""), shaderGeneratorRef = useRef(null), shaderUtilsRef = useRef(null), shaderDebounceTimeoutRef = useRef(null);
1737
1738
  // Lazy load shader utilities only when shader mode is needed
1738
1739
  useEffect((() => {
1739
1740
  "shader" === mode ?
@@ -1793,7 +1794,7 @@ const GlassFilter = memo(GlassFilterComponent, ((prevProps, nextProps) => prevP
1793
1794
  timestamp: Date.now()
1794
1795
  }),
1795
1796
  // Development mode: log cache size
1796
- "production" !== process.env.NODE_ENV && sharedShaderCache.size;
1797
+ "undefined" != typeof process && "production" === process.env?.NODE_ENV || sharedShaderCache.size;
1797
1798
  })(cacheKey, url), setShaderMapUrl(url);
1798
1799
  };
1799
1800
  "undefined" != typeof requestIdleCallback ? requestIdleCallback(generate, {
@@ -2106,9 +2107,9 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2106
2107
  childRadius > 0 && childRadius !== CONSTANTS.DEFAULT_CORNER_RADIUS && (extractedRadius = childRadius,
2107
2108
  extractionSource = "React children");
2108
2109
  }
2109
- null !== extractedRadius && extractedRadius > 0 ? setDynamicCornerRadius(extractedRadius) : process.env.NODE_ENV;
2110
+ null !== extractedRadius && extractedRadius > 0 ? setDynamicCornerRadius(extractedRadius) : "undefined" == typeof process || process.env;
2110
2111
  } catch (error) {
2111
- "production" !== process.env.NODE_ENV && debugCornerRadius && console.error("[AtomixGlass] Error extracting corner radius:", error);
2112
+ "undefined" != typeof process && "production" === process.env?.NODE_ENV || !debugCornerRadius || console.error("[AtomixGlass] Error extracting corner radius:", error);
2112
2113
  }
2113
2114
  };
2114
2115
  extractRadius();
@@ -2183,7 +2184,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2183
2184
  // For image backgrounds, assume medium luminance
2184
2185
  totalLuminance += .5, validSamples++, hasValidBackground = !0);
2185
2186
  } catch (styleError) {
2186
- process.env.NODE_ENV;
2187
+ "undefined" == typeof process || process.env;
2187
2188
  }
2188
2189
  // Move to parent element for next iteration
2189
2190
  if (!currentElement) break;
@@ -2222,7 +2223,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2222
2223
  }
2223
2224
  } catch (error) {
2224
2225
  // Enhanced error logging with context
2225
- "development" === process.env.NODE_ENV && console.warn("AtomixGlass: Error detecting background brightness:", error);
2226
+ "undefined" != typeof process && "development" !== process.env?.NODE_ENV || console.warn("AtomixGlass: Error detecting background brightness:", error);
2226
2227
  const result = !1;
2227
2228
  if (element && element.parentElement) {
2228
2229
  const threshold = "object" == typeof overLight && null !== overLight && overLight.threshold || .7;
@@ -2279,7 +2280,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2279
2280
  };
2280
2281
  // Calculate offset relative to this container
2281
2282
  // React 18 automatically batches these updates
2282
- setInternalMouseOffset(newOffset), setInternalGlobalMousePosition(globalPos), "production" !== process.env.NODE_ENV && enablePerformanceMonitoring && performance.now();
2283
+ setInternalMouseOffset(newOffset), setInternalGlobalMousePosition(globalPos), "undefined" != typeof process && "production" === process.env?.NODE_ENV || !enablePerformanceMonitoring || performance.now();
2283
2284
  }), [ mouseContainer, glassRef, externalGlobalMousePosition, externalMouseOffset, effectiveDisableEffects, enablePerformanceMonitoring ]);
2284
2285
  // Subscribe to shared mouse tracker
2285
2286
  useEffect((() => {
@@ -2419,10 +2420,10 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2419
2420
  saturationBoost: validatedSaturationBoost + .4 * mouseInfluence
2420
2421
  };
2421
2422
  // Validate and apply object config values with proper clamping
2422
- return process.env.NODE_ENV, finalConfig;
2423
+ return "undefined" == typeof process || process.env, finalConfig;
2423
2424
  }
2424
2425
  // Debug logging for non-object configs
2425
- return process.env.NODE_ENV, baseConfig;
2426
+ return "undefined" == typeof process || process.env, baseConfig;
2426
2427
  }), [ overLight, getEffectiveOverLight, mouseOffset, isHovered, isActive, validateConfigValue, debugOverLight ]), handleMouseEnter = useCallback((() => setIsHovered(!0)), []), handleMouseLeave = useCallback((() => setIsHovered(!1)), []), handleMouseDown = useCallback((() => setIsActive(!0)), []), handleMouseUp = useCallback((() => setIsActive(!1)), []), handleKeyDown = useCallback((e => {
2427
2428
  !onClick || "Enter" !== e.key && " " !== e.key || (e.preventDefault(), onClick());
2428
2429
  }), [ onClick ]), handleMouseMove = useCallback((_e => {}), []);
@@ -2533,7 +2534,7 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2533
2534
  * <div>Content with debug logging enabled</div>
2534
2535
  * </AtomixGlass>
2535
2536
  */ function AtomixGlass({children: children, displacementScale: displacementScale = ATOMIX_GLASS.DEFAULTS.DISPLACEMENT_SCALE, blurAmount: blurAmount = ATOMIX_GLASS.DEFAULTS.BLUR_AMOUNT, saturation: saturation = ATOMIX_GLASS.DEFAULTS.SATURATION, aberrationIntensity: aberrationIntensity = ATOMIX_GLASS.DEFAULTS.ABERRATION_INTENSITY, elasticity: elasticity = ATOMIX_GLASS.DEFAULTS.ELASTICITY, cornerRadius: cornerRadius, globalMousePosition: externalGlobalMousePosition, mouseOffset: externalMouseOffset, mouseContainer: mouseContainer = null, className: className = "", padding: padding = ATOMIX_GLASS.DEFAULTS.PADDING, overLight: overLight = ATOMIX_GLASS.DEFAULTS.OVER_LIGHT, style: style = {}, mode: mode = ATOMIX_GLASS.DEFAULTS.MODE, onClick: onClick, shaderVariant: shaderVariant = "liquidGlass", "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, role: role, tabIndex: tabIndex, reducedMotion: reducedMotion = !1, highContrast: highContrast = !1, disableEffects: disableEffects = !1, enableLiquidBlur: enableLiquidBlur = !1, enableBorderEffect: enableBorderEffect = !0, enableOverLightLayers: enableOverLightLayers = ATOMIX_GLASS.DEFAULTS.ENABLE_OVER_LIGHT_LAYERS, enablePerformanceMonitoring: enablePerformanceMonitoring = !1, debugCornerRadius: debugCornerRadius = !1, debugOverLight: debugOverLight = !1}) {
2536
- const glassRef = useRef(null), contentRef = useRef(null), opacityCacheRef = useRef(null), {isHovered: isHovered, isActive: isActive, glassSize: glassSize, effectiveCornerRadius: effectiveCornerRadius, effectiveReducedMotion: effectiveReducedMotion, effectiveHighContrast: effectiveHighContrast, effectiveDisableEffects: effectiveDisableEffects, overLightConfig: overLightConfig, globalMousePosition: globalMousePosition, mouseOffset: mouseOffset, transformStyle: transformStyle, handleMouseEnter: handleMouseEnter, handleMouseLeave: handleMouseLeave, handleMouseDown: handleMouseDown, handleMouseUp: handleMouseUp, handleKeyDown: handleKeyDown} = useAtomixGlass({
2537
+ const glassRef = useRef(null), contentRef = useRef(null), {isHovered: isHovered, isActive: isActive, glassSize: glassSize, effectiveCornerRadius: effectiveCornerRadius, effectiveReducedMotion: effectiveReducedMotion, effectiveHighContrast: effectiveHighContrast, effectiveDisableEffects: effectiveDisableEffects, overLightConfig: overLightConfig, globalMousePosition: globalMousePosition, mouseOffset: mouseOffset, transformStyle: transformStyle, handleMouseEnter: handleMouseEnter, handleMouseLeave: handleMouseLeave, handleMouseDown: handleMouseDown, handleMouseUp: handleMouseUp, handleKeyDown: handleKeyDown} = useAtomixGlass({
2537
2538
  glassRef: glassRef,
2538
2539
  contentRef: contentRef,
2539
2540
  cornerRadius: cornerRadius,
@@ -2550,128 +2551,51 @@ function useAtomixGlass({glassRef: glassRef, contentRef: contentRef, cornerRadiu
2550
2551
  debugOverLight: debugOverLight,
2551
2552
  enablePerformanceMonitoring: enablePerformanceMonitoring,
2552
2553
  children: children
2553
- }), isOverLight = overLightConfig.isOverLight, shouldRenderOverLightLayers = enableOverLightLayers && isOverLight;
2554
- // Read CSS custom properties once on mount and cache them
2555
- useEffect((() => {
2556
- if ("undefined" != typeof window && glassRef.current && !opacityCacheRef.current) try {
2557
- const computedStyle = window.getComputedStyle(glassRef.current), opacity50Value = computedStyle.getPropertyValue("--atomix-opacity-50").trim(), opacity40Value = computedStyle.getPropertyValue("--atomix-opacity-40").trim(), opacity80Value = computedStyle.getPropertyValue("--atomix-opacity-80").trim(), opacity0Value = computedStyle.getPropertyValue("--atomix-opacity-0").trim(), parseOpacity = (value, defaultValue) => {
2558
- if (!value) return defaultValue;
2559
- const parsed = parseFloat(value);
2560
- return isNaN(parsed) ? defaultValue : parsed;
2561
- };
2562
- opacityCacheRef.current = {
2563
- opacity50: parseOpacity(opacity50Value, .5),
2564
- opacity40: parseOpacity(opacity40Value, .4),
2565
- opacity80: parseOpacity(opacity80Value, .8),
2566
- opacity0: parseOpacity(opacity0Value, 0)
2567
- };
2568
- } catch (error) {
2569
- // Fallback to defaults if reading fails
2570
- opacityCacheRef.current = {
2571
- opacity50: .5,
2572
- opacity40: .4,
2573
- opacity80: .8,
2574
- opacity0: 0
2575
- };
2576
- }
2577
- }), []);
2578
- // Calculate base style with transforms (only dynamic values)
2579
- const baseStyle = useMemo((() => ({
2554
+ }), isOverLight = overLightConfig.isOverLight, shouldRenderOverLightLayers = enableOverLightLayers && isOverLight, baseStyle = {
2580
2555
  ...style,
2581
2556
  ...0 !== elasticity && !effectiveDisableEffects && {
2582
2557
  transform: transformStyle
2583
2558
  }
2584
- })), [ style, transformStyle, effectiveDisableEffects, elasticity ]), componentClassName = useMemo((() => [ ATOMIX_GLASS.BASE_CLASS, effectiveReducedMotion && `${ATOMIX_GLASS.BASE_CLASS}--reduced-motion`, effectiveHighContrast && `${ATOMIX_GLASS.BASE_CLASS}--high-contrast`, effectiveDisableEffects && `${ATOMIX_GLASS.BASE_CLASS}--disabled-effects`, className ].filter(Boolean).join(" ")), [ effectiveReducedMotion, effectiveHighContrast, effectiveDisableEffects, className ]), baseStylePosition = baseStyle.position, baseStyleTop = baseStyle.top, baseStyleLeft = baseStyle.left, positionStyles = useMemo((() => ({
2585
- position: baseStylePosition || "absolute",
2586
- top: baseStyleTop || 0,
2587
- left: baseStyleLeft || 0
2588
- })), [ baseStylePosition, baseStyleTop, baseStyleLeft ]), baseStyleWidth = baseStyle.width, baseStyleHeight = baseStyle.height, glassSizeWidth = glassSize.width, glassSizeHeight = glassSize.height, adjustedSize = useMemo((() => ({
2589
- width: "fixed" !== baseStylePosition ? "100%" : baseStyleWidth || Math.max(glassSizeWidth, 0),
2590
- height: "fixed" !== baseStylePosition ? "100%" : baseStyleHeight || Math.max(glassSizeHeight, 0)
2591
- })), [ baseStylePosition, baseStyleWidth, baseStyleHeight, glassSizeWidth, glassSizeHeight ]), mouseOffsetX = mouseOffset.x, mouseOffsetY = mouseOffset.y, GRADIENT = ATOMIX_GLASS.CONSTANTS.GRADIENT, gradientCalculations = useMemo((() => {
2592
- const mx = mouseOffsetX, my = mouseOffsetY, borderGradientAngle = GRADIENT.BASE_ANGLE + mx * GRADIENT.ANGLE_MULTIPLIER, borderStop1 = Math.max(GRADIENT.BORDER_STOP_1.MIN, GRADIENT.BORDER_STOP_1.BASE + my * GRADIENT.BORDER_STOP_1.MULTIPLIER), borderStop2 = Math.min(GRADIENT.BORDER_STOP_2.MAX, GRADIENT.BORDER_STOP_2.BASE + my * GRADIENT.BORDER_STOP_2.MULTIPLIER), borderOpacity1 = GRADIENT.BORDER_OPACITY.BASE_1 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_LOW, borderOpacity2 = GRADIENT.BORDER_OPACITY.BASE_2 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_HIGH, borderOpacity3 = GRADIENT.BORDER_OPACITY.BASE_3 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_LOW, borderOpacity4 = GRADIENT.BORDER_OPACITY.BASE_4 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_HIGH, hover1X = GRADIENT.CENTER_POSITION + mx / GRADIENT.HOVER_POSITION.DIVISOR_1, hover1Y = GRADIENT.CENTER_POSITION + my / GRADIENT.HOVER_POSITION.DIVISOR_1, hover2X = GRADIENT.CENTER_POSITION + mx / GRADIENT.HOVER_POSITION.DIVISOR_2, hover2Y = GRADIENT.CENTER_POSITION + my / GRADIENT.HOVER_POSITION.DIVISOR_2, hover3X = GRADIENT.CENTER_POSITION + mx * GRADIENT.HOVER_POSITION.MULTIPLIER_3, hover3Y = GRADIENT.CENTER_POSITION + my * GRADIENT.HOVER_POSITION.MULTIPLIER_3, baseX = GRADIENT.CENTER_POSITION + mx * GRADIENT.BASE_LAYER_MULTIPLIER, baseY = GRADIENT.CENTER_POSITION + my * GRADIENT.BASE_LAYER_MULTIPLIER;
2593
- return {
2594
- isOverLight: isOverLight,
2595
- mx: mx,
2596
- my: my,
2597
- borderGradientAngle: borderGradientAngle,
2598
- borderStop1: borderStop1,
2599
- borderStop2: borderStop2,
2600
- borderOpacity1: borderOpacity1,
2601
- borderOpacity2: borderOpacity2,
2602
- borderOpacity3: borderOpacity3,
2603
- borderOpacity4: borderOpacity4,
2604
- hover1X: hover1X,
2605
- hover1Y: hover1Y,
2606
- hover2X: hover2X,
2607
- hover2Y: hover2Y,
2608
- hover3X: hover3X,
2609
- hover3Y: hover3Y,
2610
- baseX: baseX,
2611
- baseY: baseY
2612
- };
2613
- }), [ mouseOffsetX, mouseOffsetY, isOverLight ]), overLightOpacity = overLightConfig.opacity, opacityValues = useMemo((() => {
2614
- // Use cached values if available, otherwise fallback to defaults
2615
- const opacity50 = opacityCacheRef.current?.opacity50 ?? .5, opacity40 = opacityCacheRef.current?.opacity40 ?? .4, opacity80 = opacityCacheRef.current?.opacity80 ?? .8, opacity0 = opacityCacheRef.current?.opacity0 ?? 0;
2616
- // Dynamic multiplier for overlay
2617
- return {
2618
- hover1: isHovered || isActive ? opacity50 : opacity0,
2619
- hover2: isActive ? opacity50 : opacity0,
2620
- hover3: isHovered ? opacity40 : isActive ? opacity80 : opacity0,
2621
- base: isOverLight ? overLightOpacity || opacity40 : opacity0,
2622
- over: isOverLight ? 1.1 * (overLightOpacity || opacity40) : opacity0
2623
- };
2624
- }), [ isHovered, isActive, isOverLight, overLightOpacity ]), gradientIsOverLight = gradientCalculations.isOverLight, gradientMx = gradientCalculations.mx, gradientMy = gradientCalculations.my, gradientBorderGradientAngle = gradientCalculations.borderGradientAngle, gradientBorderStop1 = gradientCalculations.borderStop1, gradientBorderStop2 = gradientCalculations.borderStop2, gradientBorderOpacity1 = gradientCalculations.borderOpacity1, gradientBorderOpacity2 = gradientCalculations.borderOpacity2, gradientBorderOpacity3 = gradientCalculations.borderOpacity3, gradientBorderOpacity4 = gradientCalculations.borderOpacity4, gradientHover1X = gradientCalculations.hover1X, gradientHover1Y = gradientCalculations.hover1Y, gradientHover2X = gradientCalculations.hover2X, gradientHover2Y = gradientCalculations.hover2Y, gradientHover3X = gradientCalculations.hover3X, gradientHover3Y = gradientCalculations.hover3Y, gradientBaseX = gradientCalculations.baseX, gradientBaseY = gradientCalculations.baseY, positionStylesPosition = positionStyles.position, positionStylesTop = positionStyles.top, positionStylesLeft = positionStyles.left, adjustedSizeWidth = adjustedSize.width, adjustedSizeHeight = adjustedSize.height, baseStyleTransform = baseStyle.transform, opacityValuesHover1 = opacityValues.hover1, opacityValuesHover2 = opacityValues.hover2, opacityValuesHover3 = opacityValues.hover3, opacityValuesBase = opacityValues.base, opacityValuesOver = opacityValues.over, glassVars = useMemo((() => {
2625
- // RGB color values for rgba() functions
2626
- // Note: CSS doesn't support rgba(var(--rgb), opacity) syntax, so we use direct values
2627
- // These values align with design tokens: --atomix-white-rgb and --atomix-black-rgb
2628
- // The actual RGB values are defined in SCSS and should match these fallbacks
2629
- // TODO: Consider reading from CSS custom properties if browser support improves
2630
- const whiteColor = "255, 255, 255";
2631
- // Matches --atomix-white-rgb design token
2632
- // Matches --atomix-black-rgb design token
2633
- return {
2634
- // Standard CSS custom properties for dynamic values
2635
- "--atomix-glass-radius": `${effectiveCornerRadius}px`,
2636
- "--atomix-glass-transform": baseStyleTransform || "none",
2637
- "--atomix-glass-position": positionStylesPosition,
2638
- "--atomix-glass-top": "fixed" !== positionStylesTop ? `${positionStylesTop}px` : "0",
2639
- "--atomix-glass-left": "fixed" !== positionStylesLeft ? `${positionStylesLeft}px` : "0",
2640
- "--atomix-glass-width": "fixed" !== baseStylePosition ? adjustedSizeWidth : `${adjustedSizeWidth}px`,
2641
- "--atomix-glass-height": "fixed" !== baseStylePosition ? adjustedSizeHeight : `${adjustedSizeHeight}px`,
2642
- // Border width: Use spacing token for consistency
2643
- "--atomix-glass-border-width": "var(--atomix-spacing-0-5, 0.09375rem)",
2644
- "--atomix-glass-blend-mode": gradientIsOverLight ? "multiply" : "overlay",
2645
- // Dynamic gradients and backgrounds
2646
- // Note: RGB values use design token-aligned constants (white: 255,255,255; black: 0,0,0)
2647
- "--atomix-glass-border-gradient-1": `linear-gradient(${gradientBorderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${gradientBorderOpacity1}) ${gradientBorderStop1}%, rgba(${whiteColor}, ${gradientBorderOpacity2}) ${gradientBorderStop2}%, rgba(${whiteColor}, 0) 100%)`,
2648
- "--atomix-glass-border-gradient-2": `linear-gradient(${gradientBorderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${gradientBorderOpacity3}) ${gradientBorderStop1}%, rgba(${whiteColor}, ${gradientBorderOpacity4}) ${gradientBorderStop2}%, rgba(${whiteColor}, 0) 100%)`,
2649
- "--atomix-glass-hover-1-opacity": opacityValuesHover1,
2650
- "--atomix-glass-hover-1-gradient": gradientIsOverLight ? `radial-gradient(circle at ${gradientHover1X}% ${gradientHover1Y}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_START}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_STOP}%, rgba(0, 0, 0, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_END}%)` : `radial-gradient(circle at ${gradientHover1X}% ${gradientHover1Y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.WHITE_STOP}%)`,
2651
- "--atomix-glass-hover-2-opacity": opacityValuesHover2,
2652
- "--atomix-glass-hover-2-gradient": gradientIsOverLight ? `radial-gradient(circle at ${gradientHover2X}% ${gradientHover2Y}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_START}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_STOP}%, rgba(0, 0, 0, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_END}%)` : `radial-gradient(circle at ${gradientHover2X}% ${gradientHover2Y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.WHITE_STOP}%)`,
2653
- "--atomix-glass-hover-3-opacity": opacityValuesHover3,
2654
- "--atomix-glass-hover-3-gradient": gradientIsOverLight ? `radial-gradient(circle at ${gradientHover3X}% ${gradientHover3Y}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_START}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_STOP}%, rgba(0, 0, 0, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_END}%)` : `radial-gradient(circle at ${gradientHover3X}% ${gradientHover3Y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.WHITE_STOP}%)`,
2655
- "--atomix-glass-base-opacity": opacityValuesBase,
2656
- "--atomix-glass-base-gradient": gradientIsOverLight ? `linear-gradient(${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.ANGLE}deg, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_START_BASE + gradientMx * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_BASE + gradientMy * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_MULTIPLIER}) ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_STOP}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_END_BASE + Math.abs(gradientMx) * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_END_MULTIPLIER}) 100%)` : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.WHITE_OPACITY})`,
2657
- "--atomix-glass-overlay-opacity": opacityValuesOver,
2658
- "--atomix-glass-overlay-gradient": gradientIsOverLight ? `radial-gradient(circle at ${gradientBaseX}% ${gradientBaseY}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_BASE + Math.abs(gradientMx) * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID_STOP}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_BASE + Math.abs(gradientMy) * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_MULTIPLIER}) 100%)` : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.WHITE_OPACITY})`
2659
- };
2660
- }), [
2661
- // Position styles - only specific properties
2662
- positionStylesPosition, positionStylesTop, positionStylesLeft,
2663
- // Adjusted size - only specific properties
2664
- adjustedSizeWidth, adjustedSizeHeight,
2665
- // Base style - only transform property
2666
- baseStyleTransform, baseStylePosition,
2667
- // Other values
2668
- effectiveCornerRadius, effectiveReducedMotion,
2669
- // Gradient calculations - extracted properties
2670
- gradientIsOverLight, gradientMx, gradientMy, gradientBorderGradientAngle, gradientBorderStop1, gradientBorderStop2, gradientBorderOpacity1, gradientBorderOpacity2, gradientBorderOpacity3, gradientBorderOpacity4, gradientHover1X, gradientHover1Y, gradientHover2X, gradientHover2Y, gradientHover3X, gradientHover3Y, gradientBaseX, gradientBaseY,
2671
- // Opacity values - extracted properties
2672
- opacityValuesHover1, opacityValuesHover2, opacityValuesHover3, opacityValuesBase, opacityValuesOver ]);
2673
- // Build className with state modifiers
2674
- return jsxs("div", {
2559
+ }, componentClassName = [ ATOMIX_GLASS.BASE_CLASS, effectiveReducedMotion && `${ATOMIX_GLASS.BASE_CLASS}--reduced-motion`, effectiveHighContrast && `${ATOMIX_GLASS.BASE_CLASS}--high-contrast`, effectiveDisableEffects && `${ATOMIX_GLASS.BASE_CLASS}--disabled-effects`, className ].filter(Boolean).join(" "), positionStyles = {
2560
+ position: style.position || "absolute",
2561
+ top: style.top || 0,
2562
+ left: style.left || 0
2563
+ }, adjustedSize = {
2564
+ width: "fixed" !== style.position ? "100%" : style.width ? style.width : Math.max(glassSize.width, 0),
2565
+ height: "fixed" !== style.position ? "100%" : style.height ? style.height : Math.max(glassSize.height, 0)
2566
+ }, mx = mouseOffset.x, my = mouseOffset.y, GRADIENT = ATOMIX_GLASS.CONSTANTS.GRADIENT, borderGradientAngle = GRADIENT.BASE_ANGLE + mx * GRADIENT.ANGLE_MULTIPLIER, borderStop1 = Math.max(GRADIENT.BORDER_STOP_1.MIN, GRADIENT.BORDER_STOP_1.BASE + my * GRADIENT.BORDER_STOP_1.MULTIPLIER), borderStop2 = Math.min(GRADIENT.BORDER_STOP_2.MAX, GRADIENT.BORDER_STOP_2.BASE + my * GRADIENT.BORDER_STOP_2.MULTIPLIER), borderOpacity1 = GRADIENT.BORDER_OPACITY.BASE_1 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_LOW, borderOpacity2 = GRADIENT.BORDER_OPACITY.BASE_2 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_HIGH, borderOpacity3 = GRADIENT.BORDER_OPACITY.BASE_3 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_LOW, borderOpacity4 = GRADIENT.BORDER_OPACITY.BASE_4 + Math.abs(mx) * GRADIENT.BORDER_OPACITY.MULTIPLIER_HIGH, hover1X = GRADIENT.CENTER_POSITION + mx / GRADIENT.HOVER_POSITION.DIVISOR_1, hover1Y = GRADIENT.CENTER_POSITION + my / GRADIENT.HOVER_POSITION.DIVISOR_1, hover2X = GRADIENT.CENTER_POSITION + mx / GRADIENT.HOVER_POSITION.DIVISOR_2, hover2Y = GRADIENT.CENTER_POSITION + my / GRADIENT.HOVER_POSITION.DIVISOR_2, hover3X = GRADIENT.CENTER_POSITION + mx * GRADIENT.HOVER_POSITION.MULTIPLIER_3, hover3Y = GRADIENT.CENTER_POSITION + my * GRADIENT.HOVER_POSITION.MULTIPLIER_3, baseX = GRADIENT.CENTER_POSITION + mx * GRADIENT.BASE_LAYER_MULTIPLIER, baseY = GRADIENT.CENTER_POSITION + my * GRADIENT.BASE_LAYER_MULTIPLIER, overLightOpacity = overLightConfig.opacity, opacityValues = {
2567
+ hover1: isHovered || isActive ? .5 : 0,
2568
+ hover2: isActive ? .5 : 0,
2569
+ hover3: isHovered ? .4 : isActive ? .8 : 0,
2570
+ base: isOverLight ? overLightOpacity || .4 : 0,
2571
+ over: isOverLight ? 1.1 * (overLightOpacity || .4) : 0
2572
+ }, whiteColor = "255, 255, 255", glassVars = {
2573
+ // Standard CSS custom properties for dynamic values
2574
+ "--atomix-glass-radius": `${effectiveCornerRadius}px`,
2575
+ "--atomix-glass-transform": transformStyle || "none",
2576
+ "--atomix-glass-position": positionStyles.position,
2577
+ "--atomix-glass-top": "fixed" !== positionStyles.top ? `${positionStyles.top}px` : "0",
2578
+ "--atomix-glass-left": "fixed" !== positionStyles.left ? `${positionStyles.left}px` : "0",
2579
+ "--atomix-glass-width": "fixed" !== style.position ? adjustedSize.width : `${adjustedSize.width}px`,
2580
+ "--atomix-glass-height": "fixed" !== style.position ? adjustedSize.height : `${adjustedSize.height}px`,
2581
+ // Border width: Use spacing token for consistency
2582
+ "--atomix-glass-border-width": "var(--atomix-spacing-0-5, 0.09375rem)",
2583
+ "--atomix-glass-blend-mode": isOverLight ? "multiply" : "overlay",
2584
+ // Dynamic gradients and backgrounds
2585
+ "--atomix-glass-border-gradient-1": `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${borderOpacity1}) ${borderStop1}%, rgba(${whiteColor}, ${borderOpacity2}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
2586
+ "--atomix-glass-border-gradient-2": `linear-gradient(${borderGradientAngle}deg, rgba(${whiteColor}, 0) 0%, rgba(${whiteColor}, ${borderOpacity3}) ${borderStop1}%, rgba(${whiteColor}, ${borderOpacity4}) ${borderStop2}%, rgba(${whiteColor}, 0) 100%)`,
2587
+ "--atomix-glass-hover-1-opacity": opacityValues.hover1,
2588
+ "--atomix-glass-hover-1-gradient": isOverLight ? `radial-gradient(circle at ${hover1X}% ${hover1Y}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_START}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_STOP}%, rgba(0, 0, 0, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.BLACK_END}%)` : `radial-gradient(circle at ${hover1X}% ${hover1Y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_1.WHITE_STOP}%)`,
2589
+ "--atomix-glass-hover-2-opacity": opacityValues.hover2,
2590
+ "--atomix-glass-hover-2-gradient": isOverLight ? `radial-gradient(circle at ${hover2X}% ${hover2Y}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_START}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_STOP}%, rgba(0, 0, 0, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.BLACK_END}%)` : `radial-gradient(circle at ${hover2X}% ${hover2Y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_2.WHITE_STOP}%)`,
2591
+ "--atomix-glass-hover-3-opacity": opacityValues.hover3,
2592
+ "--atomix-glass-hover-3-gradient": isOverLight ? `radial-gradient(circle at ${hover3X}% ${hover3Y}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_START}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_STOP}%, rgba(0, 0, 0, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.BLACK_END}%)` : `radial-gradient(circle at ${hover3X}% ${hover3Y}%, rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.WHITE_START}) 0%, rgba(${whiteColor}, 0) ${ATOMIX_GLASS.CONSTANTS.GRADIENT_OPACITY.HOVER_3.WHITE_STOP}%)`,
2593
+ "--atomix-glass-base-opacity": opacityValues.base,
2594
+ "--atomix-glass-base-gradient": isOverLight ? `linear-gradient(${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.ANGLE}deg, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_START_BASE + mx * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_BASE + my * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_MULTIPLIER}) ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_MID_STOP}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_END_BASE + Math.abs(mx) * ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.BLACK_END_MULTIPLIER}) 100%)` : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.BASE_GRADIENT.WHITE_OPACITY})`,
2595
+ "--atomix-glass-overlay-opacity": opacityValues.over,
2596
+ "--atomix-glass-overlay-gradient": isOverLight ? `radial-gradient(circle at ${baseX}% ${baseY}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_BASE + Math.abs(mx) * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_START_MULTIPLIER}) 0%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID}) ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_MID_STOP}%, rgba(0, 0, 0, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_BASE + Math.abs(my) * ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.BLACK_END_MULTIPLIER}) 100%)` : `rgba(${whiteColor}, ${ATOMIX_GLASS.CONSTANTS.OVERLAY_GRADIENT.WHITE_OPACITY})`
2597
+ };
2598
+ return jsxs("div", {
2675
2599
  className: componentClassName,
2676
2600
  style: glassVars,
2677
2601
  role: role || (onClick ? "button" : void 0),
@@ -3175,16 +3099,8 @@ toolbarConfig: toolbarConfig, customToolbarActions: customToolbarActions, custom
3175
3099
  interactive: interactive,
3176
3100
  panEnabled: panEnabled
3177
3101
  });
3178
- // Legacy handlers for backward compatibility
3179
- useCallback((() => {
3180
- toolbarHandlers.onFullscreen(!toolbarState.isFullscreen);
3181
- }), [ toolbarHandlers, toolbarState.isFullscreen ]), useCallback((async format => {
3182
- await toolbarHandlers.onExport(format);
3183
- }), [ toolbarHandlers ]), useCallback((() => {
3184
- toolbarHandlers.onRefresh();
3185
- }), [ toolbarHandlers ]),
3186
3102
  // Sync all toolbar state with component state
3187
- useEffect((() => {
3103
+ useEffect((() => {
3188
3104
  setIsFullscreen(toolbarState.isFullscreen), setIsExporting(toolbarState.isExporting);
3189
3105
  }), [ toolbarState.isFullscreen, toolbarState.isExporting ]);
3190
3106
  // Render enhanced toolbar
@@ -4048,8 +3964,7 @@ const AreaChart = memo( forwardRef((({datasets: datasets = [], config: config =
4048
3964
  config: config,
4049
3965
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
4050
3966
  if (!renderedDatasets.length) return null;
4051
- // Use toolbar state if available, fallback to config for backward compatibility
4052
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0;
3967
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0;
4053
3968
  return jsxs(Fragment, {
4054
3969
  children: [ renderedDatasets.map(((dataset, datasetIndex) => {
4055
3970
  const color = dataset.color || colors[datasetIndex], data = dataset.data || [];
@@ -4249,8 +4164,7 @@ const BarChart = memo( forwardRef((({datasets: datasets = [], config: config =
4249
4164
  config: config,
4250
4165
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
4251
4166
  if (!renderedDatasets.length) return null;
4252
- // Use toolbar state if available, fallback to config for backward compatibility
4253
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, barDimensions = calculateBarDimensions(renderedDatasets, scales.width, scales.height, scales.padding, horizontal);
4167
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, barDimensions = calculateBarDimensions(renderedDatasets, scales.width, scales.height, scales.padding, horizontal);
4254
4168
  return jsxs(Fragment, {
4255
4169
  children: [ barDimensions.map(((bar, index) => {
4256
4170
  const dataset = renderedDatasets[bar.datasetIndex];
@@ -4309,8 +4223,7 @@ const BubbleChart = memo( forwardRef((({bubbleData: bubbleData = [], config: co
4309
4223
  config: config,
4310
4224
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
4311
4225
  if (!bubbleData.length) return null;
4312
- // Use toolbar state if available, fallback to config for backward compatibility
4313
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, sizeValues = bubbleData.map((b => b.size)), minSize = Math.min(...sizeValues), sizeRange = Math.max(...sizeValues) - minSize || 1, bubbles = bubbleData.map(((bubble, index) => {
4226
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, sizeValues = bubbleData.map((b => b.size)), minSize = Math.min(...sizeValues), sizeRange = Math.max(...sizeValues) - minSize || 1, bubbles = bubbleData.map(((bubble, index) => {
4314
4227
  // Calculate scaled size
4315
4228
  const scaledSize = minBubbleSize + (bubble.size - minSize) / sizeRange * (maxBubbleSize - minBubbleSize), x = scales.padding.left + bubble.x / 100 * scales.innerWidth, y = scales.padding.top + scales.innerHeight - bubble.y / 100 * scales.innerHeight;
4316
4229
  // Calculate position
@@ -4394,8 +4307,7 @@ const CandlestickChart = memo( forwardRef((({candlestickData: candlestickData =
4394
4307
  config: config,
4395
4308
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
4396
4309
  if (!candlestickData.length) return null;
4397
- // Use toolbar state if available, fallback to config for backward compatibility
4398
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? candlestickOptions.showTooltips ?? !0, chartWidth = scales.width - 80, chartHeight = scales.height - 80, volumeHeight = showVolume ? chartHeight * volumeHeightRatio : 0, priceHeight = chartHeight - volumeHeight, allHighs = candlestickData.map((d => d.high)), allLows = candlestickData.map((d => d.low)), priceMin = Math.min(...allLows), priceMax = Math.max(...allHighs), priceRange = priceMax - priceMin || 1, volumes = candlestickData.map((d => d.volume || 0)), volumeRange = Math.max(...volumes) || 1, gridLines = [];
4310
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? candlestickOptions.showTooltips ?? !0, chartWidth = scales.width - 80, chartHeight = scales.height - 80, volumeHeight = showVolume ? chartHeight * volumeHeightRatio : 0, priceHeight = chartHeight - volumeHeight, allHighs = candlestickData.map((d => d.high)), allLows = candlestickData.map((d => d.low)), priceMin = Math.min(...allLows), priceMax = Math.max(...allHighs), priceRange = priceMax - priceMin || 1, volumes = candlestickData.map((d => d.volume || 0)), volumeRange = Math.max(...volumes) || 1, gridLines = [];
4399
4311
  if (showGrid) {
4400
4312
  // Horizontal grid lines for price
4401
4313
  for (let i = 0; i <= 5; i++) {
@@ -4572,8 +4484,7 @@ const DonutChart = memo( forwardRef((({datasets: datasets = [], config: config
4572
4484
  percentage: point.value / total * 100
4573
4485
  };
4574
4486
  })), showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0;
4575
- // Use toolbar state if available, fallback to config for backward compatibility
4576
- return jsxs(Fragment, {
4487
+ return jsxs(Fragment, {
4577
4488
  children: [ slices.map(((slice, index) => {
4578
4489
  const isHovered = hoveredPoint?.pointIndex === index;
4579
4490
  return jsxs("g", {
@@ -4648,8 +4559,7 @@ const FunnelChart = memo( forwardRef((({funnelData: funnelData = [], config: co
4648
4559
  config: config,
4649
4560
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
4650
4561
  if (!funnelData.length) return null;
4651
- // Use toolbar state if available, fallback to config for backward compatibility
4652
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, chartWidth = scales.width - 120, chartHeight = scales.height - 120, maxValue = Math.max(...funnelData.map((d => d.value))), processedData = funnelData.map(((item, index) => {
4562
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, chartWidth = scales.width - 120, chartHeight = scales.height - 120, maxValue = Math.max(...funnelData.map((d => d.value))), processedData = funnelData.map(((item, index) => {
4653
4563
  const percentage = item.value / maxValue * 100, conversionRate = index > 0 && funnelData[index - 1] ? item.value / funnelData[index - 1].value * 100 : 100;
4654
4564
  return {
4655
4565
  ...item,
@@ -4767,8 +4677,7 @@ const GaugeChart = memo( forwardRef((({value: value, min: min = 0, max: max = 1
4767
4677
  const innerRadius = radius * (1 - thickness), x1 = centerX + radius * Math.cos(startAngle), y1 = centerY + radius * Math.sin(startAngle), x2 = centerX + radius * Math.cos(endAngle), y2 = centerY + radius * Math.sin(endAngle), x3 = centerX + innerRadius * Math.cos(endAngle), y3 = centerY + innerRadius * Math.sin(endAngle), x4 = centerX + innerRadius * Math.cos(startAngle), y4 = centerY + innerRadius * Math.sin(startAngle), largeArcFlag = Math.abs(endAngle - startAngle) > Math.PI ? 1 : 0, sweepFlag = endAngle > startAngle ? 1 : 0;
4768
4678
  return `M ${x1} ${y1} \n A ${radius} ${radius} 0 ${largeArcFlag} ${sweepFlag} ${x2} ${y2}\n L ${x3} ${y3}\n A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} ${1 - sweepFlag} ${x4} ${y4}\n Z`;
4769
4679
  }, zones = [];
4770
- // Use toolbar state if available, fallback to config for backward compatibility
4771
- for (const zone of colorZones) {
4680
+ for (const zone of colorZones) {
4772
4681
  const zoneStart = startAngleRad + (zone.from - min) / (max - min) * angleRange, zoneEnd = startAngleRad + (zone.to - min) / (max - min) * angleRange;
4773
4682
  zones.push(jsx("path", {
4774
4683
  d: createArcPath(centerX, centerY, radius, zoneStart, zoneEnd, thickness),
@@ -4942,8 +4851,7 @@ const colorSchemes = {
4942
4851
  config: config,
4943
4852
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
4944
4853
  const {matrix: matrix, xLabels: xLabels, yLabels: yLabels} = processedData, showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0;
4945
- // Use toolbar state if available, fallback to config for backward compatibility
4946
- if (!matrix.length) return null;
4854
+ if (!matrix.length) return null;
4947
4855
  const cellWidth = cellConfig.width || 40, cellHeight = cellConfig.height || 40, spacing = cellConfig.spacing || 2, borderRadius = cellConfig.borderRadius || 4;
4948
4856
  // Leave space for x-axis labels
4949
4857
  return xLabels.length, yLabels.length, jsxs(Fragment, {
@@ -5211,8 +5119,7 @@ const LineChart = memo( forwardRef((({datasets: datasets = [], config: config =
5211
5119
  config: config,
5212
5120
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
5213
5121
  if (!renderedDatasets.length) return null;
5214
- // Use toolbar state if available, fallback to config for backward compatibility
5215
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0;
5122
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0;
5216
5123
  return toolbarState?.animationsEnabled ?? renderConfig?.animate ?? mergedLineOptions.smooth,
5217
5124
  jsxs(Fragment, {
5218
5125
  children: [ renderedDatasets.map(((dataset, datasetIndex) => {
@@ -5300,8 +5207,7 @@ const MultiAxisChart = memo( forwardRef((({datasets: datasets = [], config: con
5300
5207
  config: config,
5301
5208
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
5302
5209
  if (!datasets.length) return null;
5303
- // Use toolbar state if available, fallback to config for backward compatibility
5304
- const effectiveShowGrid = toolbarState?.showGrid ?? !0, chartWidth = scales.width - 120, chartHeight = scales.height - 120, yAxisConfigs = yAxes.length ? yAxes : [ {
5210
+ const effectiveShowGrid = toolbarState?.showGrid ?? !0, chartWidth = scales.width - 120, chartHeight = scales.height - 120, yAxisConfigs = yAxes.length ? yAxes : [ {
5305
5211
  id: "y-axis-1",
5306
5212
  position: "left",
5307
5213
  label: "Y Axis"
@@ -5599,8 +5505,7 @@ const RadarChart = memo( forwardRef((({datasets: datasets = [], config: config
5599
5505
  config: config,
5600
5506
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
5601
5507
  if (!renderedDatasets.length) return null;
5602
- // Use toolbar state if available, fallback to config for backward compatibility
5603
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, centerX = scales.width / 2, centerY = scales.height / 2, radius = .8 * Math.min(centerX, centerY), firstDataset = renderedDatasets[0];
5508
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, centerX = scales.width / 2, centerY = scales.height / 2, radius = .8 * Math.min(centerX, centerY), firstDataset = renderedDatasets[0];
5604
5509
  if (!firstDataset) return null;
5605
5510
  const dataPoints = firstDataset.data || [], angleStep = 2 * Math.PI / dataPoints.length;
5606
5511
  // Calculate value bounds
@@ -5746,8 +5651,7 @@ const ScatterChart = memo( forwardRef((({datasets: datasets = [], config: confi
5746
5651
  config: config,
5747
5652
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
5748
5653
  if (!renderedDatasets.length) return null;
5749
- // Use toolbar state if available, fallback to config for backward compatibility
5750
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, points = [];
5654
+ const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? !0, points = [];
5751
5655
  return renderedDatasets.forEach(((dataset, datasetIndex) => {
5752
5656
  const color = dataset.color || colors[datasetIndex % colors.length];
5753
5657
  dataset.data?.forEach(((point, pointIndex) => {
@@ -6034,8 +5938,7 @@ const WaterfallChart = memo( forwardRef((({waterfallData: waterfallData = [], c
6034
5938
  config: config,
6035
5939
  renderContent: ({scales: scales, colors: colors, datasets: renderedDatasets, handlers: handlers, hoveredPoint: hoveredPoint, toolbarState: toolbarState, config: renderConfig}) => {
6036
5940
  if (!waterfallData.length) return null;
6037
- // Use toolbar state if available, fallback to config for backward compatibility
6038
- const shouldAnimate = toolbarState?.animationsEnabled ?? renderConfig?.animate ?? animate, chartWidth = scales.width - 120, chartHeight = scales.height - 120;
5941
+ const shouldAnimate = toolbarState?.animationsEnabled ?? renderConfig?.animate ?? animate, chartWidth = scales.width - 120, chartHeight = scales.height - 120;
6039
5942
  // Calculate cumulative values and positions
6040
5943
  let cumulativeValue = 0;
6041
5944
  const processedData = waterfallData.map(((item, index) => {