@shohojdhara/atomix 0.2.3 → 0.2.5

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 (225) hide show
  1. package/README.md +19 -0
  2. package/dist/atomix.css +1703 -1544
  3. package/dist/atomix.min.css +4 -4
  4. package/dist/index.d.ts +1465 -963
  5. package/dist/index.esm.js +16289 -25908
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/index.js +15650 -21780
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.min.js +1 -1
  10. package/dist/index.min.js.map +1 -1
  11. package/dist/themes/applemix.css +15008 -0
  12. package/dist/themes/applemix.min.css +72 -0
  13. package/dist/themes/boomdevs.css +1608 -1450
  14. package/dist/themes/boomdevs.min.css +5 -5
  15. package/dist/themes/esrar.css +1702 -1543
  16. package/dist/themes/esrar.min.css +4 -4
  17. package/dist/themes/flashtrade.css +15159 -0
  18. package/dist/themes/flashtrade.min.css +86 -0
  19. package/dist/themes/mashroom.css +1699 -1540
  20. package/dist/themes/mashroom.min.css +7 -7
  21. package/dist/themes/shaj-default.css +1693 -1534
  22. package/dist/themes/shaj-default.min.css +4 -4
  23. package/package.json +6 -17
  24. package/src/components/Accordion/Accordion.stories.tsx +662 -21
  25. package/src/components/Accordion/Accordion.tsx +21 -14
  26. package/src/components/AtomixGlass/AtomixGlass.test.tsx +106 -72
  27. package/src/components/AtomixGlass/AtomixGlass.tsx +529 -1195
  28. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +400 -0
  29. package/src/components/AtomixGlass/GlassFilter.tsx +156 -0
  30. package/src/components/AtomixGlass/README.md +124 -2
  31. package/src/components/AtomixGlass/atomixGLass.old.tsx +1266 -0
  32. package/src/components/AtomixGlass/glass-utils.ts +263 -0
  33. package/src/components/AtomixGlass/shader-utils.ts +792 -68
  34. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +1250 -0
  35. package/src/components/AtomixGlass/stories/Examples.stories.tsx +5768 -0
  36. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1065 -0
  37. package/src/components/AtomixGlass/stories/Playground.stories.tsx +1129 -0
  38. package/src/components/AtomixGlass/stories/ShaderVariants.stories.tsx +395 -0
  39. package/src/components/AtomixGlass/stories/shared-components.tsx +301 -0
  40. package/src/components/AtomixGlass/utils.ts +3 -3
  41. package/src/components/Avatar/Avatar.tsx +3 -0
  42. package/src/components/Avatar/AvatarGroup.tsx +2 -1
  43. package/src/components/Badge/Badge.stories.tsx +76 -55
  44. package/src/components/Badge/Badge.tsx +12 -14
  45. package/src/components/Breadcrumb/Breadcrumb.tsx +23 -4
  46. package/src/components/Button/Button.stories.tsx +501 -20
  47. package/src/components/Button/Button.tsx +5 -8
  48. package/src/components/Callout/Callout.stories.tsx +86 -35
  49. package/src/components/Callout/Callout.tsx +31 -9
  50. package/src/components/Card/Card.stories.tsx +565 -2
  51. package/src/components/Card/Card.tsx +15 -4
  52. package/src/components/Card/ElevationCard.tsx +2 -0
  53. package/src/components/Chart/AnimatedChart.tsx +179 -156
  54. package/src/components/Chart/AreaChart.tsx +123 -12
  55. package/src/components/Chart/BarChart.tsx +91 -100
  56. package/src/components/Chart/BaseChart.tsx +80 -0
  57. package/src/components/Chart/BubbleChart.tsx +114 -290
  58. package/src/components/Chart/CandlestickChart.tsx +282 -622
  59. package/src/components/Chart/Chart.stories.tsx +576 -179
  60. package/src/components/Chart/Chart.tsx +374 -75
  61. package/src/components/Chart/ChartRenderer.tsx +371 -220
  62. package/src/components/Chart/ChartToolbar.tsx +372 -61
  63. package/src/components/Chart/ChartTooltip.tsx +33 -18
  64. package/src/components/Chart/DonutChart.tsx +172 -254
  65. package/src/components/Chart/FunnelChart.tsx +169 -240
  66. package/src/components/Chart/GaugeChart.tsx +224 -392
  67. package/src/components/Chart/HeatmapChart.tsx +302 -440
  68. package/src/components/Chart/LineChart.tsx +148 -103
  69. package/src/components/Chart/MultiAxisChart.tsx +267 -395
  70. package/src/components/Chart/PieChart.tsx +114 -64
  71. package/src/components/Chart/RadarChart.tsx +202 -218
  72. package/src/components/Chart/ScatterChart.tsx +111 -97
  73. package/src/components/Chart/TreemapChart.tsx +147 -222
  74. package/src/components/Chart/WaterfallChart.tsx +253 -291
  75. package/src/components/Chart/index.ts +11 -9
  76. package/src/components/Chart/types.ts +85 -9
  77. package/src/components/Chart/utils.ts +66 -0
  78. package/src/components/ColorModeToggle/ColorModeToggle.tsx +6 -3
  79. package/src/components/Countdown/Countdown.tsx +4 -0
  80. package/src/components/DataTable/DataTable.tsx +2 -1
  81. package/src/components/DatePicker/DatePicker.stories.tsx +689 -12
  82. package/src/components/DatePicker/DatePicker.tsx +3 -9
  83. package/src/components/DatePicker/types.ts +5 -0
  84. package/src/components/Dropdown/Dropdown.stories.tsx +32 -25
  85. package/src/components/Dropdown/Dropdown.tsx +26 -28
  86. package/src/components/EdgePanel/EdgePanel.stories.tsx +473 -2
  87. package/src/components/EdgePanel/EdgePanel.tsx +101 -13
  88. package/src/components/Footer/Footer.stories.tsx +187 -60
  89. package/src/components/Footer/Footer.test.tsx +134 -0
  90. package/src/components/Footer/Footer.tsx +133 -34
  91. package/src/components/Footer/FooterLink.tsx +1 -1
  92. package/src/components/Footer/FooterSection.tsx +53 -36
  93. package/src/components/Footer/FooterSocialLink.tsx +32 -29
  94. package/src/components/Footer/README.md +82 -3
  95. package/src/components/Footer/index.ts +1 -1
  96. package/src/components/Form/Checkbox.stories.tsx +13 -5
  97. package/src/components/Form/Checkbox.tsx +3 -6
  98. package/src/components/Form/Form.stories.tsx +10 -3
  99. package/src/components/Form/Form.tsx +2 -0
  100. package/src/components/Form/FormGroup.tsx +2 -1
  101. package/src/components/Form/Input.stories.tsx +12 -11
  102. package/src/components/Form/Input.tsx +97 -95
  103. package/src/components/Form/Radio.stories.tsx +22 -7
  104. package/src/components/Form/Radio.tsx +3 -6
  105. package/src/components/Form/Select.stories.tsx +21 -6
  106. package/src/components/Form/Select.tsx +3 -5
  107. package/src/components/Form/Textarea.stories.tsx +13 -11
  108. package/src/components/Form/Textarea.tsx +88 -86
  109. package/src/components/Hero/Hero.stories.tsx +2 -3
  110. package/src/components/Hero/Hero.tsx +5 -6
  111. package/src/components/Icon/Icon.tsx +12 -1
  112. package/src/components/List/List.tsx +2 -1
  113. package/src/components/List/ListGroup.tsx +2 -1
  114. package/src/components/Messages/Messages.stories.tsx +113 -0
  115. package/src/components/Messages/Messages.tsx +52 -9
  116. package/src/components/Modal/Modal.stories.tsx +48 -32
  117. package/src/components/Modal/Modal.tsx +19 -24
  118. package/src/components/Navigation/Menu/MegaMenu.tsx +2 -2
  119. package/src/components/Navigation/Menu/Menu.tsx +2 -2
  120. package/src/components/Navigation/Nav/Nav.stories.tsx +469 -0
  121. package/src/components/Navigation/Nav/Nav.tsx +22 -4
  122. package/src/components/Navigation/Nav/NavDropdown.tsx +10 -1
  123. package/src/components/Navigation/Navbar/Navbar.stories.tsx +413 -0
  124. package/src/components/Navigation/Navbar/Navbar.tsx +70 -29
  125. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +340 -0
  126. package/src/components/Navigation/SideMenu/SideMenu.tsx +29 -2
  127. package/src/components/Pagination/Pagination.stories.tsx +13 -6
  128. package/src/components/Pagination/Pagination.tsx +7 -6
  129. package/src/components/PhotoViewer/PhotoViewer.tsx +2 -1
  130. package/src/components/Popover/Popover.stories.tsx +32 -24
  131. package/src/components/Popover/Popover.tsx +4 -1
  132. package/src/components/ProductReview/ProductReview.tsx +8 -2
  133. package/src/components/Progress/Progress.tsx +19 -3
  134. package/src/components/Rating/Rating.stories.tsx +11 -6
  135. package/src/components/Rating/Rating.tsx +3 -5
  136. package/src/components/River/River.tsx +5 -5
  137. package/src/components/SectionIntro/SectionIntro.tsx +8 -2
  138. package/src/components/Slider/Slider.stories.tsx +4 -4
  139. package/src/components/Slider/Slider.tsx +4 -3
  140. package/src/components/Spinner/Spinner.tsx +19 -3
  141. package/src/components/Steps/Steps.stories.tsx +5 -4
  142. package/src/components/Steps/Steps.tsx +8 -5
  143. package/src/components/Tab/Tab.stories.tsx +4 -3
  144. package/src/components/Tab/Tab.tsx +8 -6
  145. package/src/components/Testimonial/Testimonial.tsx +8 -2
  146. package/src/components/Todo/Todo.tsx +2 -1
  147. package/src/components/Toggle/Toggle.stories.tsx +5 -4
  148. package/src/components/Toggle/Toggle.tsx +8 -5
  149. package/src/components/Tooltip/Tooltip.stories.tsx +40 -30
  150. package/src/components/Tooltip/Tooltip.tsx +9 -2
  151. package/src/components/Upload/Upload.stories.tsx +252 -0
  152. package/src/components/Upload/Upload.tsx +92 -53
  153. package/src/components/VideoPlayer/VideoPlayer.tsx +3 -1
  154. package/src/components/index.ts +0 -4
  155. package/src/layouts/Grid/Grid.stories.tsx +10 -23
  156. package/src/layouts/Grid/Grid.tsx +20 -1
  157. package/src/layouts/Grid/GridCol.tsx +76 -48
  158. package/src/lib/composables/useAtomixGlass.ts +861 -44
  159. package/src/lib/composables/useBarChart.ts +21 -4
  160. package/src/lib/composables/useChart.ts +227 -370
  161. package/src/lib/composables/useChartExport.ts +19 -78
  162. package/src/lib/composables/useChartToolbar.ts +11 -21
  163. package/src/lib/composables/useEdgePanel.ts +125 -71
  164. package/src/lib/composables/useFooter.ts +3 -3
  165. package/src/lib/composables/useGlassContainer.ts +16 -7
  166. package/src/lib/composables/useLineChart.ts +11 -2
  167. package/src/lib/composables/usePieChart.ts +4 -14
  168. package/src/lib/composables/useRiver.ts +5 -0
  169. package/src/lib/composables/useSlider.ts +62 -24
  170. package/src/lib/composables/useVideoPlayer.ts +60 -63
  171. package/src/lib/constants/components.ts +147 -32
  172. package/src/lib/types/components.ts +355 -25
  173. package/src/lib/utils/displacement-generator.ts +55 -49
  174. package/src/lib/utils/icons.ts +1 -1
  175. package/src/lib/utils/index.ts +16 -10
  176. package/src/styles/01-settings/_settings.accordion.scss +19 -19
  177. package/src/styles/01-settings/_settings.animations.scss +5 -5
  178. package/src/styles/01-settings/_settings.avatar-group.scss +1 -1
  179. package/src/styles/01-settings/_settings.avatar.scss +17 -17
  180. package/src/styles/01-settings/_settings.background.scss +0 -3
  181. package/src/styles/01-settings/_settings.badge.scss +1 -1
  182. package/src/styles/01-settings/_settings.breadcrumb.scss +1 -1
  183. package/src/styles/01-settings/_settings.card.scss +1 -1
  184. package/src/styles/01-settings/_settings.chart.scss +65 -2
  185. package/src/styles/01-settings/_settings.dropdown.scss +1 -1
  186. package/src/styles/01-settings/_settings.edge-panel.scss +1 -1
  187. package/src/styles/01-settings/_settings.footer.scss +35 -42
  188. package/src/styles/01-settings/_settings.input.scss +1 -1
  189. package/src/styles/01-settings/_settings.list.scss +1 -1
  190. package/src/styles/01-settings/_settings.rating.scss +1 -1
  191. package/src/styles/01-settings/_settings.tabs.scss +1 -1
  192. package/src/styles/01-settings/_settings.upload.scss +6 -5
  193. package/src/styles/02-tools/_tools.animations.scss +4 -5
  194. package/src/styles/02-tools/_tools.background.scss +1 -13
  195. package/src/styles/02-tools/_tools.glass.scss +0 -1
  196. package/src/styles/02-tools/_tools.utility-api.scss +91 -48
  197. package/src/styles/03-generic/_generic.root.scss +1 -4
  198. package/src/styles/04-elements/_elements.body.scss +0 -1
  199. package/src/styles/06-components/_components.atomix-glass.scss +249 -0
  200. package/src/styles/06-components/_components.badge.scss +8 -23
  201. package/src/styles/06-components/_components.button.scss +8 -3
  202. package/src/styles/06-components/_components.callout.scss +10 -5
  203. package/src/styles/06-components/_components.card.scss +2 -14
  204. package/src/styles/06-components/_components.chart.scss +969 -1449
  205. package/src/styles/06-components/_components.dropdown.scss +19 -7
  206. package/src/styles/06-components/_components.edge-panel.scss +103 -0
  207. package/src/styles/06-components/_components.footer.scss +166 -85
  208. package/src/styles/06-components/_components.input.scss +8 -9
  209. package/src/styles/06-components/_components.list.scss +1 -0
  210. package/src/styles/06-components/_components.messages.scss +176 -0
  211. package/src/styles/06-components/_components.modal.scss +16 -4
  212. package/src/styles/06-components/_components.navbar.scss +12 -1
  213. package/src/styles/06-components/_components.side-menu.scss +5 -0
  214. package/src/styles/06-components/_components.skeleton.scss +8 -6
  215. package/src/styles/06-components/_components.upload.scss +219 -4
  216. package/src/styles/06-components/old.chart.styles.scss +1 -30
  217. package/src/styles/99-utilities/_index.scss +1 -0
  218. package/src/styles/99-utilities/_utilities.glass-fixes.scss +1 -0
  219. package/src/styles/99-utilities/_utilities.scss +1 -1
  220. package/src/components/AtomixGlass/AtomixGlass.stories.tsx +0 -3011
  221. package/src/components/AtomixGlass/AtomixGlassComprehensivePreview.stories.tsx +0 -1369
  222. package/src/components/Chart/AdvancedChart.tsx +0 -624
  223. package/src/components/Chart/LineChartNew.tsx +0 -167
  224. package/src/components/Chart/RealTimeChart.tsx +0 -436
  225. package/src/components/DatePicker/DatePicker copy.tsx +0 -551
