@shohojdhara/atomix 0.4.8 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/atomix.config.ts +58 -1
  2. package/dist/atomix.css +148 -120
  3. package/dist/atomix.css.map +1 -1
  4. package/dist/atomix.min.css +1 -1
  5. package/dist/atomix.min.css.map +1 -1
  6. package/dist/charts.d.ts +33 -0
  7. package/dist/charts.js +1227 -122
  8. package/dist/charts.js.map +1 -1
  9. package/dist/core.d.ts +33 -10
  10. package/dist/core.js +1052 -41
  11. package/dist/core.js.map +1 -1
  12. package/dist/forms.d.ts +33 -0
  13. package/dist/forms.js +2086 -1035
  14. package/dist/forms.js.map +1 -1
  15. package/dist/heavy.d.ts +42 -1
  16. package/dist/heavy.js +1620 -600
  17. package/dist/heavy.js.map +1 -1
  18. package/dist/index.d.ts +441 -270
  19. package/dist/index.esm.js +1900 -638
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/index.js +1935 -670
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.min.js +1 -1
  24. package/dist/index.min.js.map +1 -1
  25. package/package.json +6 -3
  26. package/scripts/atomix-cli.js +148 -4
  27. package/scripts/cli/__tests__/basic.test.js +3 -2
  28. package/scripts/cli/__tests__/clean.test.js +278 -0
  29. package/scripts/cli/__tests__/component-validator.test.js +433 -0
  30. package/scripts/cli/__tests__/generator.test.js +613 -0
  31. package/scripts/cli/__tests__/glass-motion.test.js +256 -0
  32. package/scripts/cli/__tests__/integration.test.js +719 -108
  33. package/scripts/cli/__tests__/migrate.test.js +74 -0
  34. package/scripts/cli/__tests__/security.test.js +206 -0
  35. package/scripts/cli/__tests__/test-setup.js +3 -1
  36. package/scripts/cli/__tests__/theme-bridge.test.js +507 -0
  37. package/scripts/cli/__tests__/token-provider.test.js +361 -0
  38. package/scripts/cli/__tests__/utils.test.js +5 -5
  39. package/scripts/cli/commands/benchmark.js +105 -0
  40. package/scripts/cli/commands/build-theme.js +4 -1
  41. package/scripts/cli/commands/clean.js +109 -0
  42. package/scripts/cli/commands/doctor.js +88 -0
  43. package/scripts/cli/commands/generate.js +135 -14
  44. package/scripts/cli/commands/init.js +45 -18
  45. package/scripts/cli/commands/migrate.js +106 -0
  46. package/scripts/cli/commands/sync-tokens.js +206 -0
  47. package/scripts/cli/commands/theme-bridge.js +248 -0
  48. package/scripts/cli/commands/tokens.js +157 -0
  49. package/scripts/cli/commands/validate.js +194 -0
  50. package/scripts/cli/internal/ai-engine.js +156 -0
  51. package/scripts/cli/internal/component-validator.js +443 -0
  52. package/scripts/cli/internal/config-loader.js +162 -0
  53. package/scripts/cli/internal/filesystem.js +102 -2
  54. package/scripts/cli/internal/generator.js +359 -39
  55. package/scripts/cli/internal/glass-generator.js +398 -0
  56. package/scripts/cli/internal/hook-generator.js +369 -0
  57. package/scripts/cli/internal/hooks.js +61 -0
  58. package/scripts/cli/internal/itcss-generator.js +565 -0
  59. package/scripts/cli/internal/motion-generator.js +679 -0
  60. package/scripts/cli/internal/template-engine.js +301 -0
  61. package/scripts/cli/internal/theme-bridge.js +664 -0
  62. package/scripts/cli/internal/tokens/engine.js +122 -0
  63. package/scripts/cli/internal/tokens/provider.js +34 -0
  64. package/scripts/cli/internal/tokens/providers/figma.js +50 -0
  65. package/scripts/cli/internal/tokens/providers/style-dictionary.js +48 -0
  66. package/scripts/cli/internal/tokens/providers/w3c.js +48 -0
  67. package/scripts/cli/internal/tokens/token-provider.js +443 -0
  68. package/scripts/cli/internal/tokens/token-validator.js +513 -0
  69. package/scripts/cli/internal/validator.js +276 -0
  70. package/scripts/cli/internal/wizard.js +60 -6
  71. package/scripts/cli/mappings.js +23 -0
  72. package/scripts/cli/migration-tools.js +164 -94
  73. package/scripts/cli/plugins/style-dictionary.js +46 -0
  74. package/scripts/cli/templates/README.md +525 -95
  75. package/scripts/cli/templates/common-templates.js +40 -14
  76. package/scripts/cli/templates/components/react-component.ts +282 -0
  77. package/scripts/cli/templates/config/project-config.ts +112 -0
  78. package/scripts/cli/templates/hooks/use-component.ts +477 -0
  79. package/scripts/cli/templates/index.js +19 -4
  80. package/scripts/cli/templates/index.ts +171 -0
  81. package/scripts/cli/templates/next-templates.js +72 -0
  82. package/scripts/cli/templates/react-templates.js +70 -126
  83. package/scripts/cli/templates/scss-templates.js +35 -35
  84. package/scripts/cli/templates/stories/storybook-story.ts +241 -0
  85. package/scripts/cli/templates/styles/scss-component.ts +255 -0
  86. package/scripts/cli/templates/tests/vitest-test.ts +229 -0
  87. package/scripts/cli/templates/token-templates.js +337 -1
  88. package/scripts/cli/templates/tokens/token-generators.ts +1088 -0
  89. package/scripts/cli/templates/types/component-types.ts +145 -0
  90. package/scripts/cli/templates/utils/testing-utils.ts +144 -0
  91. package/scripts/cli/templates/vanilla-templates.js +39 -0
  92. package/scripts/cli/token-manager.js +8 -2
  93. package/scripts/cli/utils/cache-manager.js +240 -0
  94. package/scripts/cli/utils/detector.js +46 -0
  95. package/scripts/cli/utils/diagnostics.js +289 -0
  96. package/scripts/cli/utils/error.js +45 -3
  97. package/scripts/cli/utils/helpers.js +24 -0
  98. package/scripts/cli/utils/logger.js +1 -1
  99. package/scripts/cli/utils/security.js +302 -0
  100. package/scripts/cli/utils/telemetry.js +115 -0
  101. package/scripts/cli/utils/validation.js +4 -38
  102. package/scripts/cli/utils.js +46 -0
  103. package/src/components/Accordion/Accordion.stories.tsx +0 -18
  104. package/src/components/Accordion/Accordion.test.tsx +0 -17
  105. package/src/components/Accordion/Accordion.tsx +0 -4
  106. package/src/components/AtomixGlass/AtomixGlass.tsx +102 -2
  107. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +125 -12
  108. package/src/components/AtomixGlass/PerformanceDashboard.tsx +219 -0
  109. package/src/components/AtomixGlass/README.md +25 -10
  110. package/src/components/AtomixGlass/animation-system.ts +578 -0
  111. package/src/components/AtomixGlass/shader-utils.ts +3 -0
  112. package/src/components/AtomixGlass/stories/AnimationFeatures.stories.tsx +653 -0
  113. package/src/components/AtomixGlass/stories/AnimationTests.stories.tsx +95 -0
  114. package/src/components/AtomixGlass/stories/CardExamples.stories.tsx +212 -0
  115. package/src/components/AtomixGlass/stories/DashboardExamples.stories.tsx +348 -0
  116. package/src/components/AtomixGlass/stories/EcommerceExamples.stories.tsx +410 -0
  117. package/src/components/AtomixGlass/stories/FormExamples.stories.tsx +436 -0
  118. package/src/components/AtomixGlass/stories/HeroExamples.stories.tsx +264 -0
  119. package/src/components/AtomixGlass/stories/InteractivePlayground.stories.tsx +247 -0
  120. package/src/components/AtomixGlass/stories/MobileUIExamples.stories.tsx +418 -0
  121. package/src/components/AtomixGlass/stories/ModalExamples.stories.tsx +402 -0
  122. package/src/components/AtomixGlass/stories/Overview.stories.tsx +157 -6
  123. package/src/components/AtomixGlass/stories/Playground.stories.tsx +658 -93
  124. package/src/components/AtomixGlass/stories/PresetGallery.stories.tsx +335 -0
  125. package/src/components/AtomixGlass/stories/WidgetExamples.stories.tsx +441 -0
  126. package/src/components/AtomixGlass/stories/argTypes.ts +384 -0
  127. package/src/components/AtomixGlass/stories/shared-components.tsx +91 -1
  128. package/src/components/AtomixGlass/stories/types.ts +127 -0
  129. package/src/components/Avatar/Avatar.tsx +1 -1
  130. package/src/components/Button/Button.stories.disabled-link.tsx +10 -0
  131. package/src/components/Button/Button.stories.tsx +10 -0
  132. package/src/components/Button/Button.test.tsx +16 -11
  133. package/src/components/Button/Button.tsx +4 -4
  134. package/src/components/Card/Card.tsx +1 -1
  135. package/src/components/Dropdown/Dropdown.tsx +12 -12
  136. package/src/components/Form/Select.tsx +62 -3
  137. package/src/components/Modal/Modal.tsx +14 -3
  138. package/src/components/Navigation/Navbar/Navbar.tsx +44 -0
  139. package/src/components/Slider/Slider.stories.tsx +3 -3
  140. package/src/components/Slider/Slider.tsx +38 -0
  141. package/src/components/Steps/Steps.tsx +3 -3
  142. package/src/components/Tabs/Tabs.tsx +77 -8
  143. package/src/components/Testimonial/Testimonial.tsx +1 -1
  144. package/src/components/TypedButton/TypedButton.stories.tsx +59 -0
  145. package/src/components/TypedButton/TypedButton.tsx +39 -0
  146. package/src/components/TypedButton/index.ts +2 -0
  147. package/src/components/VideoPlayer/VideoPlayer.tsx +11 -4
  148. package/src/lib/composables/index.ts +4 -7
  149. package/src/lib/composables/types.ts +45 -0
  150. package/src/lib/composables/useAccordion.ts +0 -7
  151. package/src/lib/composables/useAtomixGlass.ts +144 -5
  152. package/src/lib/composables/useChartExport.ts +3 -13
  153. package/src/lib/composables/useDropdown.ts +66 -0
  154. package/src/lib/composables/useFocusTrap.ts +80 -0
  155. package/src/lib/composables/usePerformanceMonitor.ts +448 -0
  156. package/src/lib/composables/useResponsiveGlass.presets.ts +192 -0
  157. package/src/lib/composables/useResponsiveGlass.ts +441 -0
  158. package/src/lib/composables/useTooltip.ts +16 -0
  159. package/src/lib/composables/useTypedButton.ts +66 -0
  160. package/src/lib/config/index.ts +62 -5
  161. package/src/lib/constants/components.ts +55 -0
  162. package/src/lib/theme/devtools/__tests__/useHistory.test.tsx +150 -0
  163. package/src/lib/theme/tokens/centralized-tokens.ts +120 -0
  164. package/src/lib/theme/utils/__tests__/domUtils.test.ts +101 -0
  165. package/src/lib/types/components.ts +37 -11
  166. package/src/lib/types/glass.ts +35 -0
  167. package/src/lib/types/index.ts +1 -0
  168. package/src/lib/utils/displacement-generator.ts +1 -1
  169. package/src/styles/01-settings/_settings.testtypecheck.scss +53 -0
  170. package/src/styles/01-settings/_settings.typedbutton.scss +53 -0
  171. package/src/styles/06-components/_components.testbutton.scss +212 -0
  172. package/src/styles/06-components/_components.testtypecheck.scss +212 -0
  173. package/src/styles/06-components/_components.typedbutton.scss +212 -0
  174. package/src/styles/99-utilities/_index.scss +1 -0
  175. package/src/styles/99-utilities/_utilities.text.scss +1 -1
  176. package/src/styles/99-utilities/_utilities.touch-target.scss +36 -0
  177. package/src/styles/06-components/old.chart.styles.scss +0 -2788
