@shohojdhara/atomix 0.3.14 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +44 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +50 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +21044 -2618
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +77 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +44 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +50 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +152 -78
  53. package/dist/index.esm.js +346 -340
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +359 -353
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/dist/layout.js.map +1 -1
  60. package/dist/theme.d.ts +9 -9
  61. package/dist/theme.js.map +1 -1
  62. package/package.json +23 -8
  63. package/scripts/atomix-cli.js +170 -73
  64. package/scripts/cli/__tests__/README.md +81 -0
  65. package/scripts/cli/__tests__/basic.test.js +115 -0
  66. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  67. package/scripts/cli/__tests__/integration.test.js +327 -0
  68. package/scripts/cli/__tests__/test-setup.js +133 -0
  69. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  70. package/scripts/cli/__tests__/utils.test.js +161 -0
  71. package/scripts/cli/component-generator.js +253 -299
  72. package/scripts/cli/dependency-checker.js +355 -0
  73. package/scripts/cli/interactive-init.js +46 -5
  74. package/scripts/cli/template-manager.js +0 -2
  75. package/scripts/cli/templates/common-templates.js +636 -0
  76. package/scripts/cli/templates/composable-templates.js +148 -126
  77. package/scripts/cli/templates/index.js +23 -16
  78. package/scripts/cli/templates/project-templates.js +151 -23
  79. package/scripts/cli/templates/react-templates.js +280 -210
  80. package/scripts/cli/templates/scss-templates.js +90 -91
  81. package/scripts/cli/templates/testing-templates.js +206 -27
  82. package/scripts/cli/templates/testing-utils.js +278 -0
  83. package/scripts/cli/templates/types-templates.js +70 -56
  84. package/scripts/cli/theme-bridge.js +8 -2
  85. package/scripts/cli/token-manager.js +318 -206
  86. package/scripts/cli/utils.js +0 -1
  87. package/src/components/Accordion/Accordion.stories.tsx +358 -850
  88. package/src/components/Accordion/Accordion.test.tsx +70 -50
  89. package/src/components/Accordion/Accordion.tsx +99 -94
  90. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  91. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  92. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  93. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  94. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  95. package/src/components/AtomixGlass/glass-utils.ts +6 -5
  96. package/src/components/AtomixGlass/shader-utils.ts +133 -52
  97. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  98. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  99. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  100. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  101. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  102. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
  103. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
  104. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  105. package/src/components/Avatar/Avatar.stories.tsx +195 -0
  106. package/src/components/Avatar/Avatar.tsx +58 -56
  107. package/src/components/Badge/Badge.stories.tsx +122 -352
  108. package/src/components/Badge/Badge.test.tsx +41 -41
  109. package/src/components/Badge/Badge.tsx +64 -62
  110. package/src/components/Block/Block.stories.tsx +30 -11
  111. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
  112. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  113. package/src/components/Button/Button.stories.tsx +454 -1126
  114. package/src/components/Button/Button.test.tsx +123 -0
  115. package/src/components/Button/Button.tsx +88 -60
  116. package/src/components/Button/ButtonGroup.stories.tsx +376 -215
  117. package/src/components/Button/ButtonGroup.tsx +4 -15
  118. package/src/components/Callout/Callout.stories.tsx +316 -568
  119. package/src/components/Card/Card.stories.tsx +292 -81
  120. package/src/components/Card/Card.tsx +30 -14
  121. package/src/components/Chart/AreaChart.tsx +1 -1
  122. package/src/components/Chart/CandlestickChart.tsx +23 -16
  123. package/src/components/Chart/Chart.stories.tsx +153 -16
  124. package/src/components/Chart/Chart.tsx +40 -44
  125. package/src/components/Chart/ChartRenderer.tsx +39 -12
  126. package/src/components/Chart/ChartToolbar.tsx +21 -5
  127. package/src/components/Chart/DonutChart.tsx +1 -1
  128. package/src/components/Chart/FunnelChart.tsx +4 -1
  129. package/src/components/Chart/GaugeChart.tsx +3 -1
  130. package/src/components/Chart/HeatmapChart.tsx +50 -37
  131. package/src/components/Chart/LineChart.tsx +3 -2
  132. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  133. package/src/components/Chart/RadarChart.tsx +19 -17
  134. package/src/components/Chart/ScatterChart.tsx +29 -21
  135. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
  136. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  137. package/src/components/Countdown/Countdown.stories.tsx +114 -7
  138. package/src/components/DataTable/DataTable.stories.tsx +349 -144
  139. package/src/components/DataTable/DataTable.test.tsx +26 -148
  140. package/src/components/DataTable/DataTable.tsx +485 -456
  141. package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
  142. package/src/components/DatePicker/DatePicker.tsx +31 -26
  143. package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
  144. package/src/components/Dropdown/Dropdown.tsx +313 -299
  145. package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
  146. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  147. package/src/components/Footer/Footer.stories.tsx +396 -327
  148. package/src/components/Footer/Footer.tsx +130 -128
  149. package/src/components/Footer/FooterLink.tsx +2 -2
  150. package/src/components/Form/Checkbox.stories.tsx +140 -6
  151. package/src/components/Form/Checkbox.test.tsx +63 -0
  152. package/src/components/Form/Checkbox.tsx +122 -78
  153. package/src/components/Form/Form.stories.tsx +110 -19
  154. package/src/components/Form/FormGroup.stories.tsx +127 -4
  155. package/src/components/Form/Input.stories.tsx +22 -39
  156. package/src/components/Form/Input.test.tsx +38 -44
  157. package/src/components/Form/Radio.stories.tsx +146 -17
  158. package/src/components/Form/Radio.tsx +68 -66
  159. package/src/components/Form/Select.stories.tsx +140 -8
  160. package/src/components/Form/Select.tsx +184 -182
  161. package/src/components/Form/Textarea.stories.tsx +149 -6
  162. package/src/components/Form/Textarea.test.tsx +27 -32
  163. package/src/components/Hero/Hero.stories.tsx +372 -38
  164. package/src/components/Hero/Hero.tsx +201 -55
  165. package/src/components/Icon/index.ts +7 -1
  166. package/src/components/List/List.stories.tsx +141 -3
  167. package/src/components/List/List.tsx +19 -23
  168. package/src/components/Modal/Modal.stories.tsx +183 -43
  169. package/src/components/Modal/Modal.tsx +130 -127
  170. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  171. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  172. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  173. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  174. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  175. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  176. package/src/components/Pagination/Pagination.tsx +199 -202
  177. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  178. package/src/components/Popover/Popover.stories.tsx +354 -97
  179. package/src/components/Popover/Popover.tsx +41 -37
  180. package/src/components/Progress/Progress.stories.tsx +160 -7
  181. package/src/components/River/River.stories.tsx +3 -2
  182. package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
  183. package/src/components/Slider/Slider.stories.tsx +12 -4
  184. package/src/components/Spinner/Spinner.stories.tsx +104 -8
  185. package/src/components/Spinner/Spinner.test.tsx +23 -23
  186. package/src/components/Spinner/Spinner.tsx +43 -46
  187. package/src/components/Steps/Steps.stories.tsx +173 -42
  188. package/src/components/Tabs/Tabs.stories.tsx +141 -12
  189. package/src/components/Tabs/Tabs.tsx +74 -72
  190. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  191. package/src/components/Todo/Todo.stories.tsx +198 -9
  192. package/src/components/Toggle/Toggle.stories.tsx +137 -36
  193. package/src/components/Toggle/Toggle.test.tsx +65 -70
  194. package/src/components/Toggle/Toggle.tsx +4 -1
  195. package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
  196. package/src/components/Tooltip/Tooltip.tsx +104 -106
  197. package/src/components/Upload/Upload.stories.tsx +241 -150
  198. package/src/components/Upload/Upload.tsx +287 -283
  199. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  200. package/src/components/index.ts +13 -2
  201. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  202. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  203. package/src/lib/README.md +2 -2
  204. package/src/lib/__tests__/theme-tools.test.ts +219 -0
  205. package/src/lib/composables/index.ts +2 -2
  206. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  207. package/src/lib/composables/useAtomixGlass.ts +126 -97
  208. package/src/lib/composables/useChartExport.ts +3 -8
  209. package/src/lib/composables/useDataTable.ts +72 -43
  210. package/src/lib/composables/useHero.ts +58 -14
  211. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  212. package/src/lib/composables/useInput.ts +10 -8
  213. package/src/lib/composables/useSideMenu.ts +6 -5
  214. package/src/lib/composables/useTooltip.ts +1 -2
  215. package/src/lib/composables/useVideoPlayer.ts +44 -35
  216. package/src/lib/config/index.ts +154 -154
  217. package/src/lib/constants/components.ts +9 -32
  218. package/src/lib/constants/cssVariables.ts +29 -29
  219. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  220. package/src/lib/hooks/index.ts +1 -1
  221. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  222. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  223. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  224. package/src/lib/patterns/index.ts +1 -1
  225. package/src/lib/patterns/slots.tsx +8 -13
  226. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  227. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  228. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  229. package/src/lib/storybook/index.ts +1 -1
  230. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  231. package/src/lib/theme/adapters/index.ts +3 -9
  232. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  233. package/src/lib/theme/config/index.ts +1 -1
  234. package/src/lib/theme/config/types.ts +2 -2
  235. package/src/lib/theme/config/validator.ts +10 -5
  236. package/src/lib/theme/constants/constants.ts +2 -2
  237. package/src/lib/theme/constants/index.ts +1 -2
  238. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  239. package/src/lib/theme/core/composeTheme.ts +32 -26
  240. package/src/lib/theme/core/createTheme.ts +1 -1
  241. package/src/lib/theme/core/createThemeObject.ts +308 -301
  242. package/src/lib/theme/core/index.ts +3 -3
  243. package/src/lib/theme/devtools/CLI.ts +107 -105
  244. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  245. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  246. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  247. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  248. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  249. package/src/lib/theme/devtools/Preview.tsx +150 -106
  250. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  251. package/src/lib/theme/devtools/index.ts +3 -9
  252. package/src/lib/theme/devtools/useHistory.ts +23 -21
  253. package/src/lib/theme/errors/errors.ts +12 -11
  254. package/src/lib/theme/errors/index.ts +2 -7
  255. package/src/lib/theme/generators/generateCSS.ts +9 -13
  256. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  257. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  258. package/src/lib/theme/generators/index.ts +1 -4
  259. package/src/lib/theme/i18n/index.ts +1 -1
  260. package/src/lib/theme/i18n/rtl.ts +13 -13
  261. package/src/lib/theme/index.ts +7 -16
  262. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  263. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  264. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  265. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  266. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  267. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  268. package/src/lib/theme/runtime/index.ts +2 -5
  269. package/src/lib/theme/runtime/useTheme.ts +18 -18
  270. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  271. package/src/lib/theme/test/testTheme.ts +15 -16
  272. package/src/lib/theme/tokens/index.ts +2 -7
  273. package/src/lib/theme/tokens/tokens.ts +25 -24
  274. package/src/lib/theme/types.ts +428 -411
  275. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  276. package/src/lib/theme/utils/componentTheming.ts +18 -18
  277. package/src/lib/theme/utils/domUtils.ts +277 -289
  278. package/src/lib/theme/utils/index.ts +1 -2
  279. package/src/lib/theme/utils/injectCSS.ts +10 -14
  280. package/src/lib/theme/utils/naming.ts +20 -16
  281. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  282. package/src/lib/theme/utils/themeUtils.ts +85 -86
  283. package/src/lib/theme/utils/themeValidation.ts +82 -33
  284. package/src/lib/theme-tools.ts +8 -6
  285. package/src/lib/types/components.ts +172 -71
  286. package/src/lib/types/partProps.ts +1 -1
  287. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  288. package/src/lib/utils/componentUtils.ts +8 -12
  289. package/src/lib/utils/csv.ts +19 -0
  290. package/src/lib/utils/dataTableExport.ts +2 -15
  291. package/src/lib/utils/fontPreloader.ts +10 -19
  292. package/src/lib/utils/icons.ts +4 -1
  293. package/src/lib/utils/index.ts +2 -6
  294. package/src/lib/utils/memoryMonitor.ts +10 -8
  295. package/src/lib/utils/themeNaming.ts +2 -2
  296. package/src/styles/01-settings/_index.scss +1 -1
  297. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  298. package/src/styles/01-settings/_settings.colors.scss +11 -11
  299. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  300. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  301. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  302. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  303. package/src/styles/01-settings/_settings.typography.scss +4 -4
  304. package/src/styles/02-tools/_tools.button.scss +51 -21
  305. package/src/styles/02-tools/_tools.utility-api.scss +38 -12
  306. package/src/styles/03-generic/_generic.root.scss +4 -3
  307. package/src/styles/06-components/_components.accordion.scss +56 -14
  308. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  309. package/src/styles/06-components/_components.button.scss +16 -4
  310. package/src/styles/06-components/_components.callout.scss +27 -21
  311. package/src/styles/06-components/_components.card.scss +5 -14
  312. package/src/styles/06-components/_components.chart.scss +22 -19
  313. package/src/styles/06-components/_components.checkbox.scss +25 -17
  314. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  315. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  316. package/src/styles/06-components/_components.footer.scss +1 -1
  317. package/src/styles/06-components/_components.side-menu.scss +5 -5
  318. package/src/styles/06-components/_components.toggle.scss +18 -0
  319. package/src/styles/06-components/_index.scss +1 -1
  320. package/src/styles/06-components/old.chart.styles.scss +0 -2
  321. package/src/styles/99-utilities/_index.scss +2 -0
  322. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  323. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  324. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  325. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  326. package/src/styles/99-utilities/_utilities.scss +2 -0
  327. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  328. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  329. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  330. package/src/styles/99-utilities/_utilities.text.scss +67 -46
  331. package/themes/dark-complementary/README.md +98 -0
  332. package/themes/dark-complementary/index.scss +158 -0
  333. package/themes/default-light/README.md +81 -0
  334. package/themes/default-light/index.scss +154 -0
  335. package/themes/high-contrast/README.md +105 -0
  336. package/themes/high-contrast/index.scss +172 -0
  337. package/themes/test-theme/README.md +38 -0
  338. package/themes/test-theme/index.scss +47 -0
  339. package/scripts/cli/templates-original-backup.js +0 -1655
  340. package/scripts/cli/templates_backup.js +0 -684
  341. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  342. package/src/lib/composables/useButton.ts +0 -93
  343. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import React from 'react';
