opui-css 2.3.0 → 2.4.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 (79) hide show
  1. package/README.md +7 -23
  2. package/dist/{theme-one+op.css → op+ui.css} +20 -167
  3. package/dist/{theme-one.css → ui.css} +12 -168
  4. package/package.json +4 -6
  5. package/src/{themes/theme-one/components → components}/toggle-button-group.css +5 -1
  6. package/src/core/components.css +37 -0
  7. package/src/main.css +13 -0
  8. package/src/opui.css +10 -0
  9. package/src/{themes/theme-one/setup.css → theme.css} +1 -1
  10. package/dist/theme-two+op.css +0 -4021
  11. package/dist/theme-two.css +0 -3975
  12. package/src/themes/theme-one/components/table.css +0 -100
  13. package/src/themes/theme-one/components.css +0 -37
  14. package/src/themes/theme-one/theme+op.css +0 -5
  15. package/src/themes/theme-one/theme.css +0 -13
  16. package/src/themes/theme-two/components/accordion.css +0 -172
  17. package/src/themes/theme-two/components/alert.css +0 -85
  18. package/src/themes/theme-two/components/avatar.css +0 -68
  19. package/src/themes/theme-two/components/badge.css +0 -101
  20. package/src/themes/theme-two/components/button-group.css +0 -50
  21. package/src/themes/theme-two/components/button.css +0 -217
  22. package/src/themes/theme-two/components/card.css +0 -82
  23. package/src/themes/theme-two/components/checkbox-radio.css +0 -123
  24. package/src/themes/theme-two/components/chip.css +0 -135
  25. package/src/themes/theme-two/components/definition-list.css +0 -65
  26. package/src/themes/theme-two/components/dialog.css +0 -59
  27. package/src/themes/theme-two/components/divider.css +0 -7
  28. package/src/themes/theme-two/components/field-group.css +0 -83
  29. package/src/themes/theme-two/components/field.css +0 -281
  30. package/src/themes/theme-two/components/icon-button.css +0 -40
  31. package/src/themes/theme-two/components/link.css +0 -21
  32. package/src/themes/theme-two/components/list.css +0 -317
  33. package/src/themes/theme-two/components/progress.css +0 -83
  34. package/src/themes/theme-two/components/range.css +0 -121
  35. package/src/themes/theme-two/components/rich-text.css +0 -210
  36. package/src/themes/theme-two/components/select.css +0 -162
  37. package/src/themes/theme-two/components/snackbar.css +0 -148
  38. package/src/themes/theme-two/components/spinner.css +0 -38
  39. package/src/themes/theme-two/components/switch.css +0 -189
  40. package/src/themes/theme-two/components/tab-buttons.css +0 -120
  41. package/src/themes/theme-two/components/text-field.css +0 -57
  42. package/src/themes/theme-two/components/textarea.css +0 -25
  43. package/src/themes/theme-two/components/toggle-button-group.css +0 -135
  44. package/src/themes/theme-two/components/tooltip.css +0 -94
  45. package/src/themes/theme-two/components/typography.css +0 -209
  46. package/src/themes/theme-two/components.css +0 -37
  47. package/src/themes/theme-two/setup.css +0 -158
  48. package/src/themes/theme-two/theme+op.css +0 -5
  49. package/src/themes/theme-two/theme.css +0 -13
  50. /package/src/{themes/theme-one/components → components}/accordion.css +0 -0
  51. /package/src/{themes/theme-one/components → components}/alert.css +0 -0
  52. /package/src/{themes/theme-one/components → components}/avatar.css +0 -0
  53. /package/src/{themes/theme-one/components → components}/badge.css +0 -0
  54. /package/src/{themes/theme-one/components → components}/button-group.css +0 -0
  55. /package/src/{themes/theme-one/components → components}/button.css +0 -0
  56. /package/src/{themes/theme-one/components → components}/card.css +0 -0
  57. /package/src/{themes/theme-one/components → components}/checkbox-radio.css +0 -0
  58. /package/src/{themes/theme-one/components → components}/chip.css +0 -0
  59. /package/src/{themes/theme-one/components → components}/definition-list.css +0 -0
  60. /package/src/{themes/theme-one/components → components}/dialog.css +0 -0
  61. /package/src/{themes/theme-one/components → components}/divider.css +0 -0
  62. /package/src/{themes/theme-one/components → components}/field-group.css +0 -0
  63. /package/src/{themes/theme-one/components → components}/field.css +0 -0
  64. /package/src/{themes/theme-one/components → components}/icon-button.css +0 -0
  65. /package/src/{themes/theme-one/components → components}/link.css +0 -0
  66. /package/src/{themes/theme-one/components → components}/list.css +0 -0
  67. /package/src/{themes/theme-one/components → components}/progress.css +0 -0
  68. /package/src/{themes/theme-one/components → components}/range.css +0 -0
  69. /package/src/{themes/theme-one/components → components}/rich-text.css +0 -0
  70. /package/src/{themes/theme-one/components → components}/select.css +0 -0
  71. /package/src/{themes/theme-one/components → components}/snackbar.css +0 -0
  72. /package/src/{themes/theme-one/components → components}/spinner.css +0 -0
  73. /package/src/{themes/theme-one/components → components}/switch.css +0 -0
  74. /package/src/{themes/theme-one/components → components}/tab-buttons.css +0 -0
  75. /package/src/{themes/theme-two/components → components}/table.css +0 -0
  76. /package/src/{themes/theme-one/components → components}/text-field.css +0 -0
  77. /package/src/{themes/theme-one/components → components}/textarea.css +0 -0
  78. /package/src/{themes/theme-one/components → components}/tooltip.css +0 -0
  79. /package/src/{themes/theme-one/components → components}/typography.css +0 -0
