@shohojdhara/atomix 0.2.3 → 0.2.4

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 (74) hide show
  1. package/dist/atomix.css +430 -125
  2. package/dist/atomix.min.css +4 -4
  3. package/dist/index.d.ts +188 -42
  4. package/dist/index.esm.js +2049 -1516
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.js +3571 -3055
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.min.js +1 -1
  9. package/dist/index.min.js.map +1 -1
  10. package/dist/themes/boomdevs.css +379 -74
  11. package/dist/themes/boomdevs.min.css +4 -4
  12. package/dist/themes/esrar.css +430 -125
  13. package/dist/themes/esrar.min.css +4 -4
  14. package/dist/themes/mashroom.css +429 -124
  15. package/dist/themes/mashroom.min.css +4 -4
  16. package/dist/themes/shaj-default.css +429 -124
  17. package/dist/themes/shaj-default.min.css +4 -4
  18. package/package.json +1 -1
  19. package/src/components/Accordion/Accordion.stories.tsx +684 -21
  20. package/src/components/Accordion/Accordion.tsx +5 -7
  21. package/src/components/AtomixGlass/AtomixGlass.stories.tsx +456 -2237
  22. package/src/components/AtomixGlass/AtomixGlass.test.tsx +2 -2
  23. package/src/components/AtomixGlass/AtomixGlass.tsx +728 -666
  24. package/src/components/AtomixGlass/shader-utils.ts +589 -33
  25. package/src/components/AtomixGlass/stories/Examples.stories.tsx +5800 -0
  26. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1065 -0
  27. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1066 -0
  28. package/src/components/AtomixGlass/stories/ShaderVariants.stories.tsx +397 -0
  29. package/src/components/AtomixGlass/stories/shared-components.tsx +310 -0
  30. package/src/components/Badge/Badge.stories.tsx +3 -2
  31. package/src/components/Badge/Badge.tsx +9 -7
  32. package/src/components/Button/Button.stories.tsx +501 -20
  33. package/src/components/Button/Button.tsx +4 -5
  34. package/src/components/Callout/Callout.tsx +27 -9
  35. package/src/components/Card/Card.stories.tsx +560 -1
  36. package/src/components/Card/Card.tsx +1 -1
  37. package/src/components/DatePicker/DatePicker.stories.tsx +697 -9
  38. package/src/components/EdgePanel/EdgePanel.stories.tsx +476 -3
  39. package/src/components/EdgePanel/EdgePanel.tsx +86 -13
  40. package/src/components/Messages/Messages.stories.tsx +113 -0
  41. package/src/components/Messages/Messages.tsx +51 -9
  42. package/src/components/Modal/Modal.stories.tsx +6 -4
  43. package/src/components/Modal/Modal.tsx +2 -3
  44. package/src/components/Navigation/Nav/Nav.stories.tsx +469 -0
  45. package/src/components/Navigation/Nav/Nav.tsx +17 -4
  46. package/src/components/Navigation/Navbar/Navbar.stories.tsx +413 -0
  47. package/src/components/Navigation/Navbar/Navbar.tsx +66 -28
  48. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +340 -0
  49. package/src/components/Navigation/SideMenu/SideMenu.tsx +28 -2
  50. package/src/components/Progress/Progress.tsx +17 -2
  51. package/src/components/Spinner/Spinner.tsx +17 -2
  52. package/src/lib/composables/useBarChart.ts +14 -4
  53. package/src/lib/composables/useChart.ts +223 -370
  54. package/src/lib/composables/useChartToolbar.ts +11 -20
  55. package/src/lib/composables/useEdgePanel.ts +81 -35
  56. package/src/lib/composables/useLineChart.ts +4 -2
  57. package/src/lib/composables/usePieChart.ts +4 -14
  58. package/src/lib/constants/components.ts +1 -0
  59. package/src/lib/types/components.ts +97 -15
  60. package/src/styles/01-settings/_settings.background.scss +2 -2
  61. package/src/styles/01-settings/_settings.edge-panel.scss +1 -1
  62. package/src/styles/02-tools/_tools.utility-api.scss +62 -27
  63. package/src/styles/06-components/_components.atomix-glass.scss +72 -0
  64. package/src/styles/06-components/_components.badge.scss +2 -15
  65. package/src/styles/06-components/_components.callout.scss +10 -5
  66. package/src/styles/06-components/_components.edge-panel.scss +101 -0
  67. package/src/styles/06-components/_components.messages.scss +176 -0
  68. package/src/styles/06-components/_components.modal.scss +13 -3
  69. package/src/styles/06-components/_components.navbar.scss +12 -1
  70. package/src/styles/06-components/_components.side-menu.scss +5 -0
  71. package/src/styles/99-utilities/_index.scss +1 -0
  72. package/src/styles/99-utilities/_utilities.glass-fixes.scss +1 -0
  73. package/src/styles/99-utilities/_utilities.opacity.scss +1 -1
  74. package/src/components/AtomixGlass/AtomixGlassComprehensivePreview.stories.tsx +0 -1369