3
4
  import { useState } from 'react';
4
5
  import { Container, Grid, GridCol } from '../../layouts/Grid';
@@ -37,12 +38,140 @@ const meta = {
37
38
  layout: 'fullscreen',
38
39
  docs: {
39
40
  description: {
40
- component:
41
- 'The Chart component provides a comprehensive charting library with 20+ chart types including line, bar, pie, area, and more. Charts support real-time data updates, animations, interactive tooltips, and advanced customization options. Ideal for dashboards, analytics, data visualization, and any application requiring graphical data representation.',
41
+ component: `
42
+ # Chart
43
+
44
+ ## Overview
45
+
46
+ Charts provide a comprehensive charting library with 20+ chart types including line, bar, pie, area, and more. Charts support real-time data updates, animations, interactive tooltips, and advanced customization options. Ideal for dashboards, analytics, data visualization, and any application requiring graphical data representation.
47
+
48
+ ## Features
49
+
50
+ - Multiple chart types (Line, Bar, Pie, Area, etc.)
51
+ - Real-time data updates
52
+ - Interactive tooltips and annotations
53
+ - Animation capabilities
54
+ - Glass morphism effects
55
+ - Toolbar with export options
56
+ - Multi-axis support
57
+ - Advanced analytics integration
58
+
59
+ ## Accessibility
60
+
61
+ - Keyboard support: Charts can be navigated using Tab key and arrow keys
62
+ - Screen reader: Data points and chart information announced appropriately
63
+ - ARIA support: Roles and properties ensure chart accessibility
64
+ - Focus management: Maintains focus on interactive chart elements
65
+
66
+ ## Usage Examples
67
+
68
+ ### Basic Usage
69
+
70
+ \`\`\`tsx
71
+ <LineChart
72
+ title="Sales Performance"
73
+ datasets={[{ label: 'Sales', data: data, color: 'var(--atomix-primary)' }]}
74
+ />
75
+ \`\`\`
76
+
77
+ ### With Glass Effect
78
+
79
+ \`\`\`tsx
80
+ <BarChart
81
+ title="Revenue by Month"
82
+ datasets={datasets}
83
+ glass={true}
84
+ showToolbar={true}
85
+ />
86
+ \`\`\`
87
+
88
+ ## API Reference
89
+
90
+ ### Props
91
+
92
+ | Prop | Type | Default | Description |
93
+ | ---- | ---- | ------- | ----------- |
94
+ | title | string | - | Title of the chart |
95
+ | subtitle | string | - | Subtitle of the chart |
96
+ | datasets | Dataset[] | [] | Array of datasets to plot |
97
+ | width | string \\| number | 100% | Width of the chart |
98
+ | height | string \\| number | 400px | Height of the chart |
99
+ | glass | boolean | false | Whether to apply glass effect |
100
+ | showToolbar | boolean | false | Whether to show the toolbar |
101
+ | config | ChartConfig | {} | Additional configuration options |
102
+ | onPointClick | (point) => void | - | Callback when a data point is clicked |
103
+ | onPointHover | (point) => void | - | Callback when hovering over a data point |
104
+ `,
42
105
  },
43
106
  },
44
107
  },
