@stackific/md3 0.1.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 (116) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +17 -0
  3. package/README.md +316 -0
  4. package/THIRD-PARTY-NOTICES +40 -0
  5. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  6. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  7. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  8. package/dist/fonts/material-symbols-subset.woff2 +0 -0
  9. package/dist/md3.css +1 -0
  10. package/dist/md3.js +621 -0
  11. package/dist/shapes/arch.svg +1 -0
  12. package/dist/shapes/arrow.svg +1 -0
  13. package/dist/shapes/boom.svg +1 -0
  14. package/dist/shapes/bun.svg +1 -0
  15. package/dist/shapes/burst.svg +1 -0
  16. package/dist/shapes/circle.svg +1 -0
  17. package/dist/shapes/clamshell.svg +1 -0
  18. package/dist/shapes/diamond.svg +1 -0
  19. package/dist/shapes/fan.svg +1 -0
  20. package/dist/shapes/flower.svg +1 -0
  21. package/dist/shapes/gem.svg +1 -0
  22. package/dist/shapes/ghost-ish.svg +1 -0
  23. package/dist/shapes/heart.svg +1 -0
  24. package/dist/shapes/leaf-clover4.svg +1 -0
  25. package/dist/shapes/leaf-clover8.svg +1 -0
  26. package/dist/shapes/loading-indicator.svg +1 -0
  27. package/dist/shapes/oval.svg +1 -0
  28. package/dist/shapes/pentagon.svg +1 -0
  29. package/dist/shapes/pill.svg +1 -0
  30. package/dist/shapes/pixel-circle.svg +1 -0
  31. package/dist/shapes/pixel-triangle.svg +1 -0
  32. package/dist/shapes/puffy-diamond.svg +1 -0
  33. package/dist/shapes/puffy.svg +1 -0
  34. package/dist/shapes/semicircle.svg +1 -0
  35. package/dist/shapes/sided-cookie12.svg +1 -0
  36. package/dist/shapes/sided-cookie4.svg +1 -0
  37. package/dist/shapes/sided-cookie6.svg +1 -0
  38. package/dist/shapes/sided-cookie7.svg +1 -0
  39. package/dist/shapes/sided-cookie9.svg +1 -0
  40. package/dist/shapes/slanted.svg +1 -0
  41. package/dist/shapes/soft-boom.svg +1 -0
  42. package/dist/shapes/soft-burst.svg +1 -0
  43. package/dist/shapes/square.svg +1 -0
  44. package/dist/shapes/sunny.svg +1 -0
  45. package/dist/shapes/triangle.svg +1 -0
  46. package/dist/shapes/very-sunny.svg +1 -0
  47. package/dist/shapes/wavy-circle.svg +1 -0
  48. package/dist/shapes/wavy.svg +1 -0
  49. package/package.json +63 -0
  50. package/src/main.js +5 -0
  51. package/src/runtime/elements/dialogs.js +72 -0
  52. package/src/runtime/elements/fields.js +181 -0
  53. package/src/runtime/elements/menus.js +42 -0
  54. package/src/runtime/elements/pages.js +7 -0
  55. package/src/runtime/elements/progress.js +35 -0
  56. package/src/runtime/elements/sliders.js +78 -0
  57. package/src/runtime/elements/snackbars.js +27 -0
  58. package/src/runtime/helpers/ripples.js +46 -0
  59. package/src/runtime/md3.js +141 -0
  60. package/src/runtime/palette.js +64 -0
  61. package/src/runtime/settings/theme.js +194 -0
  62. package/src/runtime/utils.js +165 -0
  63. package/src/styles/_config.scss +142 -0
  64. package/src/styles/_mixins.scss +80 -0
  65. package/src/styles/elements/_badges.scss +65 -0
  66. package/src/styles/elements/_bars.scss +83 -0
  67. package/src/styles/elements/_buttons.scss +119 -0
  68. package/src/styles/elements/_cards.scss +32 -0
  69. package/src/styles/elements/_chips.scss +46 -0
  70. package/src/styles/elements/_dialogs.scss +143 -0
  71. package/src/styles/elements/_dividers.scss +46 -0
  72. package/src/styles/elements/_expansions.scss +19 -0
  73. package/src/styles/elements/_fields.scss +458 -0
  74. package/src/styles/elements/_grids.scss +35 -0
  75. package/src/styles/elements/_icons.scss +70 -0
  76. package/src/styles/elements/_layouts.scss +24 -0
  77. package/src/styles/elements/_lists.scss +76 -0
  78. package/src/styles/elements/_main-layouts.scss +45 -0
  79. package/src/styles/elements/_media.scss +104 -0
  80. package/src/styles/elements/_menus.scss +289 -0
  81. package/src/styles/elements/_navigations.scss +450 -0
  82. package/src/styles/elements/_overlays.scss +34 -0
  83. package/src/styles/elements/_pages.scss +28 -0
  84. package/src/styles/elements/_progress.scss +141 -0
  85. package/src/styles/elements/_selections.scss +248 -0
  86. package/src/styles/elements/_shapes.scss +151 -0
  87. package/src/styles/elements/_sliders.scss +336 -0
  88. package/src/styles/elements/_snackbars.scss +44 -0
  89. package/src/styles/elements/_tables.scss +67 -0
  90. package/src/styles/elements/_tabs.scss +49 -0
  91. package/src/styles/elements/_tooltips.scss +125 -0
  92. package/src/styles/helpers/_alignments.scss +29 -0
  93. package/src/styles/helpers/_blurs.scss +26 -0
  94. package/src/styles/helpers/_colors.scss +39 -0
  95. package/src/styles/helpers/_directions.scss +30 -0
  96. package/src/styles/helpers/_elevates.scss +20 -0
  97. package/src/styles/helpers/_forms.scss +76 -0
  98. package/src/styles/helpers/_margins.scss +39 -0
  99. package/src/styles/helpers/_opacities.scss +18 -0
  100. package/src/styles/helpers/_paddings.scss +35 -0
  101. package/src/styles/helpers/_positions.scss +44 -0
  102. package/src/styles/helpers/_responsive.scss +24 -0
  103. package/src/styles/helpers/_ripples.scss +40 -0
  104. package/src/styles/helpers/_scrolls.scss +7 -0
  105. package/src/styles/helpers/_shadows.scss +22 -0
  106. package/src/styles/helpers/_sizes.scss +34 -0
  107. package/src/styles/helpers/_spaces.scss +22 -0
  108. package/src/styles/helpers/_typography.scss +132 -0
  109. package/src/styles/helpers/_waves.scss +52 -0
  110. package/src/styles/helpers/_zoom.scss +18 -0
  111. package/src/styles/md3.scss +61 -0
  112. package/src/styles/settings/_fonts.scss +42 -0
  113. package/src/styles/settings/_globals.scss +104 -0
  114. package/src/styles/settings/_reset.scss +82 -0
  115. package/src/styles/settings/_theme.scss +126 -0
  116. package/src/styles/settings/_themes.scss +1525 -0
