@yewdiel21/motion-kit 0.18.0 → 0.19.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 (68) hide show
  1. package/README.md +240 -222
  2. package/dist/auto/index.d.ts +4 -3
  3. package/dist/auto/index.js +5 -3
  4. package/dist/auto/index.js.map +1 -1
  5. package/dist/{chunk-QFBOHPWZ.js → chunk-CQP66AZK.js} +2 -2
  6. package/dist/{chunk-QP4QJOEN.js → chunk-H4STLMCM.js} +2 -2
  7. package/dist/{chunk-EDMXWUW3.js → chunk-KDIJX6G4.js} +3 -3
  8. package/dist/{chunk-DOOMULVV.js → chunk-OLT3CWDJ.js} +4 -2
  9. package/dist/chunk-OLT3CWDJ.js.map +1 -0
  10. package/dist/{chunk-AWDEKDEJ.js → chunk-PEDYJ2TV.js} +8 -22
  11. package/dist/chunk-PEDYJ2TV.js.map +1 -0
  12. package/dist/{chunk-Q7IW4FV3.js → chunk-Y4GIBTRG.js} +1422 -967
  13. package/dist/chunk-Y4GIBTRG.js.map +1 -0
  14. package/dist/css/components/code-block.css +267 -0
  15. package/dist/css/components/command-search.css +274 -2
  16. package/dist/css/components/dialog.css +264 -0
  17. package/dist/css/components/heatmap-chart.css +267 -1
  18. package/dist/css/components/scroll-area.css +261 -0
  19. package/dist/css/components/select.css +284 -4
  20. package/dist/elements/index.d.ts +15 -4
  21. package/dist/elements/index.js +36 -6
  22. package/dist/elements/index.js.map +1 -1
  23. package/dist/{engine-t8d7brjn.d.ts → engine-D6XV-WNt.d.ts} +50 -1
  24. package/dist/gl/index.js +2 -2
  25. package/dist/index.css +308 -7
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.js +7 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/react/index.d.ts +20 -7
  30. package/dist/react/index.js +56 -7
  31. package/dist/react/index.js.map +1 -1
  32. package/dist/{reduced-dPsZYqtI.d.ts → reduced-4croIXl-.d.ts} +1 -1
  33. package/dist/{store-6hZNKiee.d.ts → store-CAHWkurn.d.ts} +1 -1
  34. package/package.json +110 -110
  35. package/registry.json +1357 -1340
  36. package/src/auto/auto-init.ts +341 -339
  37. package/src/components/code-block/README.md +1 -1
  38. package/src/components/code-block/code-block.css +5 -0
  39. package/src/components/code-block/engine.ts +5 -0
  40. package/src/components/command-search/README.md +1 -1
  41. package/src/components/command-search/command-search.css +12 -2
  42. package/src/components/command-search/engine.ts +6 -0
  43. package/src/components/dialog/README.md +104 -103
  44. package/src/components/dialog/dialog.css +2 -0
  45. package/src/components/dialog/engine.ts +465 -449
  46. package/src/components/heatmap-chart/README.md +48 -48
  47. package/src/components/heatmap-chart/engine.ts +6 -1
  48. package/src/components/heatmap-chart/heatmap-chart.css +5 -1
  49. package/src/components/icons.ts +1 -0
  50. package/src/components/scroll-area/README.md +89 -0
  51. package/src/components/scroll-area/element.ts +35 -0
  52. package/src/components/scroll-area/engine.ts +528 -0
  53. package/src/components/scroll-area/react.tsx +67 -0
  54. package/src/components/scroll-area/scroll-area.css +260 -0
  55. package/src/components/select/README.md +1 -1
  56. package/src/components/select/engine.ts +16 -4
  57. package/src/components/select/select.css +22 -4
  58. package/src/core/timing.ts +2 -0
  59. package/src/elements/index.ts +321 -318
  60. package/src/index.ts +1 -0
  61. package/src/motion/morph.ts +5 -2
  62. package/src/react/index.ts +2 -1
  63. package/dist/chunk-AWDEKDEJ.js.map +0 -1
  64. package/dist/chunk-DOOMULVV.js.map +0 -1
  65. package/dist/chunk-Q7IW4FV3.js.map +0 -1
  66. /package/dist/{chunk-QFBOHPWZ.js.map → chunk-CQP66AZK.js.map} +0 -0
  67. /package/dist/{chunk-QP4QJOEN.js.map → chunk-H4STLMCM.js.map} +0 -0
  68. /package/dist/{chunk-EDMXWUW3.js.map → chunk-KDIJX6G4.js.map} +0 -0
