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