@@ -607,3 +607,343 @@ export const InteractiveDemo: Story = {
607
607
  onToggle: fn(),
608
608
  },
609
609
  };
610
+
611
+ // Glass Morphism Effect Stories - Professional Showcase
612
+
613
+ /**
614
+ * Background wrapper component for consistent glass effect demonstrations
615
+ */
616
+ interface BackgroundWrapperProps {
617
+ children: React.ReactNode;
618
+ backgroundImage: string;
619
+ height?: string;
620
+ padding?: string;
621
+ overlay?: boolean;
622
+ }
623
+
624
+ const BackgroundWrapper = ({
625
+ children,
626
+ backgroundImage,
627
+ height = '90vh',
628
+ padding = '60px 40px',
629
+ overlay = false,
630
+ }: BackgroundWrapperProps) => (
631
+ <div
632
+ style={{
633
+ position: 'relative',
634
+ width: '100%',
635
+ minHeight: height,
636
+ background: `url(${backgroundImage})`,
637
+ backgroundSize: 'cover',
638
+ backgroundPosition: 'center',
639
+ backgroundAttachment: 'fixed',
640
+ display: 'flex',
641
+ alignItems: 'center',
642
+ justifyContent: 'flex-start',
643
+ padding: padding,
644
+ borderRadius: '12px',
645
+ gap: '3rem',
646
+ }}
647
+ >
648
+ {overlay && (
649
+ <div
650
+ style={{
651
+ position: 'absolute',
652
+ top: 0,
653
+ left: 0,
654
+ right: 0,
655
+ bottom: 0,
656
+ backgroundColor: 'rgba(0,0,0,0.3)',
657
+ borderRadius: '12px',
658
+ }}
659
+ />
660
+ )}
661
+ {children}
662
+ </div>
663
+ );
664
+
665
+ /**
666
+ * Glass Effect - Default
667
+ *
668
+ * Demonstrates the SideMenu component with default glass morphism settings.
669
+ * The glass effect provides a modern, frosted appearance perfect for sidebar navigation.
670
+ */
671
+ export const Glass: Story = {
672
+ render: () => (
673
+ <BackgroundWrapper
674
+ backgroundImage="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?q=80&w=2940&auto=format&fit=crop"
675
+ overlay
676
+ >
677
+ <div style={{ position: 'relative', width: '300px' }}>
678
+ <SideMenu title="Navigation" glass>
679
+ <SideMenuList>
680
+ <SideMenuItem href="/" icon={<Icon name="House" size="sm" />} active>
681
+ Home
682
+ </SideMenuItem>
683
+ <SideMenuItem href="/explore" icon={<Icon name="Compass" size="sm" />}>
684
+ Explore
685
+ </SideMenuItem>
686
+ <SideMenuItem href="/services" icon={<Icon name="Briefcase" size="sm" />}>
687
+ Services
688
+ </SideMenuItem>
689
+ <SideMenuItem href="/contact" icon={<Icon name="Envelope" size="sm" />}>
690
+ Contact
691
+ </SideMenuItem>
692
+ </SideMenuList>
693
+ <SideMenuList>
694
+ <SideMenuItem href="/settings" icon={<Icon name="Gear" size="sm" />}>
695
+ Settings
696
+ </SideMenuItem>
697
+ </SideMenuList>
698
+ </SideMenu>
699
+ </div>
700
+ <div style={{ position: 'relative', zIndex: 1, flex: 1, maxWidth: '600px' }}>
701
+ <h2
702
+ style={{
703
+ color: 'white',
704
+ fontSize: '32px',
705
+ fontWeight: 600,
706
+ marginBottom: '16px',
707
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
708
+ }}
709
+ >
710
+ Glass SideMenu
711
+ </h2>
712
+ <p
713
+ style={{
714
+ color: 'rgba(255,255,255,0.9)',
715
+ fontSize: '18px',
716
+ lineHeight: 1.6,
717
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
718
+ }}
719
+ >
720
+ A modern sidebar navigation with glassmorphism effect. Perfect for dashboards, admin
721
+ panels, and application interfaces that require elegant navigation.
722
+ </p>
723
+ </div>
724
+ </BackgroundWrapper>
725
+ ),
726
+ parameters: {
727
+ layout: 'fullscreen',
728
+ docs: {
729
+ description: {
730
+ story:
731
+ 'Basic glass morphism effect with default settings. The sidebar maintains excellent readability while creating a beautiful frosted glass aesthetic.',
732
+ },
733
+ },
734
+ },
735
+ };
736
+
737
+ /**
738
+ * Glass with Custom Properties
739
+ *
740
+ * Demonstrates advanced customization of the glass effect with various
741
+ * displacement, blur, and corner radius settings.
742
+ */
743
+ export const GlassCustom: Story = {
744
+ render: () => (
745
+ <BackgroundWrapper
746
+ backgroundImage="https://images.unsplash.com/photo-1441974231531-c6227db76b6e?q=80&w=2940&auto=format&fit=crop"
747
+ overlay
748
+ >
749
+ <div style={{ position: 'relative', width: '320px' }}>
750
+ <SideMenu
751
+ title="Nature Explorer"
752
+ glass={{
753
+ displacementScale: 70,
754
+ blurAmount: 2,
755
+ cornerRadius: 12,
756
+ mode: 'shader',
757
+ }}
758
+ >
759
+ <SideMenuList>
760
+ <SideMenuItem href="/" icon={<Icon name="House" size="sm" />} active>
761
+ Home
762
+ </SideMenuItem>
763
+ <SideMenuItem href="/trails" icon={<Icon name="MapPin" size="sm" />}>
764
+ Trails
765
+ </SideMenuItem>
766
+ <SideMenuItem href="/wildlife" icon={<Icon name="Sparkle" size="sm" />}>
767
+ Wildlife
768
+ </SideMenuItem>
769
+ <SideMenuItem href="/camping" icon={<Icon name="Tent" size="sm" />}>
770
+ Camping
771
+ </SideMenuItem>
772
+ </SideMenuList>
773
+ <SideMenuList>
774
+ <SideMenuItem href="/guides" icon={<Icon name="Book" size="sm" />}>
775
+ Guides
776
+ </SideMenuItem>
777
+ <SideMenuItem href="/gear" icon={<Icon name="Backpack" size="sm" />}>
778
+ Gear List
779
+ </SideMenuItem>
780
+ </SideMenuList>
781
+ </SideMenu>
782
+ </div>
783
+ <div style={{ position: 'relative', zIndex: 1, flex: 1, maxWidth: '600px' }}>
784
+ <h2
785
+ style={{
786
+ color: 'white',
787
+ fontSize: '32px',
788
+ fontWeight: 600,
789
+ marginBottom: '16px',
790
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
791
+ }}
792
+ >
793
+ Custom Glass Properties
794
+ </h2>
795
+ <p
796
+ style={{
797
+ color: 'rgba(255,255,255,0.9)',
798
+ fontSize: '18px',
799
+ lineHeight: 1.6,
800
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
801
+ }}
802
+ >
803
+ Enhanced glass effect with custom displacement, blur, and corner radius. Perfect for
804
+ creating unique visual experiences tailored to your brand.
805
+ </p>
806
+ </div>
807
+ </BackgroundWrapper>
808
+ ),
809
+ parameters: {
810
+ layout: 'fullscreen',
811
+ docs: {
812
+ description: {
813
+ story:
814
+ 'Customized glass effect with increased displacement and blur for a more pronounced visual impact. Demonstrates the flexibility of the glass morphism system.',
815
+ },
816
+ },
817
+ },
818
+ };
819
+
820
+ /**
821
+ * Glass Theme Variations
822
+ *
823
+ * A comprehensive showcase of glass sidebar across different themed
824
+ * backgrounds, demonstrating versatility and adaptability.
825
+ */
826
+ export const GlassThemeShowcase: Story = {
827
+ render: () => (
828
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '3rem' }}>
829
+ {/* Ocean Theme */}
830
+ <BackgroundWrapper
831
+ backgroundImage="https://images.unsplash.com/photo-1505142468610-359e7d316be0?q=80&w=2940&auto=format&fit=crop"
832
+ height="70vh"
833
+ >
834
+ <div style={{ position: 'relative', width: '300px' }}>
835
+ <SideMenu title="Ocean Explorer" glass>
836
+ <SideMenuList>
837
+ <SideMenuItem href="/" icon={<Icon name="House" size="sm" />} active>
838
+ Home
839
+ </SideMenuItem>
840
+ <SideMenuItem href="/beaches" icon={<Icon name="Sun" size="sm" />}>
841
+ Beaches
842
+ </SideMenuItem>
843
+ <SideMenuItem href="/diving" icon={<Icon name="Waves" size="sm" />}>
844
+ Diving
845
+ </SideMenuItem>
846
+ </SideMenuList>
847
+ </SideMenu>
848
+ </div>
849
+ <div style={{ position: 'relative', flex: 1 }}>
850
+ <h3
851
+ style={{
852
+ color: 'white',
853
+ fontSize: '24px',
854
+ fontWeight: 600,
855
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
856
+ }}
857
+ >
858
+ Ocean & Travel Theme
859
+ </h3>
860
+ </div>
861
+ </BackgroundWrapper>
862
+
863
+ {/* Urban Theme */}
864
+ <BackgroundWrapper
865
+ backgroundImage="https://images.unsplash.com/photo-1514565131-fce0801e5785?q=80&w=2940&auto=format&fit=crop"
866
+ height="70vh"
867
+ >
868
+ <div style={{ position: 'relative', width: '300px' }}>
869
+ <SideMenu title="Admin Panel" glass>
870
+ <SideMenuList>
871
+ <SideMenuItem href="/dashboard" icon={<Icon name="ChartBar" size="sm" />} active>
872
+ Dashboard
873
+ </SideMenuItem>
874
+ <SideMenuItem href="/analytics" icon={<Icon name="TrendUp" size="sm" />}>
875
+ Analytics
876
+ </SideMenuItem>
877
+ <SideMenuItem href="/users" icon={<Icon name="Users" size="sm" />}>
878
+ Users
879
+ </SideMenuItem>
880
+ </SideMenuList>
881
+ </SideMenu>
882
+ </div>
883
+ <div style={{ position: 'relative', flex: 1 }}>
884
+ <h3
885
+ style={{
886
+ color: 'white',
887
+ fontSize: '24px',
888
+ fontWeight: 600,
889
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
890
+ }}
891
+ >
892
+ Modern & Professional Theme
893
+ </h3>
894
+ </div>
895
+ </BackgroundWrapper>
896
+
897
+ {/* Sunset Theme */}
898
+ <BackgroundWrapper
899
+ backgroundImage="https://images.unsplash.com/photo-1495616811223-4d98c6e9c869?q=80&w=2940&auto=format&fit=crop"
900
+ height="70vh"
901
+ >
902
+ <div style={{ position: 'relative', width: '320px' }}>
903
+ <SideMenu
904
+ title="Travel Hub"
905
+ glass={{
906
+ displacementScale: 60,
907
+ blurAmount: 1.8,
908
+ cornerRadius: 16,
909
+ mode: 'shader',
910
+ }}
911
+ >
912
+ <SideMenuList>
913
+ <SideMenuItem href="/home" icon={<Icon name="House" size="sm" />} active>
914
+ Home
915
+ </SideMenuItem>
916
+ <SideMenuItem href="/destinations" icon={<Icon name="MapPin" size="sm" />}>
917
+ Destinations
918
+ </SideMenuItem>
919
+ <SideMenuItem href="/bookings" icon={<Icon name="Calendar" size="sm" />}>
920
+ Bookings
921
+ </SideMenuItem>
922
+ </SideMenuList>
923
+ </SideMenu>
924
+ </div>
925
+ <div style={{ position: 'relative', flex: 1 }}>
926
+ <h3
927
+ style={{
928
+ color: 'white',
929
+ fontSize: '24px',
930
+ fontWeight: 600,
931
+ textShadow: '0 2px 10px rgba(0,0,0,0.5)',
932
+ }}
933
+ >
934
+ Warm & Inviting Theme
935
+ </h3>
936
+ </div>
937
+ </BackgroundWrapper>
938
+ </div>
939
+ ),
940
+ parameters: {
941
+ layout: 'fullscreen',
942
+ docs: {
943
+ description: {
944
+ story:
945
+ 'A comprehensive showcase demonstrating how glass sidebar adapts to different themes and color palettes. Each example represents a different use case and aesthetic.',
946
+ },
947
+ },
948
+ },
949
+ };
@@ -3,6 +3,8 @@ import { SideMenuProps } from '../../../lib/types/components';
3
3
  import { useSideMenu } from '../../../lib/composables/useSideMenu';
