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,135 +1,87 @@
1
- @layer components.root {
2
- :where(.chip) {
3
- --_bg-color: var(--surface-tonal);
4
- --_border-color: var(--border-color);
5
- --_color: var(--text-color-1);
6
-
7
- align-items: center;
8
- background: var(--_bg-color) var(--ripple, none);
9
- border: 1px solid var(--_border-color);
10
- border-radius: var(--radius-2, 0.5rem);
11
- color: var(--_color);
12
- display: inline-flex;
13
- font-size: var(--font-size-0, 0.75rem);
14
- gap: var(--size-1);
15
- block-size: var(--size-7, 2rem);
16
- padding-inline: var(--size-2);
17
- text-decoration: none;
18
-
19
- /* Variants */
20
- &.tonal {
21
- --_bg-color: var(--surface-tonal);
22
- --_color: var(--text-color-1);
23
- }
24
-
25
- &.outlined {
26
- --_bg-color: var(--surface-default);
27
- --_color: var(--text-color-1);
28
- }
29
-
30
- /* TODO: should this be out of the box? */
31
- /* Colors */
32
- /* &:hover {
33
- --_bg-color: var(--color-11);
34
- --_border-color: var(--color-11);
35
- --_color: var(--text-color-1);
36
- } */
37
- /* &.red,
38
- &.blue,
39
- &.green,
40
- &.orange,
41
- &.primary {
42
- --_bg-color: var(--color-5);
43
- --_border-color: var(--color-7);
44
- --_color: var(--text-color-1-contrast);
45
-
46
- &:hover {
47
- --_bg-color: var(--color-7);
48
- --_border-color: var(--color-7);
49
- --_color: var(--text-color-1-contrast);
50
-
51
- &:active {
52
- --_bg-color: var(--color-8);
53
- --_border-color: var(--color-8);
54
- }
55
- }
56
-
57
- &.outlined {
58
- --_bg-color: var(--surface-tonal);
59
- --_color: var(--text-color-1);
60
- --_border-color: var(--color-9);
61
-
62
- &:hover {
63
- --_bg-color: var(--color-9);
64
- --_border-color: var(--color-9);
65
- --_color: var(--text-color-1);
66
-
67
- &:active {
68
- --_bg-color: var(--color-11);
69
- --_border-color: var(--color-11);
70
- }
71
- }
72
- }
73
- } */
74
-
75
- &:where(button, a):where(:not([disabled])) {
76
- &:where(:not(:active)):hover {
77
- --_bg-color: light-dark(
78
- oklch(from var(--surface-tonal) calc(l * 0.98) c h),
79
- oklch(from var(--surface-tonal) calc(l * 1.1) c h)
80
- );
81
- }
82
- }
83
-
84
- /* Icon */
85
- &:has(svg:first-child) {
86
- padding-inline: var(--size-1) var(--size-2);
87
- }
88
- &:has(svg:last-child) {
89
- padding-inline: var(--size-2) var(--size-1);
90
- }
91
-
92
- &:has(svg) {
93
- svg {
94
- flex-shrink: 0;
95
- inline-size: var(--size-3);
96
- }
97
- }
98
-
99
- /* Sizes */
100
- &.small {
101
- block-size: var(--size-5);
102
- }
103
- &.multiline {
104
- block-size: auto;
105
- }
106
-
107
- /* Ripple effect */
108
- background-position: center;
109
-
110
- &:where(:not([disabled])) {
111
- &:where(:not(:active):hover) {
112
- --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
113
- center/15000%;
114
-
115
- transition: background var(--button-ripple-duration);
116
- }
117
-
118
- &:where(:hover:active) {
119
- background-size: var(--button-ripple-size);
120
- transition: background 0s;
121
- }
122
- }
123
-
124
- /* Disabled */
125
- &:where([disabled]) {
126
- opacity: 0.64;
127
- --_text-color: color-mix(
128
- in oklch,
129
- var(--text-color-2) 50%,
130
- var(--surface-default)
131
- );
132
- cursor: not-allowed;
133
- }
134
- }
135
- }
1
+ @layer components.root {
2
+ :where(.chip) {
3
+ --_bg-color: var(--surface-tonal);
4
+ --_border-color: var(--border-color);
5
+ --_color: var(--text-primary);
6
+
7
+ align-items: center;
8
+ background: var(--_bg-color) var(--ripple, none);
9
+ block-size: var(--size-7, 2rem);
10
+ border-radius: var(--radius-2, 0.5rem);
11
+ border: 1px solid var(--_border-color);
12
+ color: var(--_color);
13
+ display: inline-flex;
14
+ font-size: var(--font-size-0, 0.75rem);
15
+ gap: var(--size-1);
16
+ padding-inline: var(--size-2);
17
+ text-decoration: none;
18
+
19
+ /* Variants */
20
+ &.tonal {
21
+ --_bg-color: var(--surface-tonal);
22
+ --_color: var(--text-primary);
23
+ }
24
+
25
+ &.outlined {
26
+ --_bg-color: var(--surface-default);
27
+ --_color: var(--text-primary);
28
+ }
29
+
30
+ &:where(button, a):where(:not([disabled])) {
31
+ &:where(:not(:active)):hover {
32
+ --_bg-color: light-dark(oklch(from var(--surface-tonal) calc(l * 0.98) c h),
33
+ oklch(from var(--surface-tonal) calc(l * 1.1) c h));
34
+ }
35
+ }
36
+
37
+ /* Icon */
38
+ &:has(svg:first-child) {
39
+ padding-inline: var(--size-1) var(--size-2);
40
+ }
41
+
42
+ &:has(svg:last-child) {
43
+ padding-inline: var(--size-2) var(--size-1);
44
+ }
45
+
46
+ &:has(svg) {
47
+ svg {
48
+ flex-shrink: 0;
49
+ inline-size: var(--size-3);
50
+ }
51
+ }
52
+
53
+ /* Sizes */
54
+ &.small {
55
+ block-size: var(--size-5);
56
+ }
57
+
58
+ &.multiline {
59
+ block-size: auto;
60
+ }
61
+
62
+ /* Ripple effect */
63
+ background-position: center;
64
+
65
+ &:where(:not([disabled])) {
66
+ &:where(:not(:active):hover) {
67
+ --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%) center/15000%;
68
+
69
+ transition: background var(--button-ripple-duration);
70
+ }
71
+
72
+ &:where(:hover:active) {
73
+ background-size: var(--button-ripple-size);
74
+ transition: background 0s;
75
+ }
76
+ }
77
+
78
+ /* Disabled */
79
+ &:where([disabled]) {
80
+ opacity: 0.64;
81
+ --_color: color-mix(in oklch,
82
+ var(--text-muted) 50%,
83
+ var(--surface-default));
84
+ cursor: not-allowed;
85
+ }
86
+ }
87
+ }
@@ -1,68 +1,77 @@
1
- @layer components.root {
2
- :where(.definition-list) {
3
- --_border-style: solid;
4
- --_border-width: 1px;
5
-
6
- display: grid;
7
- gap: var(--size-3);
8
- padding: 0;
9
-
10
- &.dotted {
11
- --_border-style: dotted;
12
- --_border-width: 2px;
13
- }
14
-
15
- li {
16
- display: grid;
17
- margin: 0;
18
- padding: 0;
19
-
20
- .term {
21
- display: block;
22
- font-weight: 700;
23
- overflow: hidden;
24
- position: relative;
25
- }
26
-
27
- hr {
28
- display: none;
29
- margin: 0;
30
- }
31
- }
32
-
33
- @container (width > 45ch) {
34
- gap: var(--size-1);
35
-
36
- li {
37
- align-items: baseline;
38
- display: grid;
39
- gap: var(--size-1);
40
- grid-template-columns: 1fr auto;
41
-
42
- &:has(hr) {
43
- grid-template-columns: auto 1fr auto;
44
- }
45
-
46
- hr {
47
- background-color: transparent;
48
- border-block-end: var(--_border-width) var(--_border-style)
49
- var(--border-color);
50
- block-size: 2px;
51
- display: block;
52
- }
53
-
54
- .term {
55
- inline-size: max-content;
56
-
57
- &::after {
58
- display: inline-block;
59
- }
60
- }
61
- .description {
62
- color: var(--text-color-2);
63
- text-align: end;
64
- }
65
- }
66
- }
67
- }
68
- }
1
+ @layer components.root {
2
+ :where(.description-list) {
3
+ --_border-style: solid;
4
+ --_border-width: 1px;
5
+
6
+ display: grid;
7
+ gap: var(--size-3);
8
+ margin: 0;
9
+ padding: 0;
10
+
11
+ &.dotted {
12
+ --_border-style: dotted;
13
+ --_border-width: 2px;
14
+ }
15
+
16
+ .item {
17
+ display: grid;
18
+ margin: 0;
19
+ padding: 0;
20
+
21
+ dt {
22
+ display: block;
23
+ font-weight: 700;
24
+ overflow: hidden;
25
+ position: relative;
26
+ }
27
+
28
+ dd {
29
+ margin: 0;
30
+ }
31
+ }
32
+
33
+ @container (width > 45ch) {
34
+ gap: var(--size-1);
35
+
36
+ .item {
37
+ align-items: baseline;
38
+ display: grid;
39
+ gap: var(--size-1);
40
+ grid-template-columns: 1fr auto;
41
+
42
+ dt {
43
+ inline-size: max-content;
44
+
45
+ &::after {
46
+ display: inline-block;
47
+ }
48
+ }
49
+
50
+ dd {
51
+ color: var(--text-muted);
52
+ text-align: end;
53
+ }
54
+ }
55
+
56
+ &.bordered .item {
57
+ grid-template-columns: auto 1fr auto;
58
+
59
+ dt {
60
+ order: 0;
61
+ }
62
+
63
+ dd {
64
+ order: 2;
65
+ }
66
+
67
+ &::after {
68
+ background-color: transparent;
69
+ block-size: 2px;
70
+ border-block-end: var(--_border-width) var(--_border-style) var(--border-color);
71
+ content: "";
72
+ order: 1;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ }
@@ -1,59 +1,68 @@
1
- @layer components.extended {
2
- :where(dialog) {
3
- margin-block-start: 15%; /* vertical alignment */
4
- padding-block: 0;
5
- pointer-events: none;
6
-
7
- &::backdrop {
8
- background-color: rgba(0, 0, 0, 0.5);
9
- backdrop-filter: blur(5px);
10
-
11
- @media (prefers-reduced-motion: reduce) {
12
- backdrop-filter: none;
13
- }
14
- }
15
-
16
- &:not([open]) {
17
- display: none;
18
- }
19
-
20
- &[open] {
21
- pointer-events: all;
22
- }
23
-
24
- .actions {
25
- justify-content: end;
26
- padding-inline: var(--size-3) var(--size-1);
27
- }
28
-
29
- /* Animation */
30
- /* There's no close animation, intentionally */
31
- opacity: 0;
32
-
33
- &[open] {
34
- opacity: 1;
35
- transition: display 0.2s allow-discrete,
36
- margin-block-start 0.3s var(--ease-1), overlay 0.2s allow-discrete,
37
- opacity 0.2s var(--ease-out-1);
38
-
39
- @starting-style {
40
- opacity: 0;
41
- }
42
- }
43
-
44
- @media (prefers-reduced-motion: no-preference) {
45
- margin-block-start: 17%;
46
- &[open] {
47
- margin-block-start: 15%;
48
-
49
- @starting-style {
50
- margin-block-start: 17%;
51
- }
52
- }
53
- }
54
- }
55
-
56
- :where(html:has(dialog[open])) {
57
- overflow: hidden;
58
- }
59
- }
1
+ @layer components.extended {
2
+ :where(.dialog) {
3
+ inline-size: 100%;
4
+ inset: 0;
5
+ margin: auto;
6
+ margin-block-start: 15%;
7
+ max-inline-size: calc(100% - var(--size-4));
8
+ padding-block: 0;
9
+ pointer-events: none;
10
+ position: fixed;
11
+
12
+ @media (width > 600px) {
13
+ max-inline-size: 60ch;
14
+ }
15
+
16
+ /* Animation */
17
+ /* There's no close animation, intentionally */
18
+ opacity: 0;
19
+
20
+ &::backdrop {
21
+ backdrop-filter: blur(1px);
22
+ background-color: rgba(0, 0, 0, 0.5);
23
+
24
+ @media (prefers-reduced-motion: reduce) {
25
+ backdrop-filter: none;
26
+ }
27
+ }
28
+
29
+ &:not([open]) {
30
+ display: none;
31
+ }
32
+
33
+ &[open] {
34
+ pointer-events: all;
35
+ }
36
+
37
+ .actions {
38
+ justify-content: end;
39
+ padding-inline: var(--size-3) var(--size-1);
40
+ }
41
+
42
+ &[open] {
43
+ opacity: 1;
44
+ transition: display 0.2s allow-discrete,
45
+ overlay 0.2s allow-discrete,
46
+ opacity 0.2s var(--ease-out-1);
47
+
48
+ @starting-style {
49
+ opacity: 0;
50
+ }
51
+ }
52
+
53
+ @media (prefers-reduced-motion: no-preference) {
54
+ &[open] {
55
+ margin-block-start: 15%;
56
+
57
+ @starting-style {
58
+ opacity: 0;
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ :where(html:has(.dialog[open])) {
65
+ block-size: 100%;
66
+ overflow: hidden;
67
+ }
68
+ }
@@ -0,0 +1,20 @@
1
+ @layer components.root {
2
+ :where(hr) {
3
+ background-color: var(--border-color);
4
+ block-size: var(--border-size-1);
5
+ margin-block: var(--size-fluid-3);
6
+
7
+ /* Border color */
8
+ &.border-filled {
9
+ background-color: var(--surface-filled);
10
+ }
11
+
12
+ &.border-primary {
13
+ background-color: var(--primary);
14
+ }
15
+
16
+ &.border-tonal {
17
+ background-color: var(--surface-tonal);
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,171 @@
1
+ @layer components.root {
2
+ :where(dialog.drawer) {
3
+ --_backdrop-bg-color: transparent;
4
+ --_backdrop-blur: blur(2px);
5
+ --_bg-color: var(--surface-default);
6
+ --_block-size: min(80vb, 650px);
7
+ --_border-color: var(--border-color);
8
+ --_border-width: var(--border-width);
9
+ --_color: var(--text-primary);
10
+ --_content-padding: var(--size-4);
11
+ --_footer-gap: var(--size-3);
12
+ --_footer-padding: var(--size-3);
13
+ --_header-font-size: var(--font-size-3);
14
+ --_header-padding: var(--size-3);
15
+ --_inline-size: min(375px, 100vi);
16
+ --_shadow: var(--shadow-2);
17
+ --_transition-duration: 0.2s;
18
+ --_transition-timing: var(--ease-out-3);
19
+
20
+ background-color: var(--_bg-color);
21
+ border: none;
22
+ box-shadow: var(--_shadow);
23
+ color: var(--_color);
24
+ display: flex;
25
+ flex-direction: column;
26
+ margin: 0;
27
+ max-inline-size: 100%;
28
+ padding: 0;
29
+ position: fixed;
30
+ transition:
31
+ display var(--_transition-duration) allow-discrete,
32
+ overlay var(--_transition-duration) allow-discrete,
33
+ translate var(--_transition-duration) var(--_transition-timing);
34
+ z-index: 1000;
35
+
36
+ &::backdrop {
37
+ backdrop-filter: var(--_backdrop-blur);
38
+ background-color: var(--_backdrop-bg-color);
39
+ opacity: 0;
40
+ transition:
41
+ display var(--_transition-duration) allow-discrete,
42
+ overlay var(--_transition-duration) allow-discrete,
43
+ opacity var(--_transition-duration) var(--_transition-timing);
44
+ }
45
+
46
+ &.backdrop-transparent {
47
+ --_backdrop-blur: none;
48
+ }
49
+
50
+ .header {
51
+ align-items: center;
52
+ border-block-end: var(--_border-width) solid var(--_border-color);
53
+ display: flex;
54
+ padding: var(--_header-padding);
55
+
56
+ :where(h1, h2, h3, h4, h5, h6) {
57
+ font-size: var(--_header-font-size);
58
+ margin: 0;
59
+ }
60
+
61
+ :where(.icon-button) {
62
+ margin-inline-start: auto;
63
+ }
64
+ }
65
+
66
+ .content {
67
+ flex: 1;
68
+ overflow-y: auto;
69
+ padding: var(--_content-padding);
70
+ }
71
+
72
+ .footer {
73
+ border-block-start: var(--_border-width) solid var(--_border-color);
74
+ display: flex;
75
+ gap: var(--_footer-gap);
76
+ justify-content: end;
77
+ padding: var(--_footer-padding);
78
+ }
79
+
80
+ &.inline-start,
81
+ &.inline-end {
82
+ block-size: 100dvb;
83
+ inline-size: var(--_inline-size);
84
+ inset-block: 0;
85
+ max-block-size: 100%;
86
+ }
87
+
88
+ &.inline-start {
89
+ border-inline-end: var(--_border-width) solid var(--_border-color);
90
+ inset-inline-end: auto;
91
+ inset-inline-start: 0;
92
+ translate: -100% 0;
93
+ }
94
+
95
+ &.inline-end {
96
+ border-inline-start: var(--_border-width) solid var(--_border-color);
97
+ inset-inline-end: 0;
98
+ inset-inline-start: auto;
99
+ translate: 100% 0;
100
+
101
+ .footer {
102
+ justify-content: start;
103
+ }
104
+ }
105
+
106
+ &.block-start,
107
+ &.block-end {
108
+ block-size: var(--_block-size);
109
+ inline-size: 100dvi;
110
+ inset-inline: 0;
111
+ max-block-size: 80dvb;
112
+ }
113
+
114
+ &.block-start {
115
+ border-block-end: var(--_border-width) solid var(--_border-color);
116
+ inset-block-end: auto;
117
+ inset-block-start: 0;
118
+ translate: 0 -100%;
119
+ }
120
+
121
+ &.block-end {
122
+ border-block-start: var(--_border-width) solid var(--_border-color);
123
+ inset-block-end: 0;
124
+ inset-block-start: auto;
125
+ translate: 0 100%;
126
+ }
127
+
128
+ &[open] {
129
+ translate: 0 0;
130
+
131
+ &::backdrop {
132
+ opacity: 1;
133
+ }
134
+
135
+ @starting-style {
136
+ &::backdrop {
137
+ opacity: 0;
138
+ }
139
+
140
+ &.inline-start {
141
+ translate: -100% 0;
142
+ }
143
+
144
+ &.inline-end {
145
+ translate: 100% 0;
146
+ }
147
+
148
+ &.block-start {
149
+ translate: 0 -100%;
150
+ }
151
+
152
+ &.block-end {
153
+ translate: 0 100%;
154
+ }
155
+ }
156
+ }
157
+ }
158
+
159
+ /* Scroll-lock is provided by the shared `.scroll-lock` utility in core/utils.css.
160
+ This carve-out re-enables page scrolling when a transparent-backdrop drawer is
161
+ open on wide viewports (where the drawer doesn't visually cover the page). */
162
+ html:has(dialog.drawer.scroll-lock[open].backdrop-transparent) {
163
+ overflow: unset;
164
+ overscroll-behavior: auto;
165
+
166
+ @media (width < 500px) {
167
+ overflow: clip;
168
+ overscroll-behavior: contain;
169
+ }
170
+ }
171
+ }