@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 { Card, ElevationCard } from './index';
4
5
  import { Grid, GridCol } from '../../layouts';
@@ -13,69 +14,276 @@ const meta = {
13
14
  layout: 'centered',
14
15
  docs: {
15
16
  description: {
16
- component:
17
- 'The Card component provides a flexible container for displaying content with optional headers, images, and footers. Cards are ideal for grouping related information, showcasing products, or presenting content in a structured format. They support multiple variants, sizes, and can be interactive.',
17
+ component: `
18
+ # Card
19
+
20
+ ## Overview
21
+
22
+ Cards are flexible containers for displaying content with optional headers, images, and footers. They are ideal for grouping related information, showcasing products, or presenting content in a structured format. Cards support multiple variants, sizes, and can be interactive.
23
+
24
+ ## Features
25
+
26
+ - Multiple appearance options (filled, outlined, ghost, elevated)
27
+ - Various elevation levels
28
+ - Support for headers, images, and footers
29
+ - Different color variants and sizes
30
+ - Interactive states (active, disabled, loading)
31
+ - Responsive design
32
+
33
+ ## Accessibility
34
+
35
+ - Keyboard support: Cards can be navigated using Tab key
36
+ - Screen reader: Proper semantic markup ensures content is accessible
37
+ - ARIA support: Appropriate roles and properties are automatically applied
38
+ - Focus management: Maintains focus within the card when activated
39
+
40
+ ## Usage Examples
41
+
42
+ ### Basic Usage
43
+
44
+ \`\`\`tsx
45
+ <Card title="Card Title" text="This is a basic card" />
46
+ \`\`\`
47
+
48
+ ### With Image
49
+
50
+ \`\`\`tsx
51
+ <Card
52
+ title="Card with Image"
53
+ text="This card includes an image"
54
+ image="https://example.com/image.jpg"
55
+ imageAlt="Description of image"
56
+ />
57
+ \`\`\`
58
+
59
+ ## API Reference
60
+
61
+ ### Props
62
+
63
+ | Prop | Type | Default | Description |
64
+ | ---- | ---- | ------- | ----------- |
65
+ | header | string | - | Header content for the card |
66
+ | title | string | - | Title of the card |
67
+ | text | string | - | Main text content of the card |
68
+ | image | string | - | Image URL for the card |
69
+ | imageAlt | string | - | Alt text for the card image |
70
+ | footer | string | - | Footer content for the card |
71
+ | size | 'sm' \\| 'md' \\| 'lg' | 'md' | Size of the card |
72
+ | variant | string | 'secondary' | Color variant of the card |
73
+ | appearance | 'filled' \\| 'outlined' \\| 'ghost' \\| 'elevated' | 'filled' | Visual style of the card |
74
+ | elevation | 'none' \\| 'sm' \\| 'md' \\| 'lg' \\| 'xl' | 'none' | Shadow depth of the card |
75
+ | row | boolean | false | Whether to arrange content horizontally |
76
+ | flat | boolean | false | Whether to remove border radius |
77
+ | active | boolean | false | Whether the card is in active state |
78
+ | disabled | boolean | false | Whether the card is disabled |
79
+ | loading | boolean | false | Whether the card is in loading state |
80
+ | selected | boolean | false | Whether the card is selected |
81
+ | interactive | boolean | false | Whether the card responds to interactions |
82
+ | className | string | - | Additional CSS class names |
83
+ `,
18
84
  },
19
85
  },
20
86
  },
21
87
  tags: ['autodocs'],
