@shohojdhara/atomix 0.3.15 → 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 (245) hide show
  1. package/build-tools/index.d.ts +31 -30
  2. package/build-tools/package.json +4 -21
  3. package/dist/atomix.css +20924 -2611
  4. package/dist/atomix.css.map +1 -1
  5. package/dist/atomix.min.css +76 -2
  6. package/dist/atomix.min.css.map +1 -1
  7. package/dist/build-tools/index.d.ts +31 -30
  8. package/dist/build-tools/package.json +4 -21
  9. package/dist/charts.js.map +1 -1
  10. package/dist/core.js.map +1 -1
  11. package/dist/forms.js.map +1 -1
  12. package/dist/heavy.js.map +1 -1
  13. package/dist/index.d.ts +144 -18
  14. package/dist/index.esm.js +110 -55
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +110 -55
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +1 -1
  20. package/dist/layout.js.map +1 -1
  21. package/dist/theme.d.ts +9 -9
  22. package/dist/theme.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/Accordion/Accordion.stories.tsx +32 -23
  25. package/src/components/Accordion/Accordion.test.tsx +70 -50
  26. package/src/components/Accordion/Accordion.tsx +99 -94
  27. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  28. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  29. package/src/components/AtomixGlass/glass-utils.ts +4 -3
  30. package/src/components/AtomixGlass/shader-utils.ts +128 -52
  31. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1 -1
  32. package/src/components/AtomixGlass/stories/Shaders.stories.tsx +1 -1
  33. package/src/components/Avatar/Avatar.stories.tsx +45 -62
  34. package/src/components/Avatar/Avatar.tsx +58 -56
  35. package/src/components/Badge/Badge.stories.tsx +20 -9
  36. package/src/components/Badge/Badge.test.tsx +41 -41
  37. package/src/components/Badge/Badge.tsx +64 -62
  38. package/src/components/Block/Block.stories.tsx +14 -4
  39. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +9 -8
  40. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  41. package/src/components/Button/Button.stories.tsx +13 -22
  42. package/src/components/Button/Button.test.tsx +97 -81
  43. package/src/components/Button/Button.tsx +46 -14
  44. package/src/components/Button/ButtonGroup.stories.tsx +37 -32
  45. package/src/components/Button/ButtonGroup.tsx +4 -15
  46. package/src/components/Callout/Callout.stories.tsx +109 -16
  47. package/src/components/Card/Card.stories.tsx +67 -36
  48. package/src/components/Card/Card.tsx +30 -14
  49. package/src/components/Chart/AreaChart.tsx +1 -1
  50. package/src/components/Chart/CandlestickChart.tsx +23 -16
  51. package/src/components/Chart/Chart.stories.tsx +4 -9
  52. package/src/components/Chart/Chart.tsx +40 -44
  53. package/src/components/Chart/ChartRenderer.tsx +39 -12
  54. package/src/components/Chart/ChartToolbar.tsx +21 -5
  55. package/src/components/Chart/DonutChart.tsx +1 -1
  56. package/src/components/Chart/FunnelChart.tsx +4 -1
  57. package/src/components/Chart/GaugeChart.tsx +3 -1
  58. package/src/components/Chart/HeatmapChart.tsx +50 -37
  59. package/src/components/Chart/LineChart.tsx +3 -2
  60. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  61. package/src/components/Chart/RadarChart.tsx +19 -17
  62. package/src/components/Chart/ScatterChart.tsx +29 -21
  63. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -2
  64. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  65. package/src/components/Countdown/Countdown.stories.tsx +7 -7
  66. package/src/components/DataTable/DataTable.stories.tsx +43 -38
  67. package/src/components/DataTable/DataTable.test.tsx +26 -148
  68. package/src/components/DataTable/DataTable.tsx +485 -456
  69. package/src/components/DatePicker/DatePicker.stories.tsx +32 -47
  70. package/src/components/DatePicker/DatePicker.tsx +31 -26
  71. package/src/components/Dropdown/Dropdown.stories.tsx +2 -5
  72. package/src/components/Dropdown/Dropdown.tsx +313 -299
  73. package/src/components/EdgePanel/EdgePanel.stories.tsx +6 -19
  74. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  75. package/src/components/Footer/Footer.stories.tsx +21 -16
  76. package/src/components/Footer/Footer.tsx +130 -128
  77. package/src/components/Footer/FooterLink.tsx +2 -2
  78. package/src/components/Form/Checkbox.test.tsx +49 -49
  79. package/src/components/Form/Checkbox.tsx +108 -100
  80. package/src/components/Form/Form.stories.tsx +2 -10
  81. package/src/components/Form/Input.stories.tsx +22 -39
  82. package/src/components/Form/Input.test.tsx +38 -44
  83. package/src/components/Form/Radio.stories.tsx +6 -12
  84. package/src/components/Form/Radio.tsx +68 -66
  85. package/src/components/Form/Select.tsx +184 -182
  86. package/src/components/Form/Textarea.test.tsx +27 -32
  87. package/src/components/Hero/Hero.stories.tsx +56 -23
  88. package/src/components/Hero/Hero.tsx +201 -55
  89. package/src/components/Icon/index.ts +7 -1
  90. package/src/components/List/List.tsx +19 -23
  91. package/src/components/Modal/Modal.stories.tsx +2 -1
  92. package/src/components/Modal/Modal.tsx +130 -127
  93. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  94. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  95. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  96. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  97. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  98. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  99. package/src/components/Pagination/Pagination.tsx +199 -202
  100. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  101. package/src/components/Popover/Popover.stories.tsx +99 -192
  102. package/src/components/Popover/Popover.tsx +41 -37
  103. package/src/components/Progress/Progress.stories.tsx +35 -44
  104. package/src/components/River/River.stories.tsx +2 -1
  105. package/src/components/SectionIntro/SectionIntro.stories.tsx +71 -71
  106. package/src/components/Slider/Slider.stories.tsx +12 -4
  107. package/src/components/Spinner/Spinner.stories.tsx +3 -1
  108. package/src/components/Spinner/Spinner.test.tsx +23 -23
  109. package/src/components/Spinner/Spinner.tsx +43 -46
  110. package/src/components/Steps/Steps.stories.tsx +8 -6
  111. package/src/components/Tabs/Tabs.stories.tsx +12 -9
  112. package/src/components/Tabs/Tabs.tsx +74 -72
  113. package/src/components/Toggle/Toggle.stories.tsx +27 -13
  114. package/src/components/Toggle/Toggle.test.tsx +65 -70
  115. package/src/components/Toggle/Toggle.tsx +4 -1
  116. package/src/components/Tooltip/Tooltip.stories.tsx +24 -20
  117. package/src/components/Tooltip/Tooltip.tsx +104 -106
  118. package/src/components/Upload/Upload.stories.tsx +129 -127
  119. package/src/components/Upload/Upload.tsx +287 -283
  120. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  121. package/src/components/index.ts +13 -2
  122. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  123. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  124. package/src/lib/__tests__/theme-tools.test.ts +32 -6
  125. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  126. package/src/lib/composables/useAtomixGlass.ts +106 -49
  127. package/src/lib/composables/useChartExport.ts +1 -1
  128. package/src/lib/composables/useDataTable.ts +29 -17
  129. package/src/lib/composables/useHero.ts +58 -14
  130. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  131. package/src/lib/composables/useInput.ts +10 -8
  132. package/src/lib/composables/useSideMenu.ts +6 -5
  133. package/src/lib/composables/useTooltip.ts +1 -2
  134. package/src/lib/composables/useVideoPlayer.ts +44 -35
  135. package/src/lib/config/index.ts +154 -154
  136. package/src/lib/constants/cssVariables.ts +29 -29
  137. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  138. package/src/lib/hooks/index.ts +1 -1
  139. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  140. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  141. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  142. package/src/lib/patterns/index.ts +1 -1
  143. package/src/lib/patterns/slots.tsx +8 -13
  144. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  145. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  146. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  147. package/src/lib/storybook/index.ts +1 -1
  148. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  149. package/src/lib/theme/adapters/index.ts +3 -9
  150. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  151. package/src/lib/theme/config/index.ts +1 -1
  152. package/src/lib/theme/config/types.ts +2 -2
  153. package/src/lib/theme/config/validator.ts +10 -5
  154. package/src/lib/theme/constants/constants.ts +2 -2
  155. package/src/lib/theme/constants/index.ts +1 -2
  156. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  157. package/src/lib/theme/core/composeTheme.ts +32 -26
  158. package/src/lib/theme/core/createTheme.ts +1 -1
  159. package/src/lib/theme/core/createThemeObject.ts +308 -301
  160. package/src/lib/theme/core/index.ts +3 -3
  161. package/src/lib/theme/devtools/CLI.ts +106 -104
  162. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  163. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  164. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  165. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  166. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  167. package/src/lib/theme/devtools/Preview.tsx +150 -106
  168. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  169. package/src/lib/theme/devtools/index.ts +3 -9
  170. package/src/lib/theme/devtools/useHistory.ts +23 -21
  171. package/src/lib/theme/errors/errors.ts +12 -11
  172. package/src/lib/theme/errors/index.ts +2 -7
  173. package/src/lib/theme/generators/generateCSS.ts +9 -13
  174. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  175. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  176. package/src/lib/theme/generators/index.ts +1 -4
  177. package/src/lib/theme/i18n/index.ts +1 -1
  178. package/src/lib/theme/i18n/rtl.ts +13 -13
  179. package/src/lib/theme/index.ts +7 -16
  180. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  181. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  182. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  183. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  184. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  185. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  186. package/src/lib/theme/runtime/index.ts +2 -5
  187. package/src/lib/theme/runtime/useTheme.ts +18 -18
  188. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  189. package/src/lib/theme/test/testTheme.ts +15 -16
  190. package/src/lib/theme/tokens/index.ts +2 -7
  191. package/src/lib/theme/tokens/tokens.ts +25 -24
  192. package/src/lib/theme/types.ts +428 -411
  193. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  194. package/src/lib/theme/utils/componentTheming.ts +18 -18
  195. package/src/lib/theme/utils/domUtils.ts +277 -289
  196. package/src/lib/theme/utils/index.ts +1 -2
  197. package/src/lib/theme/utils/injectCSS.ts +10 -14
  198. package/src/lib/theme/utils/naming.ts +20 -16
  199. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  200. package/src/lib/theme/utils/themeUtils.ts +85 -86
  201. package/src/lib/theme/utils/themeValidation.ts +82 -33
  202. package/src/lib/theme-tools.ts +8 -6
  203. package/src/lib/types/components.ts +172 -71
  204. package/src/lib/types/partProps.ts +1 -1
  205. package/src/lib/utils/__tests__/csv.test.ts +1 -1
  206. package/src/lib/utils/componentUtils.ts +8 -12
  207. package/src/lib/utils/csv.ts +3 -1
  208. package/src/lib/utils/dataTableExport.ts +1 -5
  209. package/src/lib/utils/fontPreloader.ts +10 -19
  210. package/src/lib/utils/icons.ts +4 -1
  211. package/src/lib/utils/index.ts +2 -6
  212. package/src/lib/utils/memoryMonitor.ts +10 -8
  213. package/src/lib/utils/themeNaming.ts +2 -2
  214. package/src/styles/01-settings/_index.scss +0 -1
  215. package/src/styles/01-settings/_settings.colors.scss +8 -8
  216. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  217. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  218. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  219. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  220. package/src/styles/01-settings/_settings.typography.scss +1 -1
  221. package/src/styles/02-tools/_tools.button.scss +51 -21
  222. package/src/styles/02-tools/_tools.utility-api.scss +30 -18
  223. package/src/styles/03-generic/_generic.root.scss +4 -3
  224. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  225. package/src/styles/06-components/_components.button.scss +16 -4
  226. package/src/styles/06-components/_components.callout.scss +27 -21
  227. package/src/styles/06-components/_components.card.scss +5 -14
  228. package/src/styles/06-components/_components.chart.scss +22 -19
  229. package/src/styles/06-components/_components.checkbox.scss +3 -1
  230. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  231. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  232. package/src/styles/06-components/_components.footer.scss +1 -1
  233. package/src/styles/06-components/_components.side-menu.scss +5 -5
  234. package/src/styles/06-components/_components.toggle.scss +18 -0
  235. package/src/styles/06-components/_index.scss +1 -1
  236. package/src/styles/06-components/old.chart.styles.scss +0 -2
  237. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  238. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  239. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  240. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  241. package/src/styles/99-utilities/_utilities.scss +1 -1
  242. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  243. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  244. package/src/styles/99-utilities/_utilities.text-gradient.scss +30 -30
  245. package/src/styles/99-utilities/_utilities.text.scss +67 -46
