@opendata-ai/openchart-core 7.11.0 → 8.0.0-rc.10

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 (59) hide show
  1. package/dist/index.d.ts +1348 -132
  2. package/dist/index.js +556 -48
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles.css +2 -1
  5. package/dist/styles.css.map +1 -0
  6. package/package.json +9 -3
  7. package/schema/chart.schema.json +9086 -0
  8. package/schema/table.schema.json +861 -0
  9. package/schema/vizspec.schema.json +17922 -0
  10. package/src/accessibility/alt-text.ts +39 -1
  11. package/src/accessibility/aria.ts +4 -2
  12. package/src/colors/__tests__/colorblind.test.ts +12 -0
  13. package/src/colors/colorblind.ts +11 -2
  14. package/src/colors/contrast.ts +11 -0
  15. package/src/colors/index.ts +9 -1
  16. package/src/colors/palettes.ts +47 -0
  17. package/src/helpers/__tests__/deep-merge.test.ts +54 -0
  18. package/src/helpers/__tests__/spec-builders.test.ts +3 -3
  19. package/src/helpers/deep-merge.ts +29 -0
  20. package/src/helpers/spec-builders.ts +7 -7
  21. package/src/index.ts +29 -1
  22. package/src/labels/collision.ts +1 -0
  23. package/src/layout/chrome.ts +24 -0
  24. package/src/layout/index.ts +1 -1
  25. package/src/locale/__tests__/format.test.ts +347 -11
  26. package/src/locale/format.ts +243 -18
  27. package/src/locale/index.ts +10 -1
  28. package/src/responsive/breakpoints.ts +7 -2
  29. package/src/responsive/index.ts +2 -0
  30. package/src/responsive/metrics.ts +77 -10
  31. package/src/schema/__tests__/generated-artifacts.test.ts +42 -0
  32. package/src/schema/__tests__/schema.test.ts +179 -0
  33. package/src/styles/__tests__/reduced-motion-selectors.test.ts +28 -0
  34. package/src/styles/animation.css +211 -168
  35. package/src/styles/base.css +89 -62
  36. package/src/styles/chrome.css +173 -179
  37. package/src/styles/dark.css +38 -35
  38. package/src/styles/graph.css +116 -111
  39. package/src/styles/index.css +5 -0
  40. package/src/styles/keyframes.css +130 -99
  41. package/src/styles/legend.css +14 -12
  42. package/src/styles/reduced-motion.css +61 -40
  43. package/src/styles/series-search.css +153 -0
  44. package/src/styles/sparkline.css +14 -12
  45. package/src/styles/table-animation.css +82 -80
  46. package/src/styles/table.css +314 -302
  47. package/src/styles/token-definitions.ts +199 -0
  48. package/src/styles/tokens.css +132 -128
  49. package/src/styles/tooltip.css +109 -115
  50. package/src/styles/you-draw-it.css +126 -0
  51. package/src/types/__tests__/encoding.test.ts +86 -17
  52. package/src/types/__tests__/spec.test.ts +16 -12
  53. package/src/types/encoding.ts +69 -25
  54. package/src/types/events.ts +107 -13
  55. package/src/types/index.ts +42 -3
  56. package/src/types/layout.ts +484 -11
  57. package/src/types/schema-roots.ts +32 -0
  58. package/src/types/spec.ts +718 -87
  59. package/src/types/table.ts +3 -2
