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