@shohojdhara/atomix 0.2.4 → 0.2.6

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 (214) hide show
  1. package/README.md +19 -0
  2. package/dist/atomix.css +1300 -1418
  3. package/dist/atomix.min.css +3 -3
  4. package/dist/index.d.ts +1259 -874
  5. package/dist/index.esm.js +16256 -26366
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/index.js +15691 -22295
  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 +15036 -0
  12. package/dist/themes/applemix.min.css +72 -0
  13. package/dist/themes/boomdevs.css +1300 -1419
  14. package/dist/themes/boomdevs.min.css +3 -3
  15. package/dist/themes/esrar.css +1301 -1419
  16. package/dist/themes/esrar.min.css +3 -3
  17. package/dist/themes/flashtrade.css +15187 -0
  18. package/dist/themes/flashtrade.min.css +86 -0
  19. package/dist/themes/mashroom.css +1299 -1417
  20. package/dist/themes/mashroom.min.css +5 -5
  21. package/dist/themes/shaj-default.css +1300 -1418
  22. package/dist/themes/shaj-default.min.css +3 -3
  23. package/package.json +6 -17
  24. package/src/components/Accordion/Accordion.stories.tsx +4 -26
  25. package/src/components/Accordion/Accordion.tsx +21 -12
  26. package/src/components/AtomixGlass/AtomixGlass.test.tsx +106 -72
  27. package/src/components/AtomixGlass/AtomixGlass.tsx +485 -1215
  28. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +399 -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 +404 -236
  34. package/src/components/AtomixGlass/{AtomixGlass.stories.tsx → stories/AtomixGlass.stories.tsx} +55 -35
  35. package/src/components/AtomixGlass/stories/Examples.stories.tsx +57 -89
  36. package/src/components/AtomixGlass/stories/Modes.stories.tsx +149 -149
  37. package/src/components/AtomixGlass/stories/Playground.stories.tsx +95 -32
  38. package/src/components/AtomixGlass/stories/ShaderVariants.stories.tsx +0 -2
  39. package/src/components/AtomixGlass/stories/shared-components.tsx +9 -18
  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 +74 -54
  44. package/src/components/Badge/Badge.tsx +8 -12
  45. package/src/components/Breadcrumb/Breadcrumb.tsx +23 -4
  46. package/src/components/Button/Button.tsx +3 -5
  47. package/src/components/Callout/Callout.stories.tsx +86 -35
  48. package/src/components/Callout/Callout.tsx +4 -0
  49. package/src/components/Card/Card.stories.tsx +89 -85
  50. package/src/components/Card/Card.tsx +15 -4
  51. package/src/components/Card/ElevationCard.tsx +2 -0
  52. package/src/components/Chart/AnimatedChart.tsx +179 -156
  53. package/src/components/Chart/AreaChart.tsx +123 -12
  54. package/src/components/Chart/BarChart.tsx +91 -100
  55. package/src/components/Chart/BaseChart.tsx +80 -0
  56. package/src/components/Chart/BubbleChart.tsx +114 -290
  57. package/src/components/Chart/CandlestickChart.tsx +282 -622
  58. package/src/components/Chart/Chart.stories.tsx +576 -179
  59. package/src/components/Chart/Chart.tsx +374 -75
  60. package/src/components/Chart/ChartRenderer.tsx +371 -220
  61. package/src/components/Chart/ChartToolbar.tsx +372 -61
  62. package/src/components/Chart/ChartTooltip.tsx +33 -18
  63. package/src/components/Chart/DonutChart.tsx +172 -254
  64. package/src/components/Chart/FunnelChart.tsx +169 -240
  65. package/src/components/Chart/GaugeChart.tsx +224 -392
  66. package/src/components/Chart/HeatmapChart.tsx +302 -440
  67. package/src/components/Chart/LineChart.tsx +148 -103
  68. package/src/components/Chart/MultiAxisChart.tsx +267 -395
  69. package/src/components/Chart/PieChart.tsx +114 -64
  70. package/src/components/Chart/RadarChart.tsx +202 -218
  71. package/src/components/Chart/ScatterChart.tsx +111 -97
  72. package/src/components/Chart/TreemapChart.tsx +147 -222
  73. package/src/components/Chart/WaterfallChart.tsx +253 -291
  74. package/src/components/Chart/index.ts +11 -9
  75. package/src/components/Chart/types.ts +85 -9
  76. package/src/components/Chart/utils.ts +66 -0
  77. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +121 -11
  78. package/src/components/ColorModeToggle/ColorModeToggle.tsx +149 -45
  79. package/src/components/ColorModeToggle/index.ts +1 -1
  80. package/src/components/Countdown/Countdown.tsx +4 -0
  81. package/src/components/DataTable/DataTable.tsx +2 -1
  82. package/src/components/DatePicker/DatePicker.stories.tsx +0 -11
  83. package/src/components/DatePicker/DatePicker.tsx +3 -9
  84. package/src/components/DatePicker/types.ts +5 -0
  85. package/src/components/Dropdown/Dropdown.stories.tsx +32 -25
  86. package/src/components/Dropdown/Dropdown.tsx +26 -28
  87. package/src/components/EdgePanel/EdgePanel.stories.tsx +13 -15
  88. package/src/components/EdgePanel/EdgePanel.tsx +20 -5
  89. package/src/components/Footer/Footer.stories.tsx +187 -60
  90. package/src/components/Footer/Footer.test.tsx +134 -0
  91. package/src/components/Footer/Footer.tsx +133 -34
  92. package/src/components/Footer/FooterLink.tsx +1 -1
  93. package/src/components/Footer/FooterSection.tsx +53 -36
  94. package/src/components/Footer/FooterSocialLink.tsx +32 -29
  95. package/src/components/Footer/README.md +82 -3
  96. package/src/components/Footer/index.ts +1 -1
  97. package/src/components/Form/Checkbox.stories.tsx +13 -5
  98. package/src/components/Form/Checkbox.tsx +3 -6
  99. package/src/components/Form/Form.stories.tsx +10 -3
  100. package/src/components/Form/Form.tsx +2 -0
  101. package/src/components/Form/FormGroup.tsx +2 -1
  102. package/src/components/Form/Input.stories.tsx +12 -11
  103. package/src/components/Form/Input.tsx +97 -95
  104. package/src/components/Form/Radio.stories.tsx +22 -7
  105. package/src/components/Form/Radio.tsx +3 -6
  106. package/src/components/Form/Select.stories.tsx +21 -6
  107. package/src/components/Form/Select.tsx +3 -5
  108. package/src/components/Form/Textarea.stories.tsx +13 -11
  109. package/src/components/Form/Textarea.tsx +88 -86
  110. package/src/components/Hero/Hero.stories.tsx +2 -3
  111. package/src/components/Hero/Hero.tsx +5 -6
  112. package/src/components/Icon/Icon.tsx +12 -1
  113. package/src/components/List/List.tsx +2 -1
  114. package/src/components/List/ListGroup.tsx +2 -1
  115. package/src/components/Messages/Messages.tsx +3 -2
  116. package/src/components/Modal/Modal.stories.tsx +48 -34
  117. package/src/components/Modal/Modal.tsx +19 -23
  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.tsx +6 -1
  121. package/src/components/Navigation/Nav/NavDropdown.tsx +10 -1
  122. package/src/components/Navigation/Navbar/Navbar.tsx +4 -1
  123. package/src/components/Navigation/SideMenu/SideMenu.tsx +3 -2
  124. package/src/components/Pagination/Pagination.stories.tsx +13 -6
  125. package/src/components/Pagination/Pagination.tsx +7 -6
  126. package/src/components/PhotoViewer/PhotoViewer.tsx +2 -1
  127. package/src/components/Popover/Popover.stories.tsx +32 -24
  128. package/src/components/Popover/Popover.tsx +4 -1
  129. package/src/components/ProductReview/ProductReview.tsx +8 -2
  130. package/src/components/Progress/Progress.tsx +2 -1
  131. package/src/components/Rating/Rating.stories.tsx +11 -6
  132. package/src/components/Rating/Rating.tsx +3 -5
  133. package/src/components/River/River.tsx +5 -5
  134. package/src/components/SectionIntro/SectionIntro.tsx +8 -2
  135. package/src/components/Slider/Slider.stories.tsx +4 -4
  136. package/src/components/Slider/Slider.tsx +4 -3
  137. package/src/components/Spinner/Spinner.tsx +2 -1
  138. package/src/components/Steps/Steps.stories.tsx +5 -4
  139. package/src/components/Steps/Steps.tsx +8 -5
  140. package/src/components/Tab/Tab.stories.tsx +4 -3
  141. package/src/components/Tab/Tab.tsx +8 -6
  142. package/src/components/Testimonial/Testimonial.tsx +8 -2
  143. package/src/components/Todo/Todo.tsx +2 -1
  144. package/src/components/Toggle/Toggle.stories.tsx +5 -4
  145. package/src/components/Toggle/Toggle.tsx +8 -5
  146. package/src/components/Tooltip/Tooltip.stories.tsx +40 -30
  147. package/src/components/Tooltip/Tooltip.tsx +9 -2
  148. package/src/components/Upload/Upload.stories.tsx +252 -0
  149. package/src/components/Upload/Upload.tsx +92 -53
  150. package/src/components/VideoPlayer/VideoPlayer.tsx +3 -1
  151. package/src/components/index.ts +0 -4
  152. package/src/layouts/Grid/Grid.stories.tsx +10 -23
  153. package/src/layouts/Grid/Grid.tsx +20 -1
  154. package/src/layouts/Grid/GridCol.tsx +76 -48
  155. package/src/lib/composables/useAtomixGlass.ts +861 -44
  156. package/src/lib/composables/useBarChart.ts +13 -6
  157. package/src/lib/composables/useChart.ts +17 -13
  158. package/src/lib/composables/useChartExport.ts +19 -78
  159. package/src/lib/composables/useChartToolbar.ts +0 -1
  160. package/src/lib/composables/useEdgePanel.ts +111 -103
  161. package/src/lib/composables/useFooter.ts +3 -3
  162. package/src/lib/composables/useGlassContainer.ts +16 -7
  163. package/src/lib/composables/useLineChart.ts +8 -1
  164. package/src/lib/composables/useRiver.ts +5 -0
  165. package/src/lib/composables/useSlider.ts +62 -24
  166. package/src/lib/composables/useVideoPlayer.ts +60 -63
  167. package/src/lib/constants/components.ts +146 -32
  168. package/src/lib/types/components.ts +258 -10
  169. package/src/lib/utils/displacement-generator.ts +55 -49
  170. package/src/lib/utils/icons.ts +1 -1
  171. package/src/lib/utils/index.ts +16 -10
  172. package/src/styles/01-settings/_settings.accordion.scss +19 -19
  173. package/src/styles/01-settings/_settings.animations.scss +5 -5
  174. package/src/styles/01-settings/_settings.avatar-group.scss +1 -1
  175. package/src/styles/01-settings/_settings.avatar.scss +17 -17
  176. package/src/styles/01-settings/_settings.background.scss +1 -4
  177. package/src/styles/01-settings/_settings.badge.scss +1 -1
  178. package/src/styles/01-settings/_settings.breadcrumb.scss +1 -1
  179. package/src/styles/01-settings/_settings.card.scss +1 -1
  180. package/src/styles/01-settings/_settings.chart.scss +65 -2
  181. package/src/styles/01-settings/_settings.dropdown.scss +1 -1
  182. package/src/styles/01-settings/_settings.footer.scss +35 -42
  183. package/src/styles/01-settings/_settings.input.scss +1 -1
  184. package/src/styles/01-settings/_settings.list.scss +1 -1
  185. package/src/styles/01-settings/_settings.rating.scss +1 -1
  186. package/src/styles/01-settings/_settings.tabs.scss +1 -1
  187. package/src/styles/01-settings/_settings.upload.scss +6 -5
  188. package/src/styles/02-tools/_tools.animations.scss +4 -5
  189. package/src/styles/02-tools/_tools.background.scss +1 -13
  190. package/src/styles/02-tools/_tools.glass.scss +0 -1
  191. package/src/styles/02-tools/_tools.utility-api.scss +42 -34
  192. package/src/styles/03-generic/_generic.root.scss +1 -4
  193. package/src/styles/04-elements/_elements.body.scss +0 -1
  194. package/src/styles/06-components/_components.atomix-glass.scss +217 -39
  195. package/src/styles/06-components/_components.badge.scss +6 -8
  196. package/src/styles/06-components/_components.button.scss +8 -3
  197. package/src/styles/06-components/_components.card.scss +2 -14
  198. package/src/styles/06-components/_components.chart.scss +969 -1449
  199. package/src/styles/06-components/_components.color-mode-toggle.scss +43 -6
  200. package/src/styles/06-components/_components.dropdown.scss +19 -7
  201. package/src/styles/06-components/_components.edge-panel.scss +4 -2
  202. package/src/styles/06-components/_components.footer.scss +166 -85
  203. package/src/styles/06-components/_components.input.scss +8 -9
  204. package/src/styles/06-components/_components.list.scss +1 -0
  205. package/src/styles/06-components/_components.modal.scss +5 -3
  206. package/src/styles/06-components/_components.skeleton.scss +8 -6
  207. package/src/styles/06-components/_components.upload.scss +219 -4
  208. package/src/styles/06-components/old.chart.styles.scss +1 -30
  209. package/src/styles/99-utilities/_utilities.opacity.scss +1 -1
  210. package/src/styles/99-utilities/_utilities.scss +1 -1
  211. package/src/components/Chart/AdvancedChart.tsx +0 -624
  212. package/src/components/Chart/LineChartNew.tsx +0 -167
  213. package/src/components/Chart/RealTimeChart.tsx +0 -436
  214. 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
+ }