@@ -1,130 +1,135 @@
1
- /* ---------------------------------------------------------------------------
2
- * Graph
3
- * --------------------------------------------------------------------------- */
1
+ @layer oc.components {
2
+ /* ---------------------------------------------------------------------------
3
+ * Graph
4
+ * --------------------------------------------------------------------------- */
4
5
 
5
- .oc-graph-wrapper {
6
- position: relative;
7
- overflow: hidden;
8
- background: var(--oc-bg);
9
- font-family: var(--oc-font-family);
10
- width: 100%;
11
- height: 100%;
12
- }
6
+ .oc-graph-wrapper {
7
+ position: relative;
8
+ overflow: hidden;
9
+ background: var(--oc-bg);
10
+ font-family: var(--oc-font-family);
11
+ width: 100%;
12
+ height: 100%;
13
+ }
13
14
 
14
- .oc-graph-canvas {
15
- display: block;
16
- width: 100%;
17
- height: 100%;
18
- cursor: grab;
19
- }
15
+ .oc-graph-canvas {
16
+ display: block;
17
+ width: 100%;
18
+ height: 100%;
19
+ cursor: grab;
20
+ }
20
21
 
21
- .oc-graph-canvas--dragging {
22
- cursor: grabbing;
23
- }
22
+ .oc-graph-canvas--dragging {
23
+ cursor: grabbing;
24
+ }
24
25
 
25
- .oc-graph-chrome {
26
- position: absolute;
27
- top: 0;
28
- left: 0;
29
- right: 0;
30
- z-index: 2;
31
- padding: 16px 16px 8px;
32
- pointer-events: none;
26
+ .oc-graph-chrome {
27
+ position: absolute;
28
+ top: 0;
29
+ left: 0;
30
+ right: 0;
31
+ z-index: 2;
32
+ padding: 16px 16px 8px;
33
+ pointer-events: none;
33
34
 
34
- & .oc-title {
35
- font-size: var(--oc-title-size);
36
- font-weight: var(--oc-title-weight);
37
- letter-spacing: var(--oc-title-tracking);
38
- color: var(--oc-text);
39
- margin: 0 0 4px;
40
- --_stroke: color-mix(in srgb, var(--oc-bg) 80%, transparent);
41
- text-shadow:
42
- -2px -2px 0 var(--_stroke),
43
- 2px -2px 0 var(--_stroke),
44
- -2px 2px 0 var(--_stroke),
45
- 2px 2px 0 var(--_stroke),
46
- 0 -2px 0 var(--_stroke),
47
- 0 2px 0 var(--_stroke),
48
- -2px 0 0 var(--_stroke),
49
- 2px 0 0 var(--_stroke);
35
+ & .oc-title {
36
+ font-size: var(--oc-title-size);
37
+ font-weight: var(--oc-title-weight);
38
+ letter-spacing: var(--oc-title-tracking);
39
+ color: var(--oc-text);
40
+ margin: 0 0 4px;
41
+ --_stroke: color-mix(in srgb, var(--oc-bg) 80%, transparent);
42
+ text-shadow:
43
+ -2px -2px 0 var(--_stroke),
44
+ 2px -2px 0 var(--_stroke),
45
+ -2px 2px 0 var(--_stroke),
46
+ 2px 2px 0 var(--_stroke),
47
+ 0 -2px 0 var(--_stroke),
48
+ 0 2px 0 var(--_stroke),
49
+ -2px 0 0 var(--_stroke),
50
+ 2px 0 0 var(--_stroke);
51
+ }
52
+
53
+ & .oc-subtitle {
54
+ font-size: var(--oc-subtitle-size);
55
+ color: var(--oc-text-secondary);
56
+ margin: 0;
57
+ --_stroke: color-mix(in srgb, var(--oc-bg) 80%, transparent);
58
+ text-shadow:
59
+ -1px -1px 0 var(--_stroke),
60
+ 1px -1px 0 var(--_stroke),
61
+ -1px 1px 0 var(--_stroke),
62
+ 1px 1px 0 var(--_stroke);
63
+ }
50
64
  }
51
65
 
52
- & .oc-subtitle {
53
- font-size: var(--oc-subtitle-size);
66
+ .oc-graph-legend {
67
+ position: absolute;
68
+ top: 8px;
69
+ right: 8px;
70
+ background: var(--oc-bg);
71
+ border: 1px solid var(--oc-border);
72
+ border-radius: var(--oc-border-radius);
73
+ padding: 8px 12px;
74
+ font-size: 12px;
54
75
  color: var(--oc-text-secondary);
55
- margin: 0;
56
- --_stroke: color-mix(in srgb, var(--oc-bg) 80%, transparent);
57
- text-shadow:
58
- -1px -1px 0 var(--_stroke),
59
- 1px -1px 0 var(--_stroke),
60
- -1px 1px 0 var(--_stroke),
61
- 1px 1px 0 var(--_stroke);
76
+ max-height: 200px;
77
+ overflow-y: auto;
62
78
  }
63
- }
64
79
 
65
- .oc-graph-legend {
66
- position: absolute;
67
- top: 8px;
68
- right: 8px;
69
- background: var(--oc-bg);
70
- border: 1px solid var(--oc-border);
71
- border-radius: var(--oc-border-radius);
72
- padding: 8px 12px;
73
- font-size: 12px;
74
- color: var(--oc-text-secondary);
75
- max-height: 200px;
76
- overflow-y: auto;
77
- }
80
+ .oc-graph-legend-item {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 6px;
84
+ padding: 2px 0;
85
+ }
78
86
 
79
- .oc-graph-legend-item {
80
- display: flex;
81
- align-items: center;
82
- gap: 6px;
83
- padding: 2px 0;
84
- }
87
+ .oc-graph-legend-swatch {
88
+ width: 10px;
89
+ height: 10px;
90
+ border-radius: 50%;
91
+ flex-shrink: 0;
92
+ }
85
93
 
86
- .oc-graph-legend-swatch {
87
- width: 10px;
88
- height: 10px;
89
- border-radius: 50%;
90
- flex-shrink: 0;
91
- }
94
+ .oc-graph-search {
95
+ position: absolute;
96
+ top: 8px;
97
+ left: 8px;
92
98
 
93
- .oc-graph-search {
94
- position: absolute;
95
- top: 8px;
96
- left: 8px;
99
+ & input {
100
+ font-family: var(--oc-font-family);
101
+ font-size: var(--oc-body-size);
102
+ padding: 6px 10px;
103
+ border: 1px solid var(--oc-border);
104
+ border-radius: var(--oc-border-radius);
105
+ background: var(--oc-bg);
106
+ color: var(--oc-text);
107
+ outline: none;
97
108
 
98
- & input {
99
- font-family: var(--oc-font-family);
100
- font-size: var(--oc-body-size);
101
- padding: 6px 10px;
102
- border: 1px solid var(--oc-border);
103
- border-radius: var(--oc-border-radius);
104
- background: var(--oc-bg);
105
- color: var(--oc-text);
106
- outline: none;
107
-
108
- &:focus {
109
- border-color: var(--oc-focus);
110
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.25);
109
+ &:focus {
110
+ border-color: var(--oc-focus);
111
+ box-shadow: 0 0 0 2px var(--oc-focus-ring-strong);
112
+ }
111
113
  }
112
114
  }
113
- }
114
-
115
- /* Dark mode graph overrides (darker bg for canvas-based rendering) */
116
- .oc-dark .oc-graph-wrapper,
117
- .oc-graph-wrapper.oc-dark {
118
- --oc-bg: #0d1117;
119
- }
120
115
 
121
- .oc-dark .oc-graph-legend,
122
- .oc-dark.oc-graph-wrapper .oc-graph-legend {
123
- background: rgba(13, 17, 23, 0.85);
124
- border-color: rgba(255, 255, 255, 0.1);
125
- }
116
+ /* Dark mode graph overrides (darker bg for canvas-based rendering) */
117
+ .oc-dark .oc-graph-wrapper,
118
+ .oc-graph-wrapper.oc-dark {
119
+ /* GitHub-dark canvas background, intentionally not a token */
120
+ --oc-bg: #0d1117;
121
+ }
126
122
 
127
- .oc-dark .oc-graph-search input {
128
- background: rgba(13, 17, 23, 0.85);
129
- border-color: rgba(255, 255, 255, 0.1);
123
+ /*
124
+ * graph-mount.ts stamps .oc-dark on both .oc-graph-wrapper and
125
+ * .oc-graph-container simultaneously, so the self-variant
126
+ * (.oc-dark.oc-graph-wrapper) and descendant variant
127
+ * (.oc-dark .oc-graph-legend) resolve identically.
128
+ */
129
+ .oc-dark .oc-graph-legend,
130
+ .oc-dark.oc-graph-wrapper .oc-graph-legend,
131
+ .oc-dark .oc-graph-search input {
132
+ background: rgba(13, 17, 23, 0.85);
133
+ border-color: var(--oc-border);
134
+ }
130
135
  }
@@ -4,16 +4,21 @@
4
4
  * CSS with oc- prefix for all class names.
5
5
  * CSS custom properties for theme overrides.
6
6
  * Dark mode via .oc-dark class on the container.
7
+ * Cascade layers: oc.tokens, oc.base, oc.components, oc.animation, oc.reduced-motion.
7
8
  */
8
9
 
9
10
  /* For optimal typography, load Inter: https://fonts.google.com/specimen/Inter */
10
11
 
12
+ @layer oc.tokens, oc.base, oc.components, oc.animation, oc.reduced-motion;
13
+
11
14
  @import "./tokens.css";
12
15
  @import "./dark.css";
13
16
  @import "./base.css";
14
17
  @import "./chrome.css";
15
18
  @import "./tooltip.css";
16
19
  @import "./legend.css";
20
+ @import "./series-search.css";
21
+ @import "./you-draw-it.css";
17
22
  @import "./table.css";
18
23
  @import "./table-animation.css";
19
24
  @import "./graph.css";
@@ -1,120 +1,151 @@
1
- /* ---------------------------------------------------------------------------
2
- * Animation keyframes
3
- * --------------------------------------------------------------------------- */
1
+ @layer oc.animation {
2
+ /* ---------------------------------------------------------------------------
3
+ * Animation keyframes
4
+ * --------------------------------------------------------------------------- */
4
5
 
5
- /* Bar entrance: clip-path reveal bottom-to-top + fade in (vertical columns).
6
- Bars grow upward from baseline with a soft opacity fade. */
7
- @keyframes oc-enter-bar {
8
- from {
9
- clip-path: inset(100% 0 0 0);
10
- opacity: 0;
6
+ /* Bar entrance: clip-path reveal bottom-to-top + fade in (vertical columns).
7
+ Bars grow upward from baseline with a soft opacity fade. */
8
+ @keyframes oc-enter-bar {
9
+ from {
10
+ clip-path: inset(100% 0 0 0);
11
+ opacity: 0;
12
+ }
13
+ 75% {
14
+ opacity: 1;
15
+ }
16
+ to {
17
+ clip-path: inset(0 0 0 0);
18
+ opacity: 1;
19
+ }
11
20
  }
12
- 75% {
13
- opacity: 1;
14
- }
15
- to {
16
- clip-path: inset(0 0 0 0);
17
- opacity: 1;
18
- }
19
- }
20
21
 
21
- /* Bar entrance: clip-path reveal left-to-right + fade in (horizontal bars).
22
- Bars grow rightward from axis with a soft opacity fade. */
23
- @keyframes oc-enter-bar-h {
24
- from {
25
- clip-path: inset(0 100% 0 0);
26
- opacity: 0;
27
- }
28
- 75% {
29
- opacity: 1;
30
- }
31
- to {
32
- clip-path: inset(0 0 0 0);
33
- opacity: 1;
22
+ /* Bar entrance: clip-path reveal left-to-right + fade in (horizontal bars).
23
+ Bars grow rightward from axis with a soft opacity fade. */
24
+ @keyframes oc-enter-bar-h {
25
+ from {
26
+ clip-path: inset(0 100% 0 0);
27
+ opacity: 0;
28
+ }
29
+ 75% {
30
+ opacity: 1;
31
+ }
32
+ to {
33
+ clip-path: inset(0 0 0 0);
34
+ opacity: 1;
35
+ }
34
36
  }
35
- }
36
37
 
37
- /* Line/area entrance: clip-path reveal left-to-right + fade in.
38
- Lines draw in following reading direction with a soft lead-in. */
39
- @keyframes oc-enter-line {
40
- from {
41
- clip-path: inset(0 100% 0 0);
42
- opacity: 0;
43
- }
44
- 15% {
45
- opacity: 1;
46
- }
47
- to {
48
- clip-path: inset(0 0 0 0);
49
- opacity: 1;
38
+ /* Line/area entrance: clip-path reveal left-to-right + fade in.
39
+ Lines draw in following reading direction with a soft lead-in. */
40
+ @keyframes oc-enter-line {
41
+ from {
42
+ clip-path: inset(0 100% 0 0);
43
+ opacity: 0;
44
+ }
45
+ 15% {
46
+ opacity: 1;
47
+ }
48
+ to {
49
+ clip-path: inset(0 0 0 0);
50
+ opacity: 1;
51
+ }
50
52
  }
51
- }
52
53
 
53
- /* Point/arc entrance: scale up + fade in from center */
54
- @keyframes oc-enter-point {
55
- from {
56
- opacity: 0;
57
- transform: scale(0.3);
58
- }
59
- to {
60
- opacity: 1;
61
- transform: scale(1);
54
+ /* Point/arc entrance: scale up + fade in from center */
55
+ @keyframes oc-enter-point {
56
+ from {
57
+ opacity: 0;
58
+ transform: scale(0.3);
59
+ }
60
+ to {
61
+ opacity: 1;
62
+ transform: scale(1);
63
+ }
62
64
  }
63
- }
64
65
 
65
- /* Pure opacity fade (no transform). Safe for elements with existing transforms
66
- like arc groups that use translate() for positioning. */
67
- @keyframes oc-enter-fade-only {
68
- from {
69
- opacity: 0;
70
- }
71
- to {
72
- opacity: 1;
66
+ /* Map feature entrance: fade in while transitioning fill from a neutral base
67
+ to the data-driven color stored in --oc-feature-fill. The target opacity is
68
+ --oc-feature-target-opacity (default 1) so features under a focus dim
69
+ animate straight to their dimmed rest opacity instead of hitting 1 and then
70
+ snapping down when the dim is applied post-animation. */
71
+ @keyframes oc-enter-map-fill {
72
+ from {
73
+ fill: var(--oc-secondary);
74
+ opacity: 0;
75
+ }
76
+ to {
77
+ fill: var(--oc-feature-fill);
78
+ opacity: var(--oc-feature-target-opacity, 1);
79
+ }
73
80
  }
74
- }
75
81
 
76
- /* Fade + subtle slide up for text, rule, tick, annotations */
77
- @keyframes oc-enter-fade {
78
- from {
79
- opacity: 0;
80
- transform: translateY(4px);
82
+ /* Map point pop-in: gentle scale from 0.75 + fade. Uses transform-origin to
83
+ scale from the circle's own center (cx/cy) rather than the SVG origin. */
84
+ @keyframes oc-enter-map-point {
85
+ from {
86
+ opacity: 0;
87
+ transform: scale(0.75);
88
+ }
89
+ to {
90
+ opacity: 1;
91
+ transform: scale(1);
92
+ }
81
93
  }
82
- to {
83
- opacity: 1;
84
- transform: translateY(0);
85
- }
86
- }
87
94
 
88
- /* Table row entrance: slide up only, no opacity (cells fade independently
89
- to avoid opacity compounding between row and cell animations) */
90
- @keyframes oc-table-enter-row {
91
- from {
92
- transform: translateY(6px);
95
+ /* Pure opacity fade (no transform). Safe for elements with existing transforms
96
+ like arc groups that use translate() for positioning. */
97
+ @keyframes oc-enter-fade-only {
98
+ from {
99
+ opacity: 0;
100
+ }
101
+ to {
102
+ opacity: 1;
103
+ }
93
104
  }
94
- to {
95
- transform: translateY(0);
96
- }
97
- }
98
105
 
99
- /* Table bar fill entrance: clip-path grow only, no opacity
100
- (preserves resting opacity: 0.15 from table.css) */
101
- @keyframes oc-table-enter-bar-fill {
102
- from {
103
- clip-path: inset(0 100% 0 0);
106
+ /* Fade + subtle slide up for text, rule, tick, annotations */
107
+ @keyframes oc-enter-fade {
108
+ from {
109
+ opacity: 0;
110
+ transform: translateY(4px);
111
+ }
112
+ to {
113
+ opacity: 1;
114
+ transform: translateY(0);
115
+ }
104
116
  }
105
- to {
106
- clip-path: inset(0 0 0 0);
117
+
118
+ /* Table row entrance: slide up only, no opacity (cells fade independently
119
+ to avoid opacity compounding between row and cell animations) */
120
+ @keyframes oc-table-enter-row {
121
+ from {
122
+ transform: translateY(6px);
123
+ }
124
+ to {
125
+ transform: translateY(0);
126
+ }
107
127
  }
108
- }
109
128
 
110
- /* Tooltip entrance */
111
- @keyframes oc-tooltip-in {
112
- from {
113
- opacity: 0;
114
- transform: translateY(2px);
129
+ /* Table bar fill entrance: clip-path grow only, no opacity
130
+ (preserves resting opacity: 0.15 from table.css) */
131
+ @keyframes oc-table-enter-bar-fill {
132
+ from {
133
+ clip-path: inset(0 100% 0 0);
134
+ }
135
+ to {
136
+ clip-path: inset(0 0 0 0);
137
+ }
115
138
  }
116
- to {
117
- opacity: 1;
118
- transform: translateY(0);
139
+
140
+ /* Tooltip entrance */
141
+ @keyframes oc-tooltip-in {
142
+ from {
143
+ opacity: 0;
144
+ transform: translateY(2px);
145
+ }
146
+ to {
147
+ opacity: 1;
148
+ transform: translateY(0);
149
+ }
119
150
  }
120
151
  }
@@ -1,16 +1,18 @@
1
- /* ---------------------------------------------------------------------------
2
- * Legend
3
- * --------------------------------------------------------------------------- */
1
+ @layer oc.components {
2
+ /* ---------------------------------------------------------------------------
3
+ * Legend
4
+ * --------------------------------------------------------------------------- */
4
5
 
5
- .oc-legend {
6
- font-family: var(--oc-font-family);
7
- font-size: var(--oc-body-size);
8
- }
6
+ .oc-legend {
7
+ font-family: var(--oc-font-family);
8
+ font-size: var(--oc-body-size);
9
+ }
9
10
 
10
- .oc-legend-entry {
11
- cursor: default;
12
- }
11
+ .oc-legend-entry {
12
+ cursor: default;
13
+ }
13
14
 
14
- .oc-legend text {
15
- fill: var(--oc-legend-text);
15
+ .oc-legend text {
16
+ fill: var(--oc-legend-text);
17
+ }
16
18
  }
@@ -1,46 +1,67 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
  * Reduced motion
3
+ *
4
+ * Catch-all: last-declared layer beats every earlier layer regardless of
5
+ * specificity. No !important, no hand-maintained selector mirror.
6
+ *
7
+ * Selector list matches CSS_TOKEN_ROOT_SELECTORS in token-definitions.ts.
3
8
  * --------------------------------------------------------------------------- */
4
9
 
5
- @media (prefers-reduced-motion: reduce) {
6
- .oc-table-sort-btn::before,
7
- .oc-table-sort-btn::after,
8
- .oc-table-search input,
9
- .oc-table-pagination button {
10
- transition: none;
11
- }
12
-
13
- /* Disable all chart entrance animations */
14
- .oc-animate .oc-mark-rect rect,
15
- .oc-animate .oc-mark-bar rect,
16
- .oc-animate .oc-mark-arc,
17
- .oc-animate .oc-mark-line,
18
- .oc-animate .oc-mark-area,
19
- .oc-animate circle.oc-mark-point,
20
- .oc-animate circle.oc-mark-circle,
21
- .oc-animate .oc-mark-text text,
22
- .oc-animate .oc-mark-rule line,
23
- .oc-animate .oc-mark-tick line,
24
- .oc-animate .oc-mark-label,
25
- .oc-animate .oc-annotation,
26
- .oc-animate .oc-sankey-node rect,
27
- .oc-animate .oc-sankey-link path {
28
- animation: none;
29
- }
30
-
31
- /* Disable all table entrance animations */
32
- .oc-table-wrapper.oc-animate > .oc-chrome,
33
- .oc-table-wrapper.oc-animate thead,
34
- .oc-table-wrapper.oc-animate tbody tr,
35
- .oc-table-wrapper.oc-animate tbody td,
36
- .oc-table-wrapper.oc-animate td.oc-table-heatmap,
37
- .oc-table-wrapper.oc-animate td.oc-table-category,
38
- .oc-table-wrapper.oc-animate .oc-table-bar-fill,
39
- .oc-table-wrapper.oc-animate .oc-table-sparkline > svg,
40
- .oc-table-wrapper.oc-animate .oc-table-sparkline-dot,
41
- .oc-table-wrapper.oc-animate .oc-table-sparkline-labels,
42
- .oc-table-wrapper.oc-animate .oc-table-search,
43
- .oc-table-wrapper.oc-animate .oc-table-pagination {
44
- animation: none;
10
+ @layer oc.reduced-motion {
11
+ @media (prefers-reduced-motion: reduce) {
12
+ :is(
13
+ .oc-root,
14
+ .oc-chart-root,
15
+ .oc-table-wrapper,
16
+ .oc-table-root,
17
+ .oc-graph-wrapper,
18
+ .oc-graph-root,
19
+ .oc-sankey-root,
20
+ .oc-tilemap-root,
21
+ .oc-barlist-root,
22
+ .oc-map-root
23
+ ),
24
+ :is(
25
+ .oc-root,
26
+ .oc-chart-root,
27
+ .oc-table-wrapper,
28
+ .oc-table-root,
29
+ .oc-graph-wrapper,
30
+ .oc-graph-root,
31
+ .oc-sankey-root,
32
+ .oc-tilemap-root,
33
+ .oc-barlist-root,
34
+ .oc-map-root
35
+ )
36
+ *,
37
+ :is(
38
+ .oc-root,
39
+ .oc-chart-root,
40
+ .oc-table-wrapper,
41
+ .oc-table-root,
42
+ .oc-graph-wrapper,
43
+ .oc-graph-root,
44
+ .oc-sankey-root,
45
+ .oc-tilemap-root,
46
+ .oc-barlist-root,
47
+ .oc-map-root
48
+ )
49
+ *::before,
50
+ :is(
51
+ .oc-root,
52
+ .oc-chart-root,
53
+ .oc-table-wrapper,
54
+ .oc-table-root,
55
+ .oc-graph-wrapper,
56
+ .oc-graph-root,
57
+ .oc-sankey-root,
58
+ .oc-tilemap-root,
59
+ .oc-barlist-root,
60
+ .oc-map-root
61
+ )
62
+ *::after {
63
+ animation: none;
64
+ transition: none;
65
+ }
45
66
  }
46
67
  }