4
4
  import { SIDE_MENU } from '../../../lib/constants/components';
5
5
  import { Icon } from '../../Icon';
6
+ import { AtomixGlass } from '../../AtomixGlass/AtomixGlass';
7
+ import { log } from 'console';
6
8
 
7
9
  /**
8
10
  * SideMenu component provides a collapsible navigation menu with title and menu items.
@@ -31,6 +33,7 @@ export const SideMenu = forwardRef<HTMLDivElement, SideMenuProps>(
31
33
  disabled = false,
32
34
  toggleIcon,
33
35
  id,
36
+ glass,
34
37
  },
35
38
  ref
36
39
  ) => {
@@ -54,8 +57,8 @@ export const SideMenu = forwardRef<HTMLDivElement, SideMenuProps>(
54
57
  // Default toggle icon using Atomix Icon component
55
58
  const defaultToggleIcon = <Icon name="CaretRight" size="xs" />;
56
59
 
57
- return (
58
- <div ref={ref} className={sideMenuClass} id={id}>
60
+ const sideMenuContent = (
61
+ <>
59
62
  {title && collapsible && (
60
63
  <div
61
64
  className="c-side-menu__toggler"
@@ -89,6 +92,29 @@ export const SideMenu = forwardRef<HTMLDivElement, SideMenuProps>(
89
92
  {children}
90
93
  </div>
91
94
  </div>
95
+ </>
96
+ );
97
+
98
+ if (glass) {
99
+ const defaultGlassProps = {
100
+ displacementScale: 70,
101
+ blurAmount: 2,
102
+ cornerRadius: 12,
103
+ mode: 'shader' as const,
104
+ };
105
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
106
+ return (
107
+ <AtomixGlass {...glassProps}>
108
+ <div ref={ref} className={sideMenuClass + ' c-side-menu--glass'} id={id}>
109
+ {sideMenuContent}
110
+ </div>
111
+ </AtomixGlass>
112
+ );
113
+ }
114
+
115
+ return (
116
+ <div ref={ref} className={sideMenuClass} id={id}>
117
+ {sideMenuContent}
92
118
  </div>
93
119
  );
94
120
  }
@@ -2,6 +2,7 @@ import React, { forwardRef } from 'react';
2
2
  import { ProgressProps } from '../../lib/types/components';
3
3
  import { useProgress } from '../../lib/composables/useProgress';
4
4
  import { PROGRESS } from '../../lib/constants/components';
5
+ import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
5
6
 
6
7
  export const Progress = forwardRef<HTMLDivElement, ProgressProps>(
7
8
  (
@@ -12,6 +13,7 @@ export const Progress = forwardRef<HTMLDivElement, ProgressProps>(
12
13
  className = '',
13
14
  disabled = false,
14
15
  ariaLabel = PROGRESS.DEFAULTS.ARIA_LABEL,
16
+ glass,
15
17
  },
16
18
  ref
17
19
  ) => {
@@ -22,10 +24,10 @@ export const Progress = forwardRef<HTMLDivElement, ProgressProps>(
22
24
  className,
23
25
  });
24
26
 
25
- return (
27
+ const progressContent = (
26
28
  <div
27
29
  ref={ref}
28
- className={progressClasses}
30
+ className={progressClasses + (glass ? ' c-progress--glass' : '')}
29
31
  style={progressStyle}
30
32
  role="progressbar"
31
33
  aria-valuemin={0}
@@ -37,6 +39,19 @@ export const Progress = forwardRef<HTMLDivElement, ProgressProps>(
37
39
  <div className={PROGRESS.CLASSES.BAR}></div>
38
40
  </div>
39
41
  );
42
+
43
+ if (glass) {
44
+ const defaultGlassProps = {
45
+ displacementScale: 30,
46
+ blurAmount: 0.5,
47
+ cornerRadius: 8,
48
+ mode: 'shader' as const,
49
+ };
50
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
51
+ return <AtomixGlass {...glassProps}>{progressContent}</AtomixGlass>;
52
+ }
53
+
54
+ return progressContent;
40
55
  }
41
56
  );
42
57
 
@@ -2,12 +2,14 @@ import React from 'react';
2
2
  import { SpinnerProps } from '../../lib/types/components';
3
3
  import { useSpinner } from '../../lib/composables/useSpinner';
4
4
  import { SPINNER } from '../../lib/constants/components';
5
+ import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
5
6
 
6
7
  export const Spinner: React.FC<SpinnerProps> = ({
7
8
  size = 'md',
8
9
  variant = 'primary',
9
10
  fullscreen = false,
10
11
  className = '',
12
+ glass,
11
13
  }) => {
12
14
  const { generateSpinnerClass } = useSpinner({
13
15
  size,
@@ -19,14 +21,27 @@ export const Spinner: React.FC<SpinnerProps> = ({
19
21
  size,
20
22
  variant,
21
23
  fullscreen,
22
- className,
24
+ className: `${className} ${glass ? 'c-spinner--glass' : ''}`.trim(),
23
25
  });
24
26
 
25
- return (
27
+ const spinnerContent = (
26
28
  <div className={spinnerClass} role="status">
27
29
  <span className={SPINNER.VISUALLY_HIDDEN}>Loading...</span>
28
30
  </div>
29
31
  );
32
+
33
+ if (glass) {
34
+ const defaultGlassProps = {
35
+ displacementScale: 20,
36
+ blurAmount: 1,
37
+ cornerRadius: 999,
38
+ mode: 'shader' as const,
39
+ };
40
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
41
+ return <AtomixGlass {...glassProps}>{spinnerContent}</AtomixGlass>;
42
+ }
43
+
44
+ return spinnerContent;
30
45
  };
31
46
 
32
47
  export type { SpinnerProps };
@@ -101,8 +101,10 @@ export function useBarChart(datasets: ChartDataset[], options: BarChartOptions =
101
101
  const [hoveredBar, setHoveredBar] = useState<{
102
102
  datasetIndex: number;
103
103
  pointIndex: number;
104
- x: number;
105
- y: number;
104
+ chartX: number;
105
+ chartY: number;
106
+ clientX: number;
107
+ clientY: number;
106
108
  } | null>(null);
107
109
 
108
110
  const [animationProgress, setAnimationProgress] = useState(0);
@@ -119,6 +121,7 @@ export function useBarChart(datasets: ChartDataset[], options: BarChartOptions =
119
121
  ): BarDimensions[] => {
120
122
  if (!datasets.length) return [];
121
123
 
124
+ // Use provided dimensions and padding (from ChartRenderer scales)
122
125
  const innerWidth = width - padding.left - padding.right;
123
126
  const innerHeight = height - padding.top - padding.bottom;
124
127
  const numCategories = datasets[0]?.data?.length || 0;
@@ -270,8 +273,15 @@ export function useBarChart(datasets: ChartDataset[], options: BarChartOptions =
270
273
 
271
274
  // Bar hover handlers
272
275
  const handleBarHover = useCallback(
273
- (datasetIndex: number, pointIndex: number, x: number, y: number) => {
274
- setHoveredBar({ datasetIndex, pointIndex, x, y });
276
+ (datasetIndex: number, pointIndex: number, chartX: number, chartY: number, clientX: number, clientY: number) => {
277
+ setHoveredBar({
278
+ datasetIndex,
279
+ pointIndex,
280
+ chartX,
281
+ chartY,
282
+ clientX,
283
+ clientY
284
+ });
275
285
  },
276
286
  []
277
287
  );