@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.
- package/CHANGELOG.md +20 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +44 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +50 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +21044 -2618
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +77 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +44 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +50 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +1 -1
- package/dist/charts.js +86 -57
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +136 -112
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +2 -5
- package/dist/forms.js +140 -128
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +1 -1
- package/dist/heavy.js +136 -112
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +152 -78
- package/dist/index.esm.js +346 -340
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +359 -353
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.js.map +1 -1
- package/dist/theme.d.ts +9 -9
- package/dist/theme.js.map +1 -1
- package/package.json +23 -8
- package/scripts/atomix-cli.js +170 -73
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +161 -0
- package/scripts/cli/component-generator.js +253 -299
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/interactive-init.js +46 -5
- package/scripts/cli/template-manager.js +0 -2
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +148 -126
- package/scripts/cli/templates/index.js +23 -16
- package/scripts/cli/templates/project-templates.js +151 -23
- package/scripts/cli/templates/react-templates.js +280 -210
- package/scripts/cli/templates/scss-templates.js +90 -91
- package/scripts/cli/templates/testing-templates.js +206 -27
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/types-templates.js +70 -56
- package/scripts/cli/theme-bridge.js +8 -2
- package/scripts/cli/token-manager.js +318 -206
- package/scripts/cli/utils.js +0 -1
- package/src/components/Accordion/Accordion.stories.tsx +358 -850
- package/src/components/Accordion/Accordion.test.tsx +70 -50
- package/src/components/Accordion/Accordion.tsx +99 -94
- package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +6 -5
- package/src/components/AtomixGlass/shader-utils.ts +133 -52
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +195 -0
- package/src/components/Avatar/Avatar.tsx +58 -56
- package/src/components/Badge/Badge.stories.tsx +122 -352
- package/src/components/Badge/Badge.test.tsx +41 -41
- package/src/components/Badge/Badge.tsx +64 -62
- package/src/components/Block/Block.stories.tsx +30 -11
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
- package/src/components/Button/Button.stories.tsx +454 -1126
- package/src/components/Button/Button.test.tsx +123 -0
- package/src/components/Button/Button.tsx +88 -60
- package/src/components/Button/ButtonGroup.stories.tsx +376 -215
- package/src/components/Button/ButtonGroup.tsx +4 -15
- package/src/components/Callout/Callout.stories.tsx +316 -568
- package/src/components/Card/Card.stories.tsx +292 -81
- package/src/components/Card/Card.tsx +30 -14
- package/src/components/Chart/AreaChart.tsx +1 -1
- package/src/components/Chart/CandlestickChart.tsx +23 -16
- package/src/components/Chart/Chart.stories.tsx +153 -16
- package/src/components/Chart/Chart.tsx +40 -44
- package/src/components/Chart/ChartRenderer.tsx +39 -12
- package/src/components/Chart/ChartToolbar.tsx +21 -5
- package/src/components/Chart/DonutChart.tsx +1 -1
- package/src/components/Chart/FunnelChart.tsx +4 -1
- package/src/components/Chart/GaugeChart.tsx +3 -1
- package/src/components/Chart/HeatmapChart.tsx +50 -37
- package/src/components/Chart/LineChart.tsx +3 -2
- package/src/components/Chart/MultiAxisChart.tsx +24 -16
- package/src/components/Chart/RadarChart.tsx +19 -17
- package/src/components/Chart/ScatterChart.tsx +29 -21
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
- package/src/components/Countdown/Countdown.stories.tsx +114 -7
- package/src/components/DataTable/DataTable.stories.tsx +349 -144
- package/src/components/DataTable/DataTable.test.tsx +26 -148
- package/src/components/DataTable/DataTable.tsx +485 -456
- package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
- package/src/components/DatePicker/DatePicker.tsx +31 -26
- package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
- package/src/components/Dropdown/Dropdown.tsx +313 -299
- package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
- package/src/components/EdgePanel/EdgePanel.tsx +1 -3
- package/src/components/Footer/Footer.stories.tsx +396 -327
- package/src/components/Footer/Footer.tsx +130 -128
- package/src/components/Footer/FooterLink.tsx +2 -2
- package/src/components/Form/Checkbox.stories.tsx +140 -6
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +122 -78
- package/src/components/Form/Form.stories.tsx +110 -19
- package/src/components/Form/FormGroup.stories.tsx +127 -4
- package/src/components/Form/Input.stories.tsx +22 -39
- package/src/components/Form/Input.test.tsx +38 -44
- package/src/components/Form/Radio.stories.tsx +146 -17
- package/src/components/Form/Radio.tsx +68 -66
- package/src/components/Form/Select.stories.tsx +140 -8
- package/src/components/Form/Select.tsx +184 -182
- package/src/components/Form/Textarea.stories.tsx +149 -6
- package/src/components/Form/Textarea.test.tsx +27 -32
- package/src/components/Hero/Hero.stories.tsx +372 -38
- package/src/components/Hero/Hero.tsx +201 -55
- package/src/components/Icon/index.ts +7 -1
- package/src/components/List/List.stories.tsx +141 -3
- package/src/components/List/List.tsx +19 -23
- package/src/components/Modal/Modal.stories.tsx +183 -43
- package/src/components/Modal/Modal.tsx +130 -127
- package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
- package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
- package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
- package/src/components/Pagination/Pagination.stories.tsx +7 -4
- package/src/components/Pagination/Pagination.tsx +199 -202
- package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
- package/src/components/Popover/Popover.stories.tsx +354 -97
- package/src/components/Popover/Popover.tsx +41 -37
- package/src/components/Progress/Progress.stories.tsx +160 -7
- package/src/components/River/River.stories.tsx +3 -2
- package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
- package/src/components/Slider/Slider.stories.tsx +12 -4
- package/src/components/Spinner/Spinner.stories.tsx +104 -8
- package/src/components/Spinner/Spinner.test.tsx +23 -23
- package/src/components/Spinner/Spinner.tsx +43 -46
- package/src/components/Steps/Steps.stories.tsx +173 -42
- package/src/components/Tabs/Tabs.stories.tsx +141 -12
- package/src/components/Tabs/Tabs.tsx +74 -72
- package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +137 -36
- package/src/components/Toggle/Toggle.test.tsx +65 -70
- package/src/components/Toggle/Toggle.tsx +4 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
- package/src/components/Tooltip/Tooltip.tsx +104 -106
- package/src/components/Upload/Upload.stories.tsx +241 -150
- package/src/components/Upload/Upload.tsx +287 -283
- package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
- package/src/components/index.ts +13 -2
- package/src/layouts/Grid/Grid.stories.tsx +9 -3
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +219 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/shared-mouse-tracker.ts +13 -14
- package/src/lib/composables/useAtomixGlass.ts +126 -97
- package/src/lib/composables/useChartExport.ts +3 -8
- package/src/lib/composables/useDataTable.ts +72 -43
- package/src/lib/composables/useHero.ts +58 -14
- package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
- package/src/lib/composables/useInput.ts +10 -8
- package/src/lib/composables/useSideMenu.ts +6 -5
- package/src/lib/composables/useTooltip.ts +1 -2
- package/src/lib/composables/useVideoPlayer.ts +44 -35
- package/src/lib/config/index.ts +154 -154
- package/src/lib/constants/components.ts +9 -32
- package/src/lib/constants/cssVariables.ts +29 -29
- package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
- package/src/lib/hooks/index.ts +1 -1
- package/src/lib/hooks/useComponentCustomization.ts +11 -17
- package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
- package/src/lib/patterns/__tests__/slots.test.ts +1 -1
- package/src/lib/patterns/index.ts +1 -1
- package/src/lib/patterns/slots.tsx +8 -13
- package/src/lib/storybook/InteractiveDemo.tsx +13 -18
- package/src/lib/storybook/PreviewContainer.tsx +1 -1
- package/src/lib/storybook/VariantsGrid.tsx +3 -7
- package/src/lib/storybook/index.ts +1 -1
- package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
- package/src/lib/theme/adapters/index.ts +3 -9
- package/src/lib/theme/adapters/themeAdapter.ts +41 -26
- package/src/lib/theme/config/index.ts +1 -1
- package/src/lib/theme/config/types.ts +2 -2
- package/src/lib/theme/config/validator.ts +10 -5
- package/src/lib/theme/constants/constants.ts +2 -2
- package/src/lib/theme/constants/index.ts +1 -2
- package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
- package/src/lib/theme/core/composeTheme.ts +32 -26
- package/src/lib/theme/core/createTheme.ts +1 -1
- package/src/lib/theme/core/createThemeObject.ts +308 -301
- package/src/lib/theme/core/index.ts +3 -3
- package/src/lib/theme/devtools/CLI.ts +107 -105
- package/src/lib/theme/devtools/Comparator.tsx +50 -32
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
- package/src/lib/theme/devtools/Inspector.tsx +75 -60
- package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
- package/src/lib/theme/devtools/Preview.tsx +150 -106
- package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
- package/src/lib/theme/devtools/index.ts +3 -9
- package/src/lib/theme/devtools/useHistory.ts +23 -21
- package/src/lib/theme/errors/errors.ts +12 -11
- package/src/lib/theme/errors/index.ts +2 -7
- package/src/lib/theme/generators/generateCSS.ts +9 -13
- package/src/lib/theme/generators/generateCSSNested.ts +1 -6
- package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
- package/src/lib/theme/generators/index.ts +1 -4
- package/src/lib/theme/i18n/index.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +13 -13
- package/src/lib/theme/index.ts +7 -16
- package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
- package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
- package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
- package/src/lib/theme/runtime/index.ts +2 -5
- package/src/lib/theme/runtime/useTheme.ts +18 -18
- package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
- package/src/lib/theme/test/testTheme.ts +15 -16
- package/src/lib/theme/tokens/index.ts +2 -7
- package/src/lib/theme/tokens/tokens.ts +25 -24
- package/src/lib/theme/types.ts +428 -411
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
- package/src/lib/theme/utils/componentTheming.ts +18 -18
- package/src/lib/theme/utils/domUtils.ts +277 -289
- package/src/lib/theme/utils/index.ts +1 -2
- package/src/lib/theme/utils/injectCSS.ts +10 -14
- package/src/lib/theme/utils/naming.ts +20 -16
- package/src/lib/theme/utils/themeHelpers.ts +10 -12
- package/src/lib/theme/utils/themeUtils.ts +85 -86
- package/src/lib/theme/utils/themeValidation.ts +82 -33
- package/src/lib/theme-tools.ts +8 -6
- package/src/lib/types/components.ts +172 -71
- package/src/lib/types/partProps.ts +1 -1
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/componentUtils.ts +8 -12
- package/src/lib/utils/csv.ts +19 -0
- package/src/lib/utils/dataTableExport.ts +2 -15
- package/src/lib/utils/fontPreloader.ts +10 -19
- package/src/lib/utils/icons.ts +4 -1
- package/src/lib/utils/index.ts +2 -6
- package/src/lib/utils/memoryMonitor.ts +10 -8
- package/src/lib/utils/themeNaming.ts +2 -2
- package/src/styles/01-settings/_index.scss +1 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
- package/src/styles/01-settings/_settings.navbar.scss +1 -1
- package/src/styles/01-settings/_settings.spacing.scss +3 -4
- package/src/styles/01-settings/_settings.tooltip.scss +1 -1
- package/src/styles/01-settings/_settings.typography.scss +4 -4
- package/src/styles/02-tools/_tools.button.scss +51 -21
- package/src/styles/02-tools/_tools.utility-api.scss +38 -12
- package/src/styles/03-generic/_generic.root.scss +4 -3
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.atomix-glass.scss +13 -9
- package/src/styles/06-components/_components.button.scss +16 -4
- package/src/styles/06-components/_components.callout.scss +27 -21
- package/src/styles/06-components/_components.card.scss +5 -14
- package/src/styles/06-components/_components.chart.scss +22 -19
- package/src/styles/06-components/_components.checkbox.scss +25 -17
- package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
- package/src/styles/06-components/_components.edge-panel.scss +9 -2
- package/src/styles/06-components/_components.footer.scss +1 -1
- package/src/styles/06-components/_components.side-menu.scss +5 -5
- package/src/styles/06-components/_components.toggle.scss +18 -0
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/06-components/old.chart.styles.scss +0 -2
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.border.scss +69 -27
- package/src/styles/99-utilities/_utilities.display.scss +1 -1
- package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
- package/src/styles/99-utilities/_utilities.position.scss +16 -9
- package/src/styles/99-utilities/_utilities.scss +2 -0
- package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
- package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +67 -46
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/templates-original-backup.js +0 -1655
- package/scripts/cli/templates_backup.js +0 -684
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- 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
|
-
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
<
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
367
|
-
{
|
|
368
|
-
<div className={CHART.
|
|
369
|
-
|
|
370
|
-
<
|
|
371
|
-
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
-
|
|
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 {
|
|
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(
|
|
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(
|
|
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
|
-
}, [
|
|
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
|
|
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(
|
|
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'
|
|
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={
|
|
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
|
|
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
|
|
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={
|
|
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
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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 &&
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
renderedDatasets[hoveredPoint.datasetIndex]?.
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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 =
|
|
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(
|
|
105
|
+
: `M ${points.map(p => `${p.x},${p.y}`).join(' L ')}`;
|
|
105
106
|
|
|
106
107
|
return (
|
|
107
108
|
<g key={`dataset-${datasetIndex}`}>
|