@@ -1,3975 +0,0 @@
1
- @layer openprops, normalize, utils, theme, components.root, components.extended;
2
-
3
- /* Normalize */
4
-
5
- @layer normalize {
6
- *,
7
- ::before,
8
- ::after {
9
- /* Set box sizing instead of inheriting */
10
- /* https://www.oddbird.net/2025/09/04/box-model/ */
11
- box-sizing: border-box;
12
- }
13
-
14
- * {
15
- scrollbar-width: thin;
16
- }
17
-
18
- :where(html) {
19
- --_page-bg-color: var(--surface-default);
20
-
21
- accent-color: var(--primary);
22
- background-color: var(--_page-bg-color);
23
- block-size: 100%;
24
- caret-color: var(--primary);
25
- color: var(--text-color-2);
26
- font-family: var(--font-sans);
27
- interpolate-size: allow-keywords;
28
- line-height: var(--font-lineheight-4);
29
-
30
- /* https://kilianvalkhof.com/2022/css-html/your-css-reset-needs-text-size-adjust-probably/ */
31
- -moz-text-size-adjust: none;
32
- -webkit-text-size-adjust: none;
33
- text-size-adjust: none;
34
-
35
- @media (--motionOK) {
36
- scroll-behavior: smooth;
37
- }
38
- }
39
-
40
- :where(body) {
41
- -moz-osx-font-smoothing: grayscale;
42
- -webkit-font-smoothing: antialiased;
43
- container-type: inline-size;
44
- font-size: 16px;
45
- font-synthesis: style;
46
- font-weight: 400;
47
- inline-size: 100%;
48
- margin: 0;
49
- min-block-size: 100%;
50
- min-inline-size: 320px;
51
- position: relative;
52
- text-rendering: optimizeLegibility;
53
- }
54
-
55
- /* TODO */
56
- :where(:not(dialog, popover)) {
57
- margin: 0;
58
- }
59
-
60
- :where(:not(fieldset, progress, meter)) {
61
- background-origin: border-box;
62
- background-repeat: no-repeat;
63
- border-style: solid;
64
- border-width: 0;
65
- }
66
-
67
- :where(fieldset) {
68
- border: var(--field-border-width) solid var(--field-border-color);
69
- border-radius: var(--field-border-radius);
70
- padding: var(--size-3);
71
- display: grid;
72
- gap: var(--size-3);
73
- }
74
-
75
- :where(input, button, textarea),
76
- :where(input[type="file"])::-webkit-file-upload-button {
77
- color: inherit;
78
- font-size: inherit;
79
- font: inherit;
80
- letter-spacing: inherit;
81
- }
82
-
83
- :where(input):-webkit-autofill,
84
- :where(input):-webkit-autofill:hover,
85
- :where(input):-webkit-autofill:focus,
86
- :where(textarea):-webkit-autofill,
87
- :where(textarea):-webkit-autofill:hover,
88
- :where(textarea):-webkit-autofill:focus,
89
- :where(select):-webkit-autofill,
90
- :where(select):-webkit-autofill:hover,
91
- :where(select):-webkit-autofill:focus,
92
- :where(input):autofill,
93
- :where(input):autofill:hover,
94
- :where(input):autofill:focus,
95
- :where(textarea):autofill,
96
- :where(textarea):autofill:hover,
97
- :where(textarea):autofill:focus,
98
- :where(select):autofill,
99
- :where(select):autofill:hover,
100
- :where(select):autofill:focus {
101
- -webkit-text-fill-color: var(--text-color-2);
102
- -webkit-box-shadow: 0 0 0px 1e5px var(--well-1) inset;
103
- transition: background-color 5000s ease-in-out 0s;
104
- }
105
-
106
- ::placeholder {
107
- color: var(--text-color-2);
108
- }
109
-
110
- ::-moz-placeholder {
111
- opacity: 1;
112
- }
113
-
114
- :focus-visible {
115
- /* Inverts the --_page-bg-color */
116
- --_focus-visible-color: rgb(
117
- from var(--_page-bg-color) calc(255 - r) calc(255 - g) calc(255 - b)
118
- );
119
-
120
- border-radius: var(--border-radius, 0px);
121
- outline: 2px solid var(--_focus-visible-color);
122
- outline-offset: 2px;
123
- }
124
-
125
- @media (--motionOK) {
126
- :where(:focus-visible) {
127
- transition: outline-offset 145ms var(--ease-2);
128
- }
129
- :where(:not(:active):focus-visible) {
130
- transition-duration: 0.15s;
131
- }
132
- }
133
-
134
- :where(:not(:active):focus-visible) {
135
- outline-offset: var(--outline-offset, 0px);
136
- }
137
-
138
- :where(
139
- a[href],
140
- area,
141
- button,
142
- input:not(
143
- [type="text"],
144
- [type="email"],
145
- [type="number"],
146
- [type="password"],
147
- [type=""],
148
- [type="tel"],
149
- [type="url"]
150
- ),
151
- label[for],
152
- select,
153
- summary
154
- ) {
155
- cursor: pointer;
156
- }
157
-
158
- :where(
159
- a[href],
160
- area,
161
- button,
162
- [role="button"],
163
- input,
164
- label[for],
165
- select,
166
- summary,
167
- textarea,
168
- [tabindex]:not([tabindex*="-"])
169
- ) {
170
- -webkit-tap-highlight-color: transparent;
171
- touch-action: manipulation;
172
- }
173
-
174
- :where(img, svg, video, canvas, audio, iframe, embed, object) {
175
- display: block;
176
- }
177
-
178
- :where(img, svg, video) {
179
- block-size: auto;
180
- max-inline-size: 100%;
181
- }
182
-
183
- :where(svg:not([width])) {
184
- inline-size: var(--size-7);
185
- }
186
-
187
- :where(dt:not(:first-of-type)) {
188
- margin-block-start: var(--size-5);
189
- }
190
-
191
- :where(figure) {
192
- display: grid;
193
- gap: var(--size-2);
194
- place-items: center;
195
- }
196
-
197
- :target {
198
- scroll-margin-block-start: 2rem;
199
- }
200
- }
201
-
202
- /* Utils */
203
-
204
- @layer utils {
205
- /*
206
- Screen-reader only
207
- When you visibly want to hide an element but make it accessible for screen readers.
208
- */
209
- .sr-only {
210
- block-size: 1px;
211
- clip-path: inset(50%);
212
- inline-size: 1px;
213
- overflow: hidden;
214
- position: absolute;
215
- white-space: nowrap;
216
- }
217
-
218
- /* Hover and active effect for checkbox, radio and icon buttons */
219
- :where(.checkbox input, .radio input, .icon-button) {
220
- --isLTR: 1;
221
- --isRTL: -1;
222
-
223
- position: relative;
224
- transform-style: preserve-3d;
225
-
226
- &:dir(rtl) {
227
- --isLTR: -1;
228
- --isRTL: 1;
229
- }
230
-
231
- &:where(:not([disabled])) {
232
- &:hover:before {
233
- --thumb-scale: 1;
234
- }
235
-
236
- &:active:before {
237
- --thumb-scale: 1.1;
238
- }
239
-
240
- &::before {
241
- --thumb-scale: 0.01;
242
- --highlight-size: 150%;
243
-
244
- background-color: oklch(0.6 0 0 / 0.2);
245
- block-size: var(--highlight-size);
246
- clip-path: circle(50%);
247
- content: "";
248
- inline-size: var(--highlight-size);
249
- inset-block-start: 50%;
250
- inset-inline-start: 50%;
251
- position: absolute;
252
- transform-origin: center center;
253
- transform: translateX(calc(var(--isRTL) * 50%)) translateY(-50%)
254
- translateZ(-1px) scale(var(--thumb-scale));
255
- will-change: transform;
256
-
257
- @media (prefers-reduced-motion: no-preference) {
258
- transition: transform 0.2s ease;
259
- }
260
- }
261
- }
262
- }
263
- }
264
-
265
- /* Components */
266
-
267
- /*
268
- * Components are divided into two categories - if they are stand-alone (root) or if they are built on top of others (extended).
269
- */
270
-
271
- /*** Root components (no dependencies) */
272
-
273
- @layer components.root {
274
- :where(.button) {
275
- --_bg-color: transparent;
276
- --_border-color: transparent;
277
- --_border-radius: var(--button-border-radius);
278
- --_font-size: initial;
279
- --_min-height: 2.375rem;
280
- --_text-color: var(--primary);
281
-
282
- -webkit-tap-highlight-color: transparent;
283
- -webkit-touch-callout: none;
284
- align-items: center;
285
- background: var(--_bg-color) var(--ripple, none);
286
- border-radius: var(--_border-radius);
287
- border: var(--border-size-1) solid var(--_border-color);
288
- color: var(--_text-color);
289
- display: inline-flex;
290
- font-size: var(--_font-size);
291
- font-weight: 700;
292
- gap: var(--size-2);
293
- justify-content: center;
294
- min-block-size: var(--_min-height);
295
- padding-block: 0.5ex;
296
- padding-inline: 1.5ex;
297
- text-align: center;
298
- text-decoration: none;
299
-
300
- user-select: none;
301
-
302
- &:where([disabled]) {
303
- cursor: not-allowed;
304
- opacity: 0.64;
305
- }
306
-
307
- @media (prefers-reduced-motion: no-preference) {
308
- transition: background-color 0.2s var(--ease-out-3),
309
- box-shadow 0.2s var(--ease-out-3), border-color 0.2s var(--ease-out-3),
310
- color 0.2s var(--ease-out-3), outline-offset 0.05s var(--ease-1);
311
-
312
- /* Ripple effect */
313
- background-position: center;
314
-
315
- &:where(:not([disabled])) {
316
- &:where(:not(:active):hover) {
317
- --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
318
- center/15000%;
319
-
320
- transition: background var(--button-ripple-duration);
321
- }
322
-
323
- &:where(:hover:active) {
324
- background-size: var(--button-ripple-size);
325
- transition: background 0s;
326
- }
327
- }
328
- }
329
-
330
- /* Element states */
331
- &:where(:not([disabled])) {
332
- &:where(:not(:active):hover) {
333
- --_bg-color: light-dark(
334
- oklch(from var(--primary) l 0.01 h / 20%),
335
- oklch(from var(--primary) l 0.01 h / 40%)
336
- );
337
- }
338
-
339
- &:where(:hover:active) {
340
- --_bg-color: light-dark(
341
- oklch(from var(--primary) l 0.06 h / 30%),
342
- oklch(from var(--primary) l 0.06 h / 40%)
343
- );
344
- }
345
- }
346
-
347
- /* Disabled */
348
- &:where([disabled]) {
349
- --_text-color: color-mix(
350
- in oklch,
351
- var(--text-color-2) 50%,
352
- var(--surface-default)
353
- );
354
- }
355
-
356
- /* Icon */
357
- &:where(:has(svg), &.icon-only) {
358
- gap: 1ex;
359
-
360
- svg {
361
- max-block-size: 0.7lh;
362
- color: currentColor;
363
- }
364
- }
365
-
366
- /* Sizes */
367
- &.small {
368
- --_min-height: 1.875rem;
369
- padding-block: 0;
370
- padding-inline: 1ex;
371
- }
372
-
373
- &.large {
374
- --_min-height: 2.875rem;
375
- padding-inline: 4ex;
376
- }
377
-
378
- /* Variants */
379
- &.outlined {
380
- --_bg-color: var(--surface-default);
381
- --_border-color: var(--color-8);
382
- --_text-color: var(--color-8);
383
-
384
- &:where(:not([disabled])) {
385
- &:where(:not(:active):hover) {
386
- --_bg-color: var(--color-10);
387
- --_border-color: var(--color-10);
388
- --_text-color: var(--color-1);
389
- }
390
-
391
- &:where(:active) {
392
- --_bg-color: var(--color-9);
393
- --_border-color: var(--color-9);
394
- --_text-color: var(--color-1);
395
- }
396
- }
397
-
398
- &:where([disabled]) {
399
- --_bg-color: var(--surface-default);
400
- --_border-color: color-mix(
401
- in oklch,
402
- var(--text-color-2) 20%,
403
- var(--surface-default)
404
- );
405
- --_text-color: color-mix(
406
- in oklch,
407
- var(--text-color-2) 40%,
408
- var(--surface-default)
409
- );
410
- }
411
- }
412
- &.tonal {
413
- --_bg-color: var(--color-6);
414
- --_text-color: var(--color-16);
415
-
416
- &:where(:not([disabled])) {
417
- &:where(:not(:active):hover) {
418
- --_bg-color: var(--color-9);
419
- --_border-color: var(--color-9);
420
- }
421
-
422
- &:where(:active) {
423
- --_bg-color: var(--color-7);
424
- --_border-color: var(--color-7);
425
- }
426
- }
427
-
428
- &:where([disabled]) {
429
- --_bg-color: color-mix(
430
- in oklch,
431
- var(--text-color-2) 8%,
432
- var(--surface-default)
433
- );
434
- --_text-color: color-mix(
435
- in oklch,
436
- var(--text-color-2) 70%,
437
- var(--surface-default)
438
- );
439
- }
440
- }
441
- &.filled {
442
- --_bg-color: var(--color-8);
443
- --_text-color: var(--color-1);
444
-
445
- &:where(:not([disabled])) {
446
- &:where(:not(:active):hover) {
447
- --_bg-color: var(--color-10);
448
- --_border-color: var(--color-10);
449
- }
450
-
451
- &:where(:active) {
452
- --_bg-color: var(--color-9);
453
- --_border-color: var(--color-9);
454
- }
455
- }
456
-
457
- &:where([disabled]) {
458
- --_bg-color: color-mix(
459
- in oklch,
460
- var(--text-color-2) 20%,
461
- var(--surface-default)
462
- );
463
- --_text-color: color-mix(
464
- in oklch,
465
- var(--text-color-2) 70%,
466
- var(--surface-default)
467
- );
468
- }
469
- }
470
- }
471
-
472
- /* file input */
473
- :where(input[type="file"]) {
474
- align-self: flex-start;
475
- border-radius: var(--radius-2);
476
- border: var(--border-size-1) solid var(--surface-filled);
477
- box-shadow: var(--inner-shadow-4);
478
- color: var(--text-color-2-contrast);
479
- cursor: initial;
480
- max-inline-size: 100%;
481
- padding: 0;
482
- }
483
-
484
- :where(input[type="file"])::-webkit-file-upload-button,
485
- :where(input[type="file"])::file-selector-button {
486
- cursor: pointer;
487
- margin-inline-end: var(--size-relative-6);
488
- }
489
- }
490
-
491
- @layer components.root {
492
- :where(.icon-button) {
493
- --_text-color: inherit;
494
-
495
- align-items: center;
496
- aspect-ratio: 1;
497
- background-color: transparent;
498
- border: 0;
499
- border-radius: var(--radius-round);
500
- display: inline-flex;
501
- inline-size: var(--size-6);
502
- justify-content: center;
503
- padding: 0;
504
- transform-style: preserve-3d;
505
-
506
- &:where([disabled]) {
507
- color: light-dark(rgb(0, 0, 0/0.3), rgb(255, 255, 255/0.26));
508
- cursor: not-allowed;
509
- opacity: 0.64;
510
- }
511
-
512
- svg {
513
- max-inline-size: var(--size-5);
514
- pointer-events: none;
515
- }
516
-
517
- /* Ripple effect, utils.css */
518
- &::before {
519
- --highlight-size: 130%;
520
- }
521
-
522
- /* Size */
523
- &.small {
524
- inline-size: var(--size-4);
525
- svg {
526
- max-inline-size: var(--size-4);
527
- }
528
- }
529
- }
530
- }
531
-
532
- @layer components.root {
533
- :where(nav.tabs) {
534
- --_bg-color: transparent;
535
-
536
- & > [role="tablist"] {
537
- button {
538
- outline-color: transparent;
539
- outline-offset: -4px;
540
-
541
- &[aria-selected="true"] {
542
- &:focus-visible {
543
- outline: 2px solid var(--text-color-1);
544
- }
545
- }
546
- }
547
- }
548
-
549
- /* Underlined */
550
- &.underlined {
551
- /* Tab list */
552
- & > [role="tablist"] {
553
- border-bottom: 1px solid var(--border-color);
554
-
555
- button {
556
- --_ripple-color: light-dark(
557
- color-mix(in oklch, var(--gray-2) 80%, var(--color-8)),
558
- color-mix(in oklch, var(--gray-13) 80%, var(--color-8))
559
- );
560
-
561
- background: var(--_bg-color) var(--ripple, none);
562
- font-weight: 500;
563
- line-height: var(--font-lineheight-4);
564
- padding: var(--size-2) var(--size-3);
565
-
566
- &:focus-visible {
567
- border-radius: 0;
568
- }
569
-
570
- &[aria-selected="true"] {
571
- border-block-end: 2px solid var(--primary);
572
- color: var(--primary);
573
- }
574
-
575
- @media (prefers-reduced-motion: no-preference) {
576
- transition: background-color 0.2s var(--ease-out-3),
577
- border-color 0.2s var(--ease-out-3), color 0.2s var(--ease-out-3),
578
- outline-offset 0.05s var(--ease-1);
579
-
580
- /*** Ripple effect */
581
- background-position: center;
582
- transition: background var(--button-ripple-duration);
583
- &:where(:not(:active):hover) {
584
- --ripple: radial-gradient(
585
- circle,
586
- transparent 1%,
587
- var(--_ripple-color) 1%
588
- )
589
- center/15000%;
590
- }
591
-
592
- &:where(:hover:active) {
593
- background-size: var(--button-ripple-size);
594
- transition: background 0s;
595
- }
596
-
597
- &:hover {
598
- background-color: light-dark(
599
- oklch(from var(--primary) calc(l * 0.75) none h / 5%),
600
- oklch(from var(--primary) calc(l * 1.25) none h / 5%)
601
- );
602
- }
603
- }
604
- }
605
- }
606
- }
607
-
608
- /* Filled */
609
- &.filled {
610
- --_bg-color: var(--surface-default);
611
- --_radius: var(--border-radius);
612
- --_selected-bg: var(--surface-filled);
613
-
614
- & > [role="tablist"] {
615
- background-color: var(--_bg-color);
616
- border: var(--border-width) solid var(--border-color);
617
- border-radius: var(--_radius);
618
- overflow: hidden;
619
- padding: 0.792ex;
620
- width: fit-content;
621
-
622
- button {
623
- background-color: var(--_bg-color);
624
- border-radius: var(--_radius);
625
- line-height: var(--font-lineheight-4);
626
- padding-inline: var(--size-3);
627
-
628
- &:hover {
629
- background-color: oklch(from var(--_bg-color) calc(l * 1.25) c h);
630
- }
631
-
632
- &[aria-selected="true"] {
633
- background-color: var(--_selected-bg);
634
-
635
- &:hover {
636
- background-color: oklch(
637
- from var(--_selected-bg) calc(l * 1.25) c h
638
- );
639
- }
640
- }
641
-
642
- @media (prefers-reduced-motion: no-preference) {
643
- transition: background-color 0.2s var(--ease-out-3),
644
- border-color 0.2s var(--ease-out-3), color 0.2s var(--ease-out-3),
645
- outline-offset 0.05s var(--ease-1);
646
- }
647
- }
648
- }
649
- }
650
- }
651
- }
652
-
653
- @layer components.root {
654
- :where([role="group"].toggle-button-group) {
655
- --_border-radius: var(--button-border-radius);
656
- --_button-padding-inline: clamp(var(--size-2), 3cqi, var(--size-4));
657
- --_max-width: auto;
658
- --_icon-size: var(--size-4);
659
-
660
- background-color: var(--surface-default);
661
- border: 1px solid var(--border-color);
662
- border-radius: var(--_border-radius);
663
- display: flex;
664
- grid-auto-columns: 1fr;
665
- grid-auto-flow: column;
666
- max-inline-size: var(--_max-width);
667
- min-inline-size: max-content;
668
- overflow: clip;
669
-
670
- /* Size */
671
- &.small {
672
- button {
673
- min-block-size: 2.1875rem; /* 35px */
674
- }
675
- }
676
-
677
- &.x-small {
678
- button {
679
- min-block-size: var(--size-6); /* 30px */
680
- }
681
- }
682
-
683
- &.fullwidth {
684
- inline-size: 100%;
685
- }
686
-
687
- /* Button */
688
- button {
689
- --_bg-color: transparent;
690
-
691
- align-items: center;
692
- background: var(--_bg-color) var(--ripple, none);
693
- border-radius: 0;
694
- border-inline: 1px solid var(--border-color);
695
- border-inline-start-width: 0;
696
- color: var(--text-color-1);
697
- display: inline-flex;
698
- flex: auto;
699
- gap: 1ex;
700
- justify-content: center;
701
- min-block-size: 2.5rem; /* 40px */
702
- min-inline-size: 5ex;
703
- outline-offset: calc(-1 * var(--size-2));
704
- padding: 0 var(--_button-padding-inline);
705
- position: relative;
706
- user-select: none;
707
-
708
- @media (prefers-reduced-motion: no-preference) {
709
- transition: background-color 0.2s var(--ease-out-3),
710
- box-shadow 0.2s var(--ease-out-3), border-color 0.2s var(--ease-out-3),
711
- color 0.2s var(--ease-out-3), outline-offset 0.05s var(--ease-1);
712
- }
713
-
714
- /* Element states */
715
- &:hover {
716
- --_bg-color: light-dark(oklch(0% 0 0 / 0.04), oklch(100% 0 0 / 0.08));
717
- }
718
-
719
- &:focus-visible {
720
- outline-offset: -6px;
721
- }
722
-
723
- /* Disabled */
724
- &[disabled] {
725
- border-color: color-mix(in oklch, var(--border-color) 50%, transparent);
726
- cursor: not-allowed;
727
- color: color-mix(in oklch, var(--text-color-1) 30%, transparent);
728
- }
729
-
730
- &[disabled] + &:not([disabled]):not(:last-of-type) {
731
- border-inline-end-width: 1px;
732
- }
733
-
734
- /* Assign border radius for outline */
735
- &:first-of-type {
736
- border-bottom-left-radius: var(--_border-radius);
737
- border-top-left-radius: var(--_border-radius);
738
- }
739
- &:last-of-type {
740
- border-bottom-right-radius: var(--_border-radius);
741
- border-top-right-radius: var(--_border-radius);
742
- }
743
-
744
- &:last-of-type {
745
- border-inline-end-width: 0;
746
- }
747
-
748
- /* Ripple effect */
749
- background-position: center;
750
-
751
- &:where(:not([disabled])) {
752
- &:where(:not(:active):hover) {
753
- --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
754
- center/15000%;
755
-
756
- transition: background var(--button-ripple-duration);
757
- }
758
-
759
- &:where(:hover:active) {
760
- background-size: var(--button-ripple-size);
761
- transition: background 0s;
762
- }
763
- }
764
-
765
- /* Icons */
766
- svg {
767
- inline-size: var(--_icon-size);
768
- inset-inline-start: calc(var(--_button-padding-inline));
769
-
770
- & + svg {
771
- max-block-size: var(--size-5);
772
- max-inline-size: var(--size-7);
773
- }
774
- }
775
-
776
- /* Selected */
777
- &.selected {
778
- --_bg-color: oklch(from var(--primary) l c h / 25%);
779
-
780
- /* Checkmark */
781
- svg:first-of-type {
782
- margin-block-end: -3px;
783
- }
784
- }
785
- }
786
- }
787
- }
788
-
789
- @layer components.root {
790
- :where(.avatar) {
791
- --_bg-color: var(--color-8);
792
- --_color: var(--text-color-1);
793
- --_width: 40px;
794
-
795
- align-items: center;
796
- background-color: var(--_bg-color);
797
- color: var(--_color);
798
- aspect-ratio: 1;
799
- border-radius: 100vmax;
800
- display: inline-flex;
801
- inline-size: var(--_width);
802
- justify-content: center;
803
- overflow: clip;
804
- position: relative;
805
- text-align: center;
806
- text-decoration: none;
807
-
808
- &:has(img) {
809
- background-color: transparent;
810
- }
811
-
812
- svg {
813
- max-inline-size: var(--size-5);
814
- }
815
-
816
- img {
817
- block-size: 100%;
818
- inline-size: 100%;
819
- inset: 0;
820
- object-fit: cover;
821
- position: absolute;
822
- }
823
-
824
- &.squared {
825
- border-radius: 0;
826
- }
827
-
828
- &.rounded {
829
- border-radius: var(--border-size-3);
830
- }
831
- }
832
-
833
- /*
834
- TODO: implement reading-order if that becomes a thing.
835
- https://developer.chrome.com/blog/reading-order/
836
- */
837
- :where(.avatar-group) {
838
- --_margin: var(--size-1);
839
-
840
- display: flex;
841
- flex-direction: row-reverse;
842
-
843
- &.gap-small {
844
- --_margin: var(--size-2);
845
- }
846
-
847
- &.gap-x-small {
848
- --_margin: var(--size-3);
849
- }
850
-
851
- .avatar {
852
- margin-inline-end: calc(-1 * var(--_margin));
853
- outline: 2px solid var(--surface-default);
854
- }
855
- }
856
- }
857
-
858
- @layer components.root {
859
- :where(.badge) {
860
- --_bg-color: var(--primary);
861
- --_border-color: var(--primary);
862
- --_color: var(--gray-1);
863
- --_inset-offset: 16px;
864
- --_inset: auto auto calc(100% - var(--_inset-offset))
865
- calc(100% - var(--_inset-offset));
866
- --_translate: 0;
867
-
868
- display: inline-flex;
869
- position: relative;
870
-
871
- &::after {
872
- background-color: var(--_bg-color);
873
- border: 2px solid var(--_border-color);
874
- border-radius: 100vmax;
875
- color: var(--_color);
876
- content: attr(aria-label);
877
- font-size: 12px;
878
- font-weight: 500;
879
- block-size: var(--size-4);
880
- line-height: normal;
881
- min-inline-size: var(--size-4, 1.125rem);
882
- padding-inline: var(--size-1);
883
- inset: var(--_inset);
884
- position: absolute;
885
- text-align: center;
886
- translate: var(--_translate);
887
- transition: opacity 0.2s var(--ease-out-1);
888
- inline-size: max-content;
889
- }
890
-
891
- /* Alignment */
892
- &.start-start {
893
- --_inset: auto calc(100% - var(--_inset-offset))
894
- calc(100% - var(--_inset-offset)) auto;
895
- }
896
- &.start-end {
897
- --_inset: auto auto calc(100% - var(--_inset-offset))
898
- calc(100% - var(--_inset-offset));
899
- }
900
- &.end-start {
901
- --_inset: calc(100% - var(--_inset-offset))
902
- calc(100% - var(--_inset-offset)) auto auto;
903
- }
904
- &.end-end {
905
- --_inset: calc(100% - var(--_inset-offset)) auto auto
906
- calc(100% - var(--_inset-offset));
907
- }
908
-
909
- /* Dot */
910
- &.dot {
911
- --_inset: 0 -1px auto auto;
912
- &::after {
913
- content: "";
914
- min-inline-size: var(--size-2);
915
- block-size: var(--size-2);
916
- inline-size: var(--size-2);
917
- padding: 0;
918
- }
919
- }
920
-
921
- /* Visibility */
922
- &.invisible {
923
- &::after {
924
- opacity: 0;
925
- pointer-events: none;
926
- }
927
- }
928
-
929
- /* Colors */
930
- &.error,
931
- &.good,
932
- &.ok,
933
- &.warning {
934
- --_bg-color: var(--color-8);
935
- --_border-color: var(--color-8);
936
- }
937
- }
938
-
939
- [dir="rtl"] {
940
- :where(.badge) {
941
- --_inset: auto calc(100% - 16px) calc(100% - 16px) auto;
942
-
943
- /* Alignment */
944
- &.start-start {
945
- --_inset: auto auto calc(100% - 16px) calc(100% - 16px);
946
- }
947
- &.start-end {
948
- --_inset: auto calc(100% - 16px) calc(100% - 16px) auto;
949
- }
950
- &.end-start {
951
- --_inset: calc(100% - 16px) auto auto calc(100% - 16px);
952
- }
953
- &.end-end {
954
- --_inset: calc(100% - 16px) calc(100% - 16px) auto auto;
955
- }
956
- }
957
- }
958
- }
959
-
960
- @layer components.root {
961
- :where(.card) {
962
- --_bg-color: transparent;
963
- --_border-color: transparent;
964
- --_border-width: 0;
965
- --_shadow: none;
966
-
967
- background-color: var(--_bg-color);
968
- border-color: var(--_border-color);
969
- border-radius: var(--border-radius, 0.25rem);
970
- border-style: solid;
971
- border-width: var(--_border-width);
972
- box-shadow: var(--_shadow);
973
- display: flex;
974
- flex-direction: column;
975
- gap: var(--size-3);
976
- overflow: hidden;
977
- padding-inline: 0;
978
-
979
- /* Variants */
980
- &.text {
981
- --_bg-color: transparent;
982
- --_border-color: transparent;
983
- --_border-width: 0;
984
- --_shadow: none;
985
- padding-inline: 0;
986
- }
987
-
988
- &.tonal {
989
- --_bg-color: var(--surface-tonal);
990
- --_border-width: 1px;
991
- }
992
-
993
- &.elevated {
994
- --_bg-color: var(--surface-elevated);
995
- --_border-color: transparent;
996
- --_border-width: 0;
997
- --_shadow: var(--shadow-3);
998
-
999
- /* Adjust shadow in dark mode */
1000
- @container style(--color-scheme: dark) {
1001
- --_shadow: var(--shadow-4);
1002
- }
1003
- }
1004
-
1005
- &.outlined {
1006
- --_bg-color: var(--surface-default);
1007
- --_border-color: var(--border-color);
1008
- --_border-width: 1px;
1009
- }
1010
-
1011
- & > :where(hgroup, .content) {
1012
- padding-inline: var(--size-3);
1013
- }
1014
-
1015
- & > hgroup {
1016
- padding-block: var(--size-3) 0;
1017
-
1018
- /* Top paragraph */
1019
- & > p:first-of-type:first-child {
1020
- line-height: 1.3;
1021
- }
1022
-
1023
- /* Bottom paragraph */
1024
- & > p:last-of-type:last-child:not(:first-child) {
1025
- font-size: var(--font-size-1, 1rem);
1026
- }
1027
- }
1028
-
1029
- & > .content:where(:only-child, :first-child) {
1030
- padding-block: var(--size-3) var(--size-4);
1031
- }
1032
-
1033
- & > .actions {
1034
- display: flex;
1035
- gap: var(--size-1);
1036
- margin-block: var(--size-2) 0;
1037
- padding-block-end: var(--size-1);
1038
- padding-inline: var(--size-1) var(--size-3);
1039
- }
1040
- }
1041
- }
1042
-
1043
- @layer components.root {
1044
- :where(.chip) {
1045
- --_bg-color: var(--surface-tonal);
1046
- --_border-color: var(--border-color);
1047
- --_color: var(--text-color-1);
1048
-
1049
- align-items: center;
1050
- background: var(--_bg-color) var(--ripple, none);
1051
- border: 1px solid var(--_border-color);
1052
- border-radius: var(--radius-2, 0.5rem);
1053
- color: var(--_color);
1054
- display: inline-flex;
1055
- font-size: var(--font-size-0, 0.75rem);
1056
- gap: var(--size-1);
1057
- block-size: var(--size-7, 2rem);
1058
- padding-inline: var(--size-2);
1059
- text-decoration: none;
1060
-
1061
- /* Variants */
1062
- &.tonal {
1063
- --_bg-color: var(--surface-tonal);
1064
- --_color: var(--text-color-1);
1065
- }
1066
-
1067
- &.outlined {
1068
- --_bg-color: var(--surface-default);
1069
- --_color: var(--text-color-1);
1070
- }
1071
-
1072
- /* TODO: should this be out of the box? */
1073
- /* Colors */
1074
- /* &:hover {
1075
- --_bg-color: var(--color-11);
1076
- --_border-color: var(--color-11);
1077
- --_color: var(--text-color-1);
1078
- } */
1079
- /* &.red,
1080
- &.blue,
1081
- &.green,
1082
- &.orange,
1083
- &.primary {
1084
- --_bg-color: var(--color-5);
1085
- --_border-color: var(--color-7);
1086
- --_color: var(--text-color-1-contrast);
1087
-
1088
- &:hover {
1089
- --_bg-color: var(--color-7);
1090
- --_border-color: var(--color-7);
1091
- --_color: var(--text-color-1-contrast);
1092
-
1093
- &:active {
1094
- --_bg-color: var(--color-8);
1095
- --_border-color: var(--color-8);
1096
- }
1097
- }
1098
-
1099
- &.outlined {
1100
- --_bg-color: var(--surface-tonal);
1101
- --_color: var(--text-color-1);
1102
- --_border-color: var(--color-9);
1103
-
1104
- &:hover {
1105
- --_bg-color: var(--color-9);
1106
- --_border-color: var(--color-9);
1107
- --_color: var(--text-color-1);
1108
-
1109
- &:active {
1110
- --_bg-color: var(--color-11);
1111
- --_border-color: var(--color-11);
1112
- }
1113
- }
1114
- }
1115
- } */
1116
-
1117
- &:where(button, a):where(:not([disabled])) {
1118
- &:where(:not(:active)):hover {
1119
- --_bg-color: light-dark(
1120
- oklch(from var(--surface-tonal) calc(l * 0.98) c h),
1121
- oklch(from var(--surface-tonal) calc(l * 1.1) c h)
1122
- );
1123
- }
1124
- }
1125
-
1126
- /* Icon */
1127
- &:has(svg:first-child) {
1128
- padding-inline: var(--size-1) var(--size-2);
1129
- }
1130
- &:has(svg:last-child) {
1131
- padding-inline: var(--size-2) var(--size-1);
1132
- }
1133
-
1134
- &:has(svg) {
1135
- svg {
1136
- flex-shrink: 0;
1137
- inline-size: var(--size-3);
1138
- }
1139
- }
1140
-
1141
- /* Sizes */
1142
- &.small {
1143
- block-size: var(--size-5);
1144
- }
1145
- &.multiline {
1146
- block-size: auto;
1147
- }
1148
-
1149
- /* Ripple effect */
1150
- background-position: center;
1151
-
1152
- &:where(:not([disabled])) {
1153
- &:where(:not(:active):hover) {
1154
- --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
1155
- center/15000%;
1156
-
1157
- transition: background var(--button-ripple-duration);
1158
- }
1159
-
1160
- &:where(:hover:active) {
1161
- background-size: var(--button-ripple-size);
1162
- transition: background 0s;
1163
- }
1164
- }
1165
-
1166
- /* Disabled */
1167
- &:where([disabled]) {
1168
- opacity: 0.64;
1169
- --_text-color: color-mix(
1170
- in oklch,
1171
- var(--text-color-2) 50%,
1172
- var(--surface-default)
1173
- );
1174
- cursor: not-allowed;
1175
- }
1176
- }
1177
- }
1178
-
1179
- @layer components.root {
1180
- :where(.definition-list) {
1181
- --_border-style: solid;
1182
- --_border-width: 1px;
1183
-
1184
- display: grid;
1185
- gap: var(--size-3);
1186
- padding: 0;
1187
-
1188
- &.dotted {
1189
- --_border-style: dotted;
1190
- --_border-width: 2px;
1191
- }
1192
-
1193
- li {
1194
- display: grid;
1195
- margin: 0;
1196
- padding: 0;
1197
-
1198
- .term {
1199
- display: block;
1200
- font-weight: 700;
1201
- overflow: hidden;
1202
- position: relative;
1203
- }
1204
-
1205
- hr {
1206
- display: none;
1207
- margin: 0;
1208
- }
1209
- }
1210
-
1211
- @container (width > 45ch) {
1212
- gap: var(--size-1);
1213
-
1214
- li {
1215
- align-items: baseline;
1216
- display: grid;
1217
- gap: var(--size-1);
1218
- grid-template-columns: 1fr auto;
1219
-
1220
- &:has(hr) {
1221
- grid-template-columns: auto 1fr auto;
1222
- }
1223
-
1224
- hr {
1225
- background-color: transparent;
1226
- border-block-end: var(--_border-width) var(--_border-style)
1227
- var(--border-color);
1228
- block-size: 2px;
1229
- display: block;
1230
- }
1231
-
1232
- .term {
1233
- &::after {
1234
- display: inline-block;
1235
- }
1236
- }
1237
- .description {
1238
- color: var(--text-color-2);
1239
- }
1240
- }
1241
- }
1242
- }
1243
- }
1244
-
1245
- @layer components.root {
1246
- :where(hr) {
1247
- background-color: var(--border-color);
1248
- block-size: var(--border-size-1);
1249
- margin-block: var(--size-fluid-3);
1250
- }
1251
- }
1252
-
1253
- @layer components.root {
1254
- :where(.link) {
1255
- color: var(--primary);
1256
- cursor: pointer;
1257
- font-weight: 700;
1258
- text-decoration: underline;
1259
- text-decoration-color: var(--primary);
1260
- text-underline-offset: 2px;
1261
-
1262
- &[href] {
1263
- &:hover,
1264
- &:focus-visible {
1265
- color: var(--primary-light);
1266
- }
1267
- }
1268
-
1269
- @supports (-moz-appearance: none) {
1270
- text-underline-offset: 2px;
1271
- }
1272
- }
1273
- }
1274
-
1275
- @layer components.root {
1276
- :where(table) {
1277
- border-collapse: collapse;
1278
- display: block;
1279
- margin: var(--size-3) 0;
1280
- max-inline-size: 100%;
1281
- position: relative;
1282
-
1283
- /* Rows */
1284
- tr {
1285
- background-color: var(--surface-default);
1286
- border-top: 1px solid var(--border-color);
1287
-
1288
- &:hover {
1289
- background-color: oklch(from var(--surface-filled) l c h / 75%);
1290
- }
1291
- }
1292
-
1293
- /* Cells */
1294
- th,
1295
- td {
1296
- border: 1px solid var(--border-color);
1297
- padding: var(--size-1) var(--size-2);
1298
- }
1299
-
1300
- th {
1301
- background-color: var(--surface-filled);
1302
- color: var(--text-color-1);
1303
- font-size: var(--font-size-sm, 0.75rem);
1304
- font-weight: 600;
1305
- text-align: start;
1306
- }
1307
-
1308
- td {
1309
- font-size: var(--font-size-sm, 0.75rem);
1310
- }
1311
-
1312
- /* Caption */
1313
- caption {
1314
- caption-side: bottom;
1315
- color: var(--text-color-2);
1316
- font-size: var(--font-size-sm, 0.75rem);
1317
- padding: var(--size-2) 0;
1318
- text-align: start;
1319
- }
1320
-
1321
- /* Header */
1322
- thead {
1323
- position: sticky;
1324
- top: 0;
1325
- z-index: 1;
1326
- }
1327
-
1328
- /* Footer */
1329
- tfoot {
1330
- border-top: 2px solid var(--border-color);
1331
-
1332
- tr {
1333
- background-color: var(--surface-filled);
1334
- }
1335
-
1336
- td {
1337
- color: var(--text-color-1);
1338
- font-weight: 600;
1339
- }
1340
- }
1341
-
1342
- /* Column group */
1343
- colgroup col {
1344
- border: none;
1345
- }
1346
-
1347
- @container (width < 60ch) {
1348
- th,
1349
- td {
1350
- padding: var(--size-1) 0.875rem;
1351
- }
1352
- }
1353
-
1354
- /* Sticky header */
1355
- &.sticky-header thead {
1356
- background-color: var(--surface-filled);
1357
- position: sticky;
1358
- inset-block-start: 0;
1359
- z-index: 1;
1360
- }
1361
-
1362
- /* Dense */
1363
- &.dense {
1364
- th,
1365
- td {
1366
- padding: var(--size-1) var(--size-2);
1367
- }
1368
-
1369
- caption {
1370
- padding: var(--size-1) 0;
1371
- }
1372
-
1373
- @container (width < 60ch) {
1374
- th,
1375
- td {
1376
- padding: var(--size-1) var(--size-2);
1377
- }
1378
- }
1379
- }
1380
- }
1381
- }
1382
-
1383
- @layer components.root {
1384
- :where(progress) {
1385
- --_accent-color: var(--primary);
1386
- --_bg-color: var(--surface-tonal);
1387
-
1388
- appearance: none;
1389
- background-color: var(--_bg-color);
1390
- border-radius: var(--border-radius, 0.25rem);
1391
- border: 0;
1392
- display: inline-block;
1393
- block-size: var(--size-1);
1394
- overflow: hidden;
1395
- position: relative;
1396
- vertical-align: baseline;
1397
- inline-size: 100%;
1398
-
1399
- &::-webkit-progress-bar {
1400
- border-radius: var(--border-radius, 0.25rem);
1401
- background: none;
1402
- }
1403
-
1404
- &[value]::-webkit-progress-value {
1405
- background-color: var(--_accent-color);
1406
-
1407
- @media (prefers-reduced-motion: no-preference) {
1408
- transition: inline-size 0.2s
1409
- var(--ease-out-4, cubic-bezier(0, 0, 0.1, 1));
1410
- }
1411
- }
1412
-
1413
- &::-moz-progress-bar {
1414
- background-color: var(--_accent-color);
1415
- }
1416
- }
1417
-
1418
- @media (prefers-reduced-motion: no-preference) {
1419
- progress:indeterminate {
1420
- background-color: var(--_bg-color);
1421
-
1422
- &::after {
1423
- animation: indeterminate 2s linear infinite;
1424
- background-color: var(--_accent-color);
1425
- content: "";
1426
- inset: 0 auto 0 0;
1427
- position: absolute;
1428
- will-change: inset-inline-start, inset-inline-end;
1429
- }
1430
-
1431
- &[value]::-webkit-progress-value {
1432
- background-color: transparent;
1433
- }
1434
-
1435
- &::-moz-progress-bar {
1436
- background-color: transparent;
1437
- }
1438
- }
1439
-
1440
- [dir="rtl"] {
1441
- :where(progress):indeterminate {
1442
- animation-direction: reverse;
1443
-
1444
- &::after {
1445
- animation-direction: reverse;
1446
- }
1447
- }
1448
- }
1449
- }
1450
-
1451
- @keyframes indeterminate {
1452
- 0% {
1453
- left: -200%;
1454
- right: 100%;
1455
- }
1456
- 60% {
1457
- left: 107%;
1458
- right: -8%;
1459
- }
1460
- 100% {
1461
- left: 107%;
1462
- right: -8%;
1463
- }
1464
- }
1465
- }
1466
-
1467
- @layer components.root {
1468
- [aria-busy="true"]:not(
1469
- input,
1470
- select,
1471
- textarea,
1472
- html,
1473
- progress,
1474
- [aria-describedby]
1475
- ) {
1476
- position: relative;
1477
-
1478
- &::before {
1479
- animation: spin 0.7s linear infinite;
1480
- border-color: transparent currentColor currentColor;
1481
- border-radius: 50%;
1482
- border-style: solid;
1483
- border-width: 3px;
1484
- content: "";
1485
- display: inline-block;
1486
- block-size: 1em;
1487
- opacity: 0.5;
1488
- vertical-align: -0.14em;
1489
- inline-size: 1em;
1490
- }
1491
-
1492
- &:not(button.button):not(:empty) {
1493
- &::before {
1494
- margin-inline-end: 0.5em;
1495
- }
1496
- }
1497
- }
1498
-
1499
- @keyframes spin {
1500
- to {
1501
- transform: rotate(1turn);
1502
- }
1503
- }
1504
- }
1505
-
1506
- @layer components.root {
1507
- label:where(.checkbox, .radio) {
1508
- align-items: center;
1509
- color: var(--text-color-1);
1510
- cursor: pointer;
1511
- display: inline-grid;
1512
- gap: 0 var(--size-2);
1513
- grid-auto-columns: auto;
1514
- grid-auto-flow: column;
1515
- inline-size: fit-content;
1516
- line-height: 1.5;
1517
- transform: translateZ(0);
1518
- user-select: none;
1519
-
1520
- /* Disabled */
1521
- &:has([disabled]) {
1522
- cursor: not-allowed;
1523
- opacity: 0.64;
1524
- user-select: none;
1525
-
1526
- input {
1527
- cursor: not-allowed;
1528
- }
1529
- }
1530
-
1531
- /* Required dot */
1532
- &:has([required]:not([type="checkbox"]:checked)) {
1533
- .label:after {
1534
- color: var(--red);
1535
- content: "*";
1536
- inset: 0 -0.25ex auto auto;
1537
- position: absolute;
1538
- }
1539
- }
1540
-
1541
- /* Label */
1542
- .label {
1543
- grid-column: 2;
1544
- grid-row: 1;
1545
- position: relative;
1546
- padding-inline: 0 1ex;
1547
- }
1548
-
1549
- /* Supporting text */
1550
- .supporting-text {
1551
- color: var(--text-color-2);
1552
- font-size: var(--font-size-xs);
1553
- grid-column: 2;
1554
- grid-row: 2;
1555
- line-height: 1.5;
1556
- z-index: 1;
1557
- }
1558
-
1559
- /* Stacked layout */
1560
- &.stack {
1561
- justify-items: center;
1562
- grid-auto-columns: unset;
1563
-
1564
- .label {
1565
- grid-column: 1/-1;
1566
- grid-row: 2;
1567
- margin-block-start: var(--size-1);
1568
- padding-inline: 1ex;
1569
-
1570
- /* Required dot */
1571
- &::after {
1572
- inset: 0 -0.25ex auto auto;
1573
- }
1574
- }
1575
-
1576
- .supporting-text {
1577
- grid-column: 1/-1;
1578
- grid-row: 3;
1579
- }
1580
- }
1581
-
1582
- /* Input */
1583
- input {
1584
- aspect-ratio: 1;
1585
- block-size: 1.125rem;
1586
- cursor: pointer;
1587
- inline-size: 1.125rem;
1588
-
1589
- &::before {
1590
- --highlight-size: 175%;
1591
- }
1592
- }
1593
-
1594
- /* Sizes */
1595
- &.small {
1596
- input {
1597
- block-size: var(--size-3);
1598
- inline-size: var(--size-3);
1599
- }
1600
- }
1601
-
1602
- &.large {
1603
- input {
1604
- block-size: var(--size-4);
1605
- inline-size: var(--size-4);
1606
- }
1607
- }
1608
-
1609
- /* Validation */
1610
- &.error {
1611
- input[type="checkbox"] {
1612
- accent-color: var(--color-9);
1613
-
1614
- & ~ :where(.label, .supporting-text) {
1615
- color: var(--color-9);
1616
- }
1617
- }
1618
- }
1619
-
1620
- /* Touch devices */
1621
- @media (pointer: coarse) {
1622
- input {
1623
- block-size: var(--size-4);
1624
- inline-size: var(--size-4);
1625
- }
1626
- }
1627
- }
1628
- }
1629
-
1630
- @layer components.root {
1631
- :where(.switch) {
1632
- --_accent-color: var(--primary);
1633
- --_accent-contrast: var(--primary-contrast);
1634
-
1635
- --_dot-bg-color: light-dark(var(--gray-11), var(--gray-14));
1636
- --_dot-inset: var(--size-1) auto auto var(--size-1);
1637
- --_dot-outline-size: 0;
1638
- --_dot-size: var(--size-3);
1639
-
1640
- --_track-bg-color: light-dark(var(--gray-3), var(--gray-8));
1641
- --_track-height: var(--size-5);
1642
- --_track-width: var(--size-8);
1643
- --_transition-tf: var(--ease-4);
1644
- --_transition-time: 0.2s;
1645
-
1646
- align-items: center;
1647
- color: var(--text-color-1);
1648
- display: inline-grid;
1649
- gap: 0 var(--size-2);
1650
- grid-auto-columns: auto;
1651
- grid-auto-flow: column;
1652
- inline-size: fit-content;
1653
-
1654
- input[type="checkbox"][role="switch"] {
1655
- appearance: none;
1656
- block-size: var(--_track-height);
1657
- cursor: pointer;
1658
- inline-size: var(--_track-width);
1659
- margin: 0;
1660
- position: relative;
1661
-
1662
- /* Track */
1663
- &::before {
1664
- background-color: var(--_track-bg-color);
1665
- block-size: var(--_track-height);
1666
- border: 1px solid var(--_dot-bg-color);
1667
- border-radius: 100vmax;
1668
- content: "";
1669
- inline-size: var(--_track-width);
1670
- inset: 0;
1671
- position: absolute;
1672
- }
1673
-
1674
- &:focus-visible {
1675
- outline-offset: 2px;
1676
- outline: 2px solid currentColor;
1677
- }
1678
-
1679
- /* Dot */
1680
- &::after {
1681
- background-color: var(--_dot-bg-color);
1682
- block-size: var(--_dot-size);
1683
- border-radius: 100vmax;
1684
- content: "";
1685
- inline-size: var(--_dot-size);
1686
- inset: var(--_dot-inset);
1687
- outline-offset: -1px;
1688
- outline: var(--_dot-outline-size) solid var(--_dot-bg-color);
1689
- position: absolute;
1690
- }
1691
-
1692
- /* Checked */
1693
- &:checked {
1694
- &::before {
1695
- background-color: var(--_accent-color);
1696
- border-color: var(--_accent-color);
1697
- transition: background-color var(--_transition-time)
1698
- var(--_transition-tf),
1699
- border-color var(--_transition-time) var(--_transition-tf);
1700
- }
1701
-
1702
- /* Dot */
1703
- &::after {
1704
- --_dot-bg-color: var(--_accent-contrast);
1705
- --_dot-outline-size: calc(var(--size-1) - 1px);
1706
-
1707
- inset-inline-start: calc(
1708
- var(--_track-width) - var(--_dot-size) - var(--size-1)
1709
- );
1710
- }
1711
- }
1712
-
1713
- /* Animation */
1714
- @media (prefers-reduced-motion: no-preference) {
1715
- /* Track */
1716
- &::before {
1717
- transition: background-color var(--_transition-time)
1718
- var(--_transition-tf),
1719
- border-color var(--_transition-time) var(--_transition-tf);
1720
- }
1721
-
1722
- /* Dot */
1723
- &::after {
1724
- transition: all var(--_transition-time) var(--_transition-tf);
1725
- }
1726
-
1727
- &:active:after {
1728
- --_dot-outline-size: calc(var(--size-1) + 1px);
1729
- }
1730
-
1731
- &:checked {
1732
- &:active:after {
1733
- --_dot-outline-size: calc(var(--size-1) + 1px);
1734
- }
1735
- }
1736
- }
1737
- }
1738
-
1739
- /* Required dot */
1740
- &:has([required]:not(:checked)) {
1741
- .label:after {
1742
- color: var(--red);
1743
- content: "*";
1744
- inset: 0 -0.25ex auto auto;
1745
- position: absolute;
1746
- }
1747
- }
1748
-
1749
- /* Disabled */
1750
- &:has([disabled]) {
1751
- cursor: not-allowed;
1752
- opacity: 0.64;
1753
- user-select: none;
1754
-
1755
- input {
1756
- cursor: not-allowed;
1757
- }
1758
- }
1759
-
1760
- /* Label */
1761
- .label {
1762
- grid-column: 2;
1763
- grid-row: 1;
1764
- min-width: 0;
1765
- padding-inline: 0 1ex;
1766
- position: relative;
1767
- user-select: none;
1768
- }
1769
-
1770
- /* Supporting text */
1771
- .supporting-text {
1772
- color: var(--text-color-2);
1773
- font-size: var(--font-size-xs);
1774
- grid-column: 2;
1775
- grid-row: 2;
1776
- line-height: 1.5;
1777
- z-index: 1;
1778
- }
1779
-
1780
- /* Size */
1781
- &.small {
1782
- --_dot-size: 0.75rem;
1783
- --_track-height: var(--size-4);
1784
- --_track-width: 2.5rem;
1785
- }
1786
-
1787
- /* Stacked layout */
1788
- &.stack {
1789
- justify-items: center;
1790
- grid-auto-columns: unset;
1791
-
1792
- .label {
1793
- grid-column: 1/-1;
1794
- grid-row: 2;
1795
- margin-block-start: var(--size-1);
1796
- padding-inline: 1ex;
1797
- }
1798
-
1799
- .supporting-text {
1800
- grid-column: 1/-1;
1801
- grid-row: 3;
1802
- }
1803
- }
1804
-
1805
- /* Validation */
1806
- &.error {
1807
- input {
1808
- outline: 2px solid var(--color-9);
1809
- border-radius: var(--radius-round);
1810
- }
1811
-
1812
- .label,
1813
- .supporting-text {
1814
- color: var(--color-9);
1815
- }
1816
- }
1817
- }
1818
- }
1819
-
1820
- @layer components.root {
1821
- :where(.range > input[type="range"]) {
1822
- --thumb-bg: var(--primary);
1823
- --thumb-highlight-color: oklch(from var(--primary) 70% 100% h / 20%);
1824
- --thumb-highlight-size: 0px;
1825
- --thumb-offset: -1ex;
1826
- --thumb-size: 3ex;
1827
- --track-color: var(--field-border-color);
1828
- --track-fill: 0%;
1829
- --track-height: 1ex;
1830
-
1831
- appearance: none;
1832
- background: transparent;
1833
- display: block;
1834
- inline-size: 100%;
1835
- margin: 1ex 0 3ex;
1836
- outline-offset: 1ex;
1837
-
1838
- @media (hover: none) {
1839
- --thumb-offset: -14px;
1840
- --thumb-size: 30px;
1841
- }
1842
-
1843
- /* Track */
1844
- &::-webkit-slider-runnable-track {
1845
- appearance: none;
1846
- background: linear-gradient(
1847
- to right,
1848
- transparent var(--track-fill),
1849
- var(--track-color) 0%
1850
- ),
1851
- var(--primary);
1852
- block-size: var(--track-height);
1853
- border-radius: 5ex;
1854
- box-shadow: var(--inner-shadow-1);
1855
- }
1856
-
1857
- &::-moz-range-track {
1858
- appearance: none;
1859
- background: linear-gradient(
1860
- to right,
1861
- transparent var(--track-fill),
1862
- var(--track-color) 0%
1863
- ),
1864
- var(--primary);
1865
- block-size: var(--track-height);
1866
- border-radius: 5ex;
1867
- box-shadow: var(--inner-shadow-2);
1868
- }
1869
-
1870
- /* Ring */
1871
- &::-webkit-slider-thumb {
1872
- appearance: none;
1873
- background: var(--thumb-bg);
1874
- block-size: var(--thumb-size);
1875
- border-radius: 50%;
1876
- border: 3px solid var(--surface-default);
1877
- box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color);
1878
- cursor: ew-resize;
1879
- inline-size: var(--thumb-size);
1880
- margin-block-start: var(--thumb-offset);
1881
-
1882
- @media (prefers-reduced-motion: no-preference) {
1883
- transition: box-shadow 0.1s ease;
1884
- }
1885
-
1886
- .fieldset-item:focus-within & {
1887
- border-color: var(--gray-14);
1888
- }
1889
- }
1890
-
1891
- &::-moz-range-thumb {
1892
- appearance: none;
1893
- background: var(--thumb-bg);
1894
- block-size: var(--thumb-size);
1895
- border-radius: 50%;
1896
- border: 3px solid var(--primary);
1897
- box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color);
1898
- cursor: ew-resize;
1899
- inline-size: var(--thumb-size);
1900
- margin-block-start: var(--thumb-offset);
1901
-
1902
- @media (prefers-reduced-motion: no-preference) {
1903
- transition: box-shadow 0.1s ease;
1904
- }
1905
-
1906
- .fieldset-item:focus-within & {
1907
- border-color: var(--gray-14);
1908
- }
1909
- }
1910
-
1911
- /* Element state */
1912
- &:not([disabled]) {
1913
- &:hover {
1914
- --thumb-highlight-size: var(--size-1);
1915
- }
1916
-
1917
- &:active {
1918
- --thumb-highlight-size: var(--size-2);
1919
- --track-color: light-dark(
1920
- oklch(from var(--field-border-color) calc(l * 0.9) c h),
1921
- oklch(from var(--field-border-color) calc(l * 1.1) c h)
1922
- );
1923
- }
1924
- }
1925
-
1926
- &[disabled] {
1927
- --thumb-bg: oklch(from var(--text-color-1) l c h / 50%);
1928
- --track-color: var(--field-border-color);
1929
-
1930
- cursor: not-allowed;
1931
-
1932
- &::-webkit-slider-thumb {
1933
- cursor: not-allowed;
1934
- }
1935
- &::-moz-range-thumb {
1936
- cursor: not-allowed;
1937
- }
1938
- }
1939
- }
1940
- }
1941
-
1942
- @layer components.root {
1943
- /* Base typography */
1944
- :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
1945
- color: var(--text-color-1);
1946
- font-weight: 700;
1947
- text-wrap: pretty;
1948
- }
1949
-
1950
- :where(h1, .h1) {
1951
- font-size: var(--font-size-h1, var(--font-size-7));
1952
- letter-spacing: -0.02em;
1953
- line-height: 1.15;
1954
- }
1955
-
1956
- :where(h2, .h2) {
1957
- font-size: var(--font-size-h2, var(--font-size-5, 2rem));
1958
- letter-spacing: -0.02em;
1959
- line-height: 1.2;
1960
- }
1961
-
1962
- :where(h3, .h3) {
1963
- font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
1964
- letter-spacing: -0.01em;
1965
- line-height: 1.167;
1966
- }
1967
-
1968
- :where(h4, .h4) {
1969
- font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
1970
- letter-spacing: -0.01em;
1971
- line-height: 1.235;
1972
- }
1973
-
1974
- :where(h5, .h5) {
1975
- font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
1976
- line-height: 1.334;
1977
- }
1978
-
1979
- :where(h6, .h6) {
1980
- font-size: var(--font-size-h6, var(--font-size-1, 1rem));
1981
- line-height: 1;
1982
- }
1983
-
1984
- :where(hgroup) {
1985
- & > :where(p, .p) {
1986
- margin: 0;
1987
- }
1988
-
1989
- & > :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
1990
- margin-block-end: 0.4em;
1991
- }
1992
-
1993
- /* The second p element */
1994
- & > :where(p, .p):last-of-type:last-child:not(:first-child) {
1995
- color: oklch(from currentColor l c h / 75%);
1996
- font-size: var(--font-size-lg);
1997
- line-height: 1.6;
1998
- }
1999
- }
2000
-
2001
- /** Overline */
2002
- :where(.overline, hgroup > :where(p, .p):first-of-type:first-child) {
2003
- color: light-dark(
2004
- oklch(from var(--text-color-2) calc(l * 1.25) c h),
2005
- oklch(from var(--text-color-2) calc(l * 0.75) c h)
2006
- );
2007
- font-size: var(--font-size-xs);
2008
- font-weight: 500;
2009
- letter-spacing: 0.06em;
2010
- line-height: 2.5;
2011
- text-transform: uppercase;
2012
- }
2013
-
2014
- :where(p, .p) {
2015
- text-wrap: pretty;
2016
-
2017
- &.small {
2018
- font-size: var(--font-size-md);
2019
- }
2020
- &.large {
2021
- font-size: var(--font-size-lg);
2022
- }
2023
- }
2024
-
2025
- /* Inline text elements */
2026
- :where(ins, u, abbr, dfn) {
2027
- text-decoration: underline;
2028
- text-underline-offset: 1px;
2029
-
2030
- @supports (-moz-appearance: none) {
2031
- text-underline-offset: 2px;
2032
- }
2033
- }
2034
-
2035
- :where(abbr, dfn) {
2036
- font-style: normal;
2037
- text-decoration: var(--color-9) underline dotted;
2038
-
2039
- &[title] {
2040
- cursor: help;
2041
- text-underline-offset: 1px;
2042
- }
2043
-
2044
- @supports (-moz-appearance: none) {
2045
- text-underline-offset: 2px;
2046
- }
2047
- }
2048
-
2049
- :where(sup) {
2050
- font-size: 0.5em;
2051
- }
2052
-
2053
- :where(del, ins) {
2054
- color: var(--color-9);
2055
- }
2056
-
2057
- :where(small) {
2058
- font-size: max(0.5em, var(--font-size-0, 0.75rem));
2059
- max-inline-size: var(--size-content-1);
2060
- }
2061
-
2062
- :where(cite) {
2063
- font-style: italic;
2064
- }
2065
-
2066
- /* Blockquote */
2067
- :where(blockquote) {
2068
- border-inline-start-width: var(--border-size-3);
2069
- display: grid;
2070
- gap: var(--size-3);
2071
- padding-block: var(--size-3);
2072
- padding-inline: var(--size-4);
2073
-
2074
- :first-child {
2075
- margin-block-start: 0;
2076
- }
2077
-
2078
- :last-child {
2079
- margin-block-end: 0;
2080
- }
2081
-
2082
- footer {
2083
- color: var(--text-color-2);
2084
- }
2085
- }
2086
-
2087
- /* Code */
2088
- :where(pre) {
2089
- border-radius: 0.375rem;
2090
- direction: ltr;
2091
- font-size: 0.875rem;
2092
- line-height: 1.7142857;
2093
- margin-block: 1.7142857em;
2094
- max-inline-size: max-content;
2095
- min-inline-size: 0;
2096
- padding-block: 0.8571429em;
2097
- padding-inline: 1.1428571em;
2098
- white-space: pre;
2099
- writing-mode: lr;
2100
- }
2101
-
2102
- :where(code, kbd, samp, pre) {
2103
- font-family: var(--font-mono);
2104
- }
2105
-
2106
- :where(code) {
2107
- background-color: oklch(00 0 0 /18%);
2108
- border-radius: var(--border-size-3);
2109
- font-size: 0.9em;
2110
- padding: 0.2ex 0.5ex;
2111
- }
2112
-
2113
- :where(kbd, var) {
2114
- background-color: var(--text-color-2);
2115
- border-color: var(--text-color-2);
2116
- border-radius: var(--border-radius, var(--radius-2));
2117
- border-width: var(--border-size-1);
2118
- color: var(--text-color-2-contrast);
2119
- padding: calc(var(--size-1) / 2) var(--size-1);
2120
- }
2121
-
2122
- :where(:not(pre) code, kbd) {
2123
- word-break: break-word;
2124
- }
2125
-
2126
- :where(:not(pre) code) {
2127
- border-radius: var(--border-radius, var(--radius-2));
2128
- padding: var(--size-1) var(--size-2);
2129
- writing-mode: lr;
2130
- }
2131
-
2132
- :where(mark) {
2133
- border-radius: var(--border-radius, 0);
2134
- box-decoration-break: clone;
2135
- padding: calc(var(--size-1) / 2) var(--size-1);
2136
- vertical-align: baseline;
2137
- }
2138
-
2139
- /* Misc */
2140
- :where(dt) {
2141
- font-weight: 700;
2142
- }
2143
-
2144
- :where(figure) {
2145
- & > :where(figcaption) {
2146
- font-size: var(--font-size-1, 1rem);
2147
- text-wrap: balance;
2148
- }
2149
- }
2150
- }
2151
-
2152
- /*** Extended components (has dependencies) */
2153
-
2154
- @layer components.extended {
2155
- :where([role="group"].button-group) {
2156
- --_border-radius: var(--button-border-radius);
2157
-
2158
- border-radius: var(--_border-radius);
2159
- display: inline-flex;
2160
- min-width: max-content;
2161
-
2162
- button {
2163
- border-radius: 0;
2164
-
2165
- svg {
2166
- max-inline-size: 0.7lh;
2167
- }
2168
-
2169
- &:focus-visible {
2170
- outline-offset: -4px;
2171
- }
2172
-
2173
- & + & {
2174
- border-inline-width: 1px;
2175
- margin-inline-start: -1px;
2176
- }
2177
-
2178
- &:first-of-type {
2179
- border-bottom-left-radius: var(--_border-radius);
2180
- border-top-left-radius: var(--_border-radius);
2181
- }
2182
- &:last-of-type {
2183
- border-bottom-right-radius: var(--_border-radius);
2184
- border-top-right-radius: var(--_border-radius);
2185
- }
2186
-
2187
- /* Variants */
2188
- &:where(.tonal, .filled) {
2189
- & + button {
2190
- border-inline-start-color: var(--color-7);
2191
- }
2192
-
2193
- & + &[disabled] {
2194
- border-inline-start-color: color-mix(
2195
- in oklch,
2196
- var(--border-color) 90%,
2197
- white
2198
- );
2199
- }
2200
- }
2201
- }
2202
- }
2203
- }
2204
-
2205
- @layer components.extended {
2206
- :where(details) {
2207
- --_accordion-transition-time: 0.2s;
2208
- --_bg-color: transparent;
2209
- --_margin-inline: var(--size-1);
2210
- --_shadow: none;
2211
-
2212
- background-color: var(--_bg-color);
2213
- box-shadow: var(--_shadow);
2214
- border-radius: var(--border-radius, 4px);
2215
- display: block;
2216
- margin-inline: var(--_margin-inline);
2217
- transition: all var(--_accordion-transition-time) ease-out;
2218
-
2219
- /* Accordion animation */
2220
- /* https://nerdy.dev/open-and-close-transitions-for-the-details-element */
2221
- @media (prefers-reduced-motion: no-preference) {
2222
- interpolate-size: allow-keywords;
2223
- }
2224
-
2225
- &::details-content {
2226
- block-size: 0;
2227
- opacity: 0;
2228
- overflow-y: clip;
2229
- transition: content-visibility var(--_accordion-transition-time)
2230
- allow-discrete,
2231
- opacity var(--_accordion-transition-time),
2232
- block-size var(--_accordion-transition-time);
2233
- }
2234
-
2235
- &[open]::details-content {
2236
- block-size: auto;
2237
- opacity: 1;
2238
- }
2239
- /***/
2240
-
2241
- & > summary {
2242
- background-color: inherit;
2243
- cursor: pointer;
2244
- font-weight: 700;
2245
- padding-block: var(--size-3);
2246
- user-select: none;
2247
- }
2248
-
2249
- /* Custom arrow */
2250
- /* summary {
2251
- align-items: center;
2252
- background-color: inherit;
2253
- cursor: pointer;
2254
- display: flex;
2255
- justify-content: space-between;
2256
- list-style: none;
2257
- padding-block: var(--size-3);
2258
- user-select: none;
2259
-
2260
- &::marker,
2261
- &::-webkit-details-marker {
2262
- display: none;
2263
- }
2264
-
2265
- svg {
2266
- transition: rotate 0.2s ease-out;
2267
- }
2268
- }
2269
-
2270
- &[open] > summary svg {
2271
- rotate: 180deg;
2272
- } */
2273
-
2274
- & > .content {
2275
- margin-block-start: 0;
2276
- padding-block: var(--size-2) var(--size-3);
2277
- }
2278
-
2279
- & > .actions {
2280
- display: flex;
2281
- gap: var(--size-1);
2282
- justify-content: end;
2283
- margin-block-start: var(--size-3);
2284
- padding-block-end: var(--size-1);
2285
- padding-inline: var(--size-3) var(--size-1);
2286
- }
2287
-
2288
- /* Variants */
2289
- &.card,
2290
- &.text {
2291
- --_bg-color: transparent;
2292
- --_margin-inline: var(--size-1);
2293
- }
2294
-
2295
- &.elevated {
2296
- --_bg-color: var(--surface-elevated);
2297
- --_margin-inline: 0;
2298
- --_shadow: var(--shadow-2);
2299
- }
2300
-
2301
- &.outlined {
2302
- --_bg-color: var(--surface-default);
2303
- --_margin-inline: 0;
2304
- border: 1px solid var(--border-color);
2305
- }
2306
-
2307
- &.tonal {
2308
- --_bg-color: var(--surface-tonal);
2309
- --_margin-inline: 0;
2310
- }
2311
-
2312
- &:where(.elevated, .outlined, .tonal) > * {
2313
- padding-inline: var(--size-3);
2314
- }
2315
- }
2316
-
2317
- /* Accordion group */
2318
- :where(.card:has(details)) {
2319
- --_gutter-color: var(--border-color);
2320
-
2321
- display: block;
2322
-
2323
- & > .content {
2324
- margin-block: 0;
2325
- padding: 0;
2326
- }
2327
-
2328
- &.card,
2329
- &.text {
2330
- &:not(.tonal, .outlined, .elevated) {
2331
- summary {
2332
- padding-inline: 0;
2333
- }
2334
- }
2335
- }
2336
-
2337
- details {
2338
- --_margin-inline: 0;
2339
-
2340
- border: 0;
2341
- box-shadow: none;
2342
-
2343
- & > * {
2344
- padding-inline: var(--size-3);
2345
- }
2346
-
2347
- /* Border between accordion items */
2348
- & + & {
2349
- summary {
2350
- border-radius: 0;
2351
- border-block-start: 1px solid var(--_gutter-color);
2352
- }
2353
- }
2354
-
2355
- /* First item */
2356
- &:first-of-type {
2357
- border-start-start-radius: var(--border-radius, 0.25rem);
2358
- border-start-end-radius: var(--border-radius, 0.25rem);
2359
- summary {
2360
- border-start-start-radius: var(--border-radius, 0.25rem);
2361
- border-start-end-radius: var(--border-radius, 0.25rem);
2362
- }
2363
- }
2364
-
2365
- /* Last item */
2366
- &:last-of-type {
2367
- border-end-start-radius: var(--border-radius, 0.25rem);
2368
- border-end-end-radius: var(--border-radius, 0.25rem);
2369
- summary {
2370
- border-end-start-radius: var(--border-radius, 0.25rem);
2371
- border-end-end-radius: var(--border-radius, 0.25rem);
2372
- }
2373
- }
2374
- }
2375
- }
2376
- }
2377
-
2378
- @layer components.extended {
2379
- /*
2380
- Lists meant to be used stand-alone or as part of Select elements
2381
-
2382
- Intended use-case:
2383
- - ul.list > li
2384
- - .select > .list > option
2385
- */
2386
- :where(.list) {
2387
- --_bg-color: light-dark(var(--gray-1), var(--gray-15));
2388
-
2389
- background-color: var(--_bg-color);
2390
- list-style: none;
2391
- padding: var(--size-2) 0;
2392
-
2393
- @media (pointer: coarse) {
2394
- &,
2395
- * {
2396
- user-select: none;
2397
- }
2398
- }
2399
-
2400
- /* Borders on all list items */
2401
- &.bordered {
2402
- :where(li + li, option + option) {
2403
- margin-block-start: var(--size-3);
2404
- &::before {
2405
- block-size: 1px;
2406
- border-block-start: 1px solid var(--border-color);
2407
- content: "";
2408
- display: block;
2409
- inline-size: 100%;
2410
- inset: calc(-1 * var(--size-2)) 0 auto 0;
2411
- position: absolute;
2412
- visibility: visible; /* override select > option:before style */
2413
- }
2414
- }
2415
- }
2416
-
2417
- /* Dense - less gaps and spacing */
2418
- &.dense {
2419
- :where(li, option) {
2420
- gap: var(--size-2);
2421
- min-block-size: var(--size-7);
2422
- padding: var(--size-1) var(--size-2);
2423
-
2424
- &.border-top {
2425
- margin-block-start: var(--size-2);
2426
- &::before {
2427
- inset: calc(-1 * var(--size-1)) 0 auto 0;
2428
- }
2429
- }
2430
-
2431
- /* Clickable list item */
2432
- &:has(> a, > button, > label) {
2433
- min-block-size: auto;
2434
- padding: 0;
2435
- }
2436
-
2437
- & > :where(a, button, label) {
2438
- gap: var(--size-2);
2439
- min-block-size: var(--size-7);
2440
- padding: var(--size-1) var(--size-2);
2441
- }
2442
-
2443
- /* Checkbox / Radio */
2444
- & > label {
2445
- .end {
2446
- padding-inline-end: 0.125rem;
2447
- }
2448
- }
2449
-
2450
- /* Leading and trailing content */
2451
- .start,
2452
- .end {
2453
- .avatar {
2454
- max-inline-size: var(--size-6);
2455
- }
2456
-
2457
- .icon-button,
2458
- svg {
2459
- max-inline-size: var(--size-4);
2460
- }
2461
-
2462
- .checkbox,
2463
- .radio {
2464
- max-inline-size: var(--size-3);
2465
- }
2466
- }
2467
- }
2468
- }
2469
-
2470
- /* Gutterless */
2471
- &.gutterless {
2472
- :where(li, option) {
2473
- padding-inline: 0;
2474
-
2475
- & > :where(a, button, label) {
2476
- padding-inline: 0;
2477
- }
2478
- }
2479
- }
2480
-
2481
- /* List item */
2482
- :where(li, option, [role="group"] > label) {
2483
- align-items: center;
2484
- background: var(--_bg-color) var(--ripple, none);
2485
- display: flex;
2486
- font-size: var(--font-size-sm);
2487
- gap: var(--size-3);
2488
- isolation: isolate;
2489
- min-block-size: 40px;
2490
- padding: var(--size-2) var(--size-3);
2491
- position: relative;
2492
-
2493
- &::before {
2494
- display: none; /* removing checkmark from option */
2495
- }
2496
-
2497
- * {
2498
- font-size: inherit;
2499
- }
2500
-
2501
- /* Clickable list item */
2502
- &:has(> a, > button, > label) {
2503
- background: transparent;
2504
- display: block;
2505
- min-block-size: auto;
2506
- padding: 0;
2507
- }
2508
-
2509
- /* Select option */
2510
- &:where(option) {
2511
- align-items: center;
2512
- background-color: var(--_bg-color);
2513
- color: inherit;
2514
- cursor: pointer;
2515
- display: flex;
2516
- gap: var(--size-3);
2517
- inline-size: 100%;
2518
- margin: 0;
2519
- min-block-size: 40px;
2520
- padding: var(--size-2) var(--size-3);
2521
- text-align: start;
2522
- text-decoration: none;
2523
- z-index: 0;
2524
-
2525
- &:hover {
2526
- background-color: light-dark(var(--gray-2), var(--gray-14));
2527
- }
2528
-
2529
- &:checked {
2530
- background-color: oklch(from var(--primary) l c h / 30%);
2531
- }
2532
- }
2533
-
2534
- & > a,
2535
- & > button,
2536
- & > label {
2537
- align-items: center;
2538
- background: var(--_bg-color) var(--ripple, none);
2539
- color: inherit;
2540
- cursor: pointer;
2541
- display: flex;
2542
- gap: var(--size-3);
2543
- inline-size: 100%;
2544
- margin: 0;
2545
- min-block-size: 40px;
2546
- outline-offset: -3px;
2547
- padding: var(--size-2) var(--size-3);
2548
- text-align: start;
2549
- text-decoration: none;
2550
- z-index: 0;
2551
-
2552
- /*** Ripple effect */
2553
- background-position: center;
2554
- transition: background var(--button-ripple-duration);
2555
- &:where(:not(:active):hover) {
2556
- --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
2557
- center/15000%;
2558
- }
2559
-
2560
- &:where(:hover:active) {
2561
- background-size: var(--button-ripple-size);
2562
- transition: background 0s;
2563
- }
2564
-
2565
- &:hover {
2566
- background-color: light-dark(var(--gray-2), var(--gray-14));
2567
- }
2568
-
2569
- /*** Remove ripple effect when trailing button is clicked */
2570
- &:has(.end:hover) {
2571
- &:where(:not(:active):hover) {
2572
- --ripple: none;
2573
- }
2574
- }
2575
- }
2576
-
2577
- /* Checkbox / Radio / Switch */
2578
- & > label {
2579
- .end {
2580
- padding-inline-end: var(--size-1);
2581
- }
2582
-
2583
- &:where(.checkbox, .radio) {
2584
- inline-size: 100%;
2585
- }
2586
-
2587
- &.switch {
2588
- --_dot-size: 0.75rem;
2589
- --_track-height: var(--size-4);
2590
- --_track-width: 2.5rem;
2591
- }
2592
- }
2593
-
2594
- /* Video */
2595
- &:has(video) {
2596
- padding: 0.75rem var(--size-3) 0.75rem 0;
2597
- }
2598
-
2599
- /* Border between list items */
2600
- &.border-top {
2601
- margin-block-start: var(--size-3);
2602
- &::before {
2603
- block-size: 1px;
2604
- border-block-start: 1px solid var(--border-color);
2605
- content: "";
2606
- display: block;
2607
- inline-size: 100%;
2608
- inset: calc(-1 * var(--size-2)) 0 auto 0;
2609
- position: absolute;
2610
- }
2611
- }
2612
-
2613
- /* Text */
2614
- .text {
2615
- flex: 1;
2616
- line-height: 1.6;
2617
-
2618
- :where(h1, h2, h3, h4, h5, h6, p, span) {
2619
- color: inherit;
2620
- font-weight: 400;
2621
- }
2622
-
2623
- p + p {
2624
- font-size: var(--font-size-xs);
2625
- }
2626
- }
2627
-
2628
- /* Leading content */
2629
- .start {
2630
- align-self: center;
2631
- align-items: center;
2632
- display: grid;
2633
- z-index: 1;
2634
-
2635
- &:has(svg) {
2636
- max-inline-size: var(--size-5);
2637
- }
2638
-
2639
- svg {
2640
- padding-block-start: 0.125rem;
2641
- }
2642
-
2643
- img {
2644
- aspect-ratio: 1;
2645
- inline-size: 56px;
2646
- object-fit: cover;
2647
- }
2648
-
2649
- video {
2650
- aspect-ratio: 16/9;
2651
- block-size: 64px;
2652
- object-fit: cover;
2653
- }
2654
- }
2655
-
2656
- /* Trailing content */
2657
- .end {
2658
- align-items: center;
2659
- display: flex;
2660
- font-size: var(--font-size-xs);
2661
- text-align: end;
2662
- z-index: 1;
2663
-
2664
- &:not(:has(a, button, input)) {
2665
- pointer-events: none;
2666
- }
2667
-
2668
- kbd {
2669
- background-color: transparent;
2670
- border: 0;
2671
- color: inherit;
2672
- opacity: 0.6;
2673
- }
2674
-
2675
- svg {
2676
- max-inline-size: var(--size-5);
2677
- inline-size: 100%;
2678
- }
2679
- }
2680
-
2681
- /* Inset */
2682
- &.inset {
2683
- .text {
2684
- padding-inline-start: calc(var(--size-5) + var(--size-3));
2685
- }
2686
-
2687
- /* Safety measure so it won't look bad if there for some reason should exist a leading element inside. */
2688
- .start {
2689
- display: none;
2690
- }
2691
- }
2692
- }
2693
- }
2694
- }
2695
-
2696
- @layer components.extended {
2697
- :where(.alert) {
2698
- --_bg-color: var(--surface-tonal);
2699
- --_border-color: var(--surface-tonal);
2700
- --_color: var(--text-color-1);
2701
-
2702
- &.outlined {
2703
- --_bg-color: var(--surface-default);
2704
- --_border-color: var(--border-color);
2705
- --_color: var(--text-color-1);
2706
- }
2707
-
2708
- background-color: var(--_bg-color);
2709
- border: 1px solid var(--_border-color);
2710
- border-radius: var(--border-radius);
2711
- color: var(--_color);
2712
- padding: var(--size-3);
2713
-
2714
- & > .content {
2715
- display: grid;
2716
- gap: var(--size-2);
2717
- font-size: var(--font-size-sm);
2718
-
2719
- h1,
2720
- h2,
2721
- h3,
2722
- h4,
2723
- h5,
2724
- h6 {
2725
- color: inherit;
2726
- font-size: var(--font-size-md);
2727
- font-weight: 600;
2728
-
2729
- * {
2730
- font-size: inherit;
2731
- }
2732
- }
2733
- }
2734
-
2735
- /* Colors */
2736
- &.error,
2737
- &.ok,
2738
- &.warning {
2739
- --_bg-color: var(--color-4);
2740
- --_border-color: var(--color-9);
2741
- --_color: var(--color-15);
2742
-
2743
- &.outlined {
2744
- --_bg-color: var(--surface-default);
2745
- --_border-color: var(--color-9);
2746
- --_color: light-dark(var(--color-15), var(--color-1));
2747
- }
2748
-
2749
- svg {
2750
- margin-block-start: 0.15rem;
2751
- stroke: var(--color-9);
2752
- }
2753
- }
2754
-
2755
- /* Links
2756
- * Can't make sure contrast will be acceptable (yet) so we use the current text color instead.
2757
- */
2758
- &:not(.outlined) {
2759
- a[href] {
2760
- color: inherit;
2761
-
2762
- &:hover {
2763
- color: var(--primary);
2764
- }
2765
- }
2766
- }
2767
-
2768
- /* Icon */
2769
- &:has(svg) {
2770
- display: grid;
2771
- gap: var(--size-3);
2772
- grid-template-columns: var(--size-4) 1fr;
2773
-
2774
- svg {
2775
- margin-block-start: 0.15rem;
2776
- stroke: currentColor;
2777
- }
2778
- }
2779
- }
2780
- }
2781
-
2782
- @layer components.extended {
2783
- :where(dialog) {
2784
- margin-block-start: 15%; /* vertical alignment */
2785
- padding-block: 0;
2786
- pointer-events: none;
2787
-
2788
- &::backdrop {
2789
- background-color: rgba(0, 0, 0, 0.5);
2790
- backdrop-filter: blur(5px);
2791
-
2792
- @media (prefers-reduced-motion: reduce) {
2793
- backdrop-filter: none;
2794
- }
2795
- }
2796
-
2797
- &:not([open]) {
2798
- display: none;
2799
- }
2800
-
2801
- &[open] {
2802
- pointer-events: all;
2803
- }
2804
-
2805
- .actions {
2806
- justify-content: end;
2807
- padding-inline: var(--size-3) var(--size-1);
2808
- }
2809
-
2810
- /* Animation */
2811
- /* There's no close animation, intentionally */
2812
- opacity: 0;
2813
-
2814
- &[open] {
2815
- opacity: 1;
2816
- transition: display 0.2s allow-discrete,
2817
- margin-block-start 0.3s var(--ease-1), overlay 0.2s allow-discrete,
2818
- opacity 0.2s var(--ease-out-1);
2819
-
2820
- @starting-style {
2821
- opacity: 0;
2822
- }
2823
- }
2824
-
2825
- @media (prefers-reduced-motion: no-preference) {
2826
- margin-block-start: 17%;
2827
- &[open] {
2828
- margin-block-start: 15%;
2829
-
2830
- @starting-style {
2831
- margin-block-start: 17%;
2832
- }
2833
- }
2834
- }
2835
- }
2836
-
2837
- :where(html:has(dialog[open])) {
2838
- overflow: hidden;
2839
- }
2840
- }
2841
-
2842
- @layer components.extended {
2843
- :where(.snackbar) {
2844
- align-items: center;
2845
- /* Inverse surface-filled */
2846
- background-color: light-dark(var(--gray-15), var(--gray-2));
2847
- border-radius: var(--border-radius);
2848
- box-shadow: var(--shadow-2);
2849
- color: var(--text-color-1-contrast);
2850
- display: flex;
2851
- font-size: var(--font-size-sm);
2852
- gap: var(--size-3);
2853
- inset-block: auto var(--size-3);
2854
- inset-inline: var(--size-3) auto;
2855
- justify-content: space-between;
2856
- min-inline-size: min(100%, 37ch);
2857
- padding: var(--size-2) var(--size-3);
2858
- position: fixed;
2859
- inline-size: calc(100% - var(--size-6, 1.75rem));
2860
- z-index: 100;
2861
-
2862
- &::backdrop {
2863
- display: none;
2864
- }
2865
-
2866
- * {
2867
- word-break: break-word;
2868
- }
2869
-
2870
- /* Global positioning (in relation to the window) */
2871
- /*** Default (end-start) */
2872
- inset-block: auto var(--size-3);
2873
- inset-inline: 50% 0;
2874
- translate: -50% 0;
2875
-
2876
- &.start-start,
2877
- &.start-center,
2878
- &.start-end {
2879
- inset-block: var(--size-3) auto;
2880
- }
2881
-
2882
- /* TODO use @custom-media instead? */
2883
- @container (width > 480px) {
2884
- /* Default (end-start) */
2885
- inset-block: auto var(--size-7, 2rem);
2886
- inset-inline: var(--size-7, 2rem) auto;
2887
- translate: revert;
2888
- inline-size: fit-content;
2889
-
2890
- &.end-start,
2891
- &.end-end,
2892
- &.start-start,
2893
- &.start-end {
2894
- translate: revert;
2895
- }
2896
-
2897
- &.start-start {
2898
- inset-block: var(--size-7, 2rem) auto;
2899
- inset-inline: var(--size-7, 2rem) auto;
2900
- }
2901
- &.start-center {
2902
- inset-block: var(--size-7, 2rem) auto;
2903
- inset-inline: 50% 0;
2904
- translate: -50% 0;
2905
- }
2906
- &.start-end {
2907
- inset-block: var(--size-7, 2rem) auto;
2908
- inset-inline: auto var(--size-7, 2rem);
2909
- }
2910
- &.end-start {
2911
- inset-block-end: var(--size-7, 2rem);
2912
- inset-inline: var(--size-7, 2rem) auto;
2913
- }
2914
- &.end-center {
2915
- inset-block: auto var(--size-7, 2rem);
2916
- inset-inline: 50% 0;
2917
- translate: -50% 0;
2918
- }
2919
- &.end-end {
2920
- inset-block: auto var(--size-7, 2rem);
2921
- inset-inline: auto var(--size-7, 2rem);
2922
- }
2923
- }
2924
-
2925
- /* Absolute positioning */
2926
- &.absolute {
2927
- position: absolute;
2928
- }
2929
-
2930
- /* Actions */
2931
- .actions {
2932
- align-items: center;
2933
- display: flex;
2934
- flex-shrink: 0;
2935
- gap: var(--size-3);
2936
- padding-inline: 0;
2937
-
2938
- button {
2939
- /* Inverse hover and active backgrounds */
2940
- &:where(:not([disabled])) {
2941
- &:where(:not(:active):hover) {
2942
- --_bg-color: light-dark(
2943
- color-mix(in oklch, white 40%, black),
2944
- color-mix(in oklch, white 85%, black)
2945
- );
2946
- }
2947
-
2948
- &:where(:hover:active) {
2949
- --_bg-color: light-dark(
2950
- color-mix(in oklch, white 45%, black),
2951
- color-mix(in oklch, white 80%, black)
2952
- );
2953
- }
2954
- }
2955
- }
2956
-
2957
- button:not(:has(svg)) {
2958
- border-radius: var(--border-radius);
2959
- font-size: inherit;
2960
- max-block-size: var(--size-6, 1.5rem);
2961
- padding: 1ex;
2962
- }
2963
-
2964
- button:has(svg) {
2965
- color: inherit;
2966
- max-inline-size: var(--size-6, 1.75rem);
2967
- margin: var(--size-00);
2968
- padding: var(--size-1);
2969
- }
2970
- }
2971
-
2972
- /* Animations */
2973
- opacity: 0;
2974
- transition: display 0.075s allow-discrete, overlay 0.075s allow-discrete,
2975
- opacity 0.075s var(--ease-out-1);
2976
-
2977
- &:popover-open,
2978
- &:popover-open::backdrop,
2979
- &.visible {
2980
- opacity: 1;
2981
- transition: display 0.25s allow-discrete, overlay 0.25s allow-discrete,
2982
- opacity 0.25s var(--ease-out-1);
2983
-
2984
- @starting-style {
2985
- opacity: 0;
2986
- }
2987
- }
2988
- }
2989
- }
2990
-
2991
- @layer components.extended {
2992
- /* Common styling for checkbox, radio and switch groups */
2993
- :where(fieldset.field-group) {
2994
- border: 0;
2995
- border-radius: 0;
2996
- gap: 0;
2997
- padding: 0;
2998
- z-index: 1;
2999
-
3000
- legend {
3001
- color: var(--text-color-2);
3002
- padding: 0 1ex 0 0;
3003
- }
3004
-
3005
- /* Disabled */
3006
- &[disabled] {
3007
- cursor: not-allowed;
3008
- opacity: 0.64;
3009
- user-select: none;
3010
-
3011
- input {
3012
- cursor: not-allowed;
3013
- }
3014
- }
3015
-
3016
- /* Validation */
3017
- &.error {
3018
- legend,
3019
- .supporting-text {
3020
- color: var(--color-9);
3021
- }
3022
- }
3023
-
3024
- /* Required */
3025
- &:has([required]) {
3026
- &:not(:has(input:where([type="radio"], [type="checkbox"]):checked)) {
3027
- legend {
3028
- position: relative;
3029
-
3030
- &::after {
3031
- color: var(--red);
3032
- content: "*";
3033
- inset: 0 -0.25ex auto auto;
3034
- position: absolute;
3035
- }
3036
- }
3037
- }
3038
- }
3039
- :where(.radio, .checkbox, .switch) .label:after {
3040
- display: none;
3041
- }
3042
-
3043
- /* Supporting text */
3044
- .supporting-text {
3045
- color: var(--text-color-2);
3046
- font-size: var(--font-size-xs);
3047
- line-height: 1.5;
3048
- z-index: 1;
3049
- }
3050
-
3051
- /* Fields */
3052
- .fields {
3053
- display: flex;
3054
- flex-direction: column;
3055
- gap: var(--size-2);
3056
-
3057
- * ~ & {
3058
- padding: var(--size-2) 0;
3059
- }
3060
- }
3061
-
3062
- :last-child {
3063
- padding-block-end: 0;
3064
- }
3065
-
3066
- /* Directions */
3067
- &.row {
3068
- .fields {
3069
- flex-direction: row;
3070
- }
3071
- }
3072
- }
3073
- }
3074
-
3075
- @layer components.extended {
3076
- /*
3077
- - Common styling for input, textarea and select
3078
- - Form related styles such as: label, supporting text, error handling
3079
- */
3080
- :where(.field) {
3081
- --_accent-color: var(--primary);
3082
- --_bg-color: var(--surface-default);
3083
- --_border-color: var(--field-border-color);
3084
- --_field-padding-block: 0.75rem;
3085
- --_field-padding-inline: var(--size-2);
3086
- --_filled-border-color: var(--text-color-1);
3087
- --_height: var(--field-size);
3088
- --_label-color: var(--text-color-2);
3089
- --_supporting-text-color: var(--text-color-2);
3090
-
3091
- display: grid;
3092
- position: relative;
3093
-
3094
- /* Input/Select base */
3095
- :where(& input, & textarea, & select) {
3096
- background-color: var(--_bg-color);
3097
- block-size: var(--_height);
3098
- border-radius: var(--field-border-radius);
3099
- border: var(--field-border-width) solid var(--_border-color);
3100
- color: var(--text-color-1);
3101
- font-family: var(--font-sans);
3102
- font-size: var(--font-size-1);
3103
- grid-column: 1/-1;
3104
- grid-row: 2;
3105
- inline-size: 100%;
3106
- line-height: var(--font-lineheight-1);
3107
- min-inline-size: 0;
3108
- padding: var(--_field-padding-block) var(--_field-padding-inline);
3109
-
3110
- @media (prefers-reduced-motion: no-preference) {
3111
- transition: border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
3112
- padding-block 0.2s var(--ease-3);
3113
- }
3114
- }
3115
-
3116
- /* Required/Invalid */
3117
- &:has(
3118
- :not(:placeholder-shown):invalid,
3119
- :where(
3120
- :placeholder-shown,
3121
- option[value=""]:not(:checked),
3122
- option:checked:not([value=""])
3123
- ):required
3124
- ) {
3125
- .label:after {
3126
- color: var(--red);
3127
- content: "*";
3128
- margin: -0.25em auto auto 0.25em;
3129
- }
3130
- }
3131
-
3132
- /* File */
3133
- &:has(input[type="file"]) {
3134
- cursor: pointer;
3135
-
3136
- input {
3137
- align-self: flex-start;
3138
- block-size: var(--_height);
3139
- box-shadow: none;
3140
- color: var(--text-color-1);
3141
- cursor: inherit;
3142
- max-inline-size: 100%;
3143
- padding: 0;
3144
- transition: font-size 0.2s var(--ease-3);
3145
-
3146
- &::-webkit-file-upload-button,
3147
- &::file-selector-button {
3148
- background-color: var(--surface-tonal);
3149
- border: none;
3150
- block-size: calc(100% - var(--size-2) * 2);
3151
- border-radius: var(--field-border-radius);
3152
- cursor: pointer;
3153
- margin-inline-end: 1ex;
3154
- margin-block-start: var(--size-2);
3155
- margin-inline-start: var(--size-2);
3156
- }
3157
- }
3158
-
3159
- /* Variants */
3160
- &.filled {
3161
- input {
3162
- &::-webkit-file-upload-button,
3163
- &::file-selector-button {
3164
- background-color: var(--surface-default);
3165
- block-size: calc(100% - var(--size-2) * 2);
3166
- border-radius: var(--field-border-radius);
3167
- cursor: pointer;
3168
- margin-block-start: var(--size-2);
3169
- }
3170
- }
3171
- }
3172
-
3173
- /* Sizes */
3174
- &.small {
3175
- input {
3176
- font-size: var(--font-size-sm);
3177
- &::-webkit-file-upload-button,
3178
- &::file-selector-button {
3179
- block-size: calc(100% - var(--size-2));
3180
- margin-block-start: var(--size-1);
3181
- }
3182
- }
3183
- }
3184
- }
3185
-
3186
- /* Autosuggest */
3187
- &:has(input[list]) {
3188
- .label {
3189
- /* Make sure chevron is visible */
3190
- inline-size: calc(100% - var(--size-6));
3191
- }
3192
- }
3193
-
3194
- /* Select */
3195
- &:has(select) {
3196
- .label {
3197
- /* Make sure chevron is visible */
3198
- inline-size: calc(100% - var(--size-6));
3199
- }
3200
- }
3201
-
3202
- /* Experimental Select */
3203
- &:has(select button) {
3204
- select {
3205
- padding: 0;
3206
-
3207
- button {
3208
- outline: 0;
3209
- padding: var(--_field-padding-block) var(--size-8)
3210
- var(--_field-padding-block) var(--_field-padding-inline);
3211
- }
3212
- }
3213
- }
3214
-
3215
- /* Non-experimental Select */
3216
- &:has(select):not(:has(button)) {
3217
- select {
3218
- padding: var(--_field-padding-block) var(--size-8)
3219
- var(--_field-padding-block) var(--_field-padding-inline);
3220
- }
3221
- }
3222
-
3223
- /* Input - color */
3224
- &:has(input[type="color"]) {
3225
- input {
3226
- appearance: none;
3227
- background: none;
3228
- block-size: var(--_height);
3229
- inline-size: var(--_height);
3230
- overflow: hidden;
3231
- padding: 0;
3232
-
3233
- &::-webkit-color-swatch {
3234
- border: none;
3235
- }
3236
-
3237
- &::-webkit-color-swatch-wrapper {
3238
- padding: 0;
3239
- }
3240
- }
3241
- }
3242
-
3243
- /* Element states */
3244
- &:hover {
3245
- &:not(.error) {
3246
- :where(input, textarea, select) {
3247
- --_border-color: var(--text-color-1);
3248
- }
3249
- }
3250
- }
3251
-
3252
- &:focus-within {
3253
- & input,
3254
- & textarea,
3255
- & select {
3256
- border-color: var(--_accent-color);
3257
- outline-offset: -2px;
3258
- outline: 2px solid var(--_accent-color);
3259
- }
3260
- }
3261
-
3262
- /* Label */
3263
- .label {
3264
- font-size: var(--font-size-sm);
3265
- grid-column: 1/-1;
3266
- grid-row: 1;
3267
- }
3268
-
3269
- /* Supporting text */
3270
- .supporting-text {
3271
- color: var(--_supporting-text-color);
3272
- font-size: var(--font-size-xs);
3273
- grid-column: 1/-1;
3274
- grid-row: 3;
3275
- line-height: 1.5;
3276
- }
3277
-
3278
- /* Auto-fit */
3279
- &.auto-fit {
3280
- inline-size: auto;
3281
-
3282
- :where(& input, & textarea) {
3283
- field-sizing: content;
3284
- inline-size: auto;
3285
- }
3286
- }
3287
-
3288
- /* Validation */
3289
- &.error {
3290
- --_accent-color: var(--color-9);
3291
- --_border-color: var(--color-9);
3292
- --_filled-border-color: var(--color-9);
3293
- --_label-color: var(--color-9);
3294
- --_supporting-text-color: var(--color-9);
3295
- }
3296
-
3297
- /*
3298
- * Variant: Filled
3299
- */
3300
- &.filled {
3301
- --_bg-color: var(--surface-tonal);
3302
-
3303
- &:not(:has([disabled], :has(input[type="color"]))) {
3304
- /* Hover */
3305
- &:hover {
3306
- --_bg-color: light-dark(
3307
- oklch(from var(--surface-tonal) calc(l * 0.93) c h),
3308
- oklch(from var(--surface-tonal) calc(l * 1.1) c h)
3309
- );
3310
- }
3311
- }
3312
- }
3313
-
3314
- /* Disabled */
3315
- &:where(:has([disabled])) {
3316
- &::before {
3317
- display: none;
3318
- }
3319
- :where(input, textarea, select) {
3320
- cursor: not-allowed;
3321
- opacity: 0.7;
3322
-
3323
- * {
3324
- pointer-events: none;
3325
- }
3326
- }
3327
- }
3328
-
3329
- /* Read-only */
3330
- &:where(:has([readonly])) {
3331
- &::before {
3332
- display: none;
3333
- }
3334
- :where(input, textarea, select) {
3335
- cursor: not-allowed;
3336
-
3337
- * {
3338
- pointer-events: none;
3339
- }
3340
- }
3341
- }
3342
-
3343
- /* Sizes */
3344
- &.small {
3345
- --_field-padding-block: var(--size-2);
3346
- --_height: var(--field-size-small);
3347
-
3348
- &:has(input[type="color"]) {
3349
- .label {
3350
- line-height: 1.5;
3351
- }
3352
- }
3353
- }
3354
- }
3355
- }
3356
-
3357
- @layer components.extended {
3358
- :where(.field > select) {
3359
- position: relative;
3360
-
3361
- /* Default arrow */
3362
- &::picker-icon {
3363
- block-size: 0;
3364
- border-block-start: 5px solid;
3365
- border-inline: 5px solid transparent;
3366
- color: currentColor;
3367
- content: "";
3368
- inline-size: 0;
3369
- inset: 50% var(--size-3) auto auto;
3370
- pointer-events: none;
3371
- position: absolute;
3372
- translate: 0 -50%;
3373
- }
3374
-
3375
- &:open {
3376
- &::picker-icon {
3377
- rotate: 180deg;
3378
- }
3379
- }
3380
-
3381
- /* Select popover */
3382
- &::picker(select) {
3383
- /* Animation on-stage styles */
3384
- border: 0;
3385
- box-shadow: var(--shadow-2);
3386
- opacity: 1;
3387
- padding: 0;
3388
- scale: 1;
3389
-
3390
- /* Animation starting styles */
3391
- @starting-style {
3392
- opacity: 0;
3393
- transform: scale(0.9);
3394
- }
3395
-
3396
- @media (prefers-reduced-motion: no-preference) {
3397
- transition: display 0.2s allow-discrete, opacity 0.2s var(--ease-3),
3398
- overlay 0.2s allow-discrete, scale 0.2s var(--ease-3);
3399
- }
3400
- }
3401
-
3402
- /* Animation off-stage styles */
3403
- &:not(:open)::picker(select) {
3404
- opacity: 0;
3405
- scale: 0.9;
3406
- }
3407
-
3408
- button {
3409
- background-color: transparent;
3410
- display: flex;
3411
- inline-size: 100%;
3412
- margin: 0;
3413
- position: relative;
3414
-
3415
- selectedcontent {
3416
- overflow: hidden;
3417
- text-overflow: ellipsis;
3418
- white-space: nowrap;
3419
- }
3420
- }
3421
-
3422
- .list {
3423
- /* Groups */
3424
- [role="group"] {
3425
- label {
3426
- background-color: light-dark(var(--gray-3), var(--gray-13));
3427
- color: light-dark(
3428
- oklch(from var(--text-color-1) calc(l * 0.75) c h),
3429
- oklch(from var(--text-color-1) calc(l * 1.25) c h)
3430
- );
3431
- font-weight: 500;
3432
- overflow: hidden;
3433
- padding-inline: var(--size-2);
3434
- text-overflow: ellipsis;
3435
- white-space: nowrap;
3436
- }
3437
-
3438
- &:not(:first-child),
3439
- option:first-of-type {
3440
- margin-block-start: var(--size-2);
3441
- }
3442
-
3443
- option:last-of-type,
3444
- &:last-child {
3445
- option:last-of-type {
3446
- margin-block-end: 0;
3447
- }
3448
- }
3449
- }
3450
-
3451
- /* Option */
3452
- option {
3453
- /* Checkmark */
3454
- /* TODO - checkmark should be the final version of the checkmark API. Follow the development of this and remove redundant psuedo stuff. */
3455
- &::check {
3456
- display: none;
3457
- }
3458
- &::checkmark {
3459
- display: none;
3460
- }
3461
- &::before {
3462
- display: none;
3463
- }
3464
-
3465
- &:focus-visible {
3466
- outline-offset: -1px;
3467
- }
3468
- }
3469
- }
3470
- }
3471
-
3472
- :where(.field:has(> select)) {
3473
- /* Size */
3474
- &.small {
3475
- button {
3476
- padding-inline: var(--size-2) var(--size-7);
3477
-
3478
- &::after {
3479
- inset-inline-end: var(--size-2);
3480
- }
3481
- }
3482
- }
3483
-
3484
- /*
3485
- * Non-experimental Select
3486
- *
3487
- * Hack to get the arrow working. Pseudo elements aren't allowed on the `<select>` element, so need to add it on the `.field` class instead. Noting this down if an `:after` element would be needed on a `.field`.
3488
- */
3489
- &:not(:has(button)) {
3490
- select {
3491
- appearance: none;
3492
- }
3493
-
3494
- /* Arrow */
3495
- &::after {
3496
- align-self: center;
3497
- block-size: 0;
3498
- border-block-start: 5px solid;
3499
- border-inline: 5px solid transparent;
3500
- content: "";
3501
- display: inline-block;
3502
- flex-shrink: 0;
3503
- grid-column: 1/-1;
3504
- grid-row: 2;
3505
- inline-size: 0;
3506
- inset-inline-end: var(--size-3);
3507
- justify-self: end;
3508
- pointer-events: none;
3509
- position: relative;
3510
- }
3511
- }
3512
- }
3513
-
3514
- select:has(button),
3515
- ::picker(select) {
3516
- appearance: base-select;
3517
- }
3518
- }
3519
-
3520
- @layer components.extended {
3521
- :where(
3522
- .field:has(
3523
- :where(
3524
- input[type="date"],
3525
- input[type="datetime-local"],
3526
- input[type="email"],
3527
- input[type="month"],
3528
- input[type="number"],
3529
- input[type="password"],
3530
- input[type="search"],
3531
- input[type="tel"],
3532
- input[type="text"],
3533
- input[type="time"],
3534
- input[type="url"],
3535
- input[type="week"]
3536
- )
3537
- )
3538
- ) {
3539
- /* Sizes */
3540
- &.small {
3541
- input {
3542
- padding-inline: var(--size-2);
3543
- }
3544
- }
3545
- }
3546
-
3547
- /* Autosuggest */
3548
- :where(.field:has(input[list])) {
3549
- /* Hide native arrow */
3550
- input::-webkit-calendar-picker-indicator {
3551
- opacity: 0;
3552
- position: absolute;
3553
- cursor: pointer;
3554
- pointer-events: none;
3555
- }
3556
- }
3557
- :where(
3558
- .field:has(input[list]:placeholder-shown),
3559
- .field:has(input[list]):where(:focus-within, :hover)
3560
- ) {
3561
- /* Arrow */
3562
- &::after {
3563
- block-size: 0;
3564
- border-block-start: 5px solid;
3565
- border-inline: 5px solid transparent;
3566
- content: "";
3567
- display: inline-block;
3568
- flex-shrink: 0;
3569
- inline-size: 0;
3570
- inset: 50% var(--size-3) auto auto;
3571
- pointer-events: none;
3572
- position: absolute;
3573
- translate: 0 -50%;
3574
- }
3575
- }
3576
- }
3577
-
3578
- @layer components.extended {
3579
- :where(.field:has(textarea)) {
3580
- textarea {
3581
- block-size: auto;
3582
- field-sizing: content;
3583
- min-block-size: 5rem;
3584
- resize: vertical;
3585
- }
3586
-
3587
- /* Size */
3588
- &.small {
3589
- textarea {
3590
- min-block-size: var(--_height);
3591
- }
3592
- }
3593
-
3594
- /* Auto-fit */
3595
- &.auto-fit {
3596
- textarea {
3597
- min-block-size: var(--_height);
3598
- resize: both;
3599
- }
3600
- }
3601
- }
3602
- }
3603
-
3604
- @layer components.extended {
3605
- @scope (.rich-text) to (.not-rich-text) {
3606
- a {
3607
- color: var(--primary);
3608
- cursor: pointer;
3609
- font-size: inherit;
3610
- font-weight: 700;
3611
- line-height: inherit;
3612
- text-decoration: underline;
3613
- text-decoration-color: var(--primary);
3614
- text-underline-offset: 2px;
3615
-
3616
- &[href] {
3617
- &:hover,
3618
- &:focus-visible {
3619
- color: var(--primary-light);
3620
- }
3621
- }
3622
- }
3623
-
3624
- /* Blockquote */
3625
- blockquote {
3626
- font-size: inherit;
3627
- line-height: inherit;
3628
- :first-child {
3629
- margin-block-start: 0;
3630
- }
3631
-
3632
- :last-child {
3633
- margin-block-end: 0;
3634
- }
3635
- }
3636
-
3637
- /* Text */
3638
- p {
3639
- font-size: inherit;
3640
- line-height: inherit;
3641
- margin-block: 1.25em;
3642
- }
3643
-
3644
- :is(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
3645
- color: var(--text-color-1);
3646
-
3647
- & + *:not(&) {
3648
- margin-block-start: 0;
3649
- }
3650
- }
3651
-
3652
- h1,
3653
- .h1 {
3654
- font-size: var(--font-size-h1, var(--font-size-7));
3655
- letter-spacing: -0.02em;
3656
- line-height: 1.1111111;
3657
- margin-block: 0 0.8888889em;
3658
- }
3659
-
3660
- h2,
3661
- .h2 {
3662
- font-size: var(--font-size-h2, var(--font-size-5, 2rem));
3663
- letter-spacing: -0.02em;
3664
- line-height: 1.3333333;
3665
- margin-block: 2em 1em;
3666
- }
3667
-
3668
- h3,
3669
- .h3 {
3670
- font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
3671
- letter-spacing: -0.01em;
3672
- line-height: 1.6;
3673
- margin-block: 1.6em 0.6em;
3674
- }
3675
-
3676
- h4,
3677
- .h4 {
3678
- font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
3679
- letter-spacing: -0.01em;
3680
- line-height: 1.5;
3681
- margin-block: 1.5em 0.5em;
3682
- }
3683
-
3684
- h5,
3685
- .h5 {
3686
- font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
3687
- line-height: 1;
3688
- margin-block: 0 var(--size-1);
3689
- }
3690
-
3691
- h6,
3692
- .h6 {
3693
- font-size: var(--font-size-h6, var(--font-size-1, 1rem));
3694
- line-height: 1;
3695
- margin-block: 0 var(--size-1);
3696
- }
3697
-
3698
- /** Overline */
3699
- :where(.overline, hgroup > :where(p, .p):first-of-type:first-child) {
3700
- color: light-dark(
3701
- oklch(from var(--text-color-2) calc(l * 1.25) c h),
3702
- oklch(from var(--text-color-2) calc(l * 0.75) c h)
3703
- );
3704
- font-size: var(--font-size-xs);
3705
- font-weight: 500;
3706
- letter-spacing: 0.06em;
3707
- line-height: 2.5;
3708
- text-transform: uppercase;
3709
- }
3710
-
3711
- hgroup {
3712
- & > p {
3713
- margin: 0;
3714
- }
3715
-
3716
- & > :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
3717
- margin-block-end: 0.4em;
3718
- }
3719
-
3720
- & + * {
3721
- margin-block-start: 3em;
3722
- }
3723
-
3724
- /* The second p element */
3725
- & > :where(p, .p):last-of-type:last-child:not(:first-child) {
3726
- color: oklch(from currentColor l c h / 75%);
3727
- font-size: var(--font-size-lg);
3728
- line-height: 1.6;
3729
- }
3730
- }
3731
-
3732
- /* Lists */
3733
- ul:not([class]) {
3734
- list-style-type: disc;
3735
- }
3736
-
3737
- ol:not([class]) {
3738
- list-style-type: decimal;
3739
- }
3740
-
3741
- :where(ul, ol):not([class]) {
3742
- display: grid;
3743
- font-size: inherit;
3744
- gap: 0.5em;
3745
- line-height: inherit;
3746
- margin-block-start: 1.25em;
3747
- margin-block-end: 1.25em;
3748
- padding-inline-start: 1.625em;
3749
-
3750
- li {
3751
- padding-inline-start: 0.375em;
3752
- }
3753
- }
3754
-
3755
- /* Nested lists */
3756
- :where(ul ul),
3757
- :where(ul ol),
3758
- :where(ol ul),
3759
- :where(ol ol) {
3760
- margin-block-start: 0.75em;
3761
- margin-block-end: 0.75em;
3762
- }
3763
-
3764
- /* Description lists */
3765
- :where(dl) {
3766
- font-size: inherit;
3767
- line-height: inherit;
3768
- margin-block-start: 1.25em;
3769
- margin-block-end: 1.25em;
3770
-
3771
- dt {
3772
- margin-block-start: 1.25em;
3773
- }
3774
-
3775
- dd {
3776
- margin-block-start: 0.5em;
3777
- padding-inline-start: 1.625em;
3778
- }
3779
- }
3780
-
3781
- /* Figures */
3782
- figure {
3783
- margin-block: 2em;
3784
-
3785
- & > * {
3786
- margin-block: 0;
3787
- }
3788
-
3789
- & figcaption {
3790
- font-size: 0.875em;
3791
- line-height: 1.4285714;
3792
- margin-block-start: 0.8571429em;
3793
- }
3794
- }
3795
-
3796
- /* Remove top margin from first child */
3797
- & > :first-child {
3798
- margin-block-start: 0;
3799
- }
3800
-
3801
- /* Remove bottom margin from last child */
3802
- & > :last-child {
3803
- margin-block-end: 0;
3804
- }
3805
-
3806
- /* Horizontal rules */
3807
- hr {
3808
- & + * {
3809
- margin-block-start: 0;
3810
- }
3811
- }
3812
- }
3813
- }
3814
-
3815
- /* Setup */
3816
-
3817
- /*
3818
- theme two theme setup
3819
- */
3820
-
3821
- @layer theme {
3822
- .light {
3823
- --color-scheme: light;
3824
- }
3825
- .dark {
3826
- --color-scheme: dark;
3827
- }
3828
-
3829
- :where(html) {
3830
- color-scheme: var(--color-scheme, light dark);
3831
-
3832
- --palette-hue: var(--oklch-orange);
3833
- --palette-hue-rotate-by: 0;
3834
- --palette-chroma: 0.89;
3835
-
3836
- /* Primary */
3837
- --primary: var(--color-8);
3838
- --primary-light: oklch(from var(--primary) calc(l * 1.25) c h);
3839
- --primary-dark: oklch(from var(--primary) calc(l * 0.75) c h);
3840
- --primary-contrast: var(--gray-1);
3841
-
3842
- /* Text */
3843
- --text-color-1: light-dark(var(--gray-15), var(--gray-1));
3844
- --text-color-1-contrast: light-dark(var(--gray-2), var(--gray-15));
3845
- --text-color-2: light-dark(var(--gray-13), var(--gray-4));
3846
- --text-color-2-contrast: light-dark(var(--gray-4), var(--gray-13));
3847
-
3848
- /* Surface */
3849
- --surface-default: light-dark(var(--gray-1), var(--gray-13));
3850
- --surface-filled: light-dark(var(--gray-3), var(--gray-15));
3851
- --surface-tonal: light-dark(var(--gray-3), var(--gray-12));
3852
- --surface-elevated: light-dark(var(--gray-1), var(--gray-12));
3853
-
3854
- /* Shadows */
3855
- --shadow-color: light-dark(220 3% 15%, 220 40% 2%);
3856
- --shadow-strength: light-dark(1%, 10%);
3857
- --inner-shadow-highlight: light-dark(
3858
- inset 0 -0.5px 0 0 #fff,
3859
- inset 0 0.5px 0 0 #0001,
3860
- inset 0 -0.5px 0 0 #fff1,
3861
- inset 0 0.5px 0 0 #0007
3862
- );
3863
-
3864
- /* Typography */
3865
- --font-size-h1: var(--font-size-fluid-3, 3.5rem);
3866
- --font-size-h2: var(--font-size-fluid-2, 2rem);
3867
- --font-size-h3: var(--font-size-fluid-1, 1.5rem);
3868
- --font-size-h4: var(--font-size-3, 1.25rem);
3869
- --font-size-h5: var(--font-size-2, 1.1rem);
3870
- --font-size-h6: var(--font-size-fluid-0, 1rem);
3871
- --font-size-lg: var(--font-size-3, 1.25rem);
3872
- --font-size-md: var(--font-size-fluid-0, 1rem);
3873
- --font-size-sm: 0.875rem;
3874
- --font-size-xs: var(--font-size-0, 0.75rem);
3875
-
3876
- /* Borders */
3877
- --border-color: light-dark(var(--gray-4), var(--gray-12));
3878
- --border-radius: var(--size-2);
3879
- --border-width: 1px;
3880
-
3881
- /* Input Field */
3882
- --field-border-color: var(--border-color);
3883
- --field-border-radius: var(--size-2);
3884
- --field-border-width: 1px;
3885
- --field-size: 2.3lh;
3886
- --field-size-small: 1.9lh;
3887
-
3888
- /* Button */
3889
- --button-border-radius: var(--size-2);
3890
- }
3891
-
3892
- /* Highlight colors */
3893
- :where(.red, .error, del) {
3894
- --palette-hue: var(--oklch-red, 25);
3895
- --palette-chroma: 1;
3896
- --palette-hue-rotate-by: 1;
3897
- }
3898
- :where(.blue, .ok, abbr, dfn) {
3899
- --palette-hue: var(--oklch-blue, 210);
3900
- --palette-chroma: 1;
3901
- --palette-hue-rotate-by: 1;
3902
- }
3903
- :where(.green, .good, ins) {
3904
- --palette-hue: var(--oklch-green, 145);
3905
- --palette-chroma: 1;
3906
- --palette-hue-rotate-by: 1;
3907
- }
3908
- :where(.orange, .warning) {
3909
- --palette-hue: var(--oklch-orange, 75);
3910
- --palette-chroma: 1;
3911
- --palette-hue-rotate-by: 1;
3912
- }
3913
-
3914
- :where(html) {
3915
- --red: oklch(from var(--color-9) l 0.2 25);
3916
- --blue: oklch(from var(--color-9) l 0.2 210);
3917
- --green: oklch(from var(--color-9) l 0.2 145);
3918
- --orange: oklch(from var(--color-7) l 0.2 75);
3919
- }
3920
-
3921
- /* Gray palette */
3922
- :where(html) {
3923
- --gray-chroma: 0.01;
3924
- --gray-lightness: 255;
3925
-
3926
- --gray-1: oklch(
3927
- from var(--color-1) l var(--gray-chroma) var(--gray-lightness)
3928
- );
3929
- --gray-2: oklch(
3930
- from var(--color-2) l var(--gray-chroma) var(--gray-lightness)
3931
- );
3932
- --gray-3: oklch(
3933
- from var(--color-3) l var(--gray-chroma) var(--gray-lightness)
3934
- );
3935
- --gray-4: oklch(
3936
- from var(--color-4) l var(--gray-chroma) var(--gray-lightness)
3937
- );
3938
- --gray-5: oklch(
3939
- from var(--color-5) l var(--gray-chroma) var(--gray-lightness)
3940
- );
3941
- --gray-6: oklch(
3942
- from var(--color-6) l var(--gray-chroma) var(--gray-lightness)
3943
- );
3944
- --gray-7: oklch(
3945
- from var(--color-7) l var(--gray-chroma) var(--gray-lightness)
3946
- );
3947
- --gray-8: oklch(
3948
- from var(--color-8) l var(--gray-chroma) var(--gray-lightness)
3949
- );
3950
- --gray-9: oklch(
3951
- from var(--color-9) l var(--gray-chroma) var(--gray-lightness)
3952
- );
3953
- --gray-10: oklch(
3954
- from var(--color-10) l var(--gray-chroma) var(--gray-lightness)
3955
- );
3956
- --gray-11: oklch(
3957
- from var(--color-11) l var(--gray-chroma) var(--gray-lightness)
3958
- );
3959
- --gray-12: oklch(
3960
- from var(--color-12) l var(--gray-chroma) var(--gray-lightness)
3961
- );
3962
- --gray-13: oklch(
3963
- from var(--color-13) l var(--gray-chroma) var(--gray-lightness)
3964
- );
3965
- --gray-14: oklch(
3966
- from var(--color-14) l var(--gray-chroma) var(--gray-lightness)
3967
- );
3968
- --gray-15: oklch(
3969
- from var(--color-15) l var(--gray-chroma) var(--gray-lightness)
3970
- );
3971
- --gray-16: oklch(
3972
- from var(--color-16) l var(--gray-chroma) var(--gray-lightness)
3973
- );
3974
- }
3975
- }