@@ -31,94 +31,80 @@
31
31
  border: var(--#{$prefix}chart-border-width) solid var(--#{$prefix}chart-border-color);
32
32
  border-radius: var(--#{$prefix}chart-border-radius);
33
33
  overflow: hidden;
34
- box-shadow: $box-shadow-sm;
34
+ box-shadow:
35
+ 0 1px 3px rgba(0, 0, 0, 0.12),
36
+ 0 1px 2px rgba(0, 0, 0, 0.24),
37
+ 0 0 0 1px rgba(var(--#{$prefix}primary-rgb), 0.05);
35
38
  position: relative;
36
39
  min-height: var(--#{$prefix}chart-min-height);
37
40
  width: 100%;
38
41
  max-width: 100%;
39
- @include dynamic-background(var(--#{$prefix}chart-bg));
40
- @include basic-transition();
42
+ background: var(--#{$prefix}chart-bg);
43
+ backdrop-filter: blur(10px);
44
+ -webkit-backdrop-filter: blur(10px);
41
45
 
46
+ // Modern gradient overlay with glass morphism
47
+ &::before {
48
+ content: '';
49
+ position: absolute;
50
+ inset: 0;
51
+ background:
52
+ linear-gradient(
53
+ 135deg,
54
+ rgba(var(--#{$prefix}primary-rgb), 0.08) 0%,
55
+ transparent 40%,
56
+ transparent 60%,
57
+ rgba(var(--#{$prefix}secondary-rgb), 0.04) 100%
58
+ ),
59
+ radial-gradient(
60
+ circle at 20% 20%,
61
+ rgba(var(--#{$prefix}primary-rgb), 0.06) 0%,
62
+ transparent 50%
63
+ ),
64
+ radial-gradient(
65
+ circle at 80% 80%,
66
+ rgba(var(--#{$prefix}secondary-rgb), 0.04) 0%,
67
+ transparent 50%
68
+ );
69
+ pointer-events: none;
70
+ z-index: 1;
71
+ opacity: 1;
72
+ transition: opacity 0.3s ease;
73
+ }
74
+
75
+ // Subtle border glow effect
42
76
  &::after {
43
77
  content: '';
44
78
  position: absolute;
45
79
  inset: 0;
80
+ border-radius: inherit;
81
+ padding: 1px;
46
82
  background: linear-gradient(
47
83
  135deg,
48
- rgba(var(--#{$prefix}primary-rgb), 0.1) 0%,
49
- transparent 50%,
50
- rgba(var(--#{$prefix}secondary-rgb), 0.05) 100%
84
+ rgba(var(--#{$prefix}primary-rgb), 0.1),
85
+ rgba(var(--#{$prefix}secondary-rgb), 0.05),
86
+ transparent
51
87
  );
88
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
89
+ -webkit-mask-composite: xor;
90
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
91
+ mask-composite: exclude;
52
92
  pointer-events: none;
53
- z-index: 1;
93
+ z-index: 2;
94
+ opacity: 0;
95
+ transition: opacity 0.3s ease;
54
96
  }
55
97
 
56
98
  &:hover {
57
- box-shadow: $box-shadow-lg;
58
- border-color: var(--#{$prefix}primary-border-subtle);
59
- }
60
-
61
- &:focus-visible {
62
- box-shadow:
63
- $box-shadow-md,
64
- 0 0 0 $chart-focus-ring-width var(--#{$prefix}primary-border-subtle);
65
- }
66
-
67
- &--xs {
68
- --#{$prefix}chart-min-height: #{$chart-min-height-xs};
69
- --#{$prefix}chart-padding: #{map.get($spacing-sizes, 2)};
70
- font-size: $font-size-xs;
71
- }
72
-
73
- &--sm {
74
- --#{$prefix}chart-min-height: #{$chart-min-height-sm};
75
- --#{$prefix}chart-padding: #{map.get($spacing-sizes, 3)};
76
- font-size: $font-size-sm;
77
- }
78
-
79
- &--md {
80
- --#{$prefix}chart-min-height: #{$chart-min-height-md};
81
- --#{$prefix}chart-padding: #{$chart-padding};
82
- font-size: $font-size-base;
83
- }
84
-
85
- &--lg {
86
- --#{$prefix}chart-min-height: #{$chart-min-height-lg};
87
- --#{$prefix}chart-padding: #{map.get($spacing-sizes, 6)};
88
- font-size: $font-size-md;
89
- }
90
-
91
- &--xl {
92
- --#{$prefix}chart-min-height: #{$chart-min-height-xl};
93
- --#{$prefix}chart-padding: #{map.get($spacing-sizes, 8)};
94
- font-size: $font-size-lg;
95
- }
96
-
97
- &--2xl {
98
- --#{$prefix}chart-min-height: #{$chart-min-height-2xl};
99
- --#{$prefix}chart-padding: #{map.get($spacing-sizes, 10)};
100
- font-size: $font-size-lg;
101
- }
102
-
103
- &--full {
104
- height: 100vh;
105
- min-height: auto;
106
- border-radius: 0;
107
- }
108
-
109
- &--auto {
110
- height: auto;
111
- min-height: $chart-canvas-min-height;
112
- }
113
-
114
- @each $color, $value in color-maps.$theme-colors {
115
- &--#{$color} {
116
- --#{$prefix}chart-primary-color: var(--#{$prefix}#{$color}-6);
117
- --#{$prefix}chart-border-color: var(--#{$prefix}#{$color}-border-subtle);
99
+ box-shadow:
100
+ 0 8px 24px rgba(0, 0, 0, 0.12),
101
+ 0 4px 8px rgba(0, 0, 0, 0.16),
102
+ 0 0 0 1px rgba(var(--#{$prefix}primary-rgb), 0.1),
103
+ 0 0 40px rgba(var(--#{$prefix}primary-rgb), 0.08);
104
+ border-color: rgba(var(--#{$prefix}primary-rgb), 0.2);
118
105
 
119
- &:hover {
120
- border-color: var(--#{$prefix}#{$color}-border-subtle);
121
- }
106
+ &::after {
107
+ opacity: 1;
122
108
  }
123
109
  }
124
110
 
@@ -145,82 +131,101 @@
145
131
  }
146
132
  }
147
133
 
148
- &--interactive {
149
- cursor: pointer;
150
- user-select: none;
134
+ &--fullscreen {
135
+ position: fixed;
136
+ top: 0;
137
+ left: 0;
138
+ width: 100vw;
139
+ height: 100vh;
140
+ z-index: 9999;
141
+ border-radius: 0;
142
+ box-shadow: none;
143
+ background: var(--#{$prefix}body-bg);
144
+ }
145
+ &--elevated {
146
+ box-shadow:
147
+ 0 12px 32px rgba(0, 0, 0, 0.15),
148
+ 0 6px 12px rgba(0, 0, 0, 0.2),
149
+ 0 0 0 1px rgba(var(--#{$prefix}primary-rgb), 0.1),
150
+ 0 0 60px rgba(var(--#{$prefix}primary-rgb), 0.12);
151
151
 
152
152
  &:hover {
153
- transform: translateY(-2px);
154
- box-shadow: $box-shadow-xl;
155
- }
156
-
157
- &:active {
158
- transform: $chart-active-transform;
159
- box-shadow: $box-shadow-md;
160
- transition-duration: 0.1s;
161
- }
162
-
163
- &:focus-visible {
164
- transform: translateY(-1px);
153
+ box-shadow:
154
+ 0 16px 40px rgba(0, 0, 0, 0.18),
155
+ 0 8px 16px rgba(0, 0, 0, 0.24),
156
+ 0 0 0 1px rgba(var(--#{$prefix}primary-rgb), 0.15),
157
+ 0 0 80px rgba(var(--#{$prefix}primary-rgb), 0.16);
165
158
  }
166
159
  }
167
160
 
168
- &--disabled {
169
- pointer-events: none;
170
- opacity: 0.6;
161
+ &--glass {
162
+ // Glass variant specific styles
163
+ // Background and borders are handled by AtomixGlass
164
+ background: transparent;
165
+ border: none;
166
+ box-shadow: none;
171
167
 
168
+ // Ensure content is visible through glass
172
169
  #{$root}__content {
173
- filter: grayscale(80%) opacity(0.6);
170
+ position: relative;
174
171
  }
175
172
 
176
173
  #{$root}__canvas {
177
- pointer-events: none;
174
+ position: relative;
178
175
  }
179
176
 
180
- &:hover {
181
- transform: none;
182
- box-shadow: $box-shadow-sm;
177
+ // Toolbar should remain visible
178
+ #{$root}__toolbar {
179
+ position: relative;
183
180
  }
184
181
  }
185
182
 
186
- &--fullscreen {
187
- position: fixed;
188
- top: 0;
189
- left: 0;
190
- width: 100vw;
191
- height: 100vh;
192
- z-index: 9999;
193
- border-radius: 0;
194
- box-shadow: none;
195
- background: var(--#{$prefix}primary-bg-default);
183
+ // State Modifiers
184
+ // =============================================================================
185
+ &--disabled {
186
+ @include component-disabled;
187
+ pointer-events: none;
188
+ opacity: 0.6;
196
189
  }
197
190
 
198
- &--elevated {
199
- box-shadow: $box-shadow-lg;
200
- transform: translateY(-2px);
191
+ &--selected {
192
+ border-color: rgba(var(--#{$prefix}primary-rgb), 0.3);
193
+ box-shadow:
194
+ 0 4px 16px rgba(0, 0, 0, 0.1),
195
+ 0 2px 4px rgba(0, 0, 0, 0.12),
196
+ 0 0 0 2px rgba(var(--#{$prefix}primary-rgb), 0.2),
197
+ 0 0 30px rgba(var(--#{$prefix}primary-rgb), 0.15);
198
+ background:
199
+ linear-gradient(
200
+ 135deg,
201
+ rgba(var(--#{$prefix}primary-rgb), 0.08) 0%,
202
+ rgba(var(--#{$prefix}primary-rgb), 0.04) 100%
203
+ ),
204
+ var(--#{$prefix}chart-bg);
205
+ }
201
206
 
202
- &:hover {
203
- box-shadow: $box-shadow-xl;
204
- transform: translateY(-4px);
205
- }
207
+ &--active {
208
+ border-color: var(--#{$prefix}primary-border-subtle);
209
+ box-shadow: $box-shadow-md;
206
210
  }
207
211
 
208
- &--flat {
209
- box-shadow: none;
210
- border: 2px solid var(--#{$prefix}primary-border-subtle);
212
+ &--clickable {
213
+ cursor: pointer;
211
214
 
212
215
  &:hover {
213
- box-shadow: $box-shadow-sm;
214
- transform: none;
216
+ box-shadow:
217
+ 0 8px 24px rgba(0, 0, 0, 0.12),
218
+ 0 4px 8px rgba(0, 0, 0, 0.16),
219
+ 0 0 0 1px rgba(var(--#{$prefix}primary-rgb), 0.1),
220
+ 0 0 40px rgba(var(--#{$prefix}primary-rgb), 0.08);
221
+ border-color: rgba(var(--#{$prefix}primary-rgb), 0.25);
215
222
  }
216
- }
217
-
218
- &--rounded {
219
- border-radius: $border-radius-xl;
220
- }
221
223
 
222
- &--square {
223
- border-radius: 0;
224
+ &:active {
225
+ box-shadow:
226
+ 0 2px 8px rgba(0, 0, 0, 0.1),
227
+ 0 1px 2px rgba(0, 0, 0, 0.12);
228
+ }
224
229
  }
225
230
 
226
231
  &__header {
@@ -298,8 +303,8 @@
298
303
  display: inline-flex;
299
304
  align-items: center;
300
305
  justify-content: center;
301
- width: rem(32px);
302
- height: rem(32px);
306
+ width: map.get($spacing-sizes, 8);
307
+ height: map.get($spacing-sizes, 8);
303
308
  border-radius: $border-radius-sm;
304
309
  border: 1px solid transparent;
305
310
  background-color: transparent;
@@ -308,7 +313,7 @@
308
313
  transition: all $chart-transition-duration $chart-transition-timing;
309
314
  position: relative;
310
315
  overflow: hidden;
311
- font-size: rem(14px);
316
+ font-size: map.get($spacing-sizes, 3.5);
312
317
 
313
318
  &::before {
314
319
  content: '';
@@ -323,8 +328,8 @@
323
328
  svg {
324
329
  position: relative;
325
330
  z-index: 1;
326
- width: rem(16px);
327
- height: rem(16px);
331
+ width: map.get($spacing-sizes, 4);
332
+ height: map.get($spacing-sizes, 4);
328
333
  transition: transform $chart-transition-duration $chart-transition-timing;
329
334
  }
330
335
 
@@ -344,9 +349,9 @@
344
349
  }
345
350
  }
346
351
 
352
+ @include focus-ring;
353
+
347
354
  &:focus-visible {
348
- outline: 2px solid var(--#{$prefix}primary-6);
349
- outline-offset: 2px;
350
355
  border-color: var(--#{$prefix}primary-border-subtle);
351
356
  }
352
357
 
@@ -377,55 +382,6 @@
377
382
  border-color: transparent;
378
383
  }
379
384
  }
380
-
381
- // Variant styles
382
- &--primary {
383
- background-color: var(--#{$prefix}primary-6);
384
- color: white;
385
- border-color: var(--#{$prefix}primary-6);
386
-
387
- &:hover {
388
- background-color: var(--#{$prefix}primary-7);
389
- border-color: var(--#{$prefix}primary-7);
390
- }
391
-
392
- &:active {
393
- background-color: var(--#{$prefix}primary-8);
394
- }
395
- }
396
-
397
- &--success {
398
- background-color: var(--#{$prefix}success-6);
399
- color: white;
400
- border-color: var(--#{$prefix}success-6);
401
-
402
- &:hover {
403
- background-color: var(--#{$prefix}success-7);
404
- border-color: var(--#{$prefix}success-7);
405
- }
406
- }
407
-
408
- &--warning {
409
- background-color: var(--#{$prefix}warning-6);
410
- color: white;
411
- border-color: var(--#{$prefix}warning-6);
412
-
413
- &:hover {
414
- background-color: var(--#{$prefix}warning-7);
415
- border-color: var(--#{$prefix}warning-7);
416
- }
417
- }
418
-
419
- &--danger {
420
- background-color: var(--#{$prefix}error-6);
421
- color: white;
422
- border-color: var(--#{$prefix}error-6);
423
-
424
- &:hover {
425
- background-color: var(--#{$prefix}error-7);
426
- border-color: var(--#{$prefix}error-7);
427
- }
428
- }
429
385
  }
430
386
 
431
387
  &__export-group {
@@ -453,7 +409,7 @@
453
409
  border-radius: $border-radius-md;
454
410
  box-shadow: $box-shadow-lg;
455
411
  padding: map.get($spacing-sizes, 1);
456
- min-width: rem(120px);
412
+ min-width: calc(map.get($spacing-sizes, 7) * 4);
457
413
  z-index: 1000;
458
414
  opacity: 0;
459
415
  visibility: hidden;
@@ -469,7 +425,7 @@
469
425
  border: none;
470
426
  background: transparent;
471
427
  color: var(--#{$prefix}primary-text-emphasis);
472
- font-size: rem(12px);
428
+ font-size: map.get($spacing-sizes, 3);
473
429
  font-weight: $font-weight-medium;
474
430
  text-align: left;
475
431
  border-radius: $border-radius-sm;
@@ -484,8 +440,8 @@
484
440
  }
485
441
 
486
442
  &:focus-visible {
487
- outline: 2px solid var(--#{$prefix}primary-6);
488
- outline-offset: -2px;
443
+ outline: calc(var(--#{$prefix}border-width) * 2) solid var(--#{$prefix}primary-6);
444
+ outline-offset: calc(var(--#{$prefix}border-width) * -2);
489
445
  }
490
446
 
491
447
  &:disabled {
@@ -499,6 +455,116 @@
499
455
  }
500
456
  }
501
457
 
458
+ &__settings-menu {
459
+ position: absolute;
460
+ top: 100%;
461
+ right: 0;
462
+ margin-top: map.get($spacing-sizes, 1);
463
+ background: var(--#{$prefix}primary-bg-default);
464
+ border: 1px solid var(--#{$prefix}primary-border-subtle);
465
+ border-radius: $border-radius-md;
466
+ box-shadow: $box-shadow-lg;
467
+ padding: map.get($spacing-sizes, 2);
468
+ min-width: calc(map.get($spacing-sizes, 7) * 5);
469
+ z-index: 1000;
470
+ opacity: 0;
471
+ visibility: hidden;
472
+ transform: translateY(-8px);
473
+ transition: all $chart-transition-duration $chart-transition-timing;
474
+ backdrop-filter: blur(8px);
475
+
476
+ &-title {
477
+ font-size: $font-size-sm;
478
+ font-weight: $font-weight-semibold;
479
+ color: var(--#{$prefix}text-primary);
480
+ margin-bottom: map.get($spacing-sizes, 2);
481
+ padding-bottom: map.get($spacing-sizes, 2);
482
+ border-bottom: 1px solid var(--#{$prefix}border-color);
483
+ }
484
+
485
+ &-content {
486
+ display: flex;
487
+ flex-direction: column;
488
+ gap: map.get($spacing-sizes, 1);
489
+ }
490
+
491
+ &-item {
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: space-between;
495
+ padding: map.get($spacing-sizes, 1.5) 0;
496
+ gap: map.get($spacing-sizes, 3);
497
+
498
+ &--info {
499
+ opacity: 0.7;
500
+ font-size: $font-size-xs;
501
+ }
502
+ }
503
+
504
+ &-toggle {
505
+ display: flex;
506
+ align-items: center;
507
+ gap: map.get($spacing-sizes, 2);
508
+ cursor: pointer;
509
+ width: 100%;
510
+ user-select: none;
511
+
512
+ input[type='checkbox'] {
513
+ width: map.get($spacing-sizes, 4);
514
+ height: map.get($spacing-sizes, 4);
515
+ cursor: pointer;
516
+ accent-color: var(--#{$prefix}primary);
517
+ flex-shrink: 0;
518
+ }
519
+ }
520
+
521
+ &-label {
522
+ font-size: $font-size-xs;
523
+ font-weight: $font-weight-medium;
524
+ color: var(--#{$prefix}text-primary);
525
+ flex: 1;
526
+ }
527
+
528
+ &-value {
529
+ font-size: $font-size-xs;
530
+ font-weight: $font-weight-semibold;
531
+ color: var(--#{$prefix}secondary-text-emphasis);
532
+ text-transform: capitalize;
533
+ }
534
+ }
535
+
536
+ &__toolbar-group {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: map.get($spacing-sizes, 2);
540
+ position: relative;
541
+
542
+ &:hover {
543
+ #{$root}__export-dropdown,
544
+ #{$root}__settings-menu {
545
+ opacity: 1;
546
+ visibility: visible;
547
+ transform: translateY(0);
548
+ }
549
+ }
550
+ }
551
+
552
+ &__toolbar-separator {
553
+ width: 1px;
554
+ height: map.get($spacing-sizes, 6);
555
+ background: var(--#{$prefix}border-color);
556
+ margin: 0 map.get($spacing-sizes, 2);
557
+ }
558
+
559
+ &__toolbar-label {
560
+ font-size: $font-size-xs;
561
+ font-weight: $font-weight-medium;
562
+ color: var(--#{$prefix}secondary-text-emphasis);
563
+ text-transform: uppercase;
564
+ letter-spacing: 0.5px;
565
+ margin-right: map.get($spacing-sizes, 2);
566
+ }
567
+
502
568
  &__content {
503
569
  flex: 1;
504
570
  position: relative;
@@ -507,7 +573,11 @@
507
573
  align-items: center;
508
574
  justify-content: center;
509
575
  min-height: $chart-canvas-min-height;
576
+ z-index: 3;
577
+ contain: layout;
578
+ overflow: hidden;
510
579
 
580
+ // Subtle dot pattern background
511
581
  &::before {
512
582
  content: '';
513
583
  position: absolute;
@@ -517,25 +587,28 @@
517
587
  bottom: 0;
518
588
  background-image: radial-gradient(
519
589
  circle at 1px 1px,
520
- var(--#{$prefix}primary-border-subtle) 1px,
590
+ rgba(var(--#{$prefix}primary-rgb), 0.08) 1px,
521
591
  transparent 0
522
592
  );
523
- background-size: $chart-pattern-size $chart-pattern-size;
524
- opacity: $chart-pattern-opacity;
593
+ background-size: 16px 16px;
594
+ opacity: 0.4;
525
595
  pointer-events: none;
526
596
  z-index: 0;
527
597
  }
528
598
 
599
+ // Modern gradient overlay
529
600
  &::after {
530
601
  content: '';
531
602
  position: absolute;
532
603
  inset: 0;
533
- background: linear-gradient(
534
- 135deg,
535
- rgba(255, 255, 255, 0.02) 0%,
536
- transparent 50%,
537
- rgba(0, 0, 0, 0.02) 100%
538
- );
604
+ background:
605
+ linear-gradient(
606
+ 180deg,
607
+ rgba(var(--#{$prefix}primary-rgb), 0.03) 0%,
608
+ transparent 30%,
609
+ transparent 70%,
610
+ rgba(var(--#{$prefix}secondary-rgb), 0.02) 100%
611
+ );
539
612
  pointer-events: none;
540
613
  z-index: 1;
541
614
  }
@@ -548,212 +621,69 @@
548
621
  overflow: hidden;
549
622
  border-radius: $border-radius-sm;
550
623
  z-index: 2;
624
+ background: transparent;
625
+ min-height: 200px;
626
+ contain: layout style paint;
551
627
 
552
628
  svg {
553
- width: 100%;
554
- height: 100%;
629
+ display: block;
555
630
  shape-rendering: geometricPrecision;
556
631
  text-rendering: optimizeLegibility;
557
632
  image-rendering: -webkit-optimize-contrast;
558
633
  image-rendering: crisp-edges;
634
+ will-change: contents;
635
+ backface-visibility: hidden;
636
+ transform: translateZ(0);
637
+ opacity: 0;
638
+ animation: chart-fade-in 0.3s ease-out forwards;
639
+ }
640
+
641
+ // Chart fade-in animation
642
+ @keyframes chart-fade-in {
643
+ from {
644
+ opacity: 0;
645
+ }
646
+ to {
647
+ opacity: 1;
648
+ }
559
649
  }
560
650
 
561
651
  canvas {
562
652
  width: 100%;
563
653
  height: 100%;
654
+ display: block;
564
655
  image-rendering: -webkit-optimize-contrast;
565
656
  image-rendering: crisp-edges;
566
657
  }
567
658
  }
568
659
 
569
- // Enhanced interactive features
570
- &__crosshair {
660
+ &__tooltip {
661
+ position: fixed;
662
+ backdrop-filter: blur($chart-tooltip-backdrop-blur);
663
+ border-radius: $chart-tooltip-border-radius;
664
+ padding: $chart-tooltip-padding-y $chart-tooltip-padding-x;
665
+ box-shadow: var(--atomix-box-shadow);
666
+ font-size: $chart-tooltip-font-size;
667
+ color: $chart-primary-text;
571
668
  pointer-events: none;
669
+ z-index: 1070;
670
+ max-width: $chart-tooltip-max-width;
671
+ min-width: $chart-tooltip-min-width;
672
+ // background: $chart-primary-bg;
673
+ border: 1px solid $chart-primary-border;
674
+ opacity: 1;
572
675
 
573
- line,
574
- &-line {
575
- stroke: $chart-primary-border;
576
- stroke-width: 1;
577
- stroke-dasharray: 4, 4;
578
- opacity: 0.7;
676
+ &-title {
677
+ font-weight: $font-weight-bold;
678
+ margin-bottom: map.get($spacing-sizes, 2);
679
+ color: $chart-primary-text;
680
+ font-size: $font-size-sm;
681
+ }
579
682
 
580
- &--vertical,
581
- &--horizontal {
582
- opacity: 0.7;
583
- }
584
- }
585
- }
586
-
587
- &__zoom-indicator {
588
- position: absolute;
589
- top: 10px;
590
- right: 10px;
591
- background: rgba(0, 0, 0, 0.8);
592
- color: white;
593
- padding: 4px 8px;
594
- border-radius: $border-radius-sm;
595
- font-size: $font-size-xs;
596
- font-weight: $font-weight-medium;
597
- pointer-events: none;
598
- z-index: 10;
599
- }
600
-
601
- &__navigator {
602
- opacity: 0.8;
603
-
604
- rect {
605
- fill: rgba(0, 0, 0, 0.05);
606
- stroke: var(--#{$prefix}gray-3);
607
- stroke-width: 1;
608
- }
609
-
610
- path {
611
- stroke-width: 1;
612
- fill: none;
613
- opacity: 0.6;
614
- }
615
- }
616
-
617
- &__real-time-indicator {
618
- position: absolute;
619
- top: 10px;
620
- left: 10px;
621
- display: flex;
622
- align-items: center;
623
- gap: 6px;
624
- background: var(--#{$prefix}success-bg-subtle);
625
- color: var(--#{$prefix}success-text-emphasis);
626
- padding: 4px 8px;
627
- border-radius: $border-radius-sm;
628
- font-size: $font-size-xs;
629
- font-weight: $font-weight-medium;
630
- border: 1px solid var(--#{$prefix}success-border-subtle);
631
-
632
- &::before {
633
- content: '';
634
- width: 6px;
635
- height: 6px;
636
- background: var(--#{$prefix}success-6);
637
- border-radius: 50%;
638
- animation: chart-pulse-dot 2s ease-in-out infinite;
639
- }
640
- }
641
-
642
- &__legend {
643
- display: flex;
644
- flex-wrap: wrap;
645
- gap: $chart-legend-spacer;
646
- padding: var(--#{$prefix}chart-padding);
647
- border-top: var(--#{$prefix}chart-border-width) solid var(--#{$prefix}brand-border-subtle);
648
- z-index: 2;
649
- }
650
-
651
- &__legend-item {
652
- display: flex;
653
- align-items: center;
654
- gap: $chart-legend-item-spacer;
655
- cursor: pointer;
656
- padding: map.get($spacing-sizes, 2) map.get($spacing-sizes, 3);
657
- border-radius: $border-radius-md;
658
- border: var(--#{$prefix}chart-border-width) solid transparent;
659
- background-color: transparent;
660
- transition: all $chart-transition-duration $chart-transition-timing;
661
- user-select: none;
662
- position: relative;
663
- overflow: hidden;
664
-
665
- &::before {
666
- content: '';
667
- position: absolute;
668
- inset: 0;
669
- background: var(--#{$prefix}secondary-bg-subtle);
670
- opacity: 0;
671
- transition: opacity $chart-transition-duration $chart-transition-timing;
672
- }
673
-
674
- &:hover {
675
- background-color: var(--#{$prefix}secondary-bg-subtle);
676
- border-color: var(--#{$prefix}primary-border-subtle);
677
- transform: translateY(-1px);
678
- box-shadow: $box-shadow-sm;
679
-
680
- &::before {
681
- opacity: 1;
682
- }
683
- }
684
-
685
- &:focus-visible {
686
- @include focus-ring;
687
- }
688
-
689
- &:active {
690
- transform: translateY(0);
691
- }
692
-
693
- &[data-visible='false'] {
694
- opacity: 0.4;
695
- filter: grayscale(60%);
696
-
697
- #{$root}__legend-label {
698
- text-decoration: line-through;
699
- }
700
-
701
- #{$root}__legend-color {
702
- opacity: 0.3;
703
- filter: grayscale(100%);
704
- }
705
- }
706
- }
707
-
708
- &__legend-color {
709
- width: $chart-legend-color-size;
710
- height: $chart-legend-color-size;
711
- border-radius: $border-radius-sm;
712
- border: var(--#{$prefix}chart-border-width) solid var(--#{$prefix}primary-border-subtle);
713
- flex-shrink: 0;
714
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
715
- transition: all $chart-transition-duration $chart-transition-timing;
716
- position: relative;
717
- }
718
-
719
- &__legend-label {
720
- color: var(--#{$prefix}primary-text-emphasis);
721
- font-weight: $font-weight-medium;
722
- letter-spacing: -0.01em;
723
- transition: color $chart-transition-duration $chart-transition-timing;
724
- position: relative;
725
- z-index: 1;
726
- }
727
-
728
- &__tooltip {
729
- position: fixed;
730
- top: 0;
731
- left: 0;
732
- backdrop-filter: blur($chart-tooltip-backdrop-blur);
733
- border-radius: $chart-tooltip-border-radius;
734
- padding: $chart-tooltip-padding-y $chart-tooltip-padding-x;
735
- box-shadow: var(--atomix-box-shadow);
736
- font-size: $chart-tooltip-font-size;
737
- color: $chart-primary-text;
738
- pointer-events: none;
739
- z-index: 1070;
740
- max-width: $chart-tooltip-max-width;
741
- min-width: $chart-tooltip-min-width;
742
- // background: $chart-primary-bg;
743
- border: 1px solid $chart-primary-border;
744
- opacity: 1;
745
-
746
- &-title {
747
- font-weight: $font-weight-bold;
748
- margin-bottom: map.get($spacing-sizes, 2);
749
- color: $chart-primary-text;
750
- font-size: $font-size-sm;
751
- }
752
-
753
- &-content {
754
- display: flex;
755
- flex-direction: column;
756
- gap: map.get($spacing-sizes, 1);
683
+ &-content {
684
+ display: flex;
685
+ flex-direction: column;
686
+ gap: map.get($spacing-sizes, 1);
757
687
  }
758
688
 
759
689
  &-dataset {
@@ -763,8 +693,8 @@
763
693
  }
764
694
 
765
695
  &-color-indicator {
766
- width: 12px;
767
- height: 12px;
696
+ width: map.get($spacing-sizes, 3);
697
+ height: map.get($spacing-sizes, 3);
768
698
  border-radius: 50%;
769
699
  flex-shrink: 0;
770
700
  }
@@ -807,139 +737,85 @@
807
737
  }
808
738
  }
809
739
 
810
- &__axis {
811
- position: relative;
812
- z-index: 55;
740
+ &__grid {
741
+ stroke: $chart-primary-border;
742
+ stroke-width: $chart-grid-stroke-width;
743
+ stroke-dasharray: 2, 4;
744
+
745
+ &--major {
746
+ stroke-width: $chart-grid-major-stroke-width;
747
+ stroke-dasharray: none;
748
+ opacity: $chart-grid-major-opacity;
749
+ }
813
750
 
814
- &--x {
815
- text-anchor: middle;
816
- dominant-baseline: hanging;
751
+ &--minor {
752
+ opacity: $chart-grid-minor-opacity;
817
753
  }
818
754
 
819
- &--y {
820
- text-anchor: end;
821
- dominant-baseline: middle;
755
+ &--zero {
756
+ stroke-width: $chart-grid-zero-stroke-width;
757
+ stroke-dasharray: none;
758
+ opacity: $chart-grid-zero-opacity;
822
759
  }
823
760
  }
824
761
 
825
762
  &__axis-line {
826
- stroke: $chart-primary-border;
763
+ stroke: var(--atomix-border-color);
827
764
  stroke-width: $chart-axis-line-stroke-width;
828
765
  opacity: $chart-axis-line-opacity;
829
- transition: opacity $chart-transition-duration $chart-transition-timing;
830
-
831
- &--x,
832
- &--y {
833
- stroke-width: 2;
834
- }
835
-
836
- &:hover {
837
- opacity: 0.8;
838
- }
839
- }
840
-
841
- &__tick-line {
842
- stroke: $chart-primary-border;
843
- stroke-width: 1;
844
- }
845
-
846
- &__tick-label {
847
- font-size: $font-size-xs;
848
- fill: $chart-secondary-text;
849
766
  }
850
767
 
851
768
  &__axis-label {
852
769
  font-size: $chart-axis-label-font-size;
853
770
  font-weight: $chart-axis-label-font-weight;
854
771
  fill: $chart-axis-label-color;
855
- text-anchor: middle;
856
- }
857
-
858
- &__plot-area {
859
- fill: rgba(248, 250, 252, 0.5);
860
- stroke: $chart-primary-border;
861
- stroke-width: 1;
862
- }
863
-
864
- &__value-label {
865
- font-size: $font-size-xs;
866
- fill: $chart-primary-text;
867
- pointer-events: none;
868
- }
869
-
870
- &__data-label {
871
- font-size: $font-size-xs;
872
- fill: $chart-secondary-text;
873
- pointer-events: none;
874
772
  }
875
773
 
876
- &__grid {
877
- stroke: $chart-primary-border;
878
- stroke-width: $chart-grid-stroke-width;
879
- stroke-dasharray: 2, 4;
880
- // opacity: $chart-grid-opacity;
881
- transition: opacity $chart-transition-duration $chart-transition-timing;
882
-
883
- &--major {
884
- stroke-width: $chart-grid-major-stroke-width;
885
- stroke-dasharray: none;
886
- opacity: $chart-grid-major-opacity;
774
+ &__legend-item {
775
+ &-color {
776
+ width: $chart-legend-color-size;
777
+ height: $chart-legend-color-size;
778
+ flex-shrink: 0;
887
779
  }
888
780
 
889
- &--minor {
890
- opacity: $chart-grid-minor-opacity;
781
+ &-text {
782
+ font-size: $font-size-xs;
783
+ fill: var(--atomix-text-primary);
891
784
  }
785
+ }
892
786
 
893
- &--zero {
894
- stroke-width: $chart-grid-zero-stroke-width;
895
- stroke-dasharray: none;
896
- opacity: $chart-grid-zero-opacity;
897
- }
787
+ &__data-line {
788
+ stroke-width: $chart-line-width;
789
+ fill: none;
898
790
 
899
- &:hover {
900
- opacity: 0.6;
791
+ &--hovered {
792
+ stroke-width: $chart-line-width-hover;
901
793
  }
902
794
  }
903
795
 
904
796
  &__data-point {
905
797
  cursor: pointer;
906
- transition: all $chart-transition-duration $chart-transition-timing !important;
907
- transform-origin: center center;
798
+ transition: all $chart-transition-duration $chart-transition-timing;
908
799
 
909
800
  &:hover {
910
801
  opacity: 0.8;
911
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
912
- }
913
-
914
- &:focus-visible {
915
- outline: 2px solid var(--#{$prefix}primary-border-subtle);
916
- outline-offset: 2px;
917
802
  }
918
803
 
919
- &:active {
920
- transform: scale(1.05);
921
- }
922
-
923
- &[data-highlighted='true'] {
924
- transform: scale(1.2);
925
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.3));
926
- z-index: 10;
804
+ @include focus-ring;
927
805
 
928
- animation: chart-glow 2s ease-in-out infinite;
806
+ &--hovered {
807
+ opacity: 0.9;
808
+ transform: scale(1.1);
929
809
  }
930
810
 
931
- &[data-selected='true'] {
932
- stroke: var(--#{$prefix}primary-border-subtle);
811
+ &--selected {
812
+ opacity: 1;
933
813
  stroke-width: 2;
934
- filter: drop-shadow(0 0 0 2px var(--#{$prefix}primary-border-subtle));
935
- }
936
-
937
- &[data-animated='true'] {
938
- animation: chart-scale-in 0.5s ease-out;
814
+ filter: drop-shadow(0 0 4px currentColor);
939
815
  }
940
816
  }
941
817
 
942
- &__loading {
818
+ &__empty {
943
819
  display: flex;
944
820
  flex-direction: column;
945
821
  align-items: center;
@@ -947,1157 +823,801 @@
947
823
  gap: map.get($spacing-sizes, 4);
948
824
  color: var(--#{$prefix}secondary-text-emphasis);
949
825
  font-size: $font-size-sm;
826
+ text-align: center;
827
+ padding: map.get($spacing-sizes, 8);
950
828
  min-height: $chart-canvas-min-height;
829
+ opacity: 0.6;
951
830
 
952
831
  animation: chart-fade-in 0.6s ease-out;
953
832
  }
954
833
 
955
- &__loading-spinner {
956
- width: $chart-loading-spinner-size;
957
- height: $chart-loading-spinner-size;
958
- border: 3px solid var(--#{$prefix}primary-border-subtle);
959
- border-top: 3px solid var(--#{$prefix}primary-text-emphasis);
960
- border-radius: 50%;
961
- animation: chart-spin 1.2s $chart-transition-timing infinite;
962
- }
963
-
964
- &__loading-text {
965
- font-weight: $font-weight-medium;
966
- opacity: 0.8;
967
- animation: chart-pulse 2s ease-in-out infinite;
968
- }
969
-
970
- &__error {
971
- display: flex;
972
- flex-direction: column;
973
- align-items: center;
974
- justify-content: center;
975
- gap: map.get($spacing-sizes, 3);
976
- color: var(--#{$prefix}error-text-emphasis);
977
- font-size: $font-size-sm;
978
- text-align: center;
979
- padding: map.get($spacing-sizes, 8);
980
- min-height: $chart-canvas-min-height;
981
- background-color: var(--#{$prefix}error-bg-subtle);
982
- border-radius: $border-radius-md;
983
- border: var(--#{$prefix}chart-border-width) solid var(--#{$prefix}error-border-subtle);
834
+ // Element modifiers for consistency
835
+ // =============================================================================
836
+ &__toolbar {
837
+ &--sm {
838
+ padding: map.get($spacing-sizes, 0.5);
839
+ gap: map.get($spacing-sizes, 1);
840
+ }
984
841
 
985
- animation: chart-fade-in 0.6s ease-out;
842
+ &--lg {
843
+ padding: map.get($spacing-sizes, 2);
844
+ gap: map.get($spacing-sizes, 3);
845
+ }
986
846
  }
987
847
 
988
- &__empty {
989
- display: flex;
990
- flex-direction: column;
991
- align-items: center;
992
- justify-content: center;
993
- gap: map.get($spacing-sizes, 4);
994
- color: var(--#{$prefix}secondary-text-emphasis);
995
- font-size: $font-size-sm;
996
- text-align: center;
997
- padding: map.get($spacing-sizes, 8);
998
- min-height: $chart-canvas-min-height;
999
- opacity: 0.6;
848
+ &__legend-item {
849
+ &--active {
850
+ opacity: 1;
851
+ font-weight: $font-weight-semibold;
852
+ }
1000
853
 
1001
- animation: chart-fade-in 0.6s ease-out;
854
+ &--inactive {
855
+ opacity: 0.5;
856
+ }
1002
857
  }
1003
858
 
1004
- &--line {
1005
- #{$root}__canvas {
1006
- .line-path,
1007
- #{$root}__line-path {
1008
- fill: none;
1009
- stroke-width: $chart-line-width;
1010
- stroke-linecap: round;
1011
- stroke-linejoin: round;
1012
- transition: all $chart-transition-duration $chart-transition-timing;
1013
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1014
-
1015
- stroke-dasharray: 1000;
1016
- stroke-dashoffset: 1000;
1017
- animation: chart-draw-line 2s ease-out forwards;
859
+ // Treemap Chart Elements
860
+ // =============================================================================
861
+ &__treemap-node {
862
+ stroke: $chart-treemap-node-border-color;
863
+ stroke-width: $chart-treemap-node-border-width;
864
+ transition: all $chart-treemap-node-transition-duration $chart-transition-timing;
865
+ cursor: pointer;
866
+ shape-rendering: geometricPrecision;
1018
867
 
1019
- &:hover {
1020
- stroke-width: $chart-line-width-hover;
1021
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
1022
- }
1023
- }
868
+ &:hover {
869
+ transform: scale($chart-treemap-node-hover-scale);
870
+ filter: drop-shadow($chart-treemap-node-hover-shadow);
871
+ stroke-width: calc($chart-treemap-node-border-width * 1.5);
872
+ }
1024
873
 
1025
- .trend-line {
1026
- stroke-dasharray: 5, 5;
1027
- opacity: 0.7;
1028
- animation: chart-dash-flow 2s linear infinite;
1029
- }
874
+ &--hovered {
875
+ transform: scale($chart-treemap-node-hover-scale);
876
+ filter: drop-shadow($chart-treemap-node-hover-shadow);
877
+ stroke-width: calc($chart-treemap-node-border-width * 1.5);
878
+ }
1030
879
 
1031
- .moving-average {
1032
- stroke-dasharray: 4, 4;
1033
- opacity: 0.6;
1034
- stroke-width: 1;
1035
- fill: none;
1036
- }
880
+ &--selected {
881
+ stroke: $chart-treemap-node-selected-border-color;
882
+ stroke-width: $chart-treemap-node-selected-border-width;
883
+ filter: drop-shadow($chart-treemap-node-selected-shadow);
884
+ }
1037
885
 
1038
- .area-path,
1039
- #{$root}__area-path {
1040
- opacity: $chart-area-opacity;
1041
- transition: opacity $chart-transition-duration $chart-transition-timing;
1042
- animation: chart-area-fade 1.5s ease-out;
886
+ @include focus-ring;
887
+ }
1043
888
 
1044
- &:hover {
1045
- opacity: $chart-area-opacity-hover;
1046
- }
1047
- }
1048
-
1049
- .chart-point-label {
1050
- font-size: $font-size-xs;
1051
- font-weight: $font-weight-semibold;
1052
- text-anchor: middle;
1053
- dominant-baseline: middle;
1054
- pointer-events: none;
1055
- opacity: 0;
1056
- transition: opacity 0.2s ease;
1057
-
1058
- &.visible {
1059
- opacity: 1;
1060
- }
1061
- }
1062
-
1063
- .data-point {
1064
- r: $chart-data-point-radius;
1065
- transition: all $chart-transition-duration $chart-transition-timing;
1066
- cursor: pointer;
1067
-
1068
- &:hover {
1069
- r: $chart-data-point-radius-hover;
1070
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
1071
- }
1072
-
1073
- &[data-highlighted='true'] {
1074
- r: $chart-data-point-radius-highlighted;
1075
- stroke-width: 3;
1076
- }
1077
-
1078
- &:focus-visible {
1079
- outline: 2px solid $chart-focus-outline-color;
1080
- outline-offset: 2px;
1081
- }
1082
- }
1083
- }
889
+ &__treemap-label {
890
+ font-size: $chart-treemap-label-font-size;
891
+ font-weight: $chart-treemap-label-font-weight;
892
+ fill: $chart-treemap-label-color;
893
+ text-anchor: middle;
894
+ dominant-baseline: middle;
895
+ pointer-events: none;
896
+ user-select: none;
897
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1084
898
  }
1085
899
 
1086
- &--area {
1087
- #{$root}__canvas {
1088
- .area-path {
1089
- opacity: 0.3;
1090
- transition: opacity $chart-transition-duration $chart-transition-timing;
1091
-
1092
- animation: chart-area-fade 1.5s ease-out;
1093
-
1094
- &:hover {
1095
- opacity: 0.45;
1096
- }
1097
- }
1098
-
1099
- .line-path {
1100
- stroke-width: 2;
1101
- opacity: 0.9;
1102
- transition: all $chart-transition-duration $chart-transition-timing;
1103
-
1104
- animation: chart-draw-line 2s ease-out;
900
+ // Funnel Chart Elements
901
+ // =============================================================================
902
+ &__funnel-segment {
903
+ stroke: $chart-funnel-segment-border-color;
904
+ stroke-width: $chart-funnel-segment-border-width;
905
+ transition: all $chart-funnel-segment-transition-duration $chart-transition-timing;
906
+ cursor: pointer;
907
+ shape-rendering: geometricPrecision;
1105
908
 
1106
- &:hover {
1107
- stroke-width: 3;
1108
- opacity: 1;
1109
- }
1110
- }
909
+ &:hover {
910
+ opacity: $chart-funnel-segment-hover-opacity;
911
+ filter: drop-shadow($chart-funnel-segment-hover-shadow);
912
+ stroke-width: calc($chart-funnel-segment-border-width * 1.5);
1111
913
  }
1112
- }
1113
-
1114
- &--bar,
1115
- &--horizontal-bar {
1116
- #{$root}__canvas {
1117
- .bar,
1118
- #{$root}__bar {
1119
- transition: all $chart-transition-duration $chart-transition-timing;
1120
- cursor: pointer;
1121
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1122
- animation: chart-bar-grow 0.8s ease-out;
1123
- opacity: 1;
1124
-
1125
- &:hover,
1126
- &--hovered {
1127
- opacity: $chart-bar-opacity-hover;
1128
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
1129
- }
1130
-
1131
- &:focus-visible {
1132
- outline: 2px solid $chart-primary-border;
1133
- outline-offset: 2px;
1134
- }
1135
-
1136
- &[data-animated='true'] {
1137
- animation: chart-bar-grow 0.8s ease-out;
1138
- }
1139
- }
1140
914
 
1141
- .bar-group {
1142
- .bar {
1143
- animation-delay: calc(var(--bar-index) * 0.1s);
1144
- }
1145
- }
1146
-
1147
- .bar-value-label,
1148
- #{$root}__bar-value-label {
1149
- font-size: $font-size-xs;
1150
- font-weight: $font-weight-medium;
1151
- fill: $chart-primary-text;
1152
- text-anchor: middle;
1153
- opacity: 1;
1154
- transition: opacity $chart-transition-duration $chart-transition-timing;
1155
- font-variant-numeric: tabular-nums;
1156
- pointer-events: none;
1157
-
1158
- &.visible {
1159
- opacity: 1;
1160
- }
1161
- }
1162
-
1163
- .bar-gradient {
1164
- stop {
1165
- transition: stop-opacity 0.3s ease;
1166
- }
1167
- }
1168
- }
915
+ @include focus-ring;
1169
916
  }
1170
917
 
1171
- &--bar {
1172
- #{$root}__canvas .bar {
1173
- transform-origin: bottom center;
1174
-
1175
- animation: chart-bar-grow 0.8s ease-out;
1176
-
1177
- &:hover {
1178
- transform: scaleY(1.05);
1179
- }
1180
- }
918
+ &__funnel-label {
919
+ font-size: $chart-funnel-label-font-size;
920
+ font-weight: $chart-funnel-label-font-weight;
921
+ fill: $chart-funnel-label-color;
922
+ text-anchor: middle;
923
+ dominant-baseline: middle;
924
+ pointer-events: none;
925
+ user-select: none;
926
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1181
927
  }
1182
928
 
1183
- &--horizontal-bar {
1184
- #{$root}__canvas .bar {
1185
- transform-origin: left center;
1186
-
1187
- animation: chart-bar-grow-horizontal 0.8s ease-out;
1188
-
1189
- &:hover {
1190
- transform: scaleX(1.05);
1191
- }
1192
- }
929
+ &__funnel-conversion {
930
+ font-size: $chart-funnel-conversion-font-size;
931
+ font-weight: $chart-funnel-conversion-font-weight;
932
+ fill: $chart-funnel-conversion-color;
933
+ text-anchor: middle;
934
+ dominant-baseline: middle;
935
+ pointer-events: none;
936
+ user-select: none;
937
+ opacity: 0.8;
1193
938
  }
1194
939
 
1195
- &--pie,
1196
- &--donut,
1197
- &--doughnut {
1198
- #{$root}__canvas {
1199
- .pie-slice,
1200
- .donut-slice,
1201
- #{$root}__pie-slice,
1202
- #{$root}__donut-slice {
1203
- transition: all $chart-pie-transition-duration $chart-transition-timing;
1204
- stroke: $chart-primary-bg;
1205
- stroke-width: $chart-pie-stroke-width;
1206
- cursor: pointer;
1207
- transform-origin: center;
1208
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
1209
- opacity: 1;
1210
-
1211
- animation: chart-pie-draw 1.5s ease-out;
1212
-
1213
- &:hover,
1214
- &--hovered {
1215
- opacity: 0.8;
1216
- transform: scale(1.05);
1217
- stroke-width: $chart-pie-stroke-width-hover;
1218
- filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.2));
1219
- }
1220
-
1221
- &--selected {
1222
- stroke: $chart-primary-border;
1223
- stroke-width: 3;
1224
- }
1225
-
1226
- &:focus-visible {
1227
- outline: 2px solid $chart-primary-border;
1228
- outline-offset: 4px;
1229
- }
1230
- }
940
+ // Heatmap Chart Elements
941
+ // =============================================================================
942
+ &__heatmap-cell {
943
+ stroke: $chart-heatmap-cell-border-color;
944
+ stroke-width: $chart-heatmap-cell-border-width;
945
+ rx: $chart-heatmap-cell-border-radius;
946
+ ry: $chart-heatmap-cell-border-radius;
947
+ transition: all $chart-heatmap-cell-transition-duration $chart-transition-timing;
948
+ cursor: pointer;
949
+ shape-rendering: geometricPrecision;
1231
950
 
1232
- .pie-label,
1233
- #{$root}__pie-label,
1234
- #{$root}__donut-label {
1235
- font-size: $font-size-xs;
1236
- font-weight: $font-weight-semibold;
1237
- fill: $chart-primary-text;
1238
- text-anchor: middle;
1239
- pointer-events: none;
1240
- transition: all $chart-transition-duration $chart-transition-timing;
1241
- font-variant-numeric: tabular-nums;
1242
- }
951
+ &:hover {
952
+ transform: scale($chart-heatmap-cell-hover-scale);
953
+ transform-origin: center;
954
+ filter: drop-shadow($chart-heatmap-cell-hover-shadow);
955
+ stroke-width: $chart-heatmap-cell-hover-border-width;
956
+ z-index: 10;
1243
957
  }
1244
- }
1245
-
1246
- &--donut,
1247
- &--doughnut {
1248
- #{$root}__canvas {
1249
- .donut-slice {
1250
- animation: chart-donut-draw 1.5s ease-out;
1251
- }
1252
-
1253
- .donut-center,
1254
- #{$root}__donut-center {
1255
- transition: fill $chart-transition-duration $chart-transition-timing;
1256
- }
1257
-
1258
- #{$root}__donut-center-bg {
1259
- fill: $chart-primary-bg;
1260
- }
1261
-
1262
- .donut-center-label,
1263
- #{$root}__donut-center-label {
1264
- font-size: $font-size-sm;
1265
- font-weight: $font-weight-medium;
1266
- fill: $chart-secondary-text;
1267
- text-anchor: middle;
1268
- dominant-baseline: central;
1269
- font-variant-numeric: tabular-nums;
1270
- }
1271
958
 
1272
- #{$root}__donut-center-value {
1273
- font-size: $font-size-xl;
1274
- font-weight: $font-weight-bold;
1275
- fill: $chart-primary-text;
1276
- text-anchor: middle;
1277
- dominant-baseline: central;
1278
- font-variant-numeric: tabular-nums;
1279
- }
959
+ &--hovered {
960
+ transform: scale($chart-heatmap-cell-hover-scale);
961
+ transform-origin: center;
962
+ filter: drop-shadow($chart-heatmap-cell-hover-shadow);
963
+ stroke-width: $chart-heatmap-cell-hover-border-width;
964
+ z-index: 10;
1280
965
  }
1281
- }
1282
-
1283
- &--scatter {
1284
- #{$root}__canvas {
1285
- .scatter-point,
1286
- #{$root}__scatter-point {
1287
- stroke: $chart-primary-border;
1288
- stroke-width: 1;
1289
- transition: all $chart-transition-duration $chart-transition-timing;
1290
- cursor: pointer;
1291
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1292
- animation: chart-fade-in 0.6s ease-out;
1293
966
 
1294
- &:hover {
1295
- filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.3));
1296
- }
1297
-
1298
- &:focus-visible {
1299
- outline: 2px solid $chart-primary-border;
1300
- outline-offset: 2px;
1301
- }
1302
- }
1303
-
1304
- #{$root}__scatter-label {
1305
- font-size: $font-size-xs;
1306
- fill: $chart-primary-text;
1307
- pointer-events: none;
1308
- }
1309
- }
967
+ @include focus-ring;
1310
968
  }
1311
969
 
1312
- &--bubble {
1313
- #{$root}__canvas {
1314
- #{$root}__bubble {
1315
- stroke: $chart-primary-bg;
1316
- stroke-width: 2;
1317
- cursor: pointer;
1318
- transition: all $chart-transition-duration $chart-transition-timing;
1319
-
1320
- &--animated {
1321
- transition: all 1s ease-out;
1322
- }
1323
-
1324
- &:hover {
1325
- // transform: scale(1.1);
1326
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.3));
1327
- }
1328
- }
1329
-
1330
- #{$root}__bubble-label {
1331
- font-size: $font-size-xs;
1332
- font-weight: $font-weight-medium;
1333
- fill: $chart-tertiary-text;
1334
- pointer-events: none;
1335
-
1336
- &--center {
1337
- fill: $chart-invert-text;
1338
- font-weight: $font-weight-bold;
1339
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
1340
- }
1341
- }
1342
- }
970
+ &__heatmap-label {
971
+ font-size: $chart-heatmap-label-font-size;
972
+ font-weight: $chart-heatmap-label-font-weight;
973
+ fill: $chart-heatmap-label-color;
974
+ text-anchor: middle;
975
+ dominant-baseline: middle;
976
+ pointer-events: none;
977
+ user-select: none;
1343
978
  }
1344
979
 
1345
- &--radar {
1346
- #{$root}__canvas {
1347
- #{$root}__radar-grid {
1348
- stroke: $chart-primary-border;
1349
- stroke-width: 1;
1350
- opacity: 0.3;
1351
- }
1352
-
1353
- #{$root}__radar-axis {
1354
- stroke: $chart-primary-border;
1355
- stroke-width: 1;
1356
- opacity: 0.5;
1357
- }
1358
-
1359
- #{$root}__radar-label {
1360
- font-size: $font-size-xs;
1361
- fill: $chart-secondary-text;
1362
- }
1363
-
1364
- #{$root}__radar-fill {
1365
- transition: opacity $chart-transition-duration $chart-transition-timing;
1366
-
1367
- &:hover {
1368
- opacity: 0.5 !important;
1369
- }
1370
- }
1371
-
1372
- #{$root}__radar-line {
1373
- fill: none;
1374
- transition: stroke-width $chart-transition-duration $chart-transition-timing;
1375
-
1376
- &:hover {
1377
- stroke-width: 3 !important;
1378
- }
1379
- }
1380
-
1381
- #{$root}__radar-point {
1382
- stroke: $chart-primary-bg;
1383
- stroke-width: 2;
1384
- cursor: pointer;
1385
- transition: all $chart-transition-duration $chart-transition-timing;
1386
-
1387
- &:hover {
1388
- transform: scale(1.3);
1389
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
1390
- }
1391
- }
1392
- }
980
+ &__heatmap-axis-label {
981
+ font-size: $chart-heatmap-axis-label-font-size;
982
+ font-weight: $chart-heatmap-axis-label-font-weight;
983
+ fill: $chart-heatmap-axis-label-color;
984
+ text-anchor: middle;
985
+ dominant-baseline: middle;
986
+ pointer-events: none;
987
+ user-select: none;
1393
988
  }
1394
989
 
1395
- &--candlestick {
1396
- #{$root}__canvas {
1397
- .candlestick,
1398
- #{$root}__candlestick {
1399
- stroke-width: 1;
1400
- cursor: pointer;
1401
- transition: all $chart-transition-duration $chart-transition-timing;
1402
- animation: chart-fade-in 0.6s ease-out;
1403
-
1404
- &--bullish {
1405
- opacity: 0.8;
1406
- }
1407
-
1408
- &--bearish {
1409
- opacity: 1;
1410
- }
1411
-
1412
- &:hover {
1413
- opacity: 0.8;
1414
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
1415
- }
1416
- }
990
+ &__heatmap-legend-title {
991
+ font-size: $chart-heatmap-legend-title-font-size;
992
+ font-weight: $chart-heatmap-legend-title-font-weight;
993
+ fill: $chart-heatmap-legend-title-color;
994
+ text-anchor: start;
995
+ dominant-baseline: baseline;
996
+ pointer-events: none;
997
+ user-select: none;
998
+ }
1417
999
 
1418
- #{$root}__candlestick-highlight {
1419
- stroke-width: 2;
1420
- opacity: 0.5;
1421
- }
1000
+ &__heatmap-legend-label {
1001
+ font-size: $chart-heatmap-legend-label-font-size;
1002
+ font-weight: $chart-heatmap-legend-label-font-weight;
1003
+ fill: $chart-heatmap-legend-label-color;
1004
+ text-anchor: start;
1005
+ dominant-baseline: middle;
1006
+ pointer-events: none;
1007
+ user-select: none;
1008
+ }
1422
1009
 
1423
- .wick,
1424
- #{$root}__wick {
1425
- stroke-width: $chart-candlestick-wick-stroke-width;
1426
- opacity: $chart-candlestick-wick-opacity;
1010
+ // Candlestick Chart Elements
1011
+ // =============================================================================
1012
+ &__candlestick-candle {
1013
+ stroke: $chart-candlestick-candle-border-color;
1014
+ stroke-width: $chart-candlestick-candle-border-width;
1015
+ rx: $chart-candlestick-candle-border-radius;
1016
+ ry: $chart-candlestick-candle-border-radius;
1017
+ transition: all $chart-candlestick-transition-duration $chart-transition-timing;
1018
+ cursor: pointer;
1019
+ shape-rendering: geometricPrecision;
1427
1020
 
1428
- &--hovered {
1429
- stroke-width: 2;
1430
- }
1431
- }
1021
+ &:hover {
1022
+ opacity: 0.9;
1023
+ stroke-width: calc($chart-candlestick-candle-border-width * 1.5);
1024
+ filter: drop-shadow($box-shadow-sm);
1025
+ }
1432
1026
 
1433
- #{$root}__moving-average {
1434
- stroke-width: 2;
1435
- opacity: 0.8;
1436
- }
1027
+ @include focus-ring;
1028
+ }
1437
1029
 
1438
- .volume-bar {
1439
- opacity: $chart-volume-bar-opacity;
1440
- transition: opacity $chart-transition-duration $chart-transition-timing;
1030
+ &__candlestick-wick {
1031
+ stroke: $chart-candlestick-wick-color;
1032
+ stroke-width: $chart-candlestick-wick-stroke-width;
1033
+ opacity: $chart-candlestick-wick-opacity;
1034
+ transition: all $chart-candlestick-transition-duration $chart-transition-timing;
1035
+ shape-rendering: geometricPrecision;
1441
1036
 
1442
- &:hover {
1443
- opacity: $chart-volume-bar-opacity-hover;
1444
- }
1445
- }
1037
+ &:hover {
1038
+ opacity: 1;
1039
+ stroke-width: calc($chart-candlestick-wick-stroke-width * 1.2);
1446
1040
  }
1447
1041
  }
1448
1042
 
1449
- &--gauge {
1450
- #{$root}__canvas {
1451
- #{$root}__gauge-background {
1452
- fill: $chart-secondary-bg;
1453
- stroke: $chart-primary-border;
1454
- stroke-width: 1;
1455
- }
1456
-
1457
- #{$root}__gauge-zone {
1458
- stroke: $chart-primary-bg;
1459
- stroke-width: 2;
1460
- }
1461
-
1462
- #{$root}__gauge-tick {
1463
- &--major {
1464
- stroke: $chart-secondary-text;
1465
- stroke-width: 2;
1466
- }
1467
-
1468
- &--minor {
1469
- stroke: $chart-tertiary-text;
1470
- stroke-width: 1;
1471
- }
1472
- }
1473
-
1474
- #{$root}__gauge-tick-label {
1475
- font-size: $font-size-xs;
1476
- fill: $chart-secondary-text;
1477
- }
1478
-
1479
- #{$root}__gauge-min-max-label {
1480
- font-size: $font-size-sm;
1481
- font-weight: $font-weight-bold;
1482
- fill: $chart-secondary-text;
1483
- }
1484
-
1485
- #{$root}__gauge-needle {
1486
- #{$root}__gauge-needle-line {
1487
- stroke-width: 3;
1488
- stroke-linecap: round;
1489
- }
1490
-
1491
- #{$root}__gauge-needle-center {
1492
- stroke: $chart-primary-bg;
1493
- stroke-width: 2;
1494
- }
1495
- }
1496
-
1497
- #{$root}__gauge-value {
1498
- font-size: $font-size-2xl;
1499
- font-weight: $font-weight-bold;
1500
- fill: $chart-primary-text;
1501
- }
1043
+ &__candlestick-volume {
1044
+ transition: all $chart-candlestick-transition-duration $chart-transition-timing;
1045
+ cursor: pointer;
1046
+ shape-rendering: geometricPrecision;
1502
1047
 
1503
- #{$root}__gauge-label {
1504
- font-size: $font-size-sm;
1505
- fill: $chart-secondary-text;
1506
- }
1048
+ &:hover {
1049
+ opacity: $chart-volume-bar-opacity-hover;
1507
1050
  }
1508
1051
  }
1509
1052
 
1510
- &--funnel {
1511
- #{$root}__canvas {
1512
- #{$root}__funnel-segment {
1513
- stroke: $chart-primary-bg;
1514
- stroke-width: 2;
1515
- cursor: pointer;
1516
- transition: all $chart-transition-duration $chart-transition-timing;
1517
-
1518
- &--animated {
1519
- transition: all 1s ease-out;
1520
- }
1521
-
1522
- &:hover {
1523
- opacity: 0.8;
1524
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
1525
- }
1526
- }
1527
-
1528
- #{$root}__funnel-label {
1529
- font-size: $font-size-sm;
1530
- font-weight: $font-weight-bold;
1531
- pointer-events: none;
1532
-
1533
- &--inside {
1534
- fill: $chart-invert-text;
1535
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
1536
- }
1053
+ // Bar Chart Elements
1054
+ // =============================================================================
1055
+ &__bar {
1056
+ rx: $border-radius-sm;
1057
+ ry: $border-radius-sm;
1058
+ transition: all $chart-transition-duration $chart-transition-timing;
1059
+ cursor: pointer;
1060
+ shape-rendering: geometricPrecision;
1537
1061
 
1538
- &--outside {
1539
- fill: $chart-primary-text;
1540
- }
1541
- }
1062
+ &:hover {
1063
+ opacity: $chart-bar-opacity-hover;
1064
+ filter: drop-shadow($box-shadow-sm);
1065
+ }
1542
1066
 
1543
- #{$root}__funnel-value {
1544
- font-size: $font-size-xs;
1545
- pointer-events: none;
1067
+ &--hovered {
1068
+ opacity: $chart-bar-opacity-hover;
1069
+ filter: drop-shadow($box-shadow-sm);
1070
+ }
1546
1071
 
1547
- &--inside {
1548
- fill: $chart-invert-text;
1549
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
1550
- }
1072
+ @include focus-ring;
1073
+ }
1551
1074
 
1552
- &--outside {
1553
- fill: $chart-secondary-text;
1554
- }
1555
- }
1075
+ &__bar-value-label {
1076
+ font-size: $font-size-xs;
1077
+ font-weight: $font-weight-medium;
1078
+ fill: var(--atomix-text-primary);
1079
+ text-anchor: middle;
1080
+ pointer-events: none;
1081
+ user-select: none;
1082
+ }
1556
1083
 
1557
- #{$root}__funnel-conversion {
1558
- font-size: $font-size-xs;
1559
- fill: $chart-secondary-text;
1560
- font-style: italic;
1561
- }
1562
- }
1084
+ // Line Chart Elements
1085
+ // =============================================================================
1086
+ &__line-path {
1087
+ fill: none;
1088
+ stroke-linecap: round;
1089
+ stroke-linejoin: round;
1090
+ transition: all $chart-transition-duration $chart-transition-timing;
1091
+ shape-rendering: geometricPrecision;
1563
1092
  }
1564
1093
 
1565
- &--heatmap {
1566
- #{$root}__canvas {
1567
- #{$root}__heatmap-axis-label {
1568
- font-size: $font-size-xs;
1569
- fill: var(--#{$prefix}gray-7);
1570
- font-weight: $font-weight-medium;
1571
- user-select: none;
1572
- }
1094
+ &__area-path {
1095
+ transition: all $chart-transition-duration $chart-transition-timing;
1096
+ shape-rendering: geometricPrecision;
1097
+ }
1573
1098
 
1574
- #{$root}__heatmap-cell {
1575
- cursor: pointer;
1576
- transition: all 0.2s ease;
1577
- shape-rendering: crispEdges;
1578
-
1579
- &--empty {
1580
- fill: var(--#{$prefix}gray-2);
1581
- stroke: var(--#{$prefix}gray-3);
1582
- stroke-width: 0.5;
1583
- opacity: 0.6;
1584
- }
1099
+ &__area-fill {
1100
+ transition: all $chart-transition-duration $chart-transition-timing;
1101
+ shape-rendering: geometricPrecision;
1102
+ }
1585
1103
 
1586
- &--hovered {
1587
- transform: scale(1.1);
1588
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
1589
- z-index: 10;
1590
- }
1104
+ &__area-point {
1105
+ transition: all $chart-transition-duration $chart-transition-timing;
1106
+ cursor: pointer;
1107
+ shape-rendering: geometricPrecision;
1591
1108
 
1592
- &:focus-visible {
1593
- outline: 2px solid var(--#{$prefix}primary-6);
1594
- outline-offset: 1px;
1595
- }
1596
- }
1109
+ &:hover {
1110
+ transform: scale(1.2);
1111
+ }
1597
1112
 
1598
- #{$root}__heatmap-value {
1599
- font-size: 9px;
1600
- font-weight: $font-weight-medium;
1601
- pointer-events: none;
1602
- user-select: none;
1603
- font-variant-numeric: tabular-nums;
1113
+ &--hovered {
1114
+ transform: scale(1.2);
1115
+ }
1604
1116
 
1605
- &--light {
1606
- fill: white;
1607
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1608
- }
1117
+ @include focus-ring;
1118
+ }
1609
1119
 
1610
- &--dark {
1611
- fill: var(--#{$prefix}gray-8);
1612
- }
1613
- }
1120
+ &__point-label {
1121
+ font-size: $font-size-xs;
1122
+ font-weight: $font-weight-medium;
1123
+ text-anchor: middle;
1124
+ pointer-events: none;
1125
+ user-select: none;
1126
+ }
1614
1127
 
1615
- // Calendar variant styles
1616
- &.c-chart--calendar {
1617
- #{$root}__heatmap-cell {
1618
- rx: 2;
1619
- }
1620
- }
1128
+ // Pie Chart Elements
1129
+ // =============================================================================
1130
+ &__pie-slice {
1131
+ transition: all $chart-pie-transition-duration $chart-transition-timing;
1132
+ cursor: pointer;
1133
+ shape-rendering: geometricPrecision;
1621
1134
 
1622
- // Grid variant styles
1623
- &.c-chart--grid {
1624
- #{$root}__heatmap-cell {
1625
- rx: 4;
1626
- }
1627
- }
1135
+ &:hover {
1136
+ stroke-width: $chart-pie-stroke-width-hover;
1137
+ filter: drop-shadow($box-shadow-sm);
1628
1138
  }
1629
- }
1630
-
1631
- &--treemap {
1632
- #{$root}__canvas {
1633
- #{$root}__treemap-node {
1634
- cursor: pointer;
1635
- stroke: $chart-primary-bg;
1636
- stroke-width: 1;
1637
- transition: all $chart-transition-duration $chart-transition-timing;
1638
1139
 
1639
- &--animated {
1640
- transition: all 750ms ease-out;
1641
- }
1140
+ &--hovered {
1141
+ stroke-width: $chart-pie-stroke-width-hover;
1142
+ filter: drop-shadow($box-shadow-sm);
1143
+ }
1642
1144
 
1643
- &--hovered {
1644
- opacity: 0.8;
1645
- }
1145
+ @include focus-ring;
1146
+ }
1646
1147
 
1647
- &--selected {
1648
- stroke-width: 2;
1649
- }
1650
- }
1148
+ &__pie-label {
1149
+ font-size: $font-size-xs;
1150
+ font-weight: $font-weight-medium;
1151
+ fill: var(--atomix-text-primary);
1152
+ text-anchor: middle;
1153
+ dominant-baseline: middle;
1154
+ pointer-events: none;
1155
+ user-select: none;
1156
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1157
+ }
1651
1158
 
1652
- #{$root}__treemap-label {
1653
- font-size: $font-size-xs;
1654
- font-weight: $font-weight-bold;
1655
- fill: $chart-invert-text;
1656
- pointer-events: none;
1657
- }
1159
+ // Donut Chart Elements
1160
+ // =============================================================================
1161
+ &__donut-slice {
1162
+ transition: all $chart-pie-transition-duration $chart-transition-timing;
1163
+ cursor: pointer;
1164
+ shape-rendering: geometricPrecision;
1165
+ transform-origin: center;
1658
1166
 
1659
- #{$root}__treemap-value {
1660
- font-size: $font-size-xs;
1661
- fill: $chart-invert-text;
1662
- opacity: 0.8;
1663
- pointer-events: none;
1664
- }
1167
+ &:hover {
1168
+ transform: scale(1.02);
1169
+ filter: drop-shadow($box-shadow-sm);
1665
1170
  }
1666
- }
1667
-
1668
- &--waterfall {
1669
- #{$root}__canvas {
1670
- #{$root}__waterfall-bar {
1671
- stroke: $chart-primary-bg;
1672
- stroke-width: 2;
1673
- cursor: pointer;
1674
- transition: all $chart-transition-duration $chart-transition-timing;
1675
1171
 
1676
- &--animated {
1677
- transition: all 1s ease-out;
1678
- }
1172
+ &--hovered {
1173
+ transform: scale(1.02);
1174
+ filter: drop-shadow($box-shadow-sm);
1175
+ }
1679
1176
 
1680
- &:hover {
1681
- opacity: 0.8;
1682
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
1683
- }
1684
- }
1177
+ @include focus-ring;
1178
+ }
1685
1179
 
1686
- #{$root}__waterfall-value {
1687
- font-size: $font-size-xs;
1688
- font-weight: $font-weight-bold;
1689
- pointer-events: none;
1180
+ &__donut-label {
1181
+ font-size: $font-size-xs;
1182
+ font-weight: $font-weight-medium;
1183
+ fill: var(--atomix-text-primary);
1184
+ text-anchor: middle;
1185
+ dominant-baseline: middle;
1186
+ pointer-events: none;
1187
+ user-select: none;
1188
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1189
+ }
1690
1190
 
1691
- &--center {
1692
- fill: $chart-invert-text;
1693
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
1694
- }
1191
+ &__donut-percentage {
1192
+ font-size: $font-size-xs;
1193
+ font-weight: $font-weight-semibold;
1194
+ fill: var(--atomix-secondary-text-emphasis);
1195
+ text-anchor: middle;
1196
+ dominant-baseline: middle;
1197
+ pointer-events: none;
1198
+ user-select: none;
1199
+ }
1695
1200
 
1696
- &--outside {
1697
- fill: $chart-primary-text;
1698
- }
1699
- }
1201
+ &__donut-center-label {
1202
+ font-size: $font-size-sm;
1203
+ font-weight: $font-weight-medium;
1204
+ fill: var(--atomix-secondary-text-emphasis);
1205
+ text-anchor: middle;
1206
+ dominant-baseline: middle;
1207
+ pointer-events: none;
1208
+ user-select: none;
1209
+ }
1700
1210
 
1701
- #{$root}__waterfall-connector {
1702
- stroke-width: 2;
1703
- opacity: 0.7;
1704
- }
1211
+ &__donut-center-value {
1212
+ font-size: $font-size-lg;
1213
+ font-weight: $font-weight-bold;
1214
+ fill: var(--atomix-text-primary);
1215
+ text-anchor: middle;
1216
+ dominant-baseline: middle;
1217
+ pointer-events: none;
1218
+ user-select: none;
1219
+ }
1705
1220
 
1706
- #{$root}__waterfall-cumulative-line {
1707
- stroke-width: 3;
1708
- stroke-linecap: round;
1709
- stroke-linejoin: round;
1710
- }
1221
+ // Scatter Chart Elements
1222
+ // =============================================================================
1223
+ &__scatter-point {
1224
+ transition: all $chart-transition-duration $chart-transition-timing;
1225
+ cursor: pointer;
1226
+ shape-rendering: geometricPrecision;
1711
1227
 
1712
- #{$root}__waterfall-cumulative-point {
1713
- stroke: $chart-primary-bg;
1714
- stroke-width: 2;
1715
- }
1228
+ &:hover {
1229
+ transform: scale(1.2);
1230
+ filter: drop-shadow($box-shadow-sm);
1716
1231
  }
1717
- }
1718
- }
1719
1232
 
1720
- // Animations
1721
- @keyframes chart-spin {
1722
- 0% {
1723
- transform: rotate(0deg);
1233
+ @include focus-ring;
1724
1234
  }
1725
- 100% {
1726
- transform: rotate(360deg);
1727
- }
1728
- }
1729
1235
 
1730
- @keyframes chart-shimmer {
1731
- 0% {
1732
- left: -100%;
1733
- }
1734
- 100% {
1735
- left: 100%;
1236
+ &__scatter-label {
1237
+ font-size: $font-size-xs;
1238
+ font-weight: $font-weight-medium;
1239
+ fill: var(--atomix-text-primary);
1240
+ text-anchor: middle;
1241
+ pointer-events: none;
1242
+ user-select: none;
1736
1243
  }
1737
- }
1738
1244
 
1739
- @keyframes chart-pulse {
1740
- 0%,
1741
- 100% {
1742
- opacity: 0.8;
1743
- }
1744
- 50% {
1745
- opacity: 1;
1746
- }
1747
- }
1245
+ // Bubble Chart Elements
1246
+ // =============================================================================
1247
+ &__bubble {
1248
+ transition: all $chart-transition-duration $chart-transition-timing;
1249
+ cursor: pointer;
1250
+ shape-rendering: geometricPrecision;
1748
1251
 
1749
- @keyframes chart-draw-line {
1750
- 0% {
1751
- stroke-dashoffset: 1000;
1752
- }
1753
- 100% {
1754
- stroke-dashoffset: 0;
1252
+ &:hover {
1253
+ transform: scale(1.1);
1254
+ filter: drop-shadow($box-shadow-md);
1255
+ }
1256
+
1257
+ &--hovered {
1258
+ transform: scale(1.1);
1259
+ filter: drop-shadow($box-shadow-md);
1260
+ }
1261
+
1262
+ @include focus-ring;
1755
1263
  }
1756
- }
1757
1264
 
1758
- @keyframes chart-area-fade {
1759
- 0% {
1760
- opacity: 0;
1265
+ &__bubble-label {
1266
+ font-size: $font-size-xs;
1267
+ font-weight: $font-weight-medium;
1268
+ fill: var(--atomix-text-primary);
1269
+ text-anchor: middle;
1270
+ dominant-baseline: middle;
1271
+ pointer-events: none;
1272
+ user-select: none;
1273
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1761
1274
  }
1762
- 100% {
1275
+
1276
+ // Radar Chart Elements
1277
+ // =============================================================================
1278
+ &__radar-grid-line {
1279
+ stroke: var(--atomix-border-color);
1280
+ stroke-width: 1;
1763
1281
  opacity: 0.3;
1282
+ shape-rendering: geometricPrecision;
1764
1283
  }
1765
- }
1766
1284
 
1767
- @keyframes chart-bar-grow {
1768
- 0% {
1769
- transform: scaleY(0);
1770
- }
1771
- 100% {
1772
- transform: scaleY(1);
1285
+ &__radar-axis-label {
1286
+ font-size: $font-size-xs;
1287
+ font-weight: $font-weight-medium;
1288
+ fill: var(--atomix-secondary-text-emphasis);
1289
+ text-anchor: middle;
1290
+ dominant-baseline: middle;
1291
+ pointer-events: none;
1292
+ user-select: none;
1773
1293
  }
1774
- }
1775
1294
 
1776
- @keyframes chart-bar-grow-horizontal {
1777
- 0% {
1778
- transform: scaleX(0);
1779
- }
1780
- 100% {
1781
- transform: scaleX(1);
1295
+ &__radar-area {
1296
+ transition: all $chart-transition-duration $chart-transition-timing;
1297
+ shape-rendering: geometricPrecision;
1782
1298
  }
1783
- }
1784
1299
 
1785
- @keyframes chart-pie-draw {
1786
- 0% {
1787
- stroke-dasharray: 0 628;
1788
- }
1789
- 100% {
1790
- stroke-dasharray: 628 628;
1300
+ &__radar-line {
1301
+ transition: all $chart-transition-duration $chart-transition-timing;
1302
+ shape-rendering: geometricPrecision;
1303
+ stroke-linecap: round;
1304
+ stroke-linejoin: round;
1791
1305
  }
1792
- }
1793
1306
 
1794
- @keyframes chart-donut-draw {
1795
- 0% {
1796
- stroke-dasharray: 0 628;
1797
- }
1798
- 100% {
1799
- stroke-dasharray: 628 628;
1800
- }
1801
- }
1307
+ &__radar-point {
1308
+ transition: all $chart-transition-duration $chart-transition-timing;
1309
+ cursor: pointer;
1310
+ shape-rendering: geometricPrecision;
1802
1311
 
1803
- @keyframes chart-fade-in {
1804
- 0% {
1805
- opacity: 0;
1806
- transform: translateY(10px);
1807
- }
1808
- 100% {
1809
- opacity: 1;
1810
- transform: translateY(0);
1811
- }
1812
- }
1312
+ &:hover {
1313
+ transform: scale(1.3);
1314
+ filter: drop-shadow($box-shadow-sm);
1315
+ }
1813
1316
 
1814
- @keyframes chart-scale-in {
1815
- 0% {
1816
- opacity: 0;
1817
- transform: scale(0.3);
1818
- }
1819
- 60% {
1820
- opacity: 0.8;
1821
- transform: scale(1.1);
1822
- }
1823
- 100% {
1824
- opacity: 1;
1825
- transform: scale(1);
1826
- }
1827
- }
1317
+ &--hovered {
1318
+ transform: scale(1.3);
1319
+ filter: drop-shadow($box-shadow-sm);
1320
+ }
1828
1321
 
1829
- @keyframes chart-slide-in {
1830
- 0% {
1831
- opacity: 0;
1832
- transform: translateX(-20px);
1833
- }
1834
- 100% {
1835
- opacity: 1;
1836
- transform: translateX(0);
1322
+ @include focus-ring;
1837
1323
  }
1838
- }
1839
1324
 
1840
- @keyframes chart-bubble-grow {
1841
- 0% {
1842
- transform: scale(0);
1843
- }
1844
- 100% {
1845
- transform: scale(1);
1846
- }
1847
- }
1325
+ // Waterfall Chart Elements
1326
+ // =============================================================================
1327
+ &__waterfall-bar {
1328
+ rx: $border-radius-sm;
1329
+ ry: $border-radius-sm;
1330
+ transition: all $chart-transition-duration $chart-transition-timing;
1331
+ cursor: pointer;
1332
+ shape-rendering: geometricPrecision;
1848
1333
 
1849
- @keyframes chart-dash-flow {
1850
- 0% {
1851
- stroke-dashoffset: 0;
1852
- }
1853
- 100% {
1854
- stroke-dashoffset: 10;
1855
- }
1856
- }
1334
+ &:hover {
1335
+ opacity: $chart-bar-opacity-hover;
1336
+ filter: drop-shadow($box-shadow-sm);
1337
+ }
1857
1338
 
1858
- @keyframes chart-glow {
1859
- 0%,
1860
- 100% {
1861
- filter: drop-shadow(0 0 5px currentColor);
1862
- }
1863
- 50% {
1864
- filter: drop-shadow(0 0 15px currentColor);
1865
- }
1866
- }
1339
+ &--animated {
1340
+ animation: chart-bar-appear $chart-animation-duration $chart-animation-easing;
1341
+ transform-origin: bottom center;
1342
+ }
1867
1343
 
1868
- @keyframes chart-pulse-dot {
1869
- 0%,
1870
- 100% {
1871
- opacity: 1;
1872
- transform: scale(1);
1344
+ @include focus-ring;
1873
1345
  }
1874
- 50% {
1875
- opacity: 0.5;
1876
- transform: scale(1.2);
1877
- }
1878
- }
1879
1346
 
1880
- @keyframes chart-zoom-in {
1881
- 0% {
1882
- transform: scale(0.8);
1883
- opacity: 0;
1347
+ &__waterfall-value {
1348
+ font-size: $font-size-xs;
1349
+ font-weight: $font-weight-semibold;
1350
+ fill: var(--atomix-text-primary);
1351
+ text-anchor: middle;
1352
+ pointer-events: none;
1353
+ user-select: none;
1354
+
1355
+ &--center {
1356
+ dominant-baseline: middle;
1357
+ }
1358
+
1359
+ &--outside {
1360
+ dominant-baseline: auto;
1361
+ }
1884
1362
  }
1885
- 100% {
1886
- transform: scale(1);
1887
- opacity: 1;
1363
+
1364
+ &__waterfall-connector {
1365
+ stroke: var(--atomix-border-color);
1366
+ stroke-width: 1;
1367
+ opacity: 0.6;
1368
+ shape-rendering: geometricPrecision;
1888
1369
  }
1889
- }
1890
1370
 
1891
- @keyframes chart-slide-up {
1892
- 0% {
1893
- transform: translateY(20px);
1894
- opacity: 0;
1371
+ &__waterfall-cumulative-line {
1372
+ stroke-width: 2;
1373
+ stroke-linecap: round;
1374
+ stroke-linejoin: round;
1375
+ transition: all $chart-transition-duration $chart-transition-timing;
1376
+ shape-rendering: geometricPrecision;
1895
1377
  }
1896
- 100% {
1897
- transform: translateY(0);
1898
- opacity: 1;
1378
+
1379
+ &__waterfall-cumulative-point {
1380
+ transition: all $chart-transition-duration $chart-transition-timing;
1381
+ cursor: pointer;
1382
+ shape-rendering: geometricPrecision;
1383
+
1384
+ &:hover {
1385
+ transform: scale(1.3);
1386
+ }
1387
+
1388
+ @include focus-ring;
1899
1389
  }
1900
1390
  }
1901
1391
 
1902
- // Responsive Design
1903
- @media (max-width: $chart-mobile-breakpoint) {
1904
- .c-chart {
1905
- --#{$prefix}chart-min-height: #{map.get($spacing-sizes, 40)};
1906
- border-radius: $border-radius-md;
1392
+ // Accessibility Enhancements
1393
+ // =============================================================================
1394
+ .c-chart {
1395
+ $root: &;
1907
1396
 
1908
- &__header {
1909
- flex-direction: column;
1910
- align-items: flex-start;
1911
- gap: map.get($spacing-sizes, 2);
1397
+ // High contrast mode support
1398
+ @media (prefers-contrast: high) {
1399
+ border-width: calc(var(--#{$prefix}border-width) * 2);
1400
+
1401
+ &--selected {
1402
+ border-width: calc(var(--#{$prefix}border-width) * 3);
1912
1403
  }
1913
1404
 
1914
- &__toolbar {
1915
- width: 100%;
1916
- justify-content: flex-end;
1917
- padding: map.get($spacing-sizes, 2);
1918
- gap: map.get($spacing-sizes, 2);
1405
+ &__action {
1406
+ border-width: calc(var(--#{$prefix}border-width) * 2);
1919
1407
 
1920
- // Stack toolbar items on very small screens
1921
- @media (max-width: 480px) {
1922
- flex-wrap: wrap;
1923
- justify-content: center;
1408
+ &:focus-visible {
1409
+ outline-width: calc(var(--#{$prefix}border-width) * 3);
1924
1410
  }
1925
1411
  }
1926
1412
 
1927
- &__action {
1928
- width: rem(36px);
1929
- height: rem(36px);
1413
+ &__data-point {
1414
+ stroke-width: 2;
1930
1415
 
1931
- svg {
1932
- width: rem(18px);
1933
- height: rem(18px);
1416
+ &--selected {
1417
+ stroke-width: 3;
1934
1418
  }
1935
1419
  }
1936
1420
 
1937
- &__export-dropdown {
1938
- position: fixed;
1939
- top: 50%;
1940
- left: 50%;
1941
- transform: translate(-50%, -50%);
1942
- margin-top: 0;
1943
- min-width: rem(200px);
1944
- max-width: 90vw;
1945
- }
1421
+ &__grid {
1422
+ stroke-width: 1;
1423
+ opacity: 0.6;
1946
1424
 
1947
- &__legend {
1948
- flex-direction: column;
1949
- gap: map.get($spacing-sizes, 2);
1950
- }
1425
+ &--major {
1426
+ stroke-width: 1.5;
1427
+ opacity: 0.8;
1428
+ }
1951
1429
 
1952
- &__legend-item {
1953
- justify-content: space-between;
1954
- width: 100%;
1430
+ &--zero {
1431
+ stroke-width: 2;
1432
+ opacity: 1;
1433
+ }
1955
1434
  }
1956
1435
 
1957
- &:hover {
1958
- transform: none;
1959
- }
1960
- }
1961
- }
1436
+ &__treemap-node {
1437
+ stroke-width: calc($chart-treemap-node-border-width * 2);
1962
1438
 
1963
- @media (max-width: $chart-small-mobile-breakpoint) {
1964
- .c-chart {
1965
- --#{$prefix}chart-min-height: #{map.get($spacing-sizes, 36)};
1966
- --#{$prefix}chart-padding: #{map.get($spacing-sizes, 2)};
1967
- border-radius: $border-radius-sm;
1439
+ &--selected {
1440
+ stroke-width: calc($chart-treemap-node-selected-border-width * 1.5);
1441
+ }
1968
1442
 
1969
- &__title {
1970
- font-size: $font-size-md;
1971
- margin-bottom: map.get($spacing-sizes, 1);
1443
+ &:focus-visible {
1444
+ outline-width: calc(var(--#{$prefix}border-width) * 3);
1445
+ }
1972
1446
  }
1973
1447
 
1974
- &__subtitle {
1975
- font-size: $font-size-xs;
1448
+ &__funnel-segment {
1449
+ stroke-width: calc($chart-funnel-segment-border-width * 2);
1450
+
1451
+ &:focus-visible {
1452
+ outline-width: calc(var(--#{$prefix}border-width) * 3);
1453
+ }
1976
1454
  }
1977
1455
 
1978
- &__toolbar {
1979
- padding: map.get($spacing-sizes, 1);
1980
- gap: map.get($spacing-sizes, 1);
1981
- border-radius: $border-radius-sm;
1456
+ &__heatmap-cell {
1457
+ stroke-width: calc($chart-heatmap-cell-border-width * 2);
1458
+
1459
+ &--hovered {
1460
+ stroke-width: calc($chart-heatmap-cell-hover-border-width * 1.5);
1461
+ }
1462
+
1463
+ &:focus-visible {
1464
+ outline-width: calc(var(--#{$prefix}border-width) * 3);
1465
+ }
1982
1466
  }
1983
1467
 
1984
- &__action {
1985
- width: rem(28px);
1986
- height: rem(28px);
1987
- font-size: rem(12px);
1468
+ &__candlestick-candle {
1469
+ stroke-width: calc($chart-candlestick-candle-border-width * 2);
1988
1470
 
1989
- svg {
1990
- width: rem(14px);
1991
- height: rem(14px);
1471
+ &:focus-visible {
1472
+ outline-width: calc(var(--#{$prefix}border-width) * 3);
1992
1473
  }
1993
1474
  }
1994
1475
 
1995
- &__export-option {
1996
- padding: map.get($spacing-sizes, 1) map.get($spacing-sizes, 2);
1997
- font-size: rem(11px);
1476
+ &__candlestick-wick {
1477
+ stroke-width: calc($chart-candlestick-wick-stroke-width * 2);
1478
+ opacity: 1;
1998
1479
  }
1999
1480
  }
2000
- }
2001
1481
 
2002
- // Enhanced accessibility
2003
- @media (prefers-reduced-motion: reduce) {
2004
- .c-chart {
1482
+ // Reduced motion support
1483
+ @media (prefers-reduced-motion: reduce) {
2005
1484
  transition: none;
1485
+ animation: none;
2006
1486
 
2007
- &:hover {
2008
- transform: none;
1487
+ &::before,
1488
+ &::after {
1489
+ animation: none;
1490
+ transition: none;
2009
1491
  }
2010
1492
 
2011
- * {
2012
- animation-duration: 0.01s !important;
2013
- transition-duration: 0.01s !important;
1493
+ &--elevated {
1494
+ transform: none;
1495
+
1496
+ &:hover {
1497
+ transform: none;
1498
+ }
2014
1499
  }
2015
1500
 
2016
- &__real-time-indicator::before {
2017
- animation: none;
1501
+ &--clickable {
1502
+ transition: none;
1503
+
1504
+ &:hover {
1505
+ transform: none;
1506
+ }
1507
+
1508
+ &:active {
1509
+ transform: none;
1510
+ }
2018
1511
  }
2019
- }
2020
- }
2021
1512
 
2022
- // Focus management for keyboard navigation
2023
- .c-chart:focus-within {
2024
- .c-chart__data-point:focus {
2025
- outline: 2px solid var(--#{$prefix}primary-6);
2026
- outline-offset: 2px;
2027
- z-index: 10;
2028
- }
1513
+ &__action {
1514
+ transition: none;
2029
1515
 
2030
- &__canvas svg {
2031
- outline: 2px solid var(--#{$prefix}primary-border-subtle);
2032
- outline-offset: 2px;
2033
- }
2034
- }
1516
+ &:hover {
1517
+ transform: none;
1518
+ }
2035
1519
 
2036
- @media (prefers-contrast: high) {
2037
- .c-chart {
2038
- border-width: 2px;
2039
- background-color: white;
2040
- color: black;
2041
- backdrop-filter: none;
1520
+ svg {
1521
+ transition: none;
2042
1522
 
2043
- &__grid {
2044
- stroke-width: 2;
2045
- opacity: 0.8;
2046
- stroke: black;
1523
+ &:hover {
1524
+ transform: none;
1525
+ }
1526
+ }
2047
1527
  }
2048
1528
 
2049
- &__title {
2050
- color: black;
1529
+ &__data-point {
1530
+ transition: none;
1531
+
1532
+ &--hovered {
1533
+ transform: none;
1534
+ }
2051
1535
  }
2052
1536
 
2053
- &__data-point {
2054
- stroke: black;
2055
- stroke-width: 2;
1537
+ &__treemap-node {
1538
+ transition: none;
1539
+
1540
+ &:hover {
1541
+ transform: none;
1542
+ }
1543
+
1544
+ &--hovered {
1545
+ transform: none;
1546
+ }
2056
1547
  }
2057
1548
 
2058
- &__crosshair line {
2059
- stroke: black;
2060
- opacity: 1;
1549
+ &__funnel-segment {
1550
+ transition: none;
1551
+
1552
+ &:hover {
1553
+ transform: none;
1554
+ }
1555
+ }
1556
+
1557
+ &__heatmap-cell {
1558
+ transition: none;
1559
+
1560
+ &:hover {
1561
+ transform: none;
1562
+ }
1563
+
1564
+ &--hovered {
1565
+ transform: none;
1566
+ }
2061
1567
  }
2062
1568
 
2063
- &__zoom-indicator {
2064
- background: black;
2065
- color: white;
2066
- border: 2px solid white;
1569
+ &__candlestick-candle {
1570
+ transition: none;
1571
+
1572
+ &:hover {
1573
+ transform: none;
1574
+ }
2067
1575
  }
2068
1576
 
2069
- .line-path {
2070
- stroke-width: 3 !important;
1577
+ &__candlestick-wick {
1578
+ transition: none;
2071
1579
  }
2072
1580
 
2073
- .bar {
2074
- stroke: black;
2075
- stroke-width: 2;
1581
+ &__candlestick-volume {
1582
+ transition: none;
2076
1583
  }
2077
- }
2078
- }
2079
1584
 
2080
- // Print styles
2081
- @media print {
2082
- .c-chart {
2083
- break-inside: avoid;
2084
- box-shadow: none;
2085
- border: 2px solid black;
2086
- background: white;
1585
+ &__empty {
1586
+ animation: none;
1587
+ }
2087
1588
 
2088
- &__toolbar {
2089
- display: none;
1589
+ &--loading {
1590
+ #{$root}__content {
1591
+ &::after {
1592
+ animation: none;
1593
+ }
1594
+ }
2090
1595
  }
2091
1596
 
2092
- &__crosshair,
2093
- &__zoom-indicator,
2094
- &__real-time-indicator {
2095
- display: none;
1597
+ &__waterfall-bar {
1598
+ &--animated {
1599
+ animation: none;
1600
+ }
2096
1601
  }
2097
1602
 
2098
- * {
2099
- animation: none !important;
2100
- transition: none !important;
1603
+ &__canvas {
1604
+ svg {
1605
+ animation: none;
1606
+ opacity: 1;
1607
+ }
2101
1608
  }
2102
1609
  }
2103
1610
  }
1611
+
1612
+ // Chart Animations
1613
+ // =============================================================================
1614
+ @keyframes chart-bar-appear {
1615
+ 0% {
1616
+ opacity: 0;
1617
+ transform: scaleY(0);
1618
+ }
1619
+ 100% {
1620
+ opacity: 1;
1621
+ transform: scaleY(1);
1622
+ }
1623
+ }