22
88
  argTypes: {
23
- header: { control: 'text', description: 'Header content for the card' },
24
89
  title: { control: 'text', description: 'Title of the card' },
25
90
  text: { control: 'text', description: 'Main text content of the card' },
26
91
  image: { control: 'text', description: 'Image URL for the card' },
27
92
  imageAlt: { control: 'text', description: 'Alt text for the card image' },
28
- footer: { control: 'text', description: 'Footer content for the card' },
29
93
  size: {
30
94
  control: { type: 'select' },
31
95
  options: SIZES,
32
96
  description: 'Size of the card',
33
97
  defaultValue: 'md',
98
+ table: {
99
+ type: { summary: 'string' },
100
+ defaultValue: { summary: 'md' },
101
+ },
34
102
  },
35
103
  variant: {
36
104
  control: { type: 'select' },
37
105
  options: THEME_COLORS,
38
106
  description: 'Color variant of the card',
39
107
  defaultValue: 'secondary',
108
+ table: {
109
+ type: { summary: 'string' },
110
+ defaultValue: { summary: 'secondary' },
111
+ },
40
112
  },
41
113
  appearance: {
42
114
  control: { type: 'select' },
43
115
  options: ['filled', 'outlined', 'ghost', 'elevated'],
116
+ description: 'Visual style of the card',
44
117
  defaultValue: 'filled',
118
+ table: {
119
+ type: { summary: '"filled" | "outlined" | "ghost" | "elevated"' },
120
+ defaultValue: { summary: 'filled' },
121
+ },
45
122
  },
46
123
  elevation: {
47
124
  control: { type: 'select' },
48
125
  options: ['none', 'sm', 'md', 'lg', 'xl'],
126
+ description: 'Shadow depth of the card',
49
127
  defaultValue: 'none',
128
+ table: {
129
+ type: { summary: '"none" | "sm" | "md" | "lg" | "xl"' },
130
+ defaultValue: { summary: 'none' },
131
+ },
132
+ },
133
+ row: {
134
+ control: 'boolean',
135
+ description: 'Whether to arrange content horizontally',
136
+ table: {
137
+ type: { summary: 'boolean' },
138
+ defaultValue: { summary: false },
139
+ },
140
+ },
141
+ flat: {
142
+ control: 'boolean',
143
+ description: 'Whether to remove border radius',
144
+ table: {
145
+ type: { summary: 'boolean' },
146
+ defaultValue: { summary: false },
147
+ },
148
+ },
149
+ active: {
150
+ control: 'boolean',
151
+ description: 'Whether the card is in active state',
152
+ table: {
153
+ type: { summary: 'boolean' },
154
+ defaultValue: { summary: false },
155
+ },
156
+ },
157
+ disabled: {
158
+ control: 'boolean',
159
+ description: 'Whether the card is disabled',
160
+ table: {
161
+ type: { summary: 'boolean' },
162
+ defaultValue: { summary: false },
163
+ },
164
+ },
165
+ loading: {
166
+ control: 'boolean',
167
+ description: 'Whether the card is in loading state',
168
+ table: {
169
+ type: { summary: 'boolean' },
170
+ defaultValue: { summary: false },
171
+ },
172
+ },
173
+ selected: {
174
+ control: 'boolean',
175
+ description: 'Whether the card is selected',
176
+ table: {
177
+ type: { summary: 'boolean' },
178
+ defaultValue: { summary: false },
179
+ },
180
+ },
181
+ interactive: {
182
+ control: 'boolean',
183
+ description: 'Whether the card responds to interactions',
184
+ table: {
185
+ type: { summary: 'boolean' },
186
+ defaultValue: { summary: false },
187
+ },
188
+ },
189
+ className: {
190
+ control: 'text',
191
+ description: 'Additional CSS class names',
192
+ table: {
193
+ type: { summary: 'string' },
194
+ defaultValue: { summary: '-' },
195
+ },
196
+ },
197
+ onClick: {
198
+ action: 'clicked',
199
+ description: 'Callback when card is clicked',
200
+ },
201
+ header: {
202
+ control: 'boolean',
203
+ description: 'Whether to show the header',
204
+ table: {
205
+ type: { summary: 'boolean' },
206
+ defaultValue: { summary: false },
207
+ },
208
+ },
209
+ footer: {
210
+ control: 'boolean',
211
+ description: 'Whether to show the footer',
212
+ table: {
213
+ type: { summary: 'boolean' },
214
+ defaultValue: { summary: false },
215
+ },
216
+ },
217
+ glass: {
218
+ control: 'boolean',
219
+ description: 'Enable glass morphism effect',
220
+ table: {
221
+ type: { summary: 'boolean' },
222
+ defaultValue: { summary: false },
223
+ },
224
+ },
225
+ rounded: {
226
+ control: 'boolean',
227
+ description: 'Whether the card has rounded corners',
228
+ table: {
229
+ type: { summary: 'boolean' },
230
+ defaultValue: { summary: false },
231
+ },
232
+ },
233
+ border: {
234
+ control: 'boolean',
235
+ description: 'Whether the card has a border',
236
+ table: {
237
+ type: { summary: 'boolean' },
238
+ defaultValue: { summary: false },
239
+ },
240
+ },
241
+ shadow: {
242
+ control: 'boolean',
243
+ description: 'Whether the card has a shadow',
244
+ table: {
245
+ type: { summary: 'boolean' },
246
+ defaultValue: { summary: false },
247
+ },
248
+ },
249
+ hoverable: {
250
+ control: 'boolean',
251
+ description: 'Whether the card has hover effects',
252
+ table: {
253
+ type: { summary: 'boolean' },
254
+ defaultValue: { summary: false },
255
+ },
256
+ },
257
+ mode: {
258
+ control: 'radio',
259
+ options: ['cartesian', 'polar', 'bipolar'],
260
+ description: 'The displacement mode for the glass effect',
261
+ table: {
262
+ type: { summary: '"cartesian" | "polar" | "bipolar"' },
263
+ defaultValue: { summary: 'polar' },
264
+ },
50
265
  },
51
- row: { control: 'boolean' },
52
- flat: { control: 'boolean' },
53
- active: { control: 'boolean' },
54
- disabled: { control: 'boolean' },
55
- loading: { control: 'boolean' },
56
- selected: { control: 'boolean' },
57
- interactive: { control: 'boolean' },
58
- className: { control: 'text', description: 'Additional CSS class names' },
59
266
  },