@@ -0,0 +1,336 @@
1
+ // .slider — range input with single + dual thumb modes, vertical orientation,
2
+ // and a .max "container slider" variant.
3
+
4
+ .slider {
5
+ --_start: 0%;
6
+ --_end: 0%;
7
+ --_value1: "";
8
+ --_value2: "";
9
+ --_track: 1rem;
10
+ --_thumb: max(2.5rem, calc(var(--_track, 0) + 0.5rem));
11
+ display: flex;
12
+ align-items: center !important;
13
+ inline-size: auto;
14
+ block-size: var(--_thumb);
15
+ flex: none;
16
+ direction: ltr;
17
+ margin: 0 1.25rem;
18
+ color: var(--primary);
19
+
20
+ &.vertical {
21
+ flex-direction: row !important;
22
+ margin: 0.5rem auto !important;
23
+ padding: 50% 0;
24
+ transform: rotate(-90deg);
25
+ inline-size: 100%;
26
+ }
27
+ }
28
+
29
+ [dir="rtl"] .slider {
30
+ transform: scaleX(-1);
31
+ }
32
+
33
+ $-slider-tracks: (
34
+ "tiny": 1rem,
35
+ "small": 1.5rem,
36
+ "medium": 2.5rem,
37
+ "large": 3.5rem,
38
+ "extra": 6rem,
39
+ );
40
+
41
+ @each $name, $value in $-slider-tracks {
42
+ .slider.#{$name} { --_track: #{$value}; }
43
+ }
44
+
45
+ // inputs
46
+ .slider > input {
47
+ appearance: none;
48
+ box-shadow: none;
49
+ border: none;
50
+ outline: none;
51
+ pointer-events: none;
52
+ inline-size: 100%;
53
+ block-size: var(--_track);
54
+ background: none;
55
+ z-index: 1;
56
+ padding: 0;
57
+ margin: 0;
58
+ transform: rotate(0deg);
59
+ touch-action: none;
60
+
61
+ &:only-of-type {
62
+ pointer-events: all;
63
+ }
64
+
65
+ & ~ input {
66
+ position: absolute;
67
+ }
68
+
69
+ &:disabled {
70
+ cursor: not-allowed;
71
+ opacity: 1;
72
+ }
73
+
74
+ &:disabled ~ span:not([class]) {
75
+ background: var(--outline);
76
+ }
77
+ }
78
+
79
+ // Thumb styling — WebKit / Firefox have separate pseudo-elements so the rules
80
+ // can't be merged; we share the body via a mixin.
81
+ @mixin -slider-thumb {
82
+ appearance: none;
83
+ box-shadow: none;
84
+ border: none;
85
+ outline: none;
86
+ pointer-events: all;
87
+ block-size: var(--_thumb);
88
+ inline-size: 0.25rem;
89
+ border-radius: 0.25rem;
90
+ background: currentColor;
91
+ cursor: grab;
92
+ margin: 0;
93
+ z-index: 1;
94
+
95
+ &:active {
96
+ cursor: grabbing;
97
+ }
98
+ }
99
+
100
+ .slider > input::-webkit-slider-thumb { @include -slider-thumb; }
101
+ .slider > input::-moz-range-thumb {
102
+ @include -slider-thumb;
103
+ block-size: 2.75rem;
104
+ background: var(--primary);
105
+ }
106
+
107
+ .slider > input:not(:disabled):is(:focus)::-webkit-slider-thumb,
108
+ .slider > input:not(:disabled):is(:focus)::-moz-range-thumb {
109
+ transform: scaleX(0.6);
110
+ }
111
+
112
+ .slider > input:disabled::-webkit-slider-thumb,
113
+ .slider > input:disabled::-moz-range-thumb {
114
+ background: var(--outline);
115
+ cursor: not-allowed;
116
+ }
117
+
118
+ // active track
119
+ .slider > span:not([class]) {
120
+ position: absolute;
121
+ block-size: var(--_track);
122
+ border-radius: 1rem 0 0 1rem;
123
+ background: currentColor;
124
+ color: currentColor;
125
+ z-index: 0;
126
+ inset: calc(50% - (var(--_track, 0) / 2)) calc(var(--_end) + 0.5rem) auto var(--_start);
127
+ }
128
+
129
+ .slider > input[type="range"] + input[type="range"] ~ span:not([class]) {
130
+ border-radius: 0;
131
+ inset: calc(50% - (var(--_track, 0) / 2)) calc(var(--_end) + 0.5rem) auto calc(var(--_start) + 0.5rem);
132
+ }
133
+
134
+ .field > .slider {
135
+ inline-size: 100%;
136
+ }
137
+
138
+ .slider::before {
139
+ content: "";
140
+ position: absolute;
141
+ inline-size: 100%;
142
+ block-size: var(--_track);
143
+ border-radius: 1rem;
144
+ background: var(--active);
145
+ clip-path: polygon(
146
+ calc(var(--_start, 0) - 0.5rem) 0,
147
+ 0 0, 0 100%,
148
+ calc(var(--_start, 0) - 0.5rem) 100%,
149
+ calc(var(--_start, 0) - 0.5rem) 0,
150
+ calc(100% - var(--_end, 0) + 0.5rem) 0,
151
+ 100% 0, 100% 100%,
152
+ calc(100% - var(--_end, 0) + 0.5rem) 100%,
153
+ calc(100% - var(--_end, 0) + 0.5rem) 0
154
+ );
155
+ }
156
+
157
+ .slider:has(> [disabled])::before {
158
+ background: var(--active);
159
+ }
160
+
161
+ .slider:has([disabled]) {
162
+ opacity: 0.62;
163
+ }
164
+
165
+ .slider > span > i {
166
+ position: absolute;
167
+ block-size: auto;
168
+ inset: 0 auto 0 0.5rem;
169
+ color: var(--inverse-primary);
170
+ z-index: 1;
171
+ }
172
+
173
+ .slider:not(.medium, .large, .extra) > span > i {
174
+ display: none;
175
+ }
176
+
177
+ .slider.vertical > i {
178
+ transform: rotate(90deg);
179
+ }
180
+
181
+ // tooltips
182
+ .slider > .tooltip {
183
+ visibility: hidden !important;
184
+ opacity: 0 !important;
185
+ inset: 0 auto auto calc(100% - var(--_end, 0));
186
+ border-radius: 2rem;
187
+ transition: top var(--speed2) ease, opacity var(--speed2) ease;
188
+ transform: translate(-50%, -25%) !important;
189
+ padding: 0.75rem 1rem;
190
+
191
+ &.bottom {
192
+ inset: auto auto 0 calc(100% - var(--_end, 0));
193
+ transition: bottom var(--speed2) ease, opacity var(--speed2) ease;
194
+ transform: translate(-50%, 25%) !important;
195
+ }
196
+
197
+ &::before {
198
+ content: var(--_value1);
199
+ }
200
+ }
201
+
202
+ [dir="rtl"] .slider > .tooltip {
203
+ transform: translate(-50%, -25%) scaleX(-1) !important;
204
+ }
205
+
206
+ [dir="rtl"] .slider > .tooltip.bottom {
207
+ transform: translate(-50%, 25%) scaleX(-1) !important;
208
+ }
209
+
210
+ .slider > .tooltip + .tooltip {
211
+ inset: 0.25rem calc(100% - var(--_start, 0)) auto auto;
212
+ transform: translate(50%, -25%) !important;
213
+
214
+ &.bottom {
215
+ inset: auto calc(100% - var(--_start, 0)) -0.25rem auto;
216
+ transform: translate(50%, 25%) !important;
217
+ }
218
+
219
+ &::before {
220
+ content: var(--_value2);
221
+ }
222
+ }
223
+
224
+ [dir="rtl"] .slider > .tooltip + .tooltip {
225
+ transform: translate(50%, -25%) scaleX(-1) !important;
226
+ }
227
+
228
+ [dir="rtl"] .slider > .tooltip + .tooltip.bottom {
229
+ transform: translate(50%, 25%) scaleX(-1) !important;
230
+ }
231
+
232
+ .slider > :focus ~ .tooltip {
233
+ inset-block: -1rem auto;
234
+ opacity: 1 !important;
235
+ visibility: visible !important;
236
+
237
+ &.bottom {
238
+ inset-block: auto -1rem;
239
+ }
240
+ }
241
+
242
+ .slider.vertical > .tooltip {
243
+ inset-block: auto;
244
+ block-size: 2.5rem;
245
+ inline-size: 2.5rem;
246
+ margin-block: calc(-1 * var(--_thumb, 0)) 0 !important;
247
+ transform: rotate(90deg) translate(-75%, 50%) !important;
248
+
249
+ &.bottom {
250
+ inset-block: auto;
251
+ margin-block: 0 calc(-1 * var(--_thumb, 0)) !important;
252
+ transform: rotate(90deg) translate(75%, 50%) !important;
253
+ }
254
+ }
255
+
256
+ .slider.vertical > .tooltip + .tooltip {
257
+ transform: rotate(90deg) translate(-75%, -50%) !important;
258
+
259
+ &.bottom {
260
+ transform: rotate(90deg) translate(75%, -50%) !important;
261
+ }
262
+ }
263
+
264
+ :is(nav, .row, .field) > .slider:not(.circle, .small, .medium, .large) {
265
+ flex: auto;
266
+ }
267
+
268
+ // .slider.max — container-filling variant
269
+ .slider.max,
270
+ .slider.max.vertical,
271
+ .slider.max > input,
272
+ .slider.max.vertical > input {
273
+ all: unset;
274
+ margin: 0 !important;
275
+ position: absolute;
276
+ color: var(--primary);
277
+ inset: 0;
278
+ border-radius: inherit;
279
+ overflow: hidden;
280
+ z-index: 2;
281
+ cursor: grab;
282
+ inline-size: 100%;
283
+ block-size: 100%;
284
+ }
285
+
286
+ .slider.max::before {
287
+ display: none;
288
+ }
289
+
290
+ .slider.max.vertical > input {
291
+ writing-mode: vertical-lr;
292
+ transform: rotate(-180deg);
293
+ }
294
+
295
+ .slider.max > input::-webkit-slider-thumb,
296
+ .slider.max > input::-moz-range-thumb {
297
+ opacity: 0;
298
+ inline-size: 1rem;
299
+ block-size: 100vh;
300
+ transform: none !important;
301
+ }
302
+
303
+ .slider.max > span:not([class]) {
304
+ block-size: auto !important;
305
+ inset: 0 var(--_end) 0 var(--_start);
306
+ background: currentcolor;
307
+ color: inherit;
308
+ border-radius: 0;
309
+ }
310
+
311
+ .slider.max.vertical > span:not([class]) {
312
+ inset: var(--_end) 0 var(--_start) 0;
313
+ }
314
+
315
+ .slider > input:focus-visible::-webkit-slider-thumb,
316
+ .slider > input:focus-visible::-moz-range-thumb {
317
+ outline: 0.1875rem solid var(--primary);
318
+ outline-offset: 0.25rem;
319
+ }
320
+
321
+ .slider.max > input:focus-visible {
322
+ outline: 0.1875rem solid var(--primary);
323
+ outline-offset: -0.125rem;
324
+ }
325
+
326
+ @media (pointer: coarse) {
327
+ .slider > :hover ~ .tooltip {
328
+ inset-block: -1rem auto !important;
329
+ opacity: 1 !important;
330
+ visibility: visible !important;
331
+ }
332
+
333
+ .slider > :hover ~ .tooltip.bottom {
334
+ inset-block: auto -1rem !important;
335
+ }
336
+ }
@@ -0,0 +1,44 @@
1
+ // .snackbar — bottom-aligned transient banner. .top relocates above.
2
+
3
+ .snackbar {
4
+ position: fixed;
5
+ inset: auto auto 6rem 50%;
6
+ inline-size: 80%;
7
+ block-size: auto;
8
+ z-index: 200;
9
+ visibility: hidden;
10
+ display: flex;
11
+ box-shadow: var(--elevate2);
12
+ color: var(--inverse-on-surface);
13
+ background-color: var(--inverse-surface);
14
+ padding: 1rem;
15
+ cursor: pointer;
16
+ text-align: start;
17
+ align-items: center;
18
+ border-radius: 0.25rem;
19
+ gap: 0.5rem;
20
+ transition: all var(--speed2);
21
+ transform: translate(-50%, 1rem);
22
+ opacity: 0;
23
+
24
+ &.top {
25
+ inset: 6rem auto auto 50%;
26
+ }
27
+
28
+ &.active,
29
+ &:popover-open {
30
+ visibility: visible;
31
+ transform: translate(-50%, 0);
32
+ opacity: 1;
33
+ }
34
+
35
+ > .max {
36
+ flex: auto;
37
+ }
38
+ }
39
+
40
+ @media only screen and (min-width: 993px) {
41
+ .snackbar {
42
+ inline-size: 40%;
43
+ }
44
+ }
@@ -0,0 +1,67 @@
1
+ // table baseline + .border / .stripes / spacing modifiers.
2
+
3
+ table {
4
+ inline-size: 100%;
5
+ border-spacing: 0;
6
+ font-size: 0.875rem;
7
+ text-align: start;
8
+
9
+ &.border > tbody > tr:not(:last-child) > td {
10
+ border-block-end: 0.0625rem solid var(--outline);
11
+ }
12
+
13
+ &.stripes > tbody > tr:nth-child(odd) {
14
+ background-color: var(--active);
15
+ }
16
+
17
+ &.no-space :is(th, td) { padding: 0; }
18
+ &.medium-space :is(th, td) { padding: 0.75rem; }
19
+ &.large-space :is(th, td) { padding: 1rem; }
20
+
21
+ > .fixed {
22
+ position: sticky;
23
+ z-index: 1;
24
+ inset-block-start: 0;
25
+ }
26
+ }
27
+
28
+ .scroll > table,
29
+ table :is(thead, tbody, tfoot, tr, th, td) {
30
+ background-color: inherit;
31
+ color: inherit;
32
+ }
33
+
34
+ :is(th, td) {
35
+ inline-size: auto;
36
+ text-align: inherit;
37
+ padding: 0.5rem;
38
+ border-radius: 0;
39
+
40
+ > * {
41
+ vertical-align: middle;
42
+ }
43
+ }
44
+
45
+ thead > tr > th {
46
+ border-block-end: 0.0625rem solid var(--outline);
47
+ }
48
+
49
+ tfoot > tr > th {
50
+ border-block-start: 0.0625rem solid var(--outline);
51
+ }
52
+
53
+ th.fixed {
54
+ position: sticky;
55
+ z-index: 1;
56
+ inset-block-start: 0;
57
+ }
58
+
59
+ tfoot.fixed,
60
+ tfoot th.fixed {
61
+ inset-block-end: 0;
62
+ }
63
+
64
+ :is(td, th).min {
65
+ inline-size: 0.1%;
66
+ white-space: nowrap;
67
+ }
@@ -0,0 +1,49 @@
1
+ // .tabs container with active-state underline.
2
+
3
+ .tabs {
4
+ display: flex;
5
+ white-space: nowrap;
6
+ border-block-end: 0.0625rem solid var(--surface-variant);
7
+ border-radius: 0;
8
+
9
+ &:not(.left-align, .right-align, .center-align) {
10
+ justify-content: space-around;
11
+ }
12
+
13
+ > a {
14
+ display: flex;
15
+ font-size: 0.875rem;
16
+ font-weight: 500;
17
+ color: var(--on-surface-variant);
18
+ padding: 0.5rem 1rem;
19
+ text-align: center;
20
+ min-block-size: 3rem;
21
+ inline-size: 100%;
22
+ gap: 0.25rem;
23
+
24
+ &.active,
25
+ &.active > i {
26
+ color: var(--primary);
27
+ }
28
+
29
+ &.active::before {
30
+ content: "";
31
+ position: absolute;
32
+ inset: auto 0 0 0;
33
+ block-size: 0.125rem;
34
+ background-color: var(--primary);
35
+ }
36
+ }
37
+
38
+ &.small > a { min-block-size: 2rem; }
39
+ &.large > a { min-block-size: 4rem; }
40
+
41
+ &.min > a.active::before {
42
+ margin: 0 auto;
43
+ max-inline-size: min(100%, 4rem);
44
+ }
45
+
46
+ &:is(.left-align, .center-align, .right-align) > a {
47
+ inline-size: auto;
48
+ }
49
+ }
@@ -0,0 +1,125 @@
1
+ // .tooltip — hover/focus popup. Defaults above; .left/.right/.bottom reposition.
2
+
3
+ .tooltip {
4
+ --_space: -0.5rem;
5
+ visibility: hidden;
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ gap: 0.5rem;
10
+ background-color: var(--inverse-surface);
11
+ color: var(--inverse-on-surface);
12
+ font-size: 0.75rem;
13
+ text-align: center;
14
+ border-radius: 0.25rem;
15
+ padding: 0.5rem;
16
+ position: absolute;
17
+ z-index: 200;
18
+ inset: 0 auto auto 50%;
19
+ inline-size: auto;
20
+ white-space: nowrap;
21
+ font-weight: 500;
22
+ opacity: 0;
23
+ transition: all var(--speed2);
24
+ line-height: normal;
25
+ transform: translate(-50%, -100%) scale(0.9);
26
+
27
+ &:not(.max):hover {
28
+ visibility: hidden;
29
+ opacity: 0;
30
+ }
31
+
32
+ &.left {
33
+ inset: 50% auto auto 0;
34
+ transform: translate(-100%, -50%) scale(0.9);
35
+ }
36
+
37
+ &.right {
38
+ inset: 50% 0 auto auto;
39
+ transform: translate(100%, -50%) scale(0.9);
40
+ }
41
+
42
+ &.bottom {
43
+ inset: auto auto 0 50%;
44
+ transform: translate(-50%, 100%) scale(0.9);
45
+ }
46
+ }
47
+
48
+ $-tooltip-sizes: (
49
+ "small": 8rem,
50
+ "medium": 12rem,
51
+ "large": 16rem,
52
+ );
53
+
54
+ @each $name, $value in $-tooltip-sizes {
55
+ .tooltip.#{$name} {
56
+ inline-size: $value;
57
+ white-space: normal;
58
+ }
59
+ }
60
+
61
+ :hover > .tooltip {
62
+ visibility: visible;
63
+ opacity: 1;
64
+ transform: translate(-50%, -100%) scale(1);
65
+ }
66
+
67
+ :hover > .tooltip.left { transform: translate(-100%, -50%) scale(1); }
68
+ :hover > .tooltip.right { transform: translate(100%, -50%) scale(1); }
69
+ :hover > .tooltip.bottom { transform: translate(-50%, 100%) scale(1); }
70
+
71
+ $-tooltip-spacing: (
72
+ "no": 0,
73
+ "medium": -1rem,
74
+ "large": -1.5rem,
75
+ );
76
+
77
+ @each $name, $value in $-tooltip-spacing {
78
+ .tooltip.#{$name}-space {
79
+ --_space: #{$value};
80
+ }
81
+ }
82
+
83
+ .tooltip:not(.left, .right, .bottom) {
84
+ margin-block-start: var(--_space) !important;
85
+ }
86
+
87
+ .tooltip.left,
88
+ .tooltip.right {
89
+ margin-inline: var(--_space) !important;
90
+ }
91
+
92
+ .tooltip.bottom {
93
+ margin-block-end: var(--_space) !important;
94
+ }
95
+
96
+ menu:active ~ .tooltip,
97
+ :is(button, .button):focus > menu ~ .tooltip,
98
+ .field > :focus ~ menu ~ .tooltip {
99
+ visibility: hidden;
100
+ }
101
+
102
+ .slider {
103
+ > .tooltip {
104
+ --_space: -1.25rem;
105
+ }
106
+
107
+ &.vertical > .tooltip {
108
+ --_space: -0.75rem;
109
+
110
+ &:is(.left, .right) {
111
+ --_space: -0.5rem;
112
+ }
113
+ }
114
+ }
115
+
116
+ .tooltip.max {
117
+ display: block;
118
+ font-size: inherit;
119
+ white-space: normal;
120
+ text-align: start;
121
+ inline-size: 20rem;
122
+ border-radius: 0.5rem;
123
+ padding: 1rem;
124
+ box-shadow: var(--elevate2);
125
+ }
@@ -0,0 +1,29 @@
1
+ // Flex / text alignment utilities.
2
+
3
+ @use "sass:map";
4
+
5
+ $-alignments: (
6
+ "middle": center,
7
+ "bottom": flex-end,
8
+ "top": flex-start,
9
+ );
10
+
11
+ @each $name, $value in $-alignments {
12
+ .#{$name}-align {
13
+ display: flex;
14
+ align-items: $value !important;
15
+ }
16
+ }
17
+
18
+ $-justifications: (
19
+ "left": (text: start, justify: flex-start),
20
+ "right": (text: end, justify: flex-end),
21
+ "center": (text: center, justify: center),
22
+ );
23
+
24
+ @each $name, $values in $-justifications {
25
+ .#{$name}-align {
26
+ text-align: map.get($values, text);
27
+ justify-content: map.get($values, justify) !important;
28
+ }
29
+ }
@@ -0,0 +1,26 @@
1
+ // Backdrop-blur surfaces with three sizes.
2
+
3
+ [class*="blur"],
4
+ [class*="blur"].light {
5
+ --_blur: 1rem;
6
+ -webkit-backdrop-filter: blur(var(--_blur));
7
+ backdrop-filter: blur(var(--_blur));
8
+ color: var(--on-surface);
9
+ background-color: rgb(255 255 255 / 0.5) !important;
10
+ }
11
+
12
+ .dark [class*="blur"],
13
+ [class*="blur"].dark {
14
+ background-color: rgb(0 0 0 / 0.5) !important;
15
+ }
16
+
17
+ $-blur-sizes: (
18
+ "small": 0.5rem,
19
+ "large": 1.5rem,
20
+ );
21
+
22
+ @each $name, $value in $-blur-sizes {
23
+ .#{$name}-blur {
24
+ --_blur: #{$value};
25
+ }
26
+ }
@@ -0,0 +1,39 @@
1
+ // Material Design 2 palette utilities, generated from the $material-palette map.
2
+ // Each palette entry yields:
3
+ // .name → bg = shade-6 (the base), color !important
4
+ // .name6 → same as .name (alias for the base shade)
5
+ // .name-text → text color
6
+ // .name-border → border color
7
+ // .name1 ... .name10 → bg only, per tonal shade
8
+ //
9
+ // One Sass loop generates the full palette.
10
+
11
+ @use "sass:list";
12
+ @use "sass:map";
13
+ @use "../config" as *;
14
+
15
+ @each $name, $shades in $material-palette {
16
+ $base: list.nth($shades, 1);
17
+
18
+ .#{$name},
19
+ .#{$name}6 {
20
+ background-color: $base !important;
21
+ }
22
+
23
+ .#{$name}-border {
24
+ border-color: $base !important;
25
+ }
26
+
27
+ .#{$name}-text {
28
+ color: $base !important;
29
+ }
30
+
31
+ // Shades 1-10 from positions 2-11 in the shade list (skipping the duplicate base).
32
+ @for $i from 1 through 10 {
33
+ @if $i != 6 {
34
+ .#{$name}#{$i} {
35
+ background-color: list.nth($shades, $i + 1) !important;
36
+ }
37
+ }
38
+ }
39
+ }