@@ -1,3 +1,265 @@
1
+ /* components/scroll-area/scroll-area.css */
2
+ /* scroll-area — the scroller keeps native scrolling with its system bar hidden; the kit's bars ride on top: a 6 px pill
3
+ (text at 32 %) that shows while hovered or scrolling, swells to 10 px over a tonal rail on the swing curve and turns the
4
+ accent while dragged. Edges with more content fade out; an optional tonal pill takes the view back to the top. */
5
+ @property --mk-scroll-thickness {
6
+ syntax: '<length>';
7
+ inherits: true;
8
+ initial-value: 6px;
9
+ }
10
+
11
+ .mk-scroll-area,
12
+ mk-scroll-area {
13
+ --mk-scroll-thumb: color-mix(in srgb, var(--mk-text) 32%, transparent);
14
+ --mk-scroll-thumb-hover: color-mix(in srgb, var(--mk-text) 48%, transparent);
15
+ --mk-scroll-rail: color-mix(in srgb, var(--mk-text) 6%, transparent);
16
+ display: flex;
17
+ flex-direction: column;
18
+ min-width: 0;
19
+ min-height: 0;
20
+ overflow: hidden;
21
+ }
22
+
23
+ /* Its own viewport fills the area (a height or a max-height on the area both work). */
24
+ :is(.mk-scroll-area, mk-scroll-area) > [data-mk-scroll-viewport] {
25
+ flex: 1 1 auto;
26
+ min-width: 0;
27
+ min-height: 0;
28
+ overflow: auto;
29
+ overscroll-behavior: contain;
30
+ border-radius: inherit;
31
+ outline: none;
32
+ }
33
+
34
+ :is(.mk-scroll-area, mk-scroll-area)[data-mk-scroll-axis='y'] > [data-mk-scroll-viewport] {
35
+ overflow-x: hidden;
36
+ }
37
+
38
+ :is(.mk-scroll-area, mk-scroll-area)[data-mk-scroll-axis='x'] > [data-mk-scroll-viewport] {
39
+ overflow-y: hidden;
40
+ }
41
+
42
+ [data-mk-scroll-anchor] {
43
+ position: relative;
44
+ }
45
+
46
+ /* The kit's bars replace the system's wherever the scroller's own styles asked for a thin one. */
47
+ [data-mk-scroll-viewport] {
48
+ scrollbar-width: none !important;
49
+ }
50
+
51
+ [data-mk-scroll-viewport]::-webkit-scrollbar {
52
+ display: none !important;
53
+ }
54
+
55
+ [data-mk-scroll-area]:has(> [data-mk-scroll-viewport]:focus-visible) {
56
+ outline: 2px solid var(--mk-accent);
57
+ outline-offset: 2px;
58
+ }
59
+
60
+ /* Edge fades: as deep as what is hidden past each edge, up to 24 px (written by the engine). */
61
+ [data-mk-fade] > [data-mk-scroll-viewport] {
62
+ --mk-scroll-fade-top: 0px;
63
+ --mk-scroll-fade-right: 0px;
64
+ --mk-scroll-fade-bottom: 0px;
65
+ --mk-scroll-fade-left: 0px;
66
+ -webkit-mask-image:
67
+ linear-gradient(to bottom, transparent, #000 var(--mk-scroll-fade-top), #000 calc(100% - var(--mk-scroll-fade-bottom)), transparent),
68
+ linear-gradient(to right, transparent, #000 var(--mk-scroll-fade-left), #000 calc(100% - var(--mk-scroll-fade-right)), transparent);
69
+ -webkit-mask-composite: source-in;
70
+ mask-image:
71
+ linear-gradient(to bottom, transparent, #000 var(--mk-scroll-fade-top), #000 calc(100% - var(--mk-scroll-fade-bottom)), transparent),
72
+ linear-gradient(to right, transparent, #000 var(--mk-scroll-fade-left), #000 calc(100% - var(--mk-scroll-fade-right)), transparent);
73
+ mask-composite: intersect;
74
+ }
75
+
76
+ /* Rails: a 14 px grip along the edge; its tonal rail and the pill inside are drawn smaller. */
77
+ [data-mk-scroll-rail] {
78
+ --mk-scroll-thickness: 6px;
79
+ position: absolute;
80
+ z-index: 2;
81
+ opacity: 0;
82
+ touch-action: none;
83
+ -webkit-user-select: none;
84
+ user-select: none;
85
+ transition:
86
+ opacity 0.2s ease,
87
+ --mk-scroll-thickness 0.35s var(--mk-ease-swatch);
88
+ }
89
+
90
+ [data-mk-scroll-rail][hidden] {
91
+ display: none;
92
+ }
93
+
94
+ /* The rails run along the viewport's box inside the root (--mk-scroll-view-*, written by the engine);
95
+ --mk-scroll-inset keeps their ends clear of rounded corners. */
96
+ [data-mk-scroll-rail][data-mk-axis='y'] {
97
+ top: calc(var(--mk-scroll-view-top, 0px) + var(--mk-scroll-inset, 6px));
98
+ right: var(--mk-scroll-view-right, 0px);
99
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + var(--mk-scroll-inset, 6px));
100
+ width: 14px;
101
+ }
102
+
103
+ [data-mk-scroll-rail][data-mk-axis='x'] {
104
+ right: calc(var(--mk-scroll-view-right, 0px) + var(--mk-scroll-inset, 6px));
105
+ bottom: var(--mk-scroll-view-bottom, 0px);
106
+ left: calc(var(--mk-scroll-view-left, 0px) + var(--mk-scroll-inset, 6px));
107
+ height: 14px;
108
+ }
109
+
110
+ /* Both bars: each stops short of the other, no corner square. */
111
+ [data-mk-overflow-x] > [data-mk-scroll-rail][data-mk-axis='y'] {
112
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + 14px);
113
+ }
114
+
115
+ [data-mk-overflow-y] > [data-mk-scroll-rail][data-mk-axis='x'] {
116
+ right: calc(var(--mk-scroll-view-right, 0px) + 14px);
117
+ }
118
+
119
+ [data-mk-active] > [data-mk-scroll-rail],
120
+ [data-mk-scroll-rail]:hover,
121
+ [data-mk-scroll-rail][data-mk-dragging] {
122
+ opacity: 1;
123
+ }
124
+
125
+ [data-mk-scroll-rail]:hover,
126
+ [data-mk-scroll-rail][data-mk-dragging] {
127
+ --mk-scroll-thickness: 10px;
128
+ }
129
+
130
+ [data-mk-scroll-rail]::before {
131
+ content: '';
132
+ position: absolute;
133
+ border-radius: 999px;
134
+ background: var(--mk-scroll-rail, color-mix(in srgb, var(--mk-text) 6%, transparent));
135
+ opacity: 0;
136
+ transition: opacity 0.2s ease;
137
+ }
138
+
139
+ [data-mk-scroll-rail][data-mk-axis='y']::before {
140
+ top: 0;
141
+ right: 2px;
142
+ bottom: 0;
143
+ width: 10px;
144
+ }
145
+
146
+ [data-mk-scroll-rail][data-mk-axis='x']::before {
147
+ right: 0;
148
+ bottom: 2px;
149
+ left: 0;
150
+ height: 10px;
151
+ }
152
+
153
+ [data-mk-scroll-rail]:hover::before,
154
+ [data-mk-scroll-rail][data-mk-dragging]::before {
155
+ opacity: 1;
156
+ }
157
+
158
+ [data-mk-scroll-thumb] {
159
+ position: absolute;
160
+ top: 0;
161
+ left: 0;
162
+ cursor: grab;
163
+ will-change: transform;
164
+ }
165
+
166
+ [data-mk-scroll-rail][data-mk-axis='y'] [data-mk-scroll-thumb] {
167
+ width: 100%;
168
+ }
169
+
170
+ [data-mk-scroll-rail][data-mk-axis='x'] [data-mk-scroll-thumb] {
171
+ height: 100%;
172
+ }
173
+
174
+ [data-mk-scroll-rail][data-mk-dragging] [data-mk-scroll-thumb] {
175
+ cursor: grabbing;
176
+ }
177
+
178
+ /* The pill stays centred on the 10 px rail while it swells. */
179
+ [data-mk-scroll-pill] {
180
+ position: absolute;
181
+ border-radius: 999px;
182
+ background: var(--mk-scroll-thumb, color-mix(in srgb, var(--mk-text) 32%, transparent));
183
+ transition: background-color 0.2s ease;
184
+ }
185
+
186
+ [data-mk-scroll-rail][data-mk-axis='y'] [data-mk-scroll-pill] {
187
+ top: 0;
188
+ right: calc(2px + (10px - var(--mk-scroll-thickness)) / 2);
189
+ bottom: 0;
190
+ width: var(--mk-scroll-thickness);
191
+ }
192
+
193
+ [data-mk-scroll-rail][data-mk-axis='x'] [data-mk-scroll-pill] {
194
+ right: 0;
195
+ bottom: calc(2px + (10px - var(--mk-scroll-thickness)) / 2);
196
+ left: 0;
197
+ height: var(--mk-scroll-thickness);
198
+ }
199
+
200
+ [data-mk-scroll-rail]:hover [data-mk-scroll-pill] {
201
+ background: var(--mk-scroll-thumb-hover, color-mix(in srgb, var(--mk-text) 48%, transparent));
202
+ }
203
+
204
+ [data-mk-scroll-rail][data-mk-dragging] [data-mk-scroll-pill] {
205
+ background: var(--mk-scroll-thumb-active, var(--mk-accent));
206
+ }
207
+
208
+ [data-mk-dragging] [data-mk-scroll-viewport] {
209
+ -webkit-user-select: none;
210
+ user-select: none;
211
+ }
212
+
213
+ /* Back to top: a tonal pill in the corner, clear of the bars. */
214
+ [data-mk-scroll-top] {
215
+ position: absolute;
216
+ z-index: 3;
217
+ right: calc(var(--mk-scroll-view-right, 0px) + 20px);
218
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + 16px);
219
+ display: inline-grid;
220
+ place-items: center;
221
+ width: 40px;
222
+ height: 40px;
223
+ padding: 0;
224
+ border: 0;
225
+ border-radius: 999px;
226
+ background: var(--mk-surface-4);
227
+ box-shadow: 0 8px 24px -8px color-mix(in srgb, var(--mk-shadow-color, #000) 45%, transparent);
228
+ color: var(--mk-text);
229
+ cursor: pointer;
230
+ transition:
231
+ background-color 0.15s,
232
+ box-shadow 0.2s;
233
+ }
234
+
235
+ [data-mk-overflow-x] > [data-mk-scroll-top] {
236
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + 22px);
237
+ }
238
+
239
+ [data-mk-scroll-top][hidden] {
240
+ display: none;
241
+ }
242
+
243
+ [data-mk-scroll-top]:hover {
244
+ background: color-mix(in srgb, var(--mk-surface-4) 80%, var(--mk-text) 10%);
245
+ }
246
+
247
+ [data-mk-scroll-top]:focus-visible {
248
+ outline: none;
249
+ box-shadow:
250
+ 0 0 0 3px color-mix(in srgb, var(--mk-accent) 45%, transparent),
251
+ 0 8px 24px -8px color-mix(in srgb, var(--mk-shadow-color, #000) 45%, transparent);
252
+ }
253
+
254
+ @media (prefers-reduced-motion: reduce) {
255
+ [data-mk-scroll-rail],
256
+ [data-mk-scroll-rail]::before,
257
+ [data-mk-scroll-pill],
258
+ [data-mk-scroll-top] {
259
+ transition: none;
260
+ }
261
+ }
262
+
1
263
  /* components/dialog/dialog.css */
2
264
  /* dialog — modal surface: 400 px, radius 40, tonal surface; full screen under 680 px. */
3
265
  .mk-dialog {
@@ -6,6 +268,8 @@
6
268
  --mk-dialog-width: 400px;
7
269
  --mk-dialog-padding: 24px;
8
270
  --mk-dialog-shadow: 0 24px 64px -16px rgb(0 0 0 / 0.35);
271
+ /* The body's scroll-area bar keeps its ends clear of the rounded corners. */
272
+ --mk-scroll-inset: max(6px, calc(var(--mk-dialog-radius) * 0.6));
9
273
  width: min(var(--mk-dialog-width), calc(100vw - 32px));
10
274
  max-width: none;
11
275
  max-height: min(88dvh, calc(100dvh - 32px));
@@ -1,3 +1,265 @@
1
+ /* components/scroll-area/scroll-area.css */
2
+ /* scroll-area — the scroller keeps native scrolling with its system bar hidden; the kit's bars ride on top: a 6 px pill
3
+ (text at 32 %) that shows while hovered or scrolling, swells to 10 px over a tonal rail on the swing curve and turns the
4
+ accent while dragged. Edges with more content fade out; an optional tonal pill takes the view back to the top. */
5
+ @property --mk-scroll-thickness {
6
+ syntax: '<length>';
7
+ inherits: true;
8
+ initial-value: 6px;
9
+ }
10
+
11
+ .mk-scroll-area,
12
+ mk-scroll-area {
13
+ --mk-scroll-thumb: color-mix(in srgb, var(--mk-text) 32%, transparent);
14
+ --mk-scroll-thumb-hover: color-mix(in srgb, var(--mk-text) 48%, transparent);
15
+ --mk-scroll-rail: color-mix(in srgb, var(--mk-text) 6%, transparent);
16
+ display: flex;
17
+ flex-direction: column;
18
+ min-width: 0;
19
+ min-height: 0;
20
+ overflow: hidden;
21
+ }
22
+
23
+ /* Its own viewport fills the area (a height or a max-height on the area both work). */
24
+ :is(.mk-scroll-area, mk-scroll-area) > [data-mk-scroll-viewport] {
25
+ flex: 1 1 auto;
26
+ min-width: 0;
27
+ min-height: 0;
28
+ overflow: auto;
29
+ overscroll-behavior: contain;
30
+ border-radius: inherit;
31
+ outline: none;
32
+ }
33
+
34
+ :is(.mk-scroll-area, mk-scroll-area)[data-mk-scroll-axis='y'] > [data-mk-scroll-viewport] {
35
+ overflow-x: hidden;
36
+ }
37
+
38
+ :is(.mk-scroll-area, mk-scroll-area)[data-mk-scroll-axis='x'] > [data-mk-scroll-viewport] {
39
+ overflow-y: hidden;
40
+ }
41
+
42
+ [data-mk-scroll-anchor] {
43
+ position: relative;
44
+ }
45
+
46
+ /* The kit's bars replace the system's wherever the scroller's own styles asked for a thin one. */
47
+ [data-mk-scroll-viewport] {
48
+ scrollbar-width: none !important;
49
+ }
50
+
51
+ [data-mk-scroll-viewport]::-webkit-scrollbar {
52
+ display: none !important;
53
+ }
54
+
55
+ [data-mk-scroll-area]:has(> [data-mk-scroll-viewport]:focus-visible) {
56
+ outline: 2px solid var(--mk-accent);
57
+ outline-offset: 2px;
58
+ }
59
+
60
+ /* Edge fades: as deep as what is hidden past each edge, up to 24 px (written by the engine). */
61
+ [data-mk-fade] > [data-mk-scroll-viewport] {
62
+ --mk-scroll-fade-top: 0px;
63
+ --mk-scroll-fade-right: 0px;
64
+ --mk-scroll-fade-bottom: 0px;
65
+ --mk-scroll-fade-left: 0px;
66
+ -webkit-mask-image:
67
+ linear-gradient(to bottom, transparent, #000 var(--mk-scroll-fade-top), #000 calc(100% - var(--mk-scroll-fade-bottom)), transparent),
68
+ linear-gradient(to right, transparent, #000 var(--mk-scroll-fade-left), #000 calc(100% - var(--mk-scroll-fade-right)), transparent);
69
+ -webkit-mask-composite: source-in;
70
+ mask-image:
71
+ linear-gradient(to bottom, transparent, #000 var(--mk-scroll-fade-top), #000 calc(100% - var(--mk-scroll-fade-bottom)), transparent),
72
+ linear-gradient(to right, transparent, #000 var(--mk-scroll-fade-left), #000 calc(100% - var(--mk-scroll-fade-right)), transparent);
73
+ mask-composite: intersect;
74
+ }
75
+
76
+ /* Rails: a 14 px grip along the edge; its tonal rail and the pill inside are drawn smaller. */
77
+ [data-mk-scroll-rail] {
78
+ --mk-scroll-thickness: 6px;
79
+ position: absolute;
80
+ z-index: 2;
81
+ opacity: 0;
82
+ touch-action: none;
83
+ -webkit-user-select: none;
84
+ user-select: none;
85
+ transition:
86
+ opacity 0.2s ease,
87
+ --mk-scroll-thickness 0.35s var(--mk-ease-swatch);
88
+ }
89
+
90
+ [data-mk-scroll-rail][hidden] {
91
+ display: none;
92
+ }
93
+
94
+ /* The rails run along the viewport's box inside the root (--mk-scroll-view-*, written by the engine);
95
+ --mk-scroll-inset keeps their ends clear of rounded corners. */
96
+ [data-mk-scroll-rail][data-mk-axis='y'] {
97
+ top: calc(var(--mk-scroll-view-top, 0px) + var(--mk-scroll-inset, 6px));
98
+ right: var(--mk-scroll-view-right, 0px);
99
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + var(--mk-scroll-inset, 6px));
100
+ width: 14px;
101
+ }
102
+
103
+ [data-mk-scroll-rail][data-mk-axis='x'] {
104
+ right: calc(var(--mk-scroll-view-right, 0px) + var(--mk-scroll-inset, 6px));
105
+ bottom: var(--mk-scroll-view-bottom, 0px);
106
+ left: calc(var(--mk-scroll-view-left, 0px) + var(--mk-scroll-inset, 6px));
107
+ height: 14px;
108
+ }
109
+
110
+ /* Both bars: each stops short of the other, no corner square. */
111
+ [data-mk-overflow-x] > [data-mk-scroll-rail][data-mk-axis='y'] {
112
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + 14px);
113
+ }
114
+
115
+ [data-mk-overflow-y] > [data-mk-scroll-rail][data-mk-axis='x'] {
116
+ right: calc(var(--mk-scroll-view-right, 0px) + 14px);
117
+ }
118
+
119
+ [data-mk-active] > [data-mk-scroll-rail],
120
+ [data-mk-scroll-rail]:hover,
121
+ [data-mk-scroll-rail][data-mk-dragging] {
122
+ opacity: 1;
123
+ }
124
+
125
+ [data-mk-scroll-rail]:hover,
126
+ [data-mk-scroll-rail][data-mk-dragging] {
127
+ --mk-scroll-thickness: 10px;
128
+ }
129
+
130
+ [data-mk-scroll-rail]::before {
131
+ content: '';
132
+ position: absolute;
133
+ border-radius: 999px;
134
+ background: var(--mk-scroll-rail, color-mix(in srgb, var(--mk-text) 6%, transparent));
135
+ opacity: 0;
136
+ transition: opacity 0.2s ease;
137
+ }
138
+
139
+ [data-mk-scroll-rail][data-mk-axis='y']::before {
140
+ top: 0;
141
+ right: 2px;
142
+ bottom: 0;
143
+ width: 10px;
144
+ }
145
+
146
+ [data-mk-scroll-rail][data-mk-axis='x']::before {
147
+ right: 0;
148
+ bottom: 2px;
149
+ left: 0;
150
+ height: 10px;
151
+ }
152
+
153
+ [data-mk-scroll-rail]:hover::before,
154
+ [data-mk-scroll-rail][data-mk-dragging]::before {
155
+ opacity: 1;
156
+ }
157
+
158
+ [data-mk-scroll-thumb] {
159
+ position: absolute;
160
+ top: 0;
161
+ left: 0;
162
+ cursor: grab;
163
+ will-change: transform;
164
+ }
165
+
166
+ [data-mk-scroll-rail][data-mk-axis='y'] [data-mk-scroll-thumb] {
167
+ width: 100%;
168
+ }
169
+
170
+ [data-mk-scroll-rail][data-mk-axis='x'] [data-mk-scroll-thumb] {
171
+ height: 100%;
172
+ }
173
+
174
+ [data-mk-scroll-rail][data-mk-dragging] [data-mk-scroll-thumb] {
175
+ cursor: grabbing;
176
+ }
177
+
178
+ /* The pill stays centred on the 10 px rail while it swells. */
179
+ [data-mk-scroll-pill] {
180
+ position: absolute;
181
+ border-radius: 999px;
182
+ background: var(--mk-scroll-thumb, color-mix(in srgb, var(--mk-text) 32%, transparent));
183
+ transition: background-color 0.2s ease;
184
+ }
185
+
186
+ [data-mk-scroll-rail][data-mk-axis='y'] [data-mk-scroll-pill] {
187
+ top: 0;
188
+ right: calc(2px + (10px - var(--mk-scroll-thickness)) / 2);
189
+ bottom: 0;
190
+ width: var(--mk-scroll-thickness);
191
+ }
192
+
193
+ [data-mk-scroll-rail][data-mk-axis='x'] [data-mk-scroll-pill] {
194
+ right: 0;
195
+ bottom: calc(2px + (10px - var(--mk-scroll-thickness)) / 2);
196
+ left: 0;
197
+ height: var(--mk-scroll-thickness);
198
+ }
199
+
200
+ [data-mk-scroll-rail]:hover [data-mk-scroll-pill] {
201
+ background: var(--mk-scroll-thumb-hover, color-mix(in srgb, var(--mk-text) 48%, transparent));
202
+ }
203
+
204
+ [data-mk-scroll-rail][data-mk-dragging] [data-mk-scroll-pill] {
205
+ background: var(--mk-scroll-thumb-active, var(--mk-accent));
206
+ }
207
+
208
+ [data-mk-dragging] [data-mk-scroll-viewport] {
209
+ -webkit-user-select: none;
210
+ user-select: none;
211
+ }
212
+
213
+ /* Back to top: a tonal pill in the corner, clear of the bars. */
214
+ [data-mk-scroll-top] {
215
+ position: absolute;
216
+ z-index: 3;
217
+ right: calc(var(--mk-scroll-view-right, 0px) + 20px);
218
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + 16px);
219
+ display: inline-grid;
220
+ place-items: center;
221
+ width: 40px;
222
+ height: 40px;
223
+ padding: 0;
224
+ border: 0;
225
+ border-radius: 999px;
226
+ background: var(--mk-surface-4);
227
+ box-shadow: 0 8px 24px -8px color-mix(in srgb, var(--mk-shadow-color, #000) 45%, transparent);
228
+ color: var(--mk-text);
229
+ cursor: pointer;
230
+ transition:
231
+ background-color 0.15s,
232
+ box-shadow 0.2s;
233
+ }
234
+
235
+ [data-mk-overflow-x] > [data-mk-scroll-top] {
236
+ bottom: calc(var(--mk-scroll-view-bottom, 0px) + 22px);
237
+ }
238
+
239
+ [data-mk-scroll-top][hidden] {
240
+ display: none;
241
+ }
242
+
243
+ [data-mk-scroll-top]:hover {
244
+ background: color-mix(in srgb, var(--mk-surface-4) 80%, var(--mk-text) 10%);
245
+ }
246
+
247
+ [data-mk-scroll-top]:focus-visible {
248
+ outline: none;
249
+ box-shadow:
250
+ 0 0 0 3px color-mix(in srgb, var(--mk-accent) 45%, transparent),
251
+ 0 8px 24px -8px color-mix(in srgb, var(--mk-shadow-color, #000) 45%, transparent);
252
+ }
253
+
254
+ @media (prefers-reduced-motion: reduce) {
255
+ [data-mk-scroll-rail],
256
+ [data-mk-scroll-rail]::before,
257
+ [data-mk-scroll-pill],
258
+ [data-mk-scroll-top] {
259
+ transition: none;
260
+ }
261
+ }
262
+
1
263
  /* components/chart/chart.css */
2
264
  /* chart — Melon Mind's Indicadores: a monochrome line on the surface, the baseline only, the last value in a pill,
3
265
  a dotted guide, the inverse glass tooltip and outlined legend pills.
@@ -318,7 +580,11 @@ mk-heatmap-chart {
318
580
  overflow-x: auto;
319
581
  overflow-y: hidden;
320
582
  padding-block: 4px;
321
- scrollbar-width: thin;
583
+ }
584
+
585
+ /* Weeks that scroll leave the scroll-area bar a lane below the last row, so a click on a day never lands on it. */
586
+ [data-mk-overflow-x] > [data-mk-heatmap-scroll] {
587
+ padding-bottom: 16px;
322
588
  }
323
589
 
324
590
  [data-mk-chart-type='heatmap'] [data-mk-chart-svg] {