45
108
  tags: ['autodocs'],
109
+ argTypes: {
110
+ title: {
111
+ control: 'text',
112
+ description: 'Title of the chart',
113
+ table: {
114
+ type: { summary: 'string' },
115
+ defaultValue: { summary: '-' },
116
+ },
117
+ },
118
+ subtitle: {
119
+ control: 'text',
120
+ description: 'Subtitle of the chart',
121
+ table: {
122
+ type: { summary: 'string' },
123
+ defaultValue: { summary: '-' },
124
+ },
125
+ },
126
+ width: {
127
+ control: 'text',
128
+ description: 'Width of the chart',
129
+ table: {
130
+ type: { summary: 'string | number' },
131
+ defaultValue: { summary: '100%' },
132
+ },
133
+ },
134
+ height: {
135
+ control: 'text',
136
+ description: 'Height of the chart',
137
+ table: {
138
+ type: { summary: 'string | number' },
139
+ defaultValue: { summary: '400px' },
140
+ },
141
+ },
142
+ glass: {
143
+ control: 'boolean',
144
+ description: 'Whether to apply glass effect',
145
+ table: {
146
+ type: { summary: 'boolean' },
147
+ defaultValue: { summary: false },
148
+ },
149
+ },
150
+ showToolbar: {
151
+ control: 'boolean',
152
+ description: 'Whether to show the toolbar',
153
+ table: {
154
+ type: { summary: 'boolean' },
155
+ defaultValue: { summary: false },
156
+ },
157
+ },
158
+ config: {
159
+ control: 'object',
160
+ description: 'Additional configuration options',
161
+ table: {
162
+ type: { summary: 'ChartConfig' },
163
+ defaultValue: { summary: '{}' },
164
+ },
165
+ },
166
+ onPointClick: {
167
+ action: 'point clicked',
168
+ description: 'Callback when a data point is clicked',
169
+ },
170
+ onPointHover: {
171
+ action: 'point hovered',
172
+ description: 'Callback when hovering over a data point',
173
+ },
174
+ },
46
175
  } satisfies Meta<typeof Chart>;