@@ -1,2788 +0,0 @@
1
- // Component: Chart
2
- // =============================================================================
3
-
4
- @use '../01-settings/settings.colors' as *;
5
- @use '../01-settings/settings.spacing' as *;
6
- @use '../01-settings/settings.typography' as *;
7
- @use '../01-settings/settings.border-radius' as *;
8
- @use '../01-settings/settings.box-shadow' as *;
9
- @use '../02-tools/tools.component' as component;
10
-
11
- @use 'sass:map';
12
- @use 'sass:math';
13
-
14
- // Chart Variables
15
- // =============================================================================
16
- $chart-border-width: 1px;
17
- $chart-backdrop-blur: 8px;
18
- $chart-header-backdrop-blur: 12px;
19
- $chart-tooltip-backdrop-blur: 16px;
20
- $chart-transition-duration: 0.3s;
21
- $chart-transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
22
- $chart-hover-transform: translateY(-1px);
23
- $chart-active-transform: translateY(0);
24
- $chart-focus-ring-width: 3px;
25
- $chart-glassmorphism-opacity: 0.6;
26
- $chart-pattern-opacity: 0.03;
27
- $chart-pattern-size: 20px;
28
- $chart-loading-spinner-size: map.get($spacing-sizes, 8);
29
- $chart-error-icon-size: map.get($spacing-sizes, 12);
30
- $chart-empty-icon-size: map.get($spacing-sizes, 16);
31
- $chart-legend-color-size: map.get($spacing-sizes, 3);
32
- $chart-action-button-size: map.get($spacing-sizes, 8);
33
- $chart-touch-target-size: map.get($spacing-sizes, 10);
34
-
35
- // Chart Color Palette
36
- $chart-colors: (
37
- primary: var(--atomix-primary-6),
38
- secondary: var(--atomix-secondary),
39
- success: var(--atomix-success),
40
- warning: var(--atomix-warning),
41
- error: var(--atomix-error),
42
- info: var(--atomix-info),
43
- accent: var(--atomix-accent),
44
- neutral: var(--atomix-neutral),
45
- );
46
-
47
- // Chart Gradients
48
- $chart-gradients-bg: (
49
- primary: linear-gradient(
50
- 135deg,
51
- rgba(var(--atomix-primary-rgb), 0.1),
52
- rgba(var(--atomix-primary-rgb), 0.2)
53
- ),
54
- secondary: linear-gradient(
55
- 135deg,
56
- rgba(var(--atomix-secondary-rgb), 0.1),
57
- rgba(var(--atomix-secondary-rgb), 0.2)
58
- ),
59
- success: linear-gradient(
60
- 135deg,
61
- rgba(var(--atomix-success-rgb), 0.1),
62
- rgba(var(--atomix-success-rgb), 0.2)
63
- ),
64
- warning: linear-gradient(
65
- 135deg,
66
- rgba(var(--atomix-warning-rgb), 0.1),
67
- rgba(var(--atomix-warning-rgb), 0.2)
68
- ),
69
- error: linear-gradient(
70
- 135deg,
71
- rgba(var(--atomix-error-rgb), 0.1),
72
- rgba(var(--atomix-error-rgb), 0.2)
73
- ),
74
- info: linear-gradient(
75
- 135deg,
76
- rgba(var(--atomix-info-rgb), 0.1),
77
- rgba(var(--atomix-info-rgb), 0.2)
78
- ),
79
- );
80
-
81
- $chart-gradients: (
82
- primary: linear-gradient(135deg, var(--atomix-primary), var(--atomix-primary-bg-subtle)),
83
- secondary: linear-gradient(135deg, var(--atomix-secondary), var(--atomix-secondary-bg-subtle)),
84
- success: linear-gradient(135deg, var(--atomix-success), var(--atomix-success-bg-subtle)),
85
- warning: linear-gradient(135deg, var(--atomix-warning), var(--atomix-warning-bg-subtle)),
86
- error: linear-gradient(135deg, var(--atomix-error), var(--atomix-error-bg-subtle)),
87
- info: linear-gradient(135deg, var(--atomix-info), var(--atomix-info-bg-subtle)),
88
- );
89
-
90
- // Chart Mixins gradient-background
91
- // =============================================================================
92
-
93
- @mixin chart-glassmorphism {
94
- backdrop-filter: blur($chart-backdrop-blur);
95
- -webkit-backdrop-filter: blur($chart-backdrop-blur);
96
- background: rgba(255, 255, 255, 0.05);
97
- border: $chart-border-width solid rgba(255, 255, 255, 0.1);
98
- }
99
-
100
- @mixin chart-gradient-background($color: 'primary') {
101
- background: map.get($chart-gradients-bg, $color);
102
- }
103
-
104
- @mixin chart-gradient-border($color: 'primary') {
105
- position: relative;
106
-
107
- &::before {
108
- content: '';
109
- position: absolute;
110
- top: 0;
111
- left: 0;
112
- right: 0;
113
- height: 1px;
114
- background: linear-gradient(90deg, transparent, map.get($chart-colors, $color), transparent);
115
- opacity: $chart-glassmorphism-opacity;
116
- }
117
- }
118
-
119
- @mixin chart-hover-elevation {
120
- transition:
121
- box-shadow $chart-transition-duration $chart-transition-timing,
122
- transform $chart-transition-duration $chart-transition-timing,
123
- border-color $chart-transition-duration $chart-transition-timing;
124
-
125
- &:hover {
126
- box-shadow: $box-shadow-lg;
127
- transform: $chart-hover-transform;
128
- border-color: var(--atomix-primary-border-subtle);
129
- }
130
- }
131
-
132
- @mixin chart-focus-ring {
133
- &:focus-visible {
134
- @include component.focus-ring;
135
- box-shadow:
136
- $box-shadow-md,
137
- 0 0 0 $chart-focus-ring-width var(--atomix-primary-border-subtle);
138
- }
139
- }
140
-
141
- @mixin chart-loading-shimmer {
142
- position: relative;
143
- overflow: hidden;
144
-
145
- &::after {
146
- content: '';
147
- position: absolute;
148
- top: 0;
149
- left: -100%;
150
- width: 100%;
151
- height: 100%;
152
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
153
- animation: chart-shimmer 2s infinite;
154
- }
155
- }
156
-
157
- @mixin chart-data-animation($type: 'fade') {
158
- @if $type == 'fade' {
159
- animation: chart-fade-in 0.6s ease-out;
160
- } @else if $type == 'scale' {
161
- animation: chart-scale-in 0.5s ease-out;
162
- } @else if $type == 'slide' {
163
- animation: chart-slide-in 0.7s ease-out;
164
- }
165
- }
166
-
167
- // Block: Base chart component
168
- // =============================================================================
169
- .c-chart {
170
- // @include component.component-base;
171
- @include chart-hover-elevation;
172
- // @include chart-focus-ring;
173
- @include chart-gradient-border;
174
- @include chart-gradient-background;
175
-
176
- display: flex;
177
- flex-direction: column;
178
- border: $chart-border-width solid var(--atomix-brand-border-subtle);
179
- border-radius: $border-radius-lg;
180
- overflow: hidden;
181
- box-shadow: $box-shadow-sm;
182
- backdrop-filter: blur($chart-backdrop-blur);
183
- position: relative;
184
- isolation: isolate;
185
-
186
- // Default sizing with fluid height
187
- min-height: map.get($spacing-sizes, 52); // 208px
188
- width: 100%;
189
- max-width: 100%;
190
-
191
- // Enhanced modern styling
192
- &::after {
193
- content: '';
194
- position: absolute;
195
- inset: 0;
196
- background: linear-gradient(
197
- 135deg,
198
- rgba(var(--atomix-primary-rgb), 0.1) 0%,
199
- transparent 50%,
200
- rgba(var(--atomix-secondary-rgb), 0.05) 100%
201
- );
202
- pointer-events: none;
203
- z-index: 1;
204
- }
205
-
206
- // CSS Custom Properties for dynamic theming
207
- --chart-primary-color: #{map.get($chart-colors, primary)};
208
- --chart-secondary-color: #{map.get($chart-colors, secondary)};
209
- --chart-border-radius: #{$border-radius-lg};
210
- --chart-padding: #{map.get($spacing-sizes, 4)};
211
- --chart-gap: #{map.get($spacing-sizes, 2)};
212
- }
213
-
214
- // Size Modifiers
215
- // =============================================================================
216
- .c-chart--xs {
217
- min-height: map.get($spacing-sizes, 28); // 112px
218
- font-size: $font-size-xs;
219
- --chart-padding: #{map.get($spacing-sizes, 2)};
220
-
221
- .c-chart__header {
222
- padding: map.get($spacing-sizes, 2);
223
- }
224
-
225
- .c-chart__content {
226
- padding: map.get($spacing-sizes, 2);
227
- }
228
-
229
- .c-chart__title {
230
- font-size: $font-size-sm;
231
- }
232
-
233
- .c-chart__action {
234
- width: map.get($spacing-sizes, 6);
235
- height: map.get($spacing-sizes, 6);
236
- }
237
- }
238
-
239
- .c-chart--sm {
240
- min-height: map.get($spacing-sizes, 36); // 144px
241
- font-size: $font-size-sm;
242
- --chart-padding: #{map.get($spacing-sizes, 3)};
243
-
244
- .c-chart__header {
245
- padding: map.get($spacing-sizes, 3);
246
- }
247
-
248
- .c-chart__content {
249
- padding: map.get($spacing-sizes, 3);
250
- }
251
-
252
- .c-chart__title {
253
- font-size: $font-size-md;
254
- }
255
-
256
- .c-chart__action {
257
- width: map.get($spacing-sizes, 7);
258
- height: map.get($spacing-sizes, 7);
259
- }
260
- }
261
-
262
- .c-chart--md {
263
- min-height: map.get($spacing-sizes, 52); // 208px
264
- font-size: $font-size-base;
265
- --chart-padding: #{map.get($spacing-sizes, 4)};
266
-
267
- .c-chart__header {
268
- padding: map.get($spacing-sizes, 4);
269
- }
270
-
271
- .c-chart__content {
272
- padding: map.get($spacing-sizes, 4);
273
- }
274
-
275
- .c-chart__title {
276
- font-size: $font-size-lg;
277
- }
278
- }
279
-
280
- .c-chart--lg {
281
- min-height: map.get($spacing-sizes, 72); // 288px
282
- font-size: $font-size-md;
283
- --chart-padding: #{map.get($spacing-sizes, 6)};
284
-
285
- .c-chart__header {
286
- padding: map.get($spacing-sizes, 6);
287
- }
288
-
289
- .c-chart__content {
290
- padding: map.get($spacing-sizes, 6);
291
- }
292
-
293
- .c-chart__title {
294
- font-size: $font-size-lg;
295
- }
296
-
297
- .c-chart__action {
298
- width: map.get($spacing-sizes, 9);
299
- height: map.get($spacing-sizes, 9);
300
- }
301
- }
302
-
303
- .c-chart--xl {
304
- min-height: map.get($spacing-sizes, 80); // 320px
305
- font-size: $font-size-lg;
306
- --chart-padding: #{map.get($spacing-sizes, 8)};
307
-
308
- .c-chart__header {
309
- padding: map.get($spacing-sizes, 8);
310
- }
311
-
312
- .c-chart__content {
313
- padding: map.get($spacing-sizes, 8);
314
- }
315
-
316
- .c-chart__title {
317
- font-size: $font-size-lg;
318
- }
319
-
320
- .c-chart__action {
321
- width: map.get($spacing-sizes, 10);
322
- height: map.get($spacing-sizes, 10);
323
- }
324
- }
325
-
326
- .c-chart--2xl {
327
- min-height: map.get($spacing-sizes, 96); // 384px
328
- font-size: $font-size-lg;
329
- --chart-padding: #{map.get($spacing-sizes, 10)};
330
-
331
- .c-chart__header {
332
- padding: map.get($spacing-sizes, 10);
333
- }
334
-
335
- .c-chart__content {
336
- padding: map.get($spacing-sizes, 10);
337
- }
338
-
339
- .c-chart__title {
340
- font-size: $font-size-lg;
341
- }
342
- }
343
-
344
- .c-chart--full {
345
- height: 100vh;
346
- min-height: auto;
347
- border-radius: 0;
348
- }
349
-
350
- .c-chart--auto {
351
- height: auto;
352
- min-height: map.get($spacing-sizes, 32);
353
- }
354
-
355
- // Color Modifiers
356
- // =============================================================================
357
- .c-chart--primary {
358
- @include chart-gradient-border('primary');
359
-
360
- --chart-primary-color: #{map.get($chart-colors, primary)};
361
-
362
- .c-chart__title {
363
- color: var(--atomix-primary-text-emphasis);
364
- background: map.get($chart-gradients, primary);
365
- background-clip: text;
366
- -webkit-background-clip: text;
367
- -webkit-text-fill-color: transparent;
368
-
369
- @supports not (background-clip: text) {
370
- color: var(--atomix-primary-text-emphasis);
371
- background: none;
372
- -webkit-text-fill-color: initial;
373
- }
374
- }
375
-
376
- &:hover {
377
- border-color: var(--atomix-primary-border-subtle);
378
- }
379
- }
380
-
381
- .c-chart--secondary {
382
- @include chart-gradient-border('secondary');
383
- @include chart-gradient-background('secondary');
384
-
385
- --chart-primary-color: #{map.get($chart-colors, secondary)};
386
-
387
- .c-chart__title {
388
- color: var(--atomix-secondary-text-emphasis);
389
- background: map.get($chart-gradients, secondary);
390
- background-clip: text;
391
- -webkit-background-clip: text;
392
- -webkit-text-fill-color: transparent;
393
- }
394
-
395
- &:hover {
396
- border-color: var(--atomix-secondary-border-subtle);
397
- }
398
- }
399
-
400
- .c-chart--success {
401
- @include chart-gradient-border('success');
402
- @include chart-gradient-background('success');
403
- --chart-primary-color: #{map.get($chart-colors, success)};
404
-
405
- .c-chart__title {
406
- color: var(--atomix-success-text-emphasis);
407
- background: map.get($chart-gradients, success);
408
- background-clip: text;
409
- -webkit-background-clip: text;
410
- -webkit-text-fill-color: transparent;
411
-
412
- @supports not (background-clip: text) {
413
- color: var(--atomix-success-text-emphasis);
414
- background: none;
415
- -webkit-text-fill-color: initial;
416
- }
417
- }
418
-
419
- &:hover {
420
- border-color: var(--atomix-success-border-subtle);
421
- }
422
- }
423
-
424
- .c-chart--error {
425
- @include chart-gradient-border('error');
426
- @include chart-gradient-background('error');
427
- --chart-primary-color: #{map.get($chart-colors, error)};
428
-
429
- .c-chart__title {
430
- color: var(--atomix-error-text-emphasis);
431
- background: map.get($chart-gradients, error);
432
- background-clip: text;
433
- -webkit-background-clip: text;
434
- -webkit-text-fill-color: transparent;
435
-
436
- @supports not (background-clip: text) {
437
- color: var(--atomix-error-text-emphasis);
438
- background: none;
439
- -webkit-text-fill-color: initial;
440
- }
441
- }
442
-
443
- &:hover {
444
- border-color: var(--atomix-error-border-subtle);
445
- }
446
- }
447
-
448
- .c-chart--warning {
449
- @include chart-gradient-border('warning');
450
- @include chart-gradient-background('warning');
451
- --chart-primary-color: #{map.get($chart-colors, warning)};
452
-
453
- .c-chart__title {
454
- color: var(--atomix-warning-text-emphasis);
455
- background: map.get($chart-gradients, warning);
456
- background-clip: text;
457
- -webkit-background-clip: text;
458
- -webkit-text-fill-color: transparent;
459
-
460
- @supports not (background-clip: text) {
461
- color: var(--atomix-warning-text-emphasis);
462
- background: none;
463
- -webkit-text-fill-color: initial;
464
- }
465
- }
466
-
467
- &:hover {
468
- border-color: var(--atomix-warning-border-subtle);
469
- }
470
- }
471
-
472
- .c-chart--info {
473
- @include chart-gradient-border('info');
474
- @include chart-gradient-background('info');
475
- --chart-primary-color: #{map.get($chart-colors, info)};
476
-
477
- .c-chart__title {
478
- color: var(--atomix-info-text-emphasis);
479
- background: map.get($chart-gradients, info);
480
- background-clip: text;
481
- -webkit-background-clip: text;
482
- -webkit-text-fill-color: transparent;
483
-
484
- @supports not (background-clip: text) {
485
- color: var(--atomix-info-text-emphasis);
486
- background: none;
487
- -webkit-text-fill-color: initial;
488
- }
489
- }
490
-
491
- &:hover {
492
- border-color: var(--atomix-info-border-subtle);
493
- }
494
- }
495
-
496
- .c-chart--accent {
497
- @include chart-gradient-border('accent');
498
- @include chart-gradient-background('accent');
499
- --chart-primary-color: #{map.get($chart-colors, accent)};
500
-
501
- border-color: var(--atomix-accent-border-subtle);
502
-
503
- .c-chart__title {
504
- color: var(--atomix-accent-text-emphasis);
505
- }
506
-
507
- &:hover {
508
- border-color: var(--atomix-accent-border-subtle);
509
- }
510
- }
511
-
512
- .c-chart--neutral {
513
- @include chart-gradient-border('neutral');
514
- @include chart-gradient-background('neutral');
515
- --chart-primary-color: #{map.get($chart-colors, neutral)};
516
-
517
- border-color: var(--atomix-neutral-border-subtle);
518
-
519
- .c-chart__title {
520
- color: var(--atomix-neutral-text-emphasis);
521
- }
522
-
523
- &:hover {
524
- border-color: var(--atomix-neutral-border-subtle);
525
- }
526
- }
527
-
528
- // State Modifiers
529
- // =============================================================================
530
- .c-chart--loading {
531
- @include component.component-loading;
532
-
533
- .c-chart__content {
534
- @include chart-loading-shimmer;
535
- }
536
-
537
- .c-chart__canvas {
538
- opacity: 0.3;
539
- filter: blur(1px);
540
- }
541
- }
542
-
543
- .c-chart--interactive {
544
- cursor: pointer;
545
- user-select: none;
546
-
547
- &:hover {
548
- transform: translateY(-2px);
549
- box-shadow: $box-shadow-xl;
550
- }
551
-
552
- &:active {
553
- transform: $chart-active-transform;
554
- box-shadow: $box-shadow-md;
555
- transition-duration: 0.1s;
556
- }
557
-
558
- &:focus-visible {
559
- transform: translateY(-1px);
560
- }
561
- }
562
-
563
- .c-chart--disabled {
564
- @include component.component-disabled;
565
-
566
- .c-chart__content {
567
- filter: grayscale(80%) opacity(0.6);
568
- }
569
-
570
- .c-chart__canvas {
571
- pointer-events: none;
572
- }
573
-
574
- &:hover {
575
- transform: none;
576
- box-shadow: $box-shadow-sm;
577
- }
578
- }
579
-
580
- .c-chart--fullscreen {
581
- position: fixed;
582
- top: 0;
583
- left: 0;
584
- width: 100vw;
585
- height: 100vh;
586
- z-index: 9999;
587
- border-radius: 0;
588
- box-shadow: none;
589
- background: var(--atomix-primary-bg-default);
590
-
591
- @include component.component-animation('scale');
592
-
593
- .c-chart__header {
594
- border-bottom: 2px solid var(--atomix-primary-border-subtle);
595
- }
596
- }
597
-
598
- .c-chart--minimized {
599
- min-height: map.get($spacing-sizes, 20); // 80px
600
- max-height: map.get($spacing-sizes, 24); // 96px
601
- overflow: hidden;
602
-
603
- .c-chart__header {
604
- padding: map.get($spacing-sizes, 2);
605
- }
606
-
607
- .c-chart__content {
608
- display: none;
609
- }
610
-
611
- .c-chart__legend {
612
- display: none;
613
- }
614
-
615
- .c-chart__title {
616
- font-size: $font-size-sm;
617
- margin-bottom: 0;
618
- }
619
-
620
- .c-chart__subtitle {
621
- display: none;
622
- }
623
- }
624
-
625
- .c-chart--elevated {
626
- box-shadow: $box-shadow-lg;
627
- transform: translateY(-2px);
628
-
629
- &:hover {
630
- box-shadow: $box-shadow-xl;
631
- transform: translateY(-4px);
632
- }
633
- }
634
-
635
- .c-chart--flat {
636
- box-shadow: none;
637
- border: 2px solid var(--atomix-primary-border-subtle);
638
-
639
- &:hover {
640
- box-shadow: $box-shadow-sm;
641
- transform: none;
642
- }
643
- }
644
-
645
- .c-chart--bordered {
646
- border: 2px solid var(--atomix-primary-border-subtle);
647
- }
648
-
649
- .c-chart--rounded {
650
- border-radius: $border-radius-xl;
651
- }
652
-
653
- .c-chart--square {
654
- border-radius: 0;
655
- }
656
-
657
- // Elements
658
- // =============================================================================
659
- .c-chart__header {
660
- padding: var(--chart-padding);
661
- border-bottom: $chart-border-width solid var(--atomix-brand-bg-subtle);
662
- backdrop-filter: blur($chart-header-backdrop-blur);
663
- position: relative;
664
- display: flex;
665
- align-items: flex-start;
666
- justify-content: space-between;
667
- gap: var(--chart-gap);
668
- z-index: 2;
669
-
670
- &::after {
671
- content: '';
672
- position: absolute;
673
- bottom: 0;
674
- left: var(--chart-padding);
675
- right: var(--chart-padding);
676
- height: 1px;
677
- background: linear-gradient(90deg, transparent, var(--atomix-brand-border-subtle), transparent);
678
- }
679
- }
680
-
681
- .c-chart__header-content {
682
- flex: 1;
683
- min-width: 0; // Prevent flex item from overflowing
684
- }
685
-
686
- .c-chart__title {
687
- margin: 0 0 map.get($spacing-sizes, 2) 0;
688
- font-size: $font-size-lg;
689
- font-weight: $font-weight-semibold;
690
- color: var(--atomix-primary-text-emphasis);
691
- letter-spacing: -0.02em;
692
- line-height: 1.3;
693
- word-wrap: break-word;
694
- hyphens: auto;
695
-
696
- background: linear-gradient(
697
- 135deg,
698
- var(--atomix-primary-text-emphasis),
699
- var(--atomix-secondary-text-emphasis)
700
- );
701
- background-clip: text;
702
- -webkit-background-clip: text;
703
- -webkit-text-fill-color: transparent;
704
-
705
- // Responsive font scaling
706
- @container (max-width: 400px) {
707
- font-size: $font-size-md;
708
- }
709
- }
710
-
711
- .c-chart__subtitle {
712
- margin: 0;
713
- color: var(--atomix-secondary-text-emphasis);
714
- opacity: 0.8;
715
- line-height: 1.4;
716
- word-wrap: break-word;
717
-
718
- @container (max-width: 400px) {
719
- font-size: $font-size-xs;
720
- }
721
- }
722
-
723
- .c-chart__toolbar {
724
- display: flex;
725
- align-items: center;
726
- gap: var(--chart-gap);
727
- flex-shrink: 0;
728
- margin-left: auto;
729
- }
730
-
731
- .c-chart__action {
732
- display: inline-flex;
733
- align-items: center;
734
- justify-content: center;
735
- width: $chart-action-button-size;
736
- height: $chart-action-button-size;
737
- border-radius: $border-radius-sm;
738
- border: $chart-border-width solid var(--atomix-primary-border-subtle);
739
- background-color: transparent;
740
- color: var(--atomix-secondary-text-emphasis);
741
- cursor: pointer;
742
- transition: all $chart-transition-duration $chart-transition-timing;
743
- position: relative;
744
- overflow: hidden;
745
-
746
- // Enhanced button styling
747
- &::before {
748
- content: '';
749
- position: absolute;
750
- inset: 0;
751
- background: var(--atomix-primary-bg-subtle);
752
- opacity: 0;
753
- transition: opacity $chart-transition-duration $chart-transition-timing;
754
- }
755
-
756
- svg {
757
- position: relative;
758
- z-index: 1;
759
- transition: transform $chart-transition-duration $chart-transition-timing;
760
- }
761
-
762
- &:hover {
763
- background-color: var(--atomix-primary-bg-subtle);
764
- color: var(--atomix-primary-text-emphasis);
765
- border-color: var(--atomix-primary-border-subtle);
766
- transform: translateY(-1px);
767
-
768
- &::before {
769
- opacity: 1;
770
- }
771
-
772
- svg {
773
- transform: scale(1.1);
774
- }
775
- }
776
-
777
- &:focus-visible {
778
- @include component.focus-ring;
779
- }
780
-
781
- &:active {
782
- transform: translateY(1px);
783
-
784
- svg {
785
- transform: scale(0.95);
786
- }
787
- }
788
-
789
- &:disabled {
790
- opacity: 0.5;
791
- cursor: not-allowed;
792
- pointer-events: none;
793
- }
794
- }
795
-
796
- .c-chart__export-group {
797
- position: relative;
798
- display: inline-flex;
799
- }
800
-
801
- .c-chart__export-dropdown {
802
- position: absolute;
803
- top: 100%;
804
- right: 0;
805
- margin-top: map.get($spacing-sizes, 1);
806
- background: var(--atomix-primary-bg-default);
807
- border: $chart-border-width solid var(--atomix-primary-border-subtle);
808
- border-radius: $border-radius-md;
809
- box-shadow: $box-shadow-lg;
810
- backdrop-filter: blur($chart-tooltip-backdrop-blur);
811
- z-index: 1000;
812
- min-width: map.get($spacing-sizes, 32);
813
- opacity: 0;
814
- visibility: hidden;
815
- transform: translateY(-8px);
816
- transition: all $chart-transition-duration $chart-transition-timing;
817
-
818
- .c-chart__export-group:hover & {
819
- opacity: 1;
820
- visibility: visible;
821
- transform: translateY(0);
822
- }
823
- }
824
-
825
- .c-chart__export-option {
826
- display: block;
827
- width: 100%;
828
- padding: map.get($spacing-sizes, 2) map.get($spacing-sizes, 3);
829
- border: none;
830
- background: transparent;
831
- color: var(--atomix-primary-text-emphasis);
832
- font-size: $font-size-sm;
833
- text-align: left;
834
- cursor: pointer;
835
- transition: background-color $chart-transition-duration $chart-transition-timing;
836
-
837
- &:hover {
838
- background-color: var(--atomix-primary-bg-subtle);
839
- }
840
-
841
- &:first-child {
842
- border-radius: $border-radius-md $border-radius-md 0 0;
843
- }
844
-
845
- &:last-child {
846
- border-radius: 0 0 $border-radius-md $border-radius-md;
847
- }
848
-
849
- &:only-child {
850
- border-radius: $border-radius-md;
851
- }
852
- }
853
-
854
- .c-chart__content {
855
- flex: 1;
856
- position: relative;
857
- padding: var(--chart-padding);
858
- display: flex;
859
- align-items: center;
860
- justify-content: center;
861
- min-height: map.get($spacing-sizes, 32); // 128px
862
- container-type: inline-size;
863
-
864
- // Enhanced background pattern
865
- &::before {
866
- content: '';
867
- position: absolute;
868
- top: 0;
869
- left: 0;
870
- right: 0;
871
- bottom: 0;
872
- background-image: radial-gradient(
873
- circle at 1px 1px,
874
- var(--atomix-primary-border-subtle) 1px,
875
- transparent 0
876
- );
877
- background-size: $chart-pattern-size $chart-pattern-size;
878
- opacity: $chart-pattern-opacity;
879
- pointer-events: none;
880
- z-index: 0;
881
- }
882
-
883
- // Subtle gradient overlay
884
- &::after {
885
- content: '';
886
- position: absolute;
887
- inset: 0;
888
- background: linear-gradient(
889
- 135deg,
890
- rgba(255, 255, 255, 0.02) 0%,
891
- transparent 50%,
892
- rgba(0, 0, 0, 0.02) 100%
893
- );
894
- pointer-events: none;
895
- z-index: 1;
896
- }
897
- }
898
-
899
- .c-chart__canvas {
900
- width: 100%;
901
- height: 100%;
902
- position: relative;
903
- overflow: hidden;
904
- border-radius: $border-radius-sm;
905
- z-index: 2;
906
-
907
- // Smooth rendering for SVG elements
908
- svg {
909
- width: 100%;
910
- height: 100%;
911
- shape-rendering: geometricPrecision;
912
- text-rendering: optimizeLegibility;
913
- image-rendering: -webkit-optimize-contrast;
914
- image-rendering: crisp-edges;
915
- }
916
-
917
- // Enhanced canvas styling
918
- canvas {
919
- width: 100%;
920
- height: 100%;
921
- image-rendering: -webkit-optimize-contrast;
922
- image-rendering: crisp-edges;
923
- }
924
- }
925
-
926
- .c-chart__legend {
927
- display: flex;
928
- flex-wrap: wrap;
929
- gap: map.get($spacing-sizes, 3);
930
- padding: var(--chart-padding);
931
- border-bottom: $chart-border-width solid var(--atomix-brand-border-subtle);
932
- z-index: 2;
933
-
934
- @include chart-glassmorphism();
935
- @include chart-gradient-border();
936
-
937
- &::after {
938
- content: '';
939
- position: absolute;
940
- bottom: 0;
941
- left: var(--chart-padding);
942
- right: var(--chart-padding);
943
- height: 1px;
944
- background: linear-gradient(90deg, transparent, var(--atomix-brand-border-subtle), transparent);
945
- }
946
- }
947
-
948
- .c-chart__legend-item {
949
- display: flex;
950
- align-items: center;
951
- gap: map.get($spacing-sizes, 2);
952
- cursor: pointer;
953
- padding: map.get($spacing-sizes, 2) map.get($spacing-sizes, 3);
954
- border-radius: $border-radius-md;
955
- border: $chart-border-width solid transparent;
956
- background-color: transparent;
957
- transition: all $chart-transition-duration $chart-transition-timing;
958
- user-select: none;
959
- position: relative;
960
- overflow: hidden;
961
-
962
- // Enhanced interaction states
963
- &::before {
964
- content: '';
965
- position: absolute;
966
- inset: 0;
967
- background: var(--atomix-secondary-bg-subtle);
968
- opacity: 0;
969
- transition: opacity $chart-transition-duration $chart-transition-timing;
970
- }
971
-
972
- &:hover {
973
- background-color: var(--atomix-secondary-bg-subtle);
974
- border-color: var(--atomix-primary-border-subtle);
975
- transform: translateY(-1px);
976
- box-shadow: $box-shadow-sm;
977
-
978
- &::before {
979
- opacity: 1;
980
- }
981
- }
982
-
983
- &:focus-visible {
984
- @include component.focus-ring;
985
- }
986
-
987
- &:active {
988
- transform: translateY(0);
989
- }
990
-
991
- // Enhanced visibility states
992
- &[data-visible='false'] {
993
- opacity: 0.4;
994
- filter: grayscale(60%);
995
-
996
- .c-chart__legend-label {
997
- text-decoration: line-through;
998
- }
999
-
1000
- .c-chart__legend-color {
1001
- opacity: 0.3;
1002
- filter: grayscale(100%);
1003
- }
1004
- }
1005
-
1006
- &[data-highlighted='true'] {
1007
- background-color: var(--atomix-primary-bg-subtle);
1008
- border-color: var(--atomix-primary-border-subtle);
1009
- box-shadow: $box-shadow-md;
1010
- transform: translateY(-2px);
1011
-
1012
- .c-chart__legend-color {
1013
- box-shadow: 0 0 0 2px var(--atomix-primary-border-subtle);
1014
- transform: scale(1.1);
1015
- }
1016
- }
1017
-
1018
- &[data-selected='true'] {
1019
- background-color: var(--chart-primary-color);
1020
- color: white;
1021
- border-color: var(--chart-primary-color);
1022
-
1023
- .c-chart__legend-label {
1024
- color: white;
1025
- }
1026
- }
1027
- }
1028
-
1029
- .c-chart__legend-color {
1030
- width: $chart-legend-color-size;
1031
- height: $chart-legend-color-size;
1032
- border-radius: $border-radius-sm;
1033
- border: $chart-border-width solid var(--atomix-primary-border-subtle);
1034
- flex-shrink: 0;
1035
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
1036
- transition: all $chart-transition-duration $chart-transition-timing;
1037
- position: relative;
1038
-
1039
- // Enhanced glow effect
1040
- &::after {
1041
- content: '';
1042
- position: absolute;
1043
- top: -1px;
1044
- left: -1px;
1045
- right: -1px;
1046
- bottom: -1px;
1047
- border-radius: inherit;
1048
- background: inherit;
1049
- filter: blur(2px);
1050
- opacity: 0.3;
1051
- z-index: -1;
1052
- }
1053
-
1054
- // Pattern support for accessibility
1055
- &[data-pattern='dots']::before {
1056
- content: '';
1057
- position: absolute;
1058
- inset: 1px;
1059
- background-image: radial-gradient(circle at 2px 2px, currentColor 1px, transparent 1px);
1060
- background-size: 4px 4px;
1061
- border-radius: inherit;
1062
- }
1063
-
1064
- &[data-pattern='stripes']::before {
1065
- content: '';
1066
- position: absolute;
1067
- inset: 1px;
1068
- background-image: repeating-linear-gradient(
1069
- 45deg,
1070
- currentColor 0px,
1071
- currentColor 1px,
1072
- transparent 1px,
1073
- transparent 3px
1074
- );
1075
- border-radius: inherit;
1076
- }
1077
- }
1078
-
1079
- .c-chart__legend-label {
1080
- color: var(--atomix-primary-text-emphasis);
1081
- font-weight: $font-weight-medium;
1082
- letter-spacing: -0.01em;
1083
- transition: color $chart-transition-duration $chart-transition-timing;
1084
- position: relative;
1085
- z-index: 1;
1086
- }
1087
-
1088
- .c-chart__tooltip {
1089
- position: absolute;
1090
- @include chart-glassmorphism();
1091
- @include chart-gradient-border();
1092
- border-radius: $border-radius-lg;
1093
- padding: map.get($spacing-sizes, 3) map.get($spacing-sizes, 4);
1094
- box-shadow: $box-shadow-xl;
1095
- font-size: $font-size-sm;
1096
- color: var(--atomix-primary-text-emphasis);
1097
- pointer-events: none;
1098
- z-index: 1070;
1099
- max-width: map.get($spacing-sizes, 64);
1100
- min-width: map.get($spacing-sizes, 32);
1101
- transition: all $chart-transition-duration $chart-transition-timing;
1102
-
1103
- // Enhanced visibility with smooth animation
1104
- &[data-visible='true'] {
1105
- opacity: 1;
1106
- transform: translateY(0) scale(1);
1107
- }
1108
-
1109
- // Enhanced arrow pointer
1110
- &::before {
1111
- content: '';
1112
- position: absolute;
1113
- top: -6px;
1114
- left: 50%;
1115
- transform: translateX(-50%);
1116
- width: 0;
1117
- height: 0;
1118
- border-left: 6px solid transparent;
1119
- border-right: 6px solid transparent;
1120
- border-bottom: 6px solid var(--atomix-primary-border-subtle);
1121
- }
1122
-
1123
- &::after {
1124
- content: '';
1125
- position: absolute;
1126
- top: -5px;
1127
- left: 50%;
1128
- transform: translateX(-50%);
1129
- width: 0;
1130
- height: 0;
1131
- border-left: 5px solid transparent;
1132
- border-right: 5px solid transparent;
1133
- border-bottom: 5px solid var(--atomix-primary-bg-subtle);
1134
- }
1135
-
1136
- // Position variants
1137
- &[data-position='top'] {
1138
- transform: translateY(-8px) scale(0.95);
1139
-
1140
- &::before {
1141
- top: auto;
1142
- bottom: -6px;
1143
- border-bottom: none;
1144
- border-top: 6px solid var(--atomix-primary-border-subtle);
1145
- }
1146
-
1147
- &::after {
1148
- top: auto;
1149
- bottom: -5px;
1150
- border-bottom: none;
1151
- border-top: 5px solid var(--atomix-primary-bg-subtle);
1152
- }
1153
- }
1154
-
1155
- &[data-position='left'] {
1156
- transform: translateX(-8px) scale(0.95);
1157
-
1158
- &::before {
1159
- top: 50%;
1160
- left: auto;
1161
- right: -6px;
1162
- transform: translateY(-50%);
1163
- border-bottom: 6px solid transparent;
1164
- border-top: 6px solid transparent;
1165
- border-left: 6px solid var(--atomix-primary-border-subtle);
1166
- border-right: none;
1167
- }
1168
-
1169
- &::after {
1170
- top: 50%;
1171
- left: auto;
1172
- right: -5px;
1173
- transform: translateY(-50%);
1174
- border-bottom: 5px solid transparent;
1175
- border-top: 5px solid transparent;
1176
- border-left: 5px solid var(--atomix-primary-bg-subtle);
1177
- border-right: none;
1178
- }
1179
- }
1180
-
1181
- &[data-position='right'] {
1182
- transform: translateX(8px) scale(0.95);
1183
-
1184
- &::before {
1185
- top: 50%;
1186
- left: -6px;
1187
- right: auto;
1188
- transform: translateY(-50%);
1189
- border-bottom: 6px solid transparent;
1190
- border-top: 6px solid transparent;
1191
- border-right: 6px solid var(--atomix-primary-border-subtle);
1192
- border-left: none;
1193
- }
1194
-
1195
- &::after {
1196
- top: 50%;
1197
- left: -5px;
1198
- right: auto;
1199
- transform: translateY(-50%);
1200
- border-bottom: 5px solid transparent;
1201
- border-top: 5px solid transparent;
1202
- border-right: 5px solid var(--atomix-primary-bg-subtle);
1203
- border-left: none;
1204
- }
1205
- }
1206
- }
1207
-
1208
- .c-chart__tooltip-title {
1209
- font-weight: $font-weight-semibold;
1210
- margin-bottom: map.get($spacing-sizes, 1);
1211
- color: var(--atomix-primary-text-emphasis);
1212
- font-size: $font-size-sm;
1213
- border-bottom: 1px solid var(--atomix-brand-border-subtle);
1214
- padding-bottom: map.get($spacing-sizes, 1);
1215
- }
1216
-
1217
- .c-chart__tooltip-content {
1218
- display: flex;
1219
- flex-direction: column;
1220
- gap: map.get($spacing-sizes, 1);
1221
- }
1222
-
1223
- .c-chart__tooltip-item {
1224
- display: flex;
1225
- align-items: center;
1226
- justify-content: space-between;
1227
- gap: map.get($spacing-sizes, 2);
1228
-
1229
- &:not(:last-child) {
1230
- padding-bottom: map.get($spacing-sizes, 1);
1231
- border-bottom: 1px solid var(--atomix-brand-border-subtle);
1232
- }
1233
- }
1234
-
1235
- .c-chart__tooltip-label {
1236
- font-size: $font-size-xs;
1237
- color: var(--atomix-secondary-text-emphasis);
1238
- opacity: 0.8;
1239
- display: flex;
1240
- align-items: center;
1241
- gap: map.get($spacing-sizes, 1);
1242
-
1243
- &::before {
1244
- content: '';
1245
- width: 8px;
1246
- height: 8px;
1247
- border-radius: 50%;
1248
- background-color: currentColor;
1249
- flex-shrink: 0;
1250
- }
1251
- }
1252
-
1253
- .c-chart__tooltip-value {
1254
- font-weight: $font-weight-medium;
1255
- color: var(--atomix-primary-text-emphasis);
1256
- font-size: $font-size-sm;
1257
- font-variant-numeric: tabular-nums;
1258
- }
1259
-
1260
- .c-chart__axis {
1261
- position: relative;
1262
- z-index: 55;
1263
- &.c-chart__axis--x {
1264
- text-anchor: middle;
1265
- dominant-baseline: hanging;
1266
- }
1267
-
1268
- &.c-chart__axis--y {
1269
- text-anchor: end;
1270
- dominant-baseline: middle;
1271
- }
1272
- }
1273
-
1274
- .c-chart__axis-line {
1275
- stroke: var(--atomix-primary-border-subtle);
1276
- stroke-width: 1;
1277
- opacity: 0.6;
1278
- transition: opacity $chart-transition-duration $chart-transition-timing;
1279
-
1280
- &:hover {
1281
- opacity: 0.8;
1282
- }
1283
- }
1284
-
1285
- .c-chart__axis-tick-line {
1286
- stroke: var(--atomix-primary-border-subtle);
1287
- stroke-width: 1;
1288
- opacity: 0.4;
1289
- transition: opacity $chart-transition-duration $chart-transition-timing;
1290
-
1291
- &:hover {
1292
- opacity: 0.6;
1293
- }
1294
- }
1295
-
1296
- .c-chart__axis-label {
1297
- font-size: $font-size-xs;
1298
- font-weight: $font-weight-medium;
1299
- fill: var(--atomix-secondary-text-emphasis);
1300
- text-anchor: middle;
1301
- }
1302
-
1303
- .c-chart__grid {
1304
- stroke: var(--atomix-primary-border-subtle);
1305
- stroke-width: 0.5;
1306
- stroke-dasharray: 2, 4;
1307
- opacity: 0.2;
1308
- transition: opacity $chart-transition-duration $chart-transition-timing;
1309
-
1310
- &.c-chart__grid--major {
1311
- stroke-width: 1;
1312
- stroke-dasharray: none;
1313
- opacity: 0.4;
1314
- }
1315
-
1316
- &.c-chart__grid--minor {
1317
- opacity: 0.1;
1318
- }
1319
-
1320
- &.c-chart__grid--zero {
1321
- stroke-width: 1.5;
1322
- stroke-dasharray: none;
1323
- opacity: 0.6;
1324
- stroke: var(--atomix-primary-border-subtle);
1325
- }
1326
-
1327
- // Interactive grid
1328
- &:hover {
1329
- opacity: 0.6;
1330
- }
1331
- }
1332
-
1333
- .c-chart__data-point {
1334
- cursor: pointer;
1335
- transition: all $chart-transition-duration $chart-transition-timing !important;
1336
-
1337
- &:hover {
1338
- opacity: 0.8;
1339
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
1340
- }
1341
-
1342
- &:focus-visible {
1343
- outline: 2px solid var(--atomix-primary-border-subtle);
1344
- outline-offset: 2px;
1345
- }
1346
-
1347
- &:active {
1348
- transform: none;
1349
- }
1350
-
1351
- // Enhanced interaction states
1352
- &[data-highlighted='true'] {
1353
- transform: scale(1.2);
1354
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.3));
1355
- z-index: 10;
1356
- }
1357
-
1358
- &[data-selected='true'] {
1359
- stroke: var(--atomix-primary-border-subtle);
1360
- stroke-width: 2;
1361
- filter: drop-shadow(0 0 0 2px var(--atomix-primary-border-subtle));
1362
- }
1363
-
1364
- &[data-animated='true'] {
1365
- @include chart-data-animation('scale');
1366
- }
1367
- }
1368
-
1369
- .c-chart__loading {
1370
- @include chart-data-animation('fade');
1371
-
1372
- display: flex;
1373
- flex-direction: column;
1374
- align-items: center;
1375
- justify-content: center;
1376
- gap: map.get($spacing-sizes, 4);
1377
- color: var(--atomix-secondary-text-emphasis);
1378
- font-size: $font-size-sm;
1379
- min-height: map.get($spacing-sizes, 32);
1380
- }
1381
-
1382
- .c-chart__loading-spinner {
1383
- width: $chart-loading-spinner-size;
1384
- height: $chart-loading-spinner-size;
1385
- border: 3px solid var(--atomix-primary-border-subtle);
1386
- border-top: 3px solid var(--atomix-primary-text-emphasis);
1387
- border-radius: 50%;
1388
- animation: chart-spin 1.2s $chart-transition-timing infinite;
1389
- position: relative;
1390
-
1391
- // Enhanced loading spinner with gradient
1392
- &::after {
1393
- content: '';
1394
- position: absolute;
1395
- top: -3px;
1396
- left: -3px;
1397
- right: -3px;
1398
- bottom: -3px;
1399
- border-radius: 50%;
1400
- background: conic-gradient(
1401
- from 0deg,
1402
- transparent,
1403
- var(--atomix-primary-border-subtle),
1404
- transparent
1405
- );
1406
- mask: radial-gradient(circle, transparent 65%, black 66%);
1407
- animation: chart-spin 0.8s linear infinite reverse;
1408
- }
1409
- }
1410
-
1411
- .c-chart__loading-text {
1412
- font-weight: $font-weight-medium;
1413
- opacity: 0.8;
1414
- animation: chart-pulse 2s ease-in-out infinite;
1415
- }
1416
-
1417
- .c-chart__error {
1418
- @include chart-data-animation('fade');
1419
-
1420
- display: flex;
1421
- flex-direction: column;
1422
- align-items: center;
1423
- justify-content: center;
1424
- gap: map.get($spacing-sizes, 3);
1425
- color: var(--atomix-error-text-emphasis);
1426
- font-size: $font-size-sm;
1427
- text-align: center;
1428
- padding: map.get($spacing-sizes, 8);
1429
- min-height: map.get($spacing-sizes, 32);
1430
- background-color: var(--atomix-error-bg-subtle);
1431
- border-radius: $border-radius-md;
1432
- border: $chart-border-width solid var(--atomix-error-border-subtle);
1433
- }
1434
-
1435
- .c-chart__error-icon {
1436
- width: $chart-error-icon-size;
1437
- height: $chart-error-icon-size;
1438
- border-radius: 50%;
1439
- background-color: var(--atomix-error-bg-emphasis);
1440
- display: flex;
1441
- align-items: center;
1442
- justify-content: center;
1443
- color: var(--atomix-error-text-emphasis);
1444
- font-size: map.get($spacing-sizes, 6);
1445
- animation: chart-pulse 2s ease-in-out infinite;
1446
- }
1447
-
1448
- .c-chart__error-content {
1449
- display: flex;
1450
- flex-direction: column;
1451
- gap: map.get($spacing-sizes, 2);
1452
- }
1453
-
1454
- .c-chart__error-message {
1455
- font-weight: $font-weight-medium;
1456
- margin-bottom: map.get($spacing-sizes, 2);
1457
- }
1458
-
1459
- .c-chart__error-details {
1460
- font-size: $font-size-xs;
1461
- opacity: 0.8;
1462
- line-height: 1.4;
1463
- }
1464
-
1465
- .c-chart__empty {
1466
- @include chart-data-animation('fade');
1467
-
1468
- display: flex;
1469
- flex-direction: column;
1470
- align-items: center;
1471
- justify-content: center;
1472
- gap: map.get($spacing-sizes, 4);
1473
- color: var(--atomix-secondary-text-emphasis);
1474
- font-size: $font-size-sm;
1475
- text-align: center;
1476
- padding: map.get($spacing-sizes, 8);
1477
- min-height: map.get($spacing-sizes, 32);
1478
- opacity: 0.6;
1479
- }
1480
-
1481
- .c-chart__empty-icon {
1482
- width: $chart-empty-icon-size;
1483
- height: $chart-empty-icon-size;
1484
- opacity: 0.4;
1485
- font-size: map.get($spacing-sizes, 8);
1486
- display: flex;
1487
- align-items: center;
1488
- justify-content: center;
1489
- }
1490
-
1491
- .c-chart__empty-message {
1492
- font-weight: $font-weight-medium;
1493
- }
1494
-
1495
- .c-chart__empty-details {
1496
- font-size: $font-size-xs;
1497
- opacity: 0.8;
1498
- line-height: 1.4;
1499
- }
1500
-
1501
- // Chart Type Specific Styles
1502
- // =============================================================================
1503
-
1504
- // Line Chart
1505
- .c-chart--line {
1506
- .c-chart__canvas {
1507
- svg {
1508
- width: 100%;
1509
- height: 100%;
1510
- overflow: visible;
1511
- }
1512
-
1513
- .line-path {
1514
- fill: none;
1515
- stroke-width: 2.5;
1516
- stroke-linecap: round;
1517
- stroke-linejoin: round;
1518
- transition: all $chart-transition-duration $chart-transition-timing;
1519
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1520
-
1521
- &:hover {
1522
- stroke-width: 3.5;
1523
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
1524
- }
1525
-
1526
- // Animated path drawing
1527
- stroke-dasharray: 1000;
1528
- stroke-dashoffset: 1000;
1529
- animation: chart-draw-line 2s ease-out forwards;
1530
-
1531
- // Gradient stroke support
1532
- &[data-gradient='true'] {
1533
- stroke: url(#lineGradient);
1534
- }
1535
- }
1536
-
1537
- .area-path {
1538
- opacity: 0.15;
1539
- transition: opacity $chart-transition-duration $chart-transition-timing;
1540
-
1541
- &:hover {
1542
- opacity: 0.25;
1543
- }
1544
-
1545
- // Gradient fill support
1546
- &[data-gradient='true'] {
1547
- fill: url(#areaGradient);
1548
- }
1549
- }
1550
-
1551
- .data-point {
1552
- r: 4;
1553
- transition: all $chart-transition-duration $chart-transition-timing;
1554
- cursor: pointer;
1555
-
1556
- &:hover {
1557
- r: 6;
1558
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
1559
- }
1560
-
1561
- &[data-highlighted='true'] {
1562
- r: 8;
1563
- stroke-width: 3;
1564
- }
1565
- }
1566
-
1567
- // Line chart specific patterns
1568
- .trend-line {
1569
- stroke-dasharray: 5, 5;
1570
- opacity: 0.7;
1571
- animation: chart-dash-flow 2s linear infinite;
1572
- }
1573
- }
1574
- }
1575
-
1576
- // Area Chart
1577
- .c-chart--area {
1578
- .c-chart__canvas {
1579
- .area-path {
1580
- opacity: 0.3;
1581
- transition: opacity $chart-transition-duration $chart-transition-timing;
1582
-
1583
- // Enhanced gradient fill animation
1584
- animation: chart-area-fade 1.5s ease-out;
1585
-
1586
- &:hover {
1587
- opacity: 0.45;
1588
- }
1589
-
1590
- // Multiple area support
1591
- &[data-stacked='true'] {
1592
- mix-blend-mode: multiply;
1593
- }
1594
- }
1595
-
1596
- .line-path {
1597
- stroke-width: 2;
1598
- opacity: 0.9;
1599
- transition: all $chart-transition-duration $chart-transition-timing;
1600
-
1601
- &:hover {
1602
- stroke-width: 3;
1603
- opacity: 1;
1604
- }
1605
- }
1606
- }
1607
- }
1608
-
1609
- // Bar Chart
1610
- .c-chart--bar {
1611
- .c-chart__canvas {
1612
- .bar {
1613
- transition: all $chart-transition-duration $chart-transition-timing;
1614
- cursor: pointer;
1615
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1616
-
1617
- // Enhanced animated height growth
1618
- animation: chart-bar-grow 0.8s ease-out;
1619
- transform-origin: bottom center;
1620
-
1621
- &:hover {
1622
- opacity: 0.85;
1623
- transform: scaleY(1.05);
1624
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
1625
- }
1626
-
1627
- &:focus-visible {
1628
- outline: 2px solid var(--atomix-primary-border-subtle);
1629
- outline-offset: 2px;
1630
- }
1631
-
1632
- // Gradient bar support
1633
- &[data-gradient='true'] {
1634
- fill: url(#barGradient);
1635
- }
1636
-
1637
- // Pattern support for accessibility
1638
- &[data-pattern='stripes'] {
1639
- fill: url(#stripesPattern);
1640
- }
1641
-
1642
- &[data-pattern='dots'] {
1643
- fill: url(#dotsPattern);
1644
- }
1645
- }
1646
-
1647
- .bar-value-label {
1648
- font-size: $font-size-xs;
1649
- font-weight: $font-weight-medium;
1650
- fill: var(--atomix-primary-text-emphasis);
1651
- text-anchor: middle;
1652
- opacity: 0;
1653
- transition: opacity $chart-transition-duration $chart-transition-timing;
1654
- font-variant-numeric: tabular-nums;
1655
-
1656
- .bar:hover + & {
1657
- opacity: 1;
1658
- }
1659
- }
1660
-
1661
- // Grouped bars
1662
- .bar-group {
1663
- .bar {
1664
- animation-delay: calc(var(--bar-index) * 0.1s);
1665
- }
1666
- }
1667
- }
1668
- }
1669
-
1670
- // Horizontal Bar Chart
1671
- .c-chart--horizontal-bar {
1672
- .c-chart__canvas {
1673
- .bar {
1674
- transition: all $chart-transition-duration $chart-transition-timing;
1675
- cursor: pointer;
1676
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1677
-
1678
- // Enhanced animated width growth
1679
- animation: chart-bar-grow-horizontal 0.8s ease-out;
1680
- transform-origin: left center;
1681
-
1682
- &:hover {
1683
- opacity: 0.85;
1684
- transform: scaleX(1.05);
1685
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
1686
- }
1687
- }
1688
- }
1689
- }
1690
-
1691
- // Pie Chart
1692
- .c-chart--pie {
1693
- .c-chart__canvas {
1694
- .pie-slice {
1695
- transition: all 0.4s $chart-transition-timing;
1696
- stroke: var(--atomix-primary-bg-subtle);
1697
- stroke-width: 2;
1698
- cursor: pointer;
1699
- transform-origin: center;
1700
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
1701
-
1702
- // Enhanced animated arc drawing
1703
- animation: chart-pie-draw 1.5s ease-out;
1704
-
1705
- &:hover {
1706
- opacity: 0.9;
1707
- transform: scale(1.05);
1708
- stroke-width: 3;
1709
- filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.2));
1710
- }
1711
-
1712
- &:focus-visible {
1713
- outline: 2px solid var(--atomix-primary-border-subtle);
1714
- outline-offset: 4px;
1715
- }
1716
-
1717
- // Exploded slice support
1718
- &[data-exploded='true'] {
1719
- transform: scale(1.1) translate(var(--explode-x, 0), var(--explode-y, 0));
1720
- }
1721
- }
1722
-
1723
- .pie-label {
1724
- font-size: $font-size-xs;
1725
- font-weight: $font-weight-semibold;
1726
- fill: var(--atomix-primary-text-emphasis);
1727
- text-anchor: middle;
1728
- pointer-events: none;
1729
- transition: all $chart-transition-duration $chart-transition-timing;
1730
- font-variant-numeric: tabular-nums;
1731
-
1732
- // Enhanced label positioning
1733
- &[data-position='outside'] {
1734
- font-size: $font-size-sm;
1735
- }
1736
- }
1737
-
1738
- // Pie chart specific enhancements
1739
- .pie-connector-line {
1740
- stroke: var(--atomix-secondary-text-emphasis);
1741
- stroke-width: 1;
1742
- opacity: 0.6;
1743
- }
1744
- }
1745
- }
1746
-
1747
- // Donut Chart
1748
- .c-chart--donut,
1749
- .c-chart--doughnut {
1750
- .c-chart__canvas {
1751
- .donut-slice {
1752
- transition: all 0.4s $chart-transition-timing;
1753
- stroke: var(--atomix-primary-bg-subtle);
1754
- stroke-width: 2;
1755
- cursor: pointer;
1756
- transform-origin: center;
1757
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
1758
-
1759
- // Enhanced animated arc drawing
1760
- animation: chart-donut-draw 1.5s ease-out;
1761
-
1762
- &:hover {
1763
- opacity: 0.9;
1764
- transform: scale(1.05);
1765
- stroke-width: 3;
1766
- filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.2));
1767
- }
1768
- }
1769
-
1770
- .donut-center {
1771
- fill: var(--atomix-primary-bg-subtle);
1772
- transition: fill $chart-transition-duration $chart-transition-timing;
1773
- }
1774
-
1775
- .donut-center-label {
1776
- font-size: $font-size-lg;
1777
- font-weight: $font-weight-bold;
1778
- fill: var(--atomix-primary-text-emphasis);
1779
- text-anchor: middle;
1780
- dominant-baseline: central;
1781
- font-variant-numeric: tabular-nums;
1782
- }
1783
-
1784
- .donut-center-sublabel {
1785
- font-size: $font-size-sm;
1786
- font-weight: $font-weight-medium;
1787
- fill: var(--atomix-secondary-text-emphasis);
1788
- text-anchor: middle;
1789
- dominant-baseline: central;
1790
- }
1791
-
1792
- // Progress donut support
1793
- .progress-track {
1794
- fill: none;
1795
- stroke: var(--atomix-primary-border-subtle);
1796
- stroke-width: 8;
1797
- opacity: 0.2;
1798
- }
1799
-
1800
- .progress-fill {
1801
- fill: none;
1802
- stroke: var(--chart-primary-color);
1803
- stroke-width: 8;
1804
- stroke-linecap: round;
1805
- transition: stroke-dasharray 1s ease-out;
1806
- }
1807
- }
1808
- }
1809
-
1810
- // Scatter Plot
1811
- .c-chart--scatter {
1812
- .c-chart__canvas {
1813
- .scatter-point {
1814
- r: 4;
1815
- transition: all $chart-transition-duration $chart-transition-timing;
1816
- cursor: pointer;
1817
- filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
1818
-
1819
- &:hover {
1820
- r: 6;
1821
- filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.3));
1822
- }
1823
-
1824
- &:focus-visible {
1825
- outline: 2px solid var(--atomix-primary-border-subtle);
1826
- outline-offset: 2px;
1827
- }
1828
-
1829
- // Size-based scaling
1830
- &[data-size='small'] {
1831
- r: 2;
1832
- }
1833
- &[data-size='medium'] {
1834
- r: 4;
1835
- }
1836
- &[data-size='large'] {
1837
- r: 6;
1838
- }
1839
- &[data-size='xlarge'] {
1840
- r: 8;
1841
- }
1842
-
1843
- // Cluster highlighting
1844
- &[data-cluster] {
1845
- stroke-width: 2;
1846
- stroke: var(--atomix-primary-border-subtle);
1847
- }
1848
- }
1849
-
1850
- // Trend lines
1851
- .trend-line {
1852
- stroke: var(--atomix-secondary-text-emphasis);
1853
- stroke-width: 2;
1854
- stroke-dasharray: 5, 5;
1855
- opacity: 0.6;
1856
- fill: none;
1857
- }
1858
-
1859
- // Confidence intervals
1860
- .confidence-area {
1861
- fill: var(--chart-primary-color);
1862
- opacity: 0.1;
1863
- }
1864
- }
1865
- }
1866
-
1867
- // Radar Chart
1868
- .c-chart--radar {
1869
- .c-chart__canvas {
1870
- .radar-path {
1871
- fill: none;
1872
- stroke-width: 2;
1873
- stroke-linejoin: round;
1874
- opacity: 0.8;
1875
- transition: all $chart-transition-duration $chart-transition-timing;
1876
-
1877
- &:hover {
1878
- stroke-width: 3;
1879
- opacity: 1;
1880
- }
1881
- }
1882
-
1883
- .radar-area {
1884
- opacity: 0.1;
1885
- transition: opacity $chart-transition-duration $chart-transition-timing;
1886
-
1887
- &:hover {
1888
- opacity: 0.2;
1889
- }
1890
- }
1891
-
1892
- .radar-point {
1893
- r: 3;
1894
- transition: all $chart-transition-duration $chart-transition-timing;
1895
-
1896
- &:hover {
1897
- r: 5;
1898
- }
1899
- }
1900
-
1901
- // Radar grid
1902
- .radar-grid-line {
1903
- stroke: var(--atomix-primary-border-subtle);
1904
- stroke-width: 1;
1905
- opacity: 0.3;
1906
- }
1907
-
1908
- .radar-axis-line {
1909
- stroke: var(--atomix-primary-border-subtle);
1910
- stroke-width: 1;
1911
- opacity: 0.5;
1912
- }
1913
-
1914
- .radar-axis-label {
1915
- font-size: $font-size-xs;
1916
- font-weight: $font-weight-medium;
1917
- fill: var(--atomix-secondary-text-emphasis);
1918
- text-anchor: middle;
1919
- }
1920
- }
1921
- }
1922
-
1923
- // Bubble Chart
1924
- .c-chart--bubble {
1925
- .c-chart__canvas {
1926
- .bubble {
1927
- transition: all 0.4s $chart-transition-timing;
1928
- cursor: pointer;
1929
- opacity: 0.8;
1930
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
1931
-
1932
- &:hover {
1933
- opacity: 1;
1934
- transform: scale(1.1);
1935
- filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
1936
- }
1937
-
1938
- // Size animation
1939
- animation: chart-bubble-grow 1s ease-out;
1940
-
1941
- // Bubble with gradient
1942
- &[data-gradient='true'] {
1943
- fill: url(#bubbleGradient);
1944
- }
1945
- }
1946
-
1947
- // Bubble size legend
1948
- .size-legend {
1949
- .legend-bubble {
1950
- opacity: 0.6;
1951
- stroke: var(--atomix-primary-border-subtle);
1952
- stroke-width: 1;
1953
- }
1954
- }
1955
- }
1956
- }
1957
-
1958
- // Candlestick Chart
1959
- .c-chart--candlestick {
1960
- .c-chart__canvas {
1961
- .candlestick {
1962
- transition: all $chart-transition-duration $chart-transition-timing;
1963
- cursor: pointer;
1964
-
1965
- &:hover {
1966
- opacity: 0.8;
1967
- filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
1968
- }
1969
-
1970
- // Bullish candle
1971
- &.bullish {
1972
- fill: var(--atomix-success-6);
1973
- stroke: var(--atomix-success-7);
1974
- }
1975
-
1976
- // Bearish candle
1977
- &.bearish {
1978
- fill: var(--atomix-error-6);
1979
- stroke: var(--atomix-error-7);
1980
- }
1981
-
1982
- // Doji candle
1983
- &.doji {
1984
- fill: var(--atomix-neutral-6);
1985
- stroke: var(--atomix-neutral-7);
1986
- }
1987
- }
1988
-
1989
- .wick {
1990
- stroke-width: 1;
1991
- opacity: 0.8;
1992
- }
1993
-
1994
- // Volume bars
1995
- .volume-bar {
1996
- opacity: 0.3;
1997
- transition: opacity $chart-transition-duration $chart-transition-timing;
1998
-
1999
- &:hover {
2000
- opacity: 0.6;
2001
- }
2002
- }
2003
- }
2004
- }
2005
-
2006
- // Heatmap Chart
2007
- .c-chart--heatmap {
2008
- .c-chart__canvas {
2009
- .heatmap-cell {
2010
- transition: all $chart-transition-duration $chart-transition-timing;
2011
- cursor: pointer;
2012
- stroke: var(--atomix-primary-bg-subtle);
2013
- stroke-width: 1;
2014
-
2015
- &:hover {
2016
- stroke-width: 2;
2017
- stroke: var(--atomix-primary-border-subtle);
2018
- filter: brightness(1.1);
2019
- }
2020
-
2021
- // Intensity levels
2022
- &[data-intensity='low'] {
2023
- opacity: 0.3;
2024
- }
2025
- &[data-intensity='medium'] {
2026
- opacity: 0.6;
2027
- }
2028
- &[data-intensity='high'] {
2029
- opacity: 0.9;
2030
- }
2031
- }
2032
-
2033
- .heatmap-label {
2034
- font-size: $font-size-xs;
2035
- font-weight: $font-weight-medium;
2036
- fill: var(--atomix-primary-text-emphasis);
2037
- text-anchor: middle;
2038
- dominant-baseline: central;
2039
- pointer-events: none;
2040
- }
2041
- }
2042
- }
2043
-
2044
- // Animations
2045
- // =============================================================================
2046
- @keyframes chart-spin {
2047
- 0% {
2048
- transform: rotate(0deg);
2049
- }
2050
- 100% {
2051
- transform: rotate(360deg);
2052
- }
2053
- }
2054
-
2055
- @keyframes chart-shimmer {
2056
- 0% {
2057
- left: -100%;
2058
- }
2059
- 100% {
2060
- left: 100%;
2061
- }
2062
- }
2063
-
2064
- @keyframes chart-pulse {
2065
- 0%,
2066
- 100% {
2067
- opacity: 0.8;
2068
- }
2069
- 50% {
2070
- opacity: 1;
2071
- }
2072
- }
2073
-
2074
- @keyframes chart-draw-line {
2075
- 0% {
2076
- stroke-dashoffset: 1000;
2077
- }
2078
- 100% {
2079
- stroke-dashoffset: 0;
2080
- }
2081
- }
2082
-
2083
- @keyframes chart-area-fade {
2084
- 0% {
2085
- opacity: 0;
2086
- }
2087
- 100% {
2088
- opacity: 0.3;
2089
- }
2090
- }
2091
-
2092
- @keyframes chart-bar-grow {
2093
- 0% {
2094
- transform: scaleY(0);
2095
- }
2096
- 100% {
2097
- transform: scaleY(1);
2098
- }
2099
- }
2100
-
2101
- @keyframes chart-bar-grow-horizontal {
2102
- 0% {
2103
- transform: scaleX(0);
2104
- }
2105
- 100% {
2106
- transform: scaleX(1);
2107
- }
2108
- }
2109
-
2110
- @keyframes chart-pie-draw {
2111
- 0% {
2112
- stroke-dasharray: 0 628;
2113
- }
2114
- 100% {
2115
- stroke-dasharray: 628 628;
2116
- }
2117
- }
2118
-
2119
- @keyframes chart-donut-draw {
2120
- 0% {
2121
- stroke-dasharray: 0 628;
2122
- }
2123
- 100% {
2124
- stroke-dasharray: 628 628;
2125
- }
2126
- }
2127
-
2128
- @keyframes chart-fade-in {
2129
- 0% {
2130
- opacity: 0;
2131
- transform: translateY(10px);
2132
- }
2133
- 100% {
2134
- opacity: 1;
2135
- transform: translateY(0);
2136
- }
2137
- }
2138
-
2139
- @keyframes chart-scale-in {
2140
- 0% {
2141
- opacity: 0;
2142
- transform: scale(0.8);
2143
- }
2144
- 100% {
2145
- opacity: 1;
2146
- transform: scale(1);
2147
- }
2148
- }
2149
-
2150
- @keyframes chart-slide-in {
2151
- 0% {
2152
- opacity: 0;
2153
- transform: translateX(-20px);
2154
- }
2155
- 100% {
2156
- opacity: 1;
2157
- transform: translateX(0);
2158
- }
2159
- }
2160
-
2161
- @keyframes chart-bubble-grow {
2162
- 0% {
2163
- transform: scale(0);
2164
- }
2165
- 100% {
2166
- transform: scale(1);
2167
- }
2168
- }
2169
-
2170
- @keyframes chart-dash-flow {
2171
- 0% {
2172
- stroke-dashoffset: 0;
2173
- }
2174
- 100% {
2175
- stroke-dashoffset: 10;
2176
- }
2177
- }
2178
-
2179
- @keyframes chart-glow {
2180
- 0%,
2181
- 100% {
2182
- filter: drop-shadow(0 0 5px currentColor);
2183
- }
2184
- 50% {
2185
- filter: drop-shadow(0 0 15px currentColor);
2186
- }
2187
- }
2188
-
2189
- // Responsive Design
2190
- // =============================================================================
2191
-
2192
- // Container queries for modern responsive design
2193
- @container (max-width: 600px) {
2194
- .c-chart {
2195
- --chart-padding: #{map.get($spacing-sizes, 3)};
2196
-
2197
- .c-chart__header {
2198
- flex-direction: column;
2199
- align-items: flex-start;
2200
- gap: map.get($spacing-sizes, '2');
2201
- }
2202
-
2203
- .c-chart__toolbar {
2204
- width: 100%;
2205
- justify-content: flex-end;
2206
- }
2207
-
2208
- .c-chart__legend {
2209
- flex-direction: column;
2210
- gap: map.get($spacing-sizes, '2');
2211
- }
2212
-
2213
- .c-chart__legend-item {
2214
- justify-content: space-between;
2215
- width: 100%;
2216
- }
2217
- }
2218
- }
2219
-
2220
- @container (max-width: 400px) {
2221
- .c-chart {
2222
- --chart-padding: #{map.get($spacing-sizes, '2')};
2223
-
2224
- .c-chart__title {
2225
- font-size: $font-size-md;
2226
- margin-bottom: map.get($spacing-sizes, 1);
2227
- }
2228
-
2229
- .c-chart__subtitle {
2230
- font-size: $font-size-xs;
2231
- }
2232
-
2233
- .c-chart__action {
2234
- width: map.get($spacing-sizes, 6);
2235
- height: map.get($spacing-sizes, 6);
2236
- }
2237
- }
2238
- }
2239
-
2240
- // Large screens (desktops)
2241
- @media (min-width: 1200px) {
2242
- .c-chart--lg {
2243
- min-height: map.get($spacing-sizes, 90); // 360px
2244
- }
2245
-
2246
- .c-chart--xl {
2247
- min-height: map.get($spacing-sizes, 90); // 360px
2248
- }
2249
-
2250
- .c-chart__title {
2251
- font-size: $h4-font-size;
2252
- }
2253
-
2254
- .c-chart__legend {
2255
- padding: map.get($spacing-sizes, 6);
2256
- }
2257
-
2258
- // Enhanced hover effects on larger screens
2259
- .c-chart:hover {
2260
- transform: translateY(-2px);
2261
- }
2262
- }
2263
-
2264
- // Medium screens (tablets)
2265
- @media (max-width: 1024px) {
2266
- .c-chart {
2267
- min-height: map.get($spacing-sizes, '44'); // 176px
2268
- }
2269
-
2270
- .c-chart--sm {
2271
- min-height: map.get($spacing-sizes, '32'); // 128px
2272
- }
2273
-
2274
- .c-chart--lg {
2275
- min-height: map.get($spacing-sizes, '64'); // 256px
2276
- }
2277
-
2278
- .c-chart--xl {
2279
- min-height: map.get($spacing-sizes, '72'); // 288px
2280
- }
2281
-
2282
- .c-chart__header {
2283
- padding: map.get($spacing-sizes, 4);
2284
- }
2285
-
2286
- .c-chart__content {
2287
- padding: map.get($spacing-sizes, 4);
2288
- }
2289
-
2290
- .c-chart__legend {
2291
- padding: map.get($spacing-sizes, 3);
2292
- gap: map.get($spacing-sizes, 2);
2293
- }
2294
-
2295
- .c-chart__toolbar {
2296
- gap: map.get($spacing-sizes, 1);
2297
- }
2298
-
2299
- .c-chart__action {
2300
- width: map.get($spacing-sizes, 7);
2301
- height: map.get($spacing-sizes, 7);
2302
- }
2303
- }
2304
-
2305
- // Small screens (large phones)
2306
- @media (max-width: 768px) {
2307
- .c-chart {
2308
- min-height: map.get($spacing-sizes, '40'); // 160px
2309
- border-radius: $border-radius-md;
2310
- }
2311
-
2312
- .c-chart--sm {
2313
- min-height: map.get($spacing-sizes, '28'); // 112px
2314
- }
2315
-
2316
- .c-chart--lg {
2317
- min-height: map.get($spacing-sizes, '56'); // 224px
2318
- }
2319
-
2320
- .c-chart--xl {
2321
- min-height: map.get($spacing-sizes, '64'); // 256px
2322
- }
2323
-
2324
- .c-chart__header {
2325
- padding: map.get($spacing-sizes, 3);
2326
- flex-direction: column;
2327
- align-items: flex-start;
2328
- gap: map.get($spacing-sizes, 2);
2329
- }
2330
-
2331
- .c-chart__content {
2332
- padding: map.get($spacing-sizes, 3);
2333
- }
2334
-
2335
- .c-chart__legend {
2336
- padding: map.get($spacing-sizes, 3);
2337
- gap: map.get($spacing-sizes, 2);
2338
- flex-direction: column;
2339
- }
2340
-
2341
- .c-chart__legend-item {
2342
- padding: map.get($spacing-sizes, 2);
2343
- justify-content: space-between;
2344
- width: 100%;
2345
- }
2346
-
2347
- .c-chart__toolbar {
2348
- width: 100%;
2349
- justify-content: flex-end;
2350
- }
2351
-
2352
- .c-chart__tooltip {
2353
- max-width: map.get($spacing-sizes, 48); // 192px
2354
- font-size: $font-size-xs;
2355
- }
2356
-
2357
- .pie-slice:hover,
2358
- .donut-slice:hover {
2359
- transform: scale(1.02);
2360
- }
2361
- }
2362
-
2363
- // Extra small screens (small phones)
2364
- @media (max-width: 480px) {
2365
- .c-chart {
2366
- min-height: map.get($spacing-sizes, 36); // 144px
2367
- border-radius: $border-radius-sm;
2368
- }
2369
-
2370
- .c-chart--sm {
2371
- min-height: map.get($spacing-sizes, 24); // 96px
2372
- }
2373
-
2374
- .c-chart--lg {
2375
- min-height: map.get($spacing-sizes, 48); // 192px
2376
- }
2377
-
2378
- .c-chart--xl {
2379
- min-height: map.get($spacing-sizes, 56); // 224px
2380
- }
2381
-
2382
- .c-chart__title {
2383
- font-size: $font-size-md;
2384
- margin-bottom: map.get($spacing-sizes, 1);
2385
- }
2386
-
2387
- .c-chart__subtitle {
2388
- font-size: $font-size-xs;
2389
- }
2390
-
2391
- .c-chart__header {
2392
- padding: map.get($spacing-sizes, 2);
2393
- }
2394
-
2395
- .c-chart__content {
2396
- padding: map.get($spacing-sizes, 2);
2397
- }
2398
-
2399
- .c-chart__legend {
2400
- padding: map.get($spacing-sizes, 2);
2401
- gap: map.get($spacing-sizes, 1);
2402
- }
2403
-
2404
- .c-chart__legend-item {
2405
- padding: map.get($spacing-sizes, 1) map.get($spacing-sizes, 2);
2406
- font-size: $font-size-xs;
2407
- }
2408
-
2409
- .c-chart__legend-color {
2410
- width: map.get($spacing-sizes, 2);
2411
- height: map.get($spacing-sizes, 2);
2412
- }
2413
-
2414
- .c-chart__toolbar {
2415
- flex-wrap: wrap;
2416
- gap: map.get($spacing-sizes, 1);
2417
- }
2418
-
2419
- .c-chart__action {
2420
- width: map.get($spacing-sizes, 6);
2421
- height: map.get($spacing-sizes, 6);
2422
- font-size: $font-size-xs;
2423
- }
2424
-
2425
- .c-chart__tooltip {
2426
- max-width: calc(100vw - #{map.get($spacing-sizes, 8)});
2427
- padding: map.get($spacing-sizes, 2) map.get($spacing-sizes, 3);
2428
- }
2429
-
2430
- .c-chart__axis {
2431
- font-size: 10px;
2432
- }
2433
-
2434
- // Disable some animations on small screens for performance
2435
- .c-chart__data-point,
2436
- .bar,
2437
- .pie-slice,
2438
- .donut-slice {
2439
- transition-duration: 0.2s;
2440
- }
2441
- }
2442
-
2443
- // Ultra-wide screens
2444
- @media (min-width: 1600px) {
2445
- .c-chart--xl {
2446
- min-height: map.get($spacing-sizes, 90); // 360px
2447
- }
2448
-
2449
- .c-chart--2xl {
2450
- min-height: map.get($spacing-sizes, 96); // 384px
2451
- }
2452
-
2453
- .c-chart--full {
2454
- min-height: 50vh;
2455
- }
2456
- }
2457
-
2458
- // Print styles
2459
- @media print {
2460
- .c-chart {
2461
- break-inside: avoid;
2462
- box-shadow: none;
2463
- border: 1px solid #000;
2464
- background: white !important;
2465
- backdrop-filter: none;
2466
- }
2467
-
2468
- .c-chart__loading,
2469
- .c-chart__error,
2470
- .c-chart__toolbar {
2471
- display: none !important;
2472
- }
2473
-
2474
- .c-chart__title {
2475
- color: #000 !important;
2476
- background: none !important;
2477
- -webkit-text-fill-color: #000 !important;
2478
- }
2479
-
2480
- .c-chart__canvas svg {
2481
- filter: none !important;
2482
- }
2483
-
2484
- // Ensure chart elements are visible in print
2485
- .c-chart__data-point,
2486
- .bar,
2487
- .pie-slice,
2488
- .donut-slice {
2489
- stroke: #000 !important;
2490
- stroke-width: 1 !important;
2491
- }
2492
- }
2493
-
2494
- // Accessibility Enhancements
2495
- // =============================================================================
2496
- .c-chart {
2497
- &:focus-visible {
2498
- @include component.focus-ring;
2499
- }
2500
-
2501
- // Screen reader support
2502
- &[aria-hidden='true'] {
2503
- pointer-events: none;
2504
- opacity: 0.5;
2505
- }
2506
-
2507
- // Keyboard navigation support
2508
- &[tabindex]:focus {
2509
- outline: none;
2510
- }
2511
-
2512
- // Enhanced keyboard navigation
2513
- &[data-keyboard-navigation='true'] {
2514
- .c-chart__data-point,
2515
- .bar,
2516
- .pie-slice,
2517
- .donut-slice {
2518
- &:focus {
2519
- outline: 2px solid var(--atomix-primary-border-subtle);
2520
- outline-offset: 2px;
2521
- }
2522
- }
2523
- }
2524
- }
2525
-
2526
- // High contrast mode support
2527
- @media (prefers-contrast: high) {
2528
- .c-chart {
2529
- border-width: 2px;
2530
- background-color: white;
2531
- color: black;
2532
- backdrop-filter: none;
2533
- }
2534
-
2535
- .c-chart__grid {
2536
- stroke-width: 2;
2537
- opacity: 0.8;
2538
- stroke: black;
2539
- }
2540
-
2541
- .c-chart__axis {
2542
- color: black;
2543
-
2544
- .axis-line,
2545
- .tick-line {
2546
- stroke: black;
2547
- opacity: 1;
2548
- }
2549
- }
2550
-
2551
- .c-chart__title {
2552
- color: black;
2553
- background: none;
2554
- -webkit-text-fill-color: black;
2555
- }
2556
-
2557
- .c-chart__legend-item {
2558
- border-color: black;
2559
-
2560
- &:hover {
2561
- background-color: #f0f0f0;
2562
- }
2563
- }
2564
-
2565
- .c-chart__data-point {
2566
- stroke: black;
2567
- stroke-width: 2;
2568
- }
2569
-
2570
- .line-path {
2571
- stroke: black;
2572
- stroke-width: 3;
2573
- }
2574
-
2575
- .bar {
2576
- stroke: black;
2577
- stroke-width: 1;
2578
- }
2579
-
2580
- .pie-slice,
2581
- .donut-slice {
2582
- stroke: black;
2583
- stroke-width: 3;
2584
- }
2585
-
2586
- // Ensure patterns are visible
2587
- .c-chart__legend-color {
2588
- border-width: 2px;
2589
- border-color: black;
2590
- }
2591
- }
2592
-
2593
- // Reduced motion preferences
2594
- @media (prefers-reduced-motion: reduce) {
2595
- .c-chart {
2596
- transition: none;
2597
-
2598
- &:hover {
2599
- transform: none;
2600
- }
2601
- }
2602
-
2603
- .c-chart__data-point,
2604
- .bar,
2605
- .pie-slice,
2606
- .donut-slice,
2607
- .scatter-point,
2608
- .bubble {
2609
- transition: none;
2610
- animation: none;
2611
-
2612
- &:hover {
2613
- transform: none;
2614
- animation: none;
2615
- }
2616
- }
2617
-
2618
- .line-path {
2619
- animation: none;
2620
- stroke-dasharray: none;
2621
- stroke-dashoffset: 0;
2622
- }
2623
-
2624
- .area-path {
2625
- animation: none;
2626
- }
2627
-
2628
- .c-chart__loading-spinner {
2629
- animation: none;
2630
-
2631
- &::after {
2632
- animation: none;
2633
- }
2634
- }
2635
-
2636
- .c-chart__loading-text {
2637
- animation: none;
2638
- }
2639
-
2640
- .c-chart__tooltip {
2641
- transition: none;
2642
- transform: none;
2643
- opacity: 1;
2644
- }
2645
-
2646
- .c-chart__legend-item {
2647
- transition: none;
2648
-
2649
- &:hover {
2650
- transform: none;
2651
- }
2652
- }
2653
-
2654
- // Disable all chart animations
2655
- * {
2656
- animation-duration: 0s !important;
2657
- animation-delay: 0s !important;
2658
- transition-duration: 0s !important;
2659
- transition-delay: 0s !important;
2660
- }
2661
- }
2662
-
2663
- // Focus management for interactive elements
2664
- .c-chart__data-point,
2665
- .bar,
2666
- .pie-slice,
2667
- .donut-slice,
2668
- .scatter-point,
2669
- .bubble {
2670
- &:focus-visible {
2671
- outline: 2px solid var(--atomix-primary-border-subtle);
2672
- outline-offset: 2px;
2673
- }
2674
- }
2675
-
2676
- .c-chart__legend-item {
2677
- &:focus-visible {
2678
- @include component.focus-ring;
2679
- }
2680
- }
2681
-
2682
- .c-chart__action {
2683
- &:focus-visible {
2684
- @include component.focus-ring;
2685
- }
2686
- }
2687
-
2688
- // Touch device optimizations
2689
- @media (hover: none) and (pointer: coarse) {
2690
- .c-chart__data-point,
2691
- .bar,
2692
- .pie-slice,
2693
- .donut-slice {
2694
- // Increase touch targets
2695
- &::after {
2696
- content: '';
2697
- position: absolute;
2698
- top: -#{map.get($spacing-sizes, 2)};
2699
- left: -#{map.get($spacing-sizes, 2)};
2700
- right: -#{map.get($spacing-sizes, 2)};
2701
- bottom: -#{map.get($spacing-sizes, 2)};
2702
- min-width: map.get($spacing-sizes, 8);
2703
- min-height: map.get($spacing-sizes, 8);
2704
- }
2705
- }
2706
-
2707
- .c-chart__legend-item {
2708
- min-height: $chart-touch-target-size;
2709
- padding: map.get($spacing-sizes, 2) map.get($spacing-sizes, 3);
2710
- }
2711
-
2712
- .c-chart__action {
2713
- min-width: $chart-touch-target-size;
2714
- min-height: $chart-touch-target-size;
2715
- }
2716
-
2717
- // Enhanced touch feedback
2718
- .c-chart__data-point:active,
2719
- .bar:active,
2720
- .pie-slice:active,
2721
- .donut-slice:active {
2722
- opacity: 0.7;
2723
- }
2724
- }
2725
-
2726
- // CSS Grid support for complex layouts
2727
- .c-chart--grid {
2728
- display: grid;
2729
- grid-template-rows: auto 1fr auto;
2730
- grid-template-areas:
2731
- 'header'
2732
- 'content'
2733
- 'legend';
2734
-
2735
- .c-chart__header {
2736
- grid-area: header;
2737
- }
2738
-
2739
- .c-chart__content {
2740
- grid-area: content;
2741
- }
2742
-
2743
- .c-chart__legend {
2744
- grid-area: legend;
2745
- }
2746
-
2747
- // Side legend layout
2748
- &.c-chart--legend-side {
2749
- grid-template-columns: 1fr auto;
2750
- grid-template-areas:
2751
- 'header header'
2752
- 'content legend';
2753
-
2754
- .c-chart__legend {
2755
- border-top: none;
2756
- border-left: $chart-border-width solid var(--atomix-primary-border-subtle);
2757
- flex-direction: column;
2758
- max-width: map.get($spacing-sizes, 64);
2759
- }
2760
- }
2761
- }
2762
-
2763
- // Modern CSS features
2764
- @supports (backdrop-filter: blur(10px)) {
2765
- .c-chart {
2766
- backdrop-filter: blur($chart-backdrop-blur);
2767
- }
2768
-
2769
- .c-chart__header {
2770
- backdrop-filter: blur($chart-header-backdrop-blur);
2771
- }
2772
-
2773
- .c-chart__tooltip {
2774
- backdrop-filter: blur($chart-tooltip-backdrop-blur);
2775
- }
2776
- }
2777
-
2778
- @supports (container-type: inline-size) {
2779
- .c-chart__content {
2780
- container-type: inline-size;
2781
- }
2782
- }
2783
-
2784
- @supports (color-mix(in srgb, red, blue)) {
2785
- .c-chart {
2786
- --chart-mixed-color: color-mix(in srgb, var(--chart-primary-color) 70%, white);
2787
- }
2788
- }