@@ -351,57 +351,53 @@ const Chart = memo(
351
351
  tabIndex={0}
352
352
  {...props}
353
353
  >
354
- {(title || subtitle || showToolbar) && (
355
- <div
356
- className={`${CHART.HEADER_CLASS} u-flex u-justify-between u-items-start u-gap-4`}
357
- >
358
- <div className={`${CHART.HEADER_CONTENT_CLASS} u-flex-1`}>
359
- {title && <h3 className={`${CHART.TITLE_CLASS} u-mb-1`}>{title}</h3>}
360
- {subtitle && <p className={`${CHART.SUBTITLE_CLASS} u-mb-0`}>{subtitle}</p>}
361
- </div>
362
- {renderToolbar()}
354
+ {(title || subtitle || showToolbar) && (
355
+ <div className={`${CHART.HEADER_CLASS} u-flex u-justify-between u-items-start u-gap-4`}>
356
+ <div className={`${CHART.HEADER_CONTENT_CLASS} u-flex-1`}>
357
+ {title && <h3 className={`${CHART.TITLE_CLASS} u-mb-1`}>{title}</h3>}
358
+ {subtitle && <p className={`${CHART.SUBTITLE_CLASS} u-mb-0`}>{subtitle}</p>}
359
+ </div>
360
+ {renderToolbar()}
361
+ </div>
362
+ )}
363
+
364
+ <div className={CHART.CONTENT_CLASS}>
365
+ {loading && (
366
+ <div className={CHART.LOADING_CLASS}>
367
+ <div className={CHART.LOADING_SPINNER_CLASS}></div>
368
+ <span className={CHART.LOADING_TEXT_CLASS}>
369
+ {toolbarState.isExporting
370
+ ? 'Exporting chart...'
371
+ : toolbarState.isRefreshing
372
+ ? 'Refreshing chart...'
373
+ : 'Loading chart...'}
374
+ </span>
363
375
  </div>
364
376
  )}
365
377
 
366
- <div className={CHART.CONTENT_CLASS}>
367
- {loading && (
368
- <div className={CHART.LOADING_CLASS}>
369
- <div className={CHART.LOADING_SPINNER_CLASS}></div>
370
- <span className={CHART.LOADING_TEXT_CLASS}>
371
- {toolbarState.isExporting
372
- ? 'Exporting chart...'
373
- : toolbarState.isRefreshing
374
- ? 'Refreshing chart...'
375
- : 'Loading chart...'}
376
- </span>
378
+ {error && (
379
+ <div className={CHART.ERROR_CLASS}>
380
+ <div className={CHART.ERROR_ICON_CLASS}>⚠</div>
381
+ <div className={CHART.ERROR_CONTENT_CLASS}>
382
+ <div className={CHART.ERROR_MESSAGE_CLASS}>Chart Error</div>
383
+ <div className={CHART.ERROR_DETAILS_CLASS}>{error}</div>
377
384
  </div>
378
- )}
379
-
380
- {error && (
381
- <div className={CHART.ERROR_CLASS}>
382
- <div className={CHART.ERROR_ICON_CLASS}>⚠</div>
383
- <div className={CHART.ERROR_CONTENT_CLASS}>
384
- <div className={CHART.ERROR_MESSAGE_CLASS}>Chart Error</div>
385
- <div className={CHART.ERROR_DETAILS_CLASS}>{error}</div>
386
- </div>
387
- </div>
388
- )}
389
-
390
- {!loading && !error && !children && (
391
- <div className={CHART.EMPTY_CLASS}>
392
- <div className={CHART.EMPTY_ICON_CLASS}>📊</div>
393
- <div className={CHART.EMPTY_MESSAGE_CLASS}>No data available</div>
394
- <div className={CHART.EMPTY_DETAILS_CLASS}>
395
- Add data to your chart to see visualizations
396
- </div>
385
+ </div>
386
+ )}
387
+
388
+ {!loading && !error && !children && (
389
+ <div className={CHART.EMPTY_CLASS}>
390
+ <div className={CHART.EMPTY_ICON_CLASS}>📊</div>
391
+ <div className={CHART.EMPTY_MESSAGE_CLASS}>No data available</div>
392
+ <div className={CHART.EMPTY_DETAILS_CLASS}>
393
+ Add data to your chart to see visualizations
397
394
  </div>
398
- )}
395
+ </div>
396
+ )}
399
397
 
400
- {!loading && !error && children && (
401
- <div className={CHART.CANVAS_CLASS}>{children}</div>
402
- )}
403
- </div>
398
+ {!loading && !error && children && <div className={CHART.CANVAS_CLASS}>{children}</div>}
404
399
  </div>
400
+ </div>
405
401
  );
406
402
 
407
403
  // Wrap with AtomixGlass if glass is enabled
@@ -1,4 +1,13 @@
1
- import { forwardRef, memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
1
+ import {
2
+ forwardRef,
3
+ memo,
4
+ useCallback,
5
+ useContext,
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ } from 'react';
2
11
  import {
3
12
  useChart,
4
13
  useChartAccessibility,
@@ -88,7 +97,7 @@ const ChartRenderer = memo(
88
97
  const svgRef = useRef<SVGSVGElement>(null);
89
98
  const containerRef = useRef<HTMLDivElement>(null);
90
99
  const [isInitialized, setIsInitialized] = useState(false);
91
-
100
+
92
101
  // Responsive dimensions state - initialize with 0 to prevent layout shifts
93
102
  const [dimensions, setDimensions] = useState({
94
103
  width: 0,
@@ -121,7 +130,7 @@ const ChartRenderer = memo(
121
130
  });
122
131
 
123
132
  // Use ResizeObserver to track container size changes
124
- const resizeObserver = new ResizeObserver((entries) => {
133
+ const resizeObserver = new ResizeObserver(entries => {
125
134
  for (const entry of entries) {
126
135
  const { width: containerWidth, height: containerHeight } = entry.contentRect;
127
136
  if (containerWidth > 0 && containerHeight > 0) {
@@ -274,7 +283,13 @@ const ChartRenderer = memo(
274
283
  return null;
275
284
  }
276
285
 
277
- const scales = calculateScales(processedData, dimensions.width, dimensions.height, undefined, config);
286
+ const scales = calculateScales(
287
+ processedData,
288
+ dimensions.width,
289
+ dimensions.height,
290
+ undefined,
291
+ config
292
+ );
278
293
  if (!scales) return null;
279
294
 
280
295
  const colors = getChartColors(processedData.length).filter(
@@ -289,7 +304,15 @@ const ChartRenderer = memo(
289
304
  color: dataset.color || colors[i],
290
305
  })),
291
306
  };
292
- }, [processedData, config, dimensions.width, dimensions.height, isInitialized, calculateScales, getChartColors]);
307
+ }, [
308
+ processedData,
309
+ config,
310
+ dimensions.width,
311
+ dimensions.height,
312
+ isInitialized,
313
+ calculateScales,
314
+ getChartColors,
315
+ ]);
293
316
 
294
317
  useEffect(() => {
295
318
  return () => {
@@ -335,12 +358,12 @@ const ChartRenderer = memo(
335
358
  // Don't render until dimensions are initialized to prevent layout shifts
336
359
  if (!isInitialized || dimensions.width === 0 || dimensions.height === 0) {
337
360
  return (
338
- <div
339
- ref={containerRef}
340
- className={CHART.CANVAS_CLASS}
341
- style={{
342
- width: '100%',
343
- height: '100%',
361
+ <div
362
+ ref={containerRef}
363
+ className={CHART.CANVAS_CLASS}
364
+ style={{
365
+ width: '100%',
366
+ height: '100%',
344
367
  minHeight: '200px',
345
368
  display: 'flex',
346
369
  alignItems: 'center',
@@ -359,7 +382,11 @@ const ChartRenderer = memo(
359
382
 
360
383
  return (
361
384
  <>
362
- <div ref={containerRef} className={CHART.CANVAS_CLASS} style={{ width: '100%', height: '100%' }}>
385
+ <div
386
+ ref={containerRef}
387
+ className={CHART.CANVAS_CLASS}
388
+ style={{ width: '100%', height: '100%' }}
389
+ >
363
390
  <svg
364
391
  ref={svgRef}
365
392
  width={svgWidth}
@@ -569,14 +569,20 @@ const ChartToolbar = memo(
569
569
  onRefresh?.();
570
570
  break;
571
571
  default:
572
- console.warn(`No handler found for action: ${String(action.id).replace(/[\r\n\t]/g, '')}`);
572
+ console.warn(
573
+ `No handler found for action: ${String(action.id).replace(/[\r\n\t]/g, '')}`
574
+ );
573
575
  }
574
576
  }
575
577
  }
576
578
  };
577
579
 
578
580
  const buttonRef =
579
- action.id === 'export' ? exportButtonRef : action.id === 'settings' ? settingsButtonRef : null;
581
+ action.id === 'export'
582
+ ? exportButtonRef
583
+ : action.id === 'settings'
584
+ ? settingsButtonRef
585
+ : null;
580
586
 
581
587
  return (
582
588
  <button
@@ -589,7 +595,13 @@ const ChartToolbar = memo(
589
595
  type="button"
590
596
  aria-label={action.label}
591
597
  aria-pressed={action.active ? 'true' : 'false'}
592
- aria-expanded={action.id === 'export' ? showExportMenu : action.id === 'settings' ? showSettingsMenu : undefined}
598
+ aria-expanded={
599
+ action.id === 'export'
600
+ ? showExportMenu
601
+ : action.id === 'settings'
602
+ ? showSettingsMenu
603
+ : undefined
604
+ }
593
605
  >
594
606
  <Icon name={action.icon} size="sm" />
595
607
  {size === 'lg' && <span className={`${CHART.ACTION_CLASS}-label`}>{action.label}</span>}
@@ -698,14 +710,18 @@ const ChartToolbar = memo(
698
710
 
699
711
  {/* Info items */}
700
712
  {state.zoomLevel !== undefined && (
701
- <div className={`${CHART.SETTINGS_MENU_CLASS}-item ${CHART.SETTINGS_MENU_CLASS}-item--info`}>
713
+ <div
714
+ className={`${CHART.SETTINGS_MENU_CLASS}-item ${CHART.SETTINGS_MENU_CLASS}-item--info`}
715
+ >
702
716
  <span className={`${CHART.SETTINGS_MENU_CLASS}-label`}>Zoom Level</span>
703
717
  <span className={`${CHART.SETTINGS_MENU_CLASS}-value`}>
704
718
  {Math.round((state.zoomLevel || 1) * 100)}%
705
719
  </span>
706
720
  </div>
707
721
  )}
708
- <div className={`${CHART.SETTINGS_MENU_CLASS}-item ${CHART.SETTINGS_MENU_CLASS}-item--info`}>
722
+ <div
723
+ className={`${CHART.SETTINGS_MENU_CLASS}-item ${CHART.SETTINGS_MENU_CLASS}-item--info`}
724
+ >
709
725
  <span className={`${CHART.SETTINGS_MENU_CLASS}-label`}>Chart Type</span>
710
726
  <span className={`${CHART.SETTINGS_MENU_CLASS}-value`}>{chartType}</span>
711
727
  </div>
@@ -125,7 +125,7 @@ const DonutChart = memo(
125
125
  // Calculate angles for each slice
126
126
  const padAngleRad = ((pieOptions.padAngle || 1) * Math.PI) / 180;
127
127
  let currentAngle = ((pieOptions.startAngle || 0) * Math.PI) / 180;
128
-
128
+
129
129
  const slices = chartData.validDataPoints.map((point, index) => {
130
130
  const percentage = point.value / total;
131
131
  const sliceAngle = percentage * (2 * Math.PI) - padAngleRad;
@@ -282,7 +282,10 @@ const FunnelChart = memo(
282
282
  <ChartTooltip
283
283
  dataPoint={funnelData[hoveredPoint.pointIndex]!}
284
284
  datasetLabel="Funnel Data"
285
- datasetColor={funnelData[hoveredPoint.pointIndex]?.color || colors[hoveredPoint.pointIndex % colors.length]}
285
+ datasetColor={
286
+ funnelData[hoveredPoint.pointIndex]?.color ||
287
+ colors[hoveredPoint.pointIndex % colors.length]
288
+ }
286
289
  position={{
287
290
  x: hoveredPoint.clientX,
288
291
  y: hoveredPoint.clientY,
@@ -335,7 +335,9 @@ const GaugeChart = memo(
335
335
  d={createArcPath(centerX, centerY, radius, startAngleRad, valueAngle, thickness)}
336
336
  fill="var(--atomix-brand-bg-subtle)"
337
337
  style={{
338
- transition: shouldAnimate ? `all ${animationDuration}ms ${animationEasing}` : 'none',
338
+ transition: shouldAnimate
339
+ ? `all ${animationDuration}ms ${animationEasing}`
340
+ : 'none',
339
341
  }}
340
342
  />
341
343
 
@@ -288,21 +288,28 @@ const HeatmapChart = memo(
288
288
  <g>
289
289
  {/* Gradient definitions */}
290
290
  <defs>
291
- {showColorLegend && (() => {
292
- const schemeColors = colorSchemes[colorScale.scheme] || colorSchemes.viridis;
293
- if (!schemeColors || schemeColors.length === 0) return null;
294
- return (
295
- <linearGradient id="heatmap-legend-gradient" x1="0%" y1="100%" x2="0%" y2="0%">
296
- {schemeColors.map((color, i) => (
297
- <stop
298
- key={i}
299
- offset={`${(i / (schemeColors.length - 1)) * 100}%`}
300
- stopColor={color}
301
- />
302
- ))}
303
- </linearGradient>
304
- );
305
- })()}
291
+ {showColorLegend &&
292
+ (() => {
293
+ const schemeColors = colorSchemes[colorScale.scheme] || colorSchemes.viridis;
294
+ if (!schemeColors || schemeColors.length === 0) return null;
295
+ return (
296
+ <linearGradient
297
+ id="heatmap-legend-gradient"
298
+ x1="0%"
299
+ y1="100%"
300
+ x2="0%"
301
+ y2="0%"
302
+ >
303
+ {schemeColors.map((color, i) => (
304
+ <stop
305
+ key={i}
306
+ offset={`${(i / (schemeColors.length - 1)) * 100}%`}
307
+ stopColor={color}
308
+ />
309
+ ))}
310
+ </linearGradient>
311
+ );
312
+ })()}
306
313
  </defs>
307
314
 
308
315
  {/* Grid cells */}
@@ -333,11 +340,15 @@ const HeatmapChart = memo(
333
340
  }}
334
341
  onClick={() => {
335
342
  if (cell) {
336
- handlers.onDataPointClick?.({
337
- ...cell,
338
- label: cell.label || `${cell.x}, ${cell.y}`,
339
- value: cell.value,
340
- } as any, rowIndex, colIndex);
343
+ handlers.onDataPointClick?.(
344
+ {
345
+ ...cell,
346
+ label: cell.label || `${cell.x}, ${cell.y}`,
347
+ value: cell.value,
348
+ } as any,
349
+ rowIndex,
350
+ colIndex
351
+ );
341
352
  }
342
353
  }}
343
354
  onMouseEnter={e => {
@@ -422,23 +433,25 @@ const HeatmapChart = memo(
422
433
  </g>
423
434
  )}
424
435
  </g>
425
- {showTooltips && hoveredPoint && renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && (
426
- <ChartTooltip
427
- dataPoint={
428
- renderedDatasets[hoveredPoint.datasetIndex]!.data![hoveredPoint.pointIndex]!
429
- }
430
- datasetLabel={renderedDatasets[hoveredPoint.datasetIndex]?.label}
431
- datasetColor={
432
- renderedDatasets[hoveredPoint.datasetIndex]?.color ||
433
- colors[hoveredPoint.datasetIndex % colors.length]
434
- }
435
- position={{
436
- x: hoveredPoint.clientX,
437
- y: hoveredPoint.clientY,
438
- }}
439
- visible={true}
440
- />
441
- )}
436
+ {showTooltips &&
437
+ hoveredPoint &&
438
+ renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && (
439
+ <ChartTooltip
440
+ dataPoint={
441
+ renderedDatasets[hoveredPoint.datasetIndex]!.data![hoveredPoint.pointIndex]!
442
+ }
443
+ datasetLabel={renderedDatasets[hoveredPoint.datasetIndex]?.label}
444
+ datasetColor={
445
+ renderedDatasets[hoveredPoint.datasetIndex]?.color ||
446
+ colors[hoveredPoint.datasetIndex % colors.length]
447
+ }
448
+ position={{
449
+ x: hoveredPoint.clientX,
450
+ y: hoveredPoint.clientY,
451
+ }}
452
+ visible={true}
453
+ />
454
+ )}
442
455
  </>
443
456
  );
444
457
  };
@@ -81,7 +81,8 @@ const LineChart = memo(
81
81
  if (!renderedDatasets.length) return null;
82
82
 
83
83
  const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? true;
84
- const shouldAnimate = toolbarState?.animationsEnabled ?? renderConfig?.animate ?? mergedLineOptions.smooth;
84
+ const shouldAnimate =
85
+ toolbarState?.animationsEnabled ?? renderConfig?.animate ?? mergedLineOptions.smooth;
85
86
 
86
87
  return (
87
88
  <>
@@ -101,7 +102,7 @@ const LineChart = memo(
101
102
  // Generate line path - ensure proper SVG path format
102
103
  const path = mergedLineOptions.smooth
103
104
  ? generateSmoothPath(points)
104
- : `M ${points.map((p) => `${p.x},${p.y}`).join(' L ')}`;
105
+ : `M ${points.map(p => `${p.x},${p.y}`).join(' L ')}`;
105
106
 
106
107
  return (
107
108
  <g key={`dataset-${datasetIndex}`}>
@@ -164,7 +164,8 @@ const MultiAxisChart = memo(
164
164
  }: ChartRenderContentParams) => {
165
165
  if (!datasets.length) return null;
166
166
 
167
- const effectiveShowTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? showTooltips ?? true;
167
+ const effectiveShowTooltips =
168
+ toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? showTooltips ?? true;
168
169
  const effectiveShowGrid = toolbarState?.showGrid ?? true; // Grid visibility from toolbar
169
170
 
170
171
  const padding = 60;
@@ -221,19 +222,19 @@ const MultiAxisChart = memo(
221
222
 
222
223
  // Draw grid lines
223
224
  if (effectiveShowGrid) {
224
- for (let i = 0; i <= 5; i++) {
225
- const y = padding + (i / 5) * chartHeight;
226
- elements.push(
227
- <line
228
- key={`grid-${i}`}
229
- x1={padding}
230
- y1={y}
231
- x2={padding + chartWidth}
232
- y2={y}
233
- className="c-chart__grid"
234
- />
235
- );
236
- }
225
+ for (let i = 0; i <= 5; i++) {
226
+ const y = padding + (i / 5) * chartHeight;
227
+ elements.push(
228
+ <line
229
+ key={`grid-${i}`}
230
+ x1={padding}
231
+ y1={y}
232
+ x2={padding + chartWidth}
233
+ y2={y}
234
+ className="c-chart__grid"
235
+ />
236
+ );
237
+ }
237
238
  }
238
239
 
239
240
  // Draw datasets
@@ -253,7 +254,7 @@ const MultiAxisChart = memo(
253
254
  // Generate line path
254
255
  let linePath = '';
255
256
  if (points.length > 0) {
256
- linePath = `M ${points.map((p) => `${p.x},${p.y}`).join(' L ')}`;
257
+ linePath = `M ${points.map(p => `${p.x},${p.y}`).join(' L ')}`;
257
258
  }
258
259
 
259
260
  // Draw area under line
@@ -338,7 +339,14 @@ const MultiAxisChart = memo(
338
339
 
339
340
  elements.push(
340
341
  <g key={`legend-${index}`}>
341
- <rect x={legendX} y={legendY} width="12" height="12" fill={color} className="c-chart__legend-item-color" />
342
+ <rect
343
+ x={legendX}
344
+ y={legendY}
345
+ width="12"
346
+ height="12"
347
+ fill={color}
348
+ className="c-chart__legend-item-color"
349
+ />
342
350
  <text x={legendX + 16} y={legendY + 10} className="c-chart__legend-item-text">
343
351
  {dataset.label}
344
352
  </text>
@@ -282,23 +282,25 @@ const RadarChart = memo(
282
282
  {dataPaths}
283
283
  {axisLabels}
284
284
  </g>
285
- {showTooltips && hoveredPoint && renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && (
286
- <ChartTooltip
287
- dataPoint={
288
- renderedDatasets[hoveredPoint.datasetIndex]!.data![hoveredPoint.pointIndex]!
289
- }
290
- datasetLabel={renderedDatasets[hoveredPoint.datasetIndex]?.label}
291
- datasetColor={
292
- renderedDatasets[hoveredPoint.datasetIndex]?.color ||
293
- colors[hoveredPoint.datasetIndex]
294
- }
295
- position={{
296
- x: hoveredPoint.clientX,
297
- y: hoveredPoint.clientY,
298
- }}
299
- visible={true}
300
- />
301
- )}
285
+ {showTooltips &&
286
+ hoveredPoint &&
287
+ renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && (
288
+ <ChartTooltip
289
+ dataPoint={
290
+ renderedDatasets[hoveredPoint.datasetIndex]!.data![hoveredPoint.pointIndex]!
291
+ }
292
+ datasetLabel={renderedDatasets[hoveredPoint.datasetIndex]?.label}
293
+ datasetColor={
294
+ renderedDatasets[hoveredPoint.datasetIndex]?.color ||
295
+ colors[hoveredPoint.datasetIndex]
296
+ }
297
+ position={{
298
+ x: hoveredPoint.clientX,
299
+ y: hoveredPoint.clientY,
300
+ }}
301
+ visible={true}
302
+ />
303
+ )}
302
304
  </>
303
305
  );
304
306
  };
@@ -81,7 +81,10 @@ const ScatterChart = memo(
81
81
  onClick={() => handlers.onDataPointClick?.(point, datasetIndex, pointIndex)}
82
82
  onMouseEnter={e => {
83
83
  if (scatterOptions.enableHoverEffects) {
84
- const newRadius = Math.max(0, (point.size || scatterOptions.pointRadius || 4) * 1.5);
84
+ const newRadius = Math.max(
85
+ 0,
86
+ (point.size || scatterOptions.pointRadius || 4) * 1.5
87
+ );
85
88
  e.currentTarget.setAttribute('r', String(newRadius));
86
89
  }
87
90
  const rect = e.currentTarget.getBoundingClientRect();
@@ -96,7 +99,10 @@ const ScatterChart = memo(
96
99
  }}
97
100
  onMouseLeave={e => {
98
101
  if (scatterOptions.enableHoverEffects) {
99
- const originalRadius = Math.max(0, point.size || scatterOptions.pointRadius || 4);
102
+ const originalRadius = Math.max(
103
+ 0,
104
+ point.size || scatterOptions.pointRadius || 4
105
+ );
100
106
  e.currentTarget.setAttribute('r', String(originalRadius));
101
107
  }
102
108
  handlers.onPointLeave();
@@ -104,13 +110,13 @@ const ScatterChart = memo(
104
110
  />
105
111
  {scatterOptions.showLabels && point.label && (
106
112
  <text x={x} y={y - 10} textAnchor="middle" className="c-chart__scatter-label">
107
- {String(point.label).replace(/[<>&"']/g, (char) => {
113
+ {String(point.label).replace(/[<>&"']/g, char => {
108
114
  const entities: Record<string, string> = {
109
115
  '<': '&lt;',
110
116
  '>': '&gt;',
111
117
  '&': '&amp;',
112
118
  '"': '&quot;',
113
- "'": '&#x27;'
119
+ "'": '&#x27;',
114
120
  };
115
121
  return entities[char] || char;
116
122
  })}
@@ -124,23 +130,25 @@ const ScatterChart = memo(
124
130
  return (
125
131
  <>
126
132
  {points}
127
- {showTooltips && hoveredPoint && renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && (
128
- <ChartTooltip
129
- dataPoint={
130
- renderedDatasets[hoveredPoint.datasetIndex]!.data![hoveredPoint.pointIndex]!
131
- }
132
- datasetLabel={renderedDatasets[hoveredPoint.datasetIndex]?.label}
133
- datasetColor={
134
- renderedDatasets[hoveredPoint.datasetIndex]?.color ||
135
- colors[hoveredPoint.datasetIndex]
136
- }
137
- position={{
138
- x: hoveredPoint.clientX,
139
- y: hoveredPoint.clientY,
140
- }}
141
- visible={true}
142
- />
143
- )}
133
+ {showTooltips &&
134
+ hoveredPoint &&
135
+ renderedDatasets[hoveredPoint.datasetIndex]?.data?.[hoveredPoint.pointIndex] && (
136
+ <ChartTooltip
137
+ dataPoint={
138
+ renderedDatasets[hoveredPoint.datasetIndex]!.data![hoveredPoint.pointIndex]!
139
+ }
140
+ datasetLabel={renderedDatasets[hoveredPoint.datasetIndex]?.label}
141
+ datasetColor={
142
+ renderedDatasets[hoveredPoint.datasetIndex]?.color ||
143
+ colors[hoveredPoint.datasetIndex]
144
+ }
145
+ position={{
146
+ x: hoveredPoint.clientX,
147
+ y: hoveredPoint.clientY,
148
+ }}
149
+ visible={true}
150
+ />
151
+ )}
144
152
  </>
145
153
  );
146
154
  };
@@ -228,7 +228,11 @@ export const WithCallback: Story = {
228
228
  const [lastChanged, setLastChanged] = useState<string>('');
229
229
  return (
230
230
  <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', alignItems: 'center' }}>
231
- <ColorModeToggle onChange={(mode) => setLastChanged(`Mode changed to ${mode} at ${new Date().toLocaleTimeString()}`)} />
231
+ <ColorModeToggle
232
+ onChange={mode =>
233
+ setLastChanged(`Mode changed to ${mode} at ${new Date().toLocaleTimeString()}`)
234
+ }
235
+ />
232
236
  {lastChanged && <p>Last changed: {lastChanged}</p>}
233
237
  </div>
234
238
  );
@@ -240,4 +244,4 @@ export const WithCallback: Story = {
240
244
  },
241
245
  },
242
246
  },
243
- };
247
+ };