60
267
  } satisfies Meta<typeof Card>;
61
268
 
62
269
  export default meta;
63
270
  type Story = StoryObj<typeof meta>;
64
271
 
65
- /**
66
- * Basic card with title and text content.
67
- */
68
- export const Basic: Story = {
272
+ export const BasicUsage: Story = {
69
273
  args: {
70
274
  title: 'Card Title',
71
275
  text: 'This is a basic card with title and text content.',
72
276
  className: 'custom-card',
73
277
  },
278
+ parameters: {
279
+ docs: {
280
+ description: {
281
+ story: 'Basic card with title and text content.',
282
+ },
283
+ },
284
+ },
74
285
  };
75
286
 
76
- /**
77
- * Card with an image displayed above the content.
78
- */
79
287
  export const WithImage: Story = {
80
288
  args: {
81
289
  title: 'Card with Image',
@@ -83,11 +291,15 @@ export const WithImage: Story = {
83
291
  image: 'https://placehold.co/600x400',
84
292
  imageAlt: 'Placeholder image',
85
293
  },
294
+ parameters: {
295
+ docs: {
296
+ description: {
297
+ story: 'Card with an image displayed above the content.',
298
+ },
299
+ },
300
+ },
86
301
  };
87
302
 
88
- /**
89
- * Card with action buttons in the footer.
90
- */
91
303
  export const WithActions: Story = {
92
304
  args: {
93
305
  title: 'Card with Actions',
@@ -99,6 +311,13 @@ export const WithActions: Story = {
99
311
  </React.Fragment>
100
312
  ),
101
313
  },
314
+ parameters: {
315
+ docs: {
316
+ description: {
317
+ story: 'Card with action buttons in the footer.',
318
+ },
319
+ },
320
+ },
102
321
  };
103
322
 
104
323
  /**
@@ -162,20 +381,16 @@ export const WithGlassEffect: Story = {
162
381
  parameters: {
163
382
  docs: {
164
383
  description: {
165
- story: 'Demonstrates a card with glass morphism effect applied, creating a translucent, frosted appearance that works well over colorful backgrounds.',
384
+ story:
385
+ 'Demonstrates a card with glass morphism effect applied, creating a translucent, frosted appearance that works well over colorful backgrounds.',
166
386
  },
167
387
  },
168
388
  },
169
389
  render: args => (
170
390
  <div
391
+ className="u-bg-cover u-h-80vh u-w-90vw u-grid u-rounded-xl u-overflow-hidden"
171
392
  style={{
172
393
  backgroundImage: `url(https://picsum.photos/id/128/1920/1024)`,
173
- backgroundSize: 'cover',
174
- height: '80vh',
175
- width: '90vw',
176
- display: 'grid',
177
- borderRadius: '12px',
178
- placeItems: 'center',
179
394
  }}
180
395
  >
181
396
  <Card {...args} style={{ ['--atomix-card-width' as string]: '300px' }} />
@@ -507,7 +722,8 @@ export const AllGlassModesComparison: Story = {
507
722
  parameters: {
508
723
  docs: {
509
724
  description: {
510
- story: 'Side-by-side comparison of all available glass morphism modes (standard, polar, prominent, shader) to help you choose the right effect for your design.',
725
+ story:
726
+ 'Side-by-side comparison of all available glass morphism modes (standard, polar, prominent, shader) to help you choose the right effect for your design.',
511
727
  },
512
728
  },
513
729
  },
@@ -754,42 +970,20 @@ export const GlassCardGallery: Story = {
754
970
  export const GlassCardLayouts: Story = {
755
971
  render: () => (
756
972
  <div
973
+ className="u-bg-cover u-bg-center u-p-12 u-rounded-xl u-min-h-95vh u-min-w-95vw u-overflow-auto"
757
974
  style={{
758
975
  backgroundImage: 'url(https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?w=1920)',
759
- backgroundSize: 'cover',
760
- backgroundPosition: 'center',
761
- padding: '3rem',
762
- borderRadius: '12px',
763
- minHeight: '95vh',
764
- minWidth: '95vw',
765
- overflow: 'auto',
766
976
  }}
767
977
  >
768
978
  <Container>
769
- <h2
770
- style={{
771
- textAlign: 'center',
772
- color: 'white',
773
- marginBottom: '3rem',
774
- fontSize: '2rem',
775
- textShadow: '0 2px 8px rgba(0,0,0,0.5)',
776
- }}
777
- >
979
+ <h2 className="u-text-center u-text-white u-mb-12 u-text-2xl u-text-shadow">
778
980
  Glass Card Layouts
779
981
  </h2>
780
982
 
781
- <div style={{ display: 'flex', gap: '2rem' }}>
983
+ <div className="u-flex u-gap-8">
782
984
  {/* Standard Layout */}
783
985
  <div className="u-w-50">
784
- <h3
785
- style={{
786
- color: 'white',
787
- marginBottom: '1rem',
788
- textShadow: '0 2px 4px rgba(0,0,0,0.5)',
789
- }}
790
- >
791
- Standard Layout
792
- </h3>
986
+ <h3 className="u-text-white u-mb-4 u-text-shadow">Standard Layout</h3>
793
987
  <Card
794
988
  title="Standard Glass Card"
795
989
  text="This is a standard glass card with vertical layout."
@@ -807,15 +1001,7 @@ export const GlassCardLayouts: Story = {
807
1001
 
808
1002
  {/* Row Layout */}
809
1003
  <div className="u-w-50">
810
- <h3
811
- style={{
812
- color: 'white',
813
- marginBottom: '1rem',
814
- textShadow: '0 2px 4px rgba(0,0,0,0.5)',
815
- }}
816
- >
817
- Row Layout
818
- </h3>
1004
+ <h3 className="u-text-white u-mb-4 u-text-shadow">Row Layout</h3>
819
1005
  <Card
820
1006
  title="Row Glass Card"
821
1007
  text="This is a row glass card with horizontal layout."
@@ -838,15 +1024,7 @@ export const GlassCardLayouts: Story = {
838
1024
 
839
1025
  {/* Flat Layout */}
840
1026
  <div className="u-w-50">
841
- <h3
842
- style={{
843
- color: 'white',
844
- marginBottom: '1rem',
845
- textShadow: '0 2px 4px rgba(0,0,0,0.5)',
846
- }}
847
- >
848
- Flat Layout
849
- </h3>
1027
+ <h3 className="u-text-white u-mb-4 u-text-shadow">Flat Layout</h3>
850
1028
  <Card
851
1029
  title="Flat Glass Card"
852
1030
  text="This is a flat glass card with edge-to-edge image."
@@ -901,7 +1079,13 @@ export const SizeVariants: Story = {
901
1079
  // Color Variants
902
1080
  export const ColorVariants: Story = {
903
1081
  render: () => (
904
- <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '1rem' }}>
1082
+ <div
1083
+ style={{
1084
+ display: 'grid',
1085
+ gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
1086
+ gap: '1rem',
1087
+ }}
1088
+ >
905
1089
  <Card variant="primary" title="Primary Card" text="Primary variant card." />
906
1090
  <Card variant="secondary" title="Secondary Card" text="Secondary variant card." />
907
1091
  <Card variant="success" title="Success Card" text="Success variant card." />
@@ -917,11 +1101,37 @@ export const ColorVariants: Story = {
917
1101
  // Appearance Variants
918
1102
  export const AppearanceVariants: Story = {
919
1103
  render: () => (
920
- <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '1rem' }}>
921
- <Card appearance="filled" variant="primary" title="Filled Card" text="Filled appearance with solid background." />
922
- <Card appearance="outlined" variant="primary" title="Outlined Card" text="Outlined appearance with border only." />
923
- <Card appearance="ghost" variant="primary" title="Ghost Card" text="Ghost appearance with minimal styling." />
924
- <Card appearance="elevated" variant="primary" title="Elevated Card" text="Elevated appearance with shadow." />
1104
+ <div
1105
+ style={{
1106
+ display: 'grid',
1107
+ gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
1108
+ gap: '1rem',
1109
+ }}
1110
+ >
1111
+ <Card
1112
+ appearance="filled"
1113
+ variant="primary"
1114
+ title="Filled Card"
1115
+ text="Filled appearance with solid background."
1116
+ />
1117
+ <Card
1118
+ appearance="outlined"
1119
+ variant="primary"
1120
+ title="Outlined Card"
1121
+ text="Outlined appearance with border only."
1122
+ />
1123
+ <Card
1124
+ appearance="ghost"
1125
+ variant="primary"
1126
+ title="Ghost Card"
1127
+ text="Ghost appearance with minimal styling."
1128
+ />
1129
+ <Card
1130
+ appearance="elevated"
1131
+ variant="primary"
1132
+ title="Elevated Card"
1133
+ text="Elevated appearance with shadow."
1134
+ />
925
1135
  </div>
926
1136
  ),
927
1137
  };
@@ -1008,7 +1218,8 @@ export const Comprehensive: Story = {
1008
1218
  parameters: {
1009
1219
  docs: {
1010
1220
  description: {
1011
- story: 'A comprehensive example demonstrating various card features including sizes, variants, appearances, elevations, and states in a grid layout.',
1221
+ story:
1222
+ 'A comprehensive example demonstrating various card features including sizes, variants, appearances, elevations, and states in a grid layout.',
1012
1223
  },
1013
1224
  },
1014
1225
  },
@@ -96,7 +96,24 @@ export const Card = React.memo(
96
96
  ]
97
97
  .filter(Boolean)
98
98
  .join(' '),
99
- [size, variant, appearance, elevation, hoverable, hoverElevation, row, flat, active, disabled, loading, selected, interactive, isClickable, glass, className]
99
+ [
100
+ size,
101
+ variant,
102
+ appearance,
103
+ elevation,
104
+ hoverable,
105
+ hoverElevation,
106
+ row,
107
+ flat,
108
+ active,
109
+ disabled,
110
+ loading,
111
+ selected,
112
+ interactive,
113
+ isClickable,
114
+ glass,
115
+ className,
116
+ ]
100
117
  );
101
118
 
102
119
  // Determine ARIA role
@@ -239,11 +256,7 @@ export const Card = React.memo(
239
256
 
240
257
  if (glass) {
241
258
  const glassProps = glass === true ? {} : glass;
242
- return (
243
- <AtomixGlass {...{ ...glassProps, elasticity: 0 }}>
244
- {anchorElement}
245
- </AtomixGlass>
246
- );
259
+ return <AtomixGlass {...{ ...glassProps, elasticity: 0 }}>{anchorElement}</AtomixGlass>;
247
260
  }
248
261
 
249
262
  return anchorElement;
@@ -258,11 +271,7 @@ export const Card = React.memo(
258
271
 
259
272
  if (glass) {
260
273
  const glassProps = glass === true ? {} : glass;
261
- return (
262
- <AtomixGlass {...{ ...glassProps, elasticity: 0 }}>
263
- {divElement}
264
- </AtomixGlass>
265
- );
274
+ return <AtomixGlass {...{ ...glassProps, elasticity: 0 }}>{divElement}</AtomixGlass>;
266
275
  }
267
276
 
268
277
  return divElement;
@@ -327,10 +336,16 @@ export interface CardBodyProps extends React.HTMLAttributes<HTMLDivElement> {
327
336
 
328
337
  export const CardBody = forwardRef<HTMLDivElement, CardBodyProps>(
329
338
  ({ scrollable = false, maxHeight, children, className = '', style, ...props }, ref) => {
330
- const bodyClasses = `${CARD.SELECTORS.BODY.substring(1)} ${scrollable ? 'c-card__body--scrollable' : ''} ${className}`.trim();
339
+ const bodyClasses =
340
+ `${CARD.SELECTORS.BODY.substring(1)} ${scrollable ? 'c-card__body--scrollable' : ''} ${className}`.trim();
331
341
  const bodyStyle: React.CSSProperties = {
332
342
  ...style,
333
- ...(scrollable && maxHeight ? { maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight, overflowY: 'auto' } : {}),
343
+ ...(scrollable && maxHeight
344
+ ? {
345
+ maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,
346
+ overflowY: 'auto',
347
+ }
348
+ : {}),
334
349
  };
335
350
 
336
351
  return (
@@ -352,7 +367,8 @@ export interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {
352
367
 
353
368
  export const CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(
354
369
  ({ align, children, className = '', style, ...props }, ref) => {
355
- const footerClasses = `${CARD.SELECTORS.FOOTER.substring(1)} ${align ? `c-card__footer--align-${align}` : ''} ${className}`.trim();
370
+ const footerClasses =
371
+ `${CARD.SELECTORS.FOOTER.substring(1)} ${align ? `c-card__footer--align-${align}` : ''} ${className}`.trim();
356
372
 
357
373
  return (
358
374
  <div ref={ref} className={footerClasses} style={style} {...props}>
@@ -49,7 +49,7 @@ const AreaChart = memo(
49
49
  y: scales.yScale(point.value),
50
50
  }));
51
51
 
52
- const areaPath = `M ${areaPoints.map((p) => `${p.x},${p.y}`).join(' L ')} L ${areaPoints[areaPoints.length - 1]?.x},${scales.height} L ${areaPoints[0]?.x},${scales.height} Z`;
52
+ const areaPath = `M ${areaPoints.map(p => `${p.x},${p.y}`).join(' L ')} L ${areaPoints[areaPoints.length - 1]?.x},${scales.height} L ${areaPoints[0]?.x},${scales.height} Z`;
53
53
 
54
54
  return (
55
55
  <g key={`dataset-${datasetIndex}`}>
@@ -125,7 +125,10 @@ const CandlestickChart = memo(
125
125
  borderColor = 'var(--atomix-primary-border-subtle)',
126
126
  showMovingAverages = false,
127
127
  movingAveragePeriods = [7, 21],
128
- movingAverageColors = ['var(--atomix-warning-bg-subtle)', 'var(--atomix-warning-border-subtle)'],
128
+ movingAverageColors = [
129
+ 'var(--atomix-warning-bg-subtle)',
130
+ 'var(--atomix-warning-border-subtle)',
131
+ ],
129
132
  dateFormat = 'short',
130
133
  dateFormatter,
131
134
  showGrid = true,
@@ -189,7 +192,11 @@ const CandlestickChart = memo(
189
192
  }: ChartRenderContentParams) => {
190
193
  if (!candlestickData.length) return null;
191
194
 
192
- const showTooltips = toolbarState?.showTooltips ?? renderConfig?.showTooltips ?? candlestickOptions.showTooltips ?? true;
195
+ const showTooltips =
196
+ toolbarState?.showTooltips ??
197
+ renderConfig?.showTooltips ??
198
+ candlestickOptions.showTooltips ??
199
+ true;
193
200
 
194
201
  const padding = 40;
195
202
  const chartWidth = scales.width - padding * 2;
@@ -298,7 +305,9 @@ const CandlestickChart = memo(
298
305
  );
299
306
  }}
300
307
  onMouseLeave={handlers.onPointLeave}
301
- onClick={() => handlers.onDataPointClick?.(candle as unknown as ChartDataPoint, 0, index)}
308
+ onClick={() =>
309
+ handlers.onDataPointClick?.(candle as unknown as ChartDataPoint, 0, index)
310
+ }
302
311
  />
303
312
  </g>
304
313
  );
@@ -372,19 +381,17 @@ const CandlestickChart = memo(
372
381
  {candles}
373
382
  {volumeBars}
374
383
  {movingAverages}
375
- {showTooltips &&
376
- hoveredPoint &&
377
- candlestickData[hoveredPoint.pointIndex] && (
378
- <ChartTooltip
379
- dataPoint={candlestickData[hoveredPoint.pointIndex] as unknown as ChartDataPoint}
380
- datasetLabel="Candlestick"
381
- position={{
382
- x: hoveredPoint.clientX,
383
- y: hoveredPoint.clientY,
384
- }}
385
- visible={true}
386
- />
387
- )}
384
+ {showTooltips && hoveredPoint && candlestickData[hoveredPoint.pointIndex] && (
385
+ <ChartTooltip
386
+ dataPoint={candlestickData[hoveredPoint.pointIndex] as unknown as ChartDataPoint}
387
+ datasetLabel="Candlestick"
388
+ position={{
389
+ x: hoveredPoint.clientX,
390
+ y: hoveredPoint.clientY,
391
+ }}
392
+ visible={true}
393
+ />
394
+ )}
388
395
  </>
389
396
  );
390
397
  };