47
176
 
48
177
  export default meta;
@@ -50,7 +179,7 @@ type Story = StoryObj<typeof meta>;
50
179
 
51
180
  // Glass Variant Story
52
181
  export const GlassVariant: Story = {
53
- render: () => {
182
+ render: args => {
54
183
  const sampleData = [
55
184
  { label: 'Jan', value: 65 },
56
185
  { label: 'Feb', value: 78 },
@@ -84,6 +213,7 @@ export const GlassVariant: Story = {
84
213
  </GridCol>
85
214
  <GridCol col={12} md={6}>
86
215
  <LineChart
216
+ {...args}
87
217
  title="Sales Performance"
88
218
  subtitle="Monthly revenue data"
89
219
  datasets={datasets}
@@ -97,24 +227,20 @@ export const GlassVariant: Story = {
97
227
  </GridCol>
98
228
  <GridCol col={12} md={6}>
99
229
  <BarChart
230
+ {...args}
100
231
  title="Revenue by Month"
101
232
  subtitle="Q1-Q2 comparison"
102
233
  datasets={datasets}
103
- glass={{
104
- displacementScale: 30,
105
- saturation: 200,
106
- mode: 'polar',
107
- }}
234
+ glass={true}
108
235
  showToolbar={true}
236
+ config={{
237
+ showTooltips: true,
238
+ animate: true,
239
+ }}
109
240
  />
110
241
  </GridCol>
111
242
  <GridCol col={12} md={6}>
112
- <PieChart
113
- title="Market Share"
114
- data={sampleData}
115
- glass={true}
116
- showToolbar={true}
117
- />
243
+ <PieChart title="Market Share" data={sampleData} glass={true} showToolbar={true} />
118
244
  </GridCol>
119
245
  <GridCol col={12} md={6}>
120
246
  <AreaChart
@@ -134,6 +260,17 @@ export const GlassVariant: Story = {
134
260
  </div>
135
261
  );
136
262
  },
263
+ args: {
264
+ onPointClick: fn(),
265
+ onPointHover: fn(),
266
+ },
267
+ parameters: {
268
+ docs: {
269
+ description: {
270
+ story: 'Chart with glass effect applied to demonstrate aesthetic enhancement.',
271
+ },
272
+ },
273
+ },
137
274
  };
138
275
 
139
276
  // Data generators
@@ -214,7 +351,7 @@ const generateTreemapData = (count = 12) => {
214
351
  'Agriculture',
215
352
  'Construction',
216
353
  ];
217
-
354
+
218
355
  return Array.from({ length: count }, (_, i) => ({
219
356
  id: `category-${i}`,
220
357
  label: categories[i % categories.length] || `Category ${i + 1}`,
@@ -235,7 +372,7 @@ const generateFunnelData = () => {
235
372
  { label: 'Evaluation', value: 600 },
236
373
  { label: 'Purchase', value: 300 },
237
374
  ];
238
-
375
+
239
376
  return stages.map(stage => ({
240
377
  ...stage,
241
378
  percentage: ((stage.value / stages[0].value) * 100).toFixed(1),
@@ -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}`}>