css-drawer 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/index.cjs +2 -3
- package/dist/index.d.cts +2 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -3
- package/dist/index.mjs.map +1 -1
- package/dist/observer-BZAUqGHC.cjs +2 -0
- package/dist/observer-DEB7SwSL.mjs +3 -0
- package/dist/observer-DEB7SwSL.mjs.map +1 -0
- package/dist/react.cjs +1 -2
- package/dist/react.d.cts +14 -7
- package/dist/react.d.cts.map +1 -1
- package/dist/react.d.mts +14 -7
- package/dist/react.d.mts.map +1 -1
- package/dist/react.mjs +1 -2
- package/dist/react.mjs.map +1 -1
- package/dist/{observer-CtfG4nrq.css → style.css} +91 -128
- package/package.json +11 -7
- package/src/drawer.css +6 -1
- package/dist/observer-B-WjvsFU.cjs +0 -1
- package/dist/observer-DIOx0VCj.mjs +0 -2
- package/dist/observer-DIOx0VCj.mjs.map +0 -1
- package/dist/observer-QD6bSdOu.css +0 -334
- package/dist/observer-QD6bSdOu.css.map +0 -1
|
@@ -1,94 +1,73 @@
|
|
|
1
|
-
/* CSS Drawer - Vaul-quality drawer with auto-nesting and directions */
|
|
2
|
-
|
|
3
1
|
:root {
|
|
4
|
-
/* Visual */
|
|
5
2
|
--drawer-bg: #fff;
|
|
6
3
|
--drawer-radius: 24px;
|
|
7
|
-
--drawer-backdrop:
|
|
4
|
+
--drawer-backdrop: #0006;
|
|
8
5
|
--drawer-backdrop-blur: 4px;
|
|
9
|
-
|
|
10
|
-
/* Sizing */
|
|
11
6
|
--drawer-max-height: 96dvh;
|
|
12
7
|
--drawer-modal-width: fit-content;
|
|
13
8
|
--drawer-modal-height: fit-content;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
--drawer-handle-bg: hsl(0 0% 80%);
|
|
17
|
-
--drawer-handle-bg-hover: hsl(0 0% 60%);
|
|
9
|
+
--drawer-handle-bg: #ccc;
|
|
10
|
+
--drawer-handle-bg-hover: #999;
|
|
18
11
|
--drawer-handle-width: 48px;
|
|
19
12
|
--drawer-handle-width-hover: 56px;
|
|
20
13
|
--drawer-handle-height: 5px;
|
|
21
|
-
--drawer-handle-padding-block: 1rem
|
|
14
|
+
--drawer-handle-padding-block: 1rem .5rem;
|
|
22
15
|
--drawer-handle-padding-inline: 0;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
--drawer-shadow-
|
|
26
|
-
--drawer-shadow-
|
|
27
|
-
--drawer-shadow-
|
|
28
|
-
--drawer-
|
|
29
|
-
--drawer-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
--drawer-duration: 0.5s;
|
|
33
|
-
--drawer-duration-close: 0.35s;
|
|
34
|
-
--drawer-ease: cubic-bezier(0.32, 0.72, 0, 1);
|
|
35
|
-
|
|
36
|
-
/* Nesting effects */
|
|
37
|
-
--drawer-nested-scale: 0.94;
|
|
16
|
+
--drawer-shadow-bottom: 0 -10px 60px #0000001f, 0 -4px 20px #00000014;
|
|
17
|
+
--drawer-shadow-top: 0 10px 60px #0000001f, 0 4px 20px #00000014;
|
|
18
|
+
--drawer-shadow-right: -10px 0 60px #0000001f, -4px 0 20px #00000014;
|
|
19
|
+
--drawer-shadow-left: 10px 0 60px #0000001f, 4px 0 20px #00000014;
|
|
20
|
+
--drawer-shadow-modal: 0 25px 50px -12px #00000040;
|
|
21
|
+
--drawer-duration: .5s;
|
|
22
|
+
--drawer-duration-close: .35s;
|
|
23
|
+
--drawer-ease: cubic-bezier(.32, .72, 0, 1);
|
|
24
|
+
--drawer-nested-scale: .94;
|
|
38
25
|
--drawer-nested-offset: 20px;
|
|
39
|
-
--drawer-nested-brightness:
|
|
40
|
-
--drawer-nested-backdrop:
|
|
26
|
+
--drawer-nested-brightness: .92;
|
|
27
|
+
--drawer-nested-backdrop: #00000026;
|
|
41
28
|
}
|
|
42
29
|
|
|
43
30
|
@media (prefers-color-scheme: dark) {
|
|
44
31
|
:root {
|
|
45
|
-
--drawer-bg:
|
|
46
|
-
--drawer-handle-bg:
|
|
47
|
-
--drawer-handle-bg-hover:
|
|
48
|
-
--drawer-shadow-bottom: 0 -10px 60px
|
|
49
|
-
--drawer-shadow-top: 0 10px 60px
|
|
50
|
-
--drawer-shadow-right: -10px 0 60px
|
|
51
|
-
--drawer-shadow-left: 10px 0 60px
|
|
52
|
-
--drawer-shadow-modal: 0 25px 50px -12px
|
|
32
|
+
--drawer-bg: #1f1f1f;
|
|
33
|
+
--drawer-handle-bg: #595959;
|
|
34
|
+
--drawer-handle-bg-hover: gray;
|
|
35
|
+
--drawer-shadow-bottom: 0 -10px 60px #0006, 0 -4px 20px #0000004d;
|
|
36
|
+
--drawer-shadow-top: 0 10px 60px #0006, 0 4px 20px #0000004d;
|
|
37
|
+
--drawer-shadow-right: -10px 0 60px #0006, -4px 0 20px #0000004d;
|
|
38
|
+
--drawer-shadow-left: 10px 0 60px #0006, 4px 0 20px #0000004d;
|
|
39
|
+
--drawer-shadow-modal: 0 25px 50px -12px #00000080;
|
|
53
40
|
}
|
|
54
41
|
}
|
|
55
42
|
|
|
56
|
-
/* Background scale effect */
|
|
57
43
|
body {
|
|
58
44
|
transition: scale var(--drawer-duration) var(--drawer-ease), border-radius var(--drawer-duration) var(--drawer-ease);
|
|
59
|
-
transform-origin:
|
|
45
|
+
transform-origin: top;
|
|
60
46
|
}
|
|
61
47
|
|
|
62
48
|
body:has(.drawer[open]) {
|
|
63
|
-
overflow: hidden;
|
|
64
49
|
scale: var(--drawer-nested-scale);
|
|
65
50
|
border-radius: var(--drawer-radius);
|
|
66
51
|
}
|
|
67
52
|
|
|
68
|
-
|
|
53
|
+
body:has(.drawer[open]:not([data-scroll-lock="false"])) {
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
}
|
|
56
|
+
|
|
69
57
|
.drawer {
|
|
70
|
-
border: none;
|
|
71
|
-
padding: 0;
|
|
72
|
-
margin: 0;
|
|
73
|
-
max-width: 100%;
|
|
74
|
-
max-height: 100%;
|
|
75
|
-
position: fixed;
|
|
76
58
|
background: var(--drawer-bg);
|
|
77
|
-
overflow: hidden;
|
|
78
59
|
opacity: 0;
|
|
79
|
-
|
|
80
|
-
|
|
60
|
+
max-width: 100%;
|
|
61
|
+
max-height: 100%;
|
|
62
|
+
transition: display var(--drawer-duration-close) allow-discrete,
|
|
81
63
|
overlay var(--drawer-duration-close) allow-discrete,
|
|
82
64
|
translate var(--drawer-duration-close) var(--drawer-ease),
|
|
83
65
|
scale var(--drawer-duration-close) var(--drawer-ease),
|
|
84
66
|
filter var(--drawer-duration-close) ease,
|
|
85
67
|
opacity var(--drawer-duration-close) ease;
|
|
86
|
-
|
|
87
|
-
/* Default: bottom */
|
|
88
68
|
--_translate-closed: 0 100%;
|
|
89
69
|
--_border-radius: var(--drawer-radius) var(--drawer-radius) 0 0;
|
|
90
|
-
|
|
91
|
-
margin-inline: auto;
|
|
70
|
+
margin: 0;
|
|
92
71
|
width: var(--drawer-width, 100%);
|
|
93
72
|
max-width: var(--drawer-max-width, none);
|
|
94
73
|
height: var(--drawer-height, auto);
|
|
@@ -96,94 +75,97 @@ body:has(.drawer[open]) {
|
|
|
96
75
|
border-radius: var(--drawer-border-radius, var(--_border-radius));
|
|
97
76
|
box-shadow: var(--drawer-shadow-bottom);
|
|
98
77
|
translate: var(--_translate-closed);
|
|
78
|
+
border: none;
|
|
79
|
+
margin-inline: auto;
|
|
80
|
+
padding: 0;
|
|
81
|
+
position: fixed;
|
|
82
|
+
inset: auto 0 0;
|
|
83
|
+
overflow: hidden;
|
|
99
84
|
}
|
|
100
85
|
|
|
101
86
|
.drawer::backdrop {
|
|
102
87
|
background: var(--drawer-backdrop);
|
|
103
88
|
opacity: 0;
|
|
104
|
-
backdrop-filter: blur(var(--drawer-backdrop-blur));
|
|
105
89
|
-webkit-backdrop-filter: blur(var(--drawer-backdrop-blur));
|
|
106
|
-
transition:
|
|
107
|
-
display var(--drawer-duration-close) allow-discrete,
|
|
90
|
+
transition: display var(--drawer-duration-close) allow-discrete,
|
|
108
91
|
overlay var(--drawer-duration-close) allow-discrete,
|
|
109
92
|
opacity var(--drawer-duration-close) ease;
|
|
110
93
|
}
|
|
111
94
|
|
|
112
95
|
.drawer[open] {
|
|
113
96
|
opacity: 1;
|
|
114
|
-
|
|
115
|
-
transition:
|
|
116
|
-
display var(--drawer-duration) allow-discrete,
|
|
97
|
+
transition: display var(--drawer-duration) allow-discrete,
|
|
117
98
|
overlay var(--drawer-duration) allow-discrete,
|
|
118
99
|
translate var(--drawer-duration) var(--drawer-ease),
|
|
119
100
|
scale var(--drawer-duration) var(--drawer-ease),
|
|
120
101
|
filter var(--drawer-duration) ease,
|
|
121
|
-
opacity
|
|
102
|
+
opacity .15s ease;
|
|
103
|
+
translate: 0;
|
|
122
104
|
}
|
|
123
105
|
|
|
124
106
|
.drawer[open]::backdrop {
|
|
125
107
|
opacity: 1;
|
|
126
|
-
transition: display var(--drawer-duration) allow-discrete, overlay var(--drawer-duration) allow-discrete, opacity
|
|
108
|
+
transition: display var(--drawer-duration) allow-discrete, overlay var(--drawer-duration) allow-discrete, opacity .2s ease;
|
|
127
109
|
}
|
|
128
110
|
|
|
129
111
|
@starting-style {
|
|
130
|
-
.drawer[open] {
|
|
131
|
-
|
|
132
|
-
|
|
112
|
+
.drawer[open] {
|
|
113
|
+
opacity: 0;
|
|
114
|
+
translate: var(--_translate-closed);
|
|
115
|
+
}
|
|
133
116
|
|
|
134
|
-
|
|
117
|
+
.drawer[open]::backdrop {
|
|
118
|
+
opacity: 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
135
121
|
|
|
136
|
-
/* Right */
|
|
137
122
|
.drawer[data-direction="right"] {
|
|
138
123
|
--_translate-closed: 100% 0;
|
|
139
124
|
--_border-radius: var(--drawer-radius) 0 0 var(--drawer-radius);
|
|
140
|
-
inset: 0 0 0 auto;
|
|
141
|
-
margin: 0;
|
|
142
125
|
width: var(--drawer-width, 500px);
|
|
143
126
|
max-width: var(--drawer-max-width, 90%);
|
|
144
127
|
height: var(--drawer-height, 100dvh);
|
|
145
128
|
max-height: 100dvh;
|
|
146
129
|
box-shadow: var(--drawer-shadow-right);
|
|
130
|
+
margin: 0;
|
|
131
|
+
inset: 0 0 0 auto;
|
|
147
132
|
}
|
|
148
133
|
|
|
149
|
-
/* Left */
|
|
150
134
|
.drawer[data-direction="left"] {
|
|
151
135
|
--_translate-closed: -100% 0;
|
|
152
136
|
--_border-radius: 0 var(--drawer-radius) var(--drawer-radius) 0;
|
|
153
|
-
inset: 0 auto 0 0;
|
|
154
|
-
margin: 0;
|
|
155
137
|
width: var(--drawer-width, 500px);
|
|
156
138
|
max-width: var(--drawer-max-width, 90%);
|
|
157
139
|
height: var(--drawer-height, 100dvh);
|
|
158
140
|
max-height: 100dvh;
|
|
159
141
|
box-shadow: var(--drawer-shadow-left);
|
|
142
|
+
margin: 0;
|
|
143
|
+
inset: 0 auto 0 0;
|
|
160
144
|
}
|
|
161
145
|
|
|
162
|
-
/* Top */
|
|
163
146
|
.drawer[data-direction="top"] {
|
|
164
147
|
--_translate-closed: 0 -100%;
|
|
165
148
|
--_border-radius: 0 0 var(--drawer-radius) var(--drawer-radius);
|
|
166
|
-
inset: 0 0 auto 0;
|
|
167
|
-
margin-inline: auto;
|
|
168
149
|
width: var(--drawer-width, 100%);
|
|
169
150
|
max-width: var(--drawer-max-width, none);
|
|
170
151
|
height: var(--drawer-height, auto);
|
|
171
152
|
max-height: var(--drawer-max-height, 96dvh);
|
|
172
153
|
box-shadow: var(--drawer-shadow-top);
|
|
154
|
+
margin-inline: auto;
|
|
155
|
+
inset: 0 0 auto;
|
|
173
156
|
}
|
|
174
157
|
|
|
175
|
-
/* Modal (centered) */
|
|
176
158
|
.drawer[data-direction="modal"] {
|
|
177
159
|
--_translate-closed: 0 0;
|
|
178
160
|
--_border-radius: var(--drawer-radius);
|
|
179
|
-
inset: 0;
|
|
180
|
-
margin: auto;
|
|
181
161
|
width: var(--drawer-modal-width, fit-content);
|
|
182
162
|
max-width: var(--drawer-max-width, 90%);
|
|
183
163
|
height: var(--drawer-modal-height, fit-content);
|
|
184
164
|
max-height: var(--drawer-max-height, 96dvh);
|
|
185
165
|
box-shadow: var(--drawer-shadow-modal);
|
|
186
166
|
scale: var(--drawer-nested-scale);
|
|
167
|
+
margin: auto;
|
|
168
|
+
inset: 0;
|
|
187
169
|
}
|
|
188
170
|
|
|
189
171
|
.drawer[data-direction="modal"][open] {
|
|
@@ -196,11 +178,7 @@ body:has(.drawer[open]) {
|
|
|
196
178
|
}
|
|
197
179
|
}
|
|
198
180
|
|
|
199
|
-
|
|
200
|
-
/* Uses sibling combinators to count open drawers */
|
|
201
|
-
|
|
202
|
-
/* 1+ open drawers after */
|
|
203
|
-
.drawer[open]:has(~ .drawer[open]) {
|
|
181
|
+
.drawer[open]:has( ~ .drawer[open]) {
|
|
204
182
|
scale: var(--drawer-nested-scale);
|
|
205
183
|
translate: 0 calc(-1 * var(--drawer-nested-offset));
|
|
206
184
|
border-radius: var(--drawer-radius);
|
|
@@ -208,125 +186,110 @@ body:has(.drawer[open]) {
|
|
|
208
186
|
pointer-events: none;
|
|
209
187
|
}
|
|
210
188
|
|
|
211
|
-
|
|
212
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open]) {
|
|
189
|
+
.drawer[open]:has( ~ .drawer[open] ~ .drawer[open]) {
|
|
213
190
|
scale: calc(var(--drawer-nested-scale) * var(--drawer-nested-scale));
|
|
214
191
|
translate: 0 calc(-2 * var(--drawer-nested-offset));
|
|
215
192
|
filter: brightness(calc(var(--drawer-nested-brightness) * var(--drawer-nested-brightness)));
|
|
216
193
|
}
|
|
217
194
|
|
|
218
|
-
|
|
219
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
195
|
+
.drawer[open]:has( ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
220
196
|
scale: calc(var(--drawer-nested-scale) * var(--drawer-nested-scale) * var(--drawer-nested-scale));
|
|
221
197
|
translate: 0 calc(-3 * var(--drawer-nested-offset));
|
|
222
198
|
filter: brightness(calc(var(--drawer-nested-brightness) * var(--drawer-nested-brightness) * var(--drawer-nested-brightness)));
|
|
223
199
|
}
|
|
224
200
|
|
|
225
|
-
|
|
226
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
201
|
+
.drawer[open]:has( ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
227
202
|
scale: calc(var(--drawer-nested-scale) * var(--drawer-nested-scale) * var(--drawer-nested-scale) * var(--drawer-nested-scale));
|
|
228
203
|
translate: 0 calc(-4 * var(--drawer-nested-offset));
|
|
229
204
|
filter: brightness(calc(var(--drawer-nested-brightness) * var(--drawer-nested-brightness) * var(--drawer-nested-brightness) * var(--drawer-nested-brightness)));
|
|
230
205
|
}
|
|
231
206
|
|
|
232
|
-
|
|
233
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
207
|
+
.drawer[open]:has( ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
234
208
|
scale: calc(var(--drawer-nested-scale) * var(--drawer-nested-scale) * var(--drawer-nested-scale) * var(--drawer-nested-scale) * var(--drawer-nested-scale));
|
|
235
209
|
translate: 0 calc(-5 * var(--drawer-nested-offset));
|
|
236
210
|
filter: brightness(calc(var(--drawer-nested-brightness) * var(--drawer-nested-brightness) * var(--drawer-nested-brightness) * var(--drawer-nested-brightness) * var(--drawer-nested-brightness)));
|
|
237
211
|
}
|
|
238
212
|
|
|
239
|
-
/* Lighter backdrop for stacked drawers */
|
|
240
213
|
.drawer[open] ~ .drawer[open]::backdrop {
|
|
241
214
|
background: var(--drawer-nested-backdrop);
|
|
242
215
|
backdrop-filter: none;
|
|
243
216
|
}
|
|
244
217
|
|
|
245
|
-
/* Handle */
|
|
246
218
|
.drawer-handle {
|
|
247
|
-
display: flex;
|
|
248
|
-
justify-content: center;
|
|
249
219
|
padding-block: var(--drawer-handle-padding-block);
|
|
250
220
|
padding-inline: var(--drawer-handle-padding-inline);
|
|
251
221
|
cursor: grab;
|
|
222
|
+
justify-content: center;
|
|
223
|
+
display: flex;
|
|
252
224
|
}
|
|
253
225
|
|
|
254
|
-
.drawer-handle
|
|
255
|
-
content:
|
|
226
|
+
.drawer-handle:before {
|
|
227
|
+
content: "";
|
|
256
228
|
width: var(--drawer-handle-width);
|
|
257
229
|
height: var(--drawer-handle-height);
|
|
258
230
|
background: var(--drawer-handle-bg);
|
|
231
|
+
transition: width .2s var(--drawer-ease), height .2s var(--drawer-ease), background .2s ease;
|
|
259
232
|
border-radius: 100px;
|
|
260
|
-
transition: width 0.2s var(--drawer-ease), height 0.2s var(--drawer-ease), background 0.2s ease;
|
|
261
233
|
}
|
|
262
234
|
|
|
263
|
-
.drawer-handle:hover
|
|
235
|
+
.drawer-handle:hover:before {
|
|
264
236
|
width: var(--drawer-handle-width-hover);
|
|
265
237
|
background: var(--drawer-handle-bg-hover);
|
|
266
238
|
}
|
|
267
239
|
|
|
268
|
-
|
|
269
|
-
.drawer[data-direction="left"] .drawer-handle,
|
|
270
|
-
.drawer[data-direction="right"] .drawer-handle {
|
|
271
|
-
flex-direction: column;
|
|
272
|
-
align-items: center;
|
|
273
|
-
justify-content: center;
|
|
240
|
+
.drawer[data-direction="left"] .drawer-handle, .drawer[data-direction="right"] .drawer-handle {
|
|
274
241
|
padding-block: var(--drawer-handle-padding-inline);
|
|
275
242
|
padding-inline: var(--drawer-handle-padding-block);
|
|
243
|
+
writing-mode: vertical-lr;
|
|
244
|
+
flex-direction: column;
|
|
245
|
+
justify-content: center;
|
|
246
|
+
align-items: center;
|
|
276
247
|
height: 100%;
|
|
277
248
|
position: absolute;
|
|
278
249
|
top: 0;
|
|
279
|
-
writing-mode: vertical-lr;
|
|
280
250
|
}
|
|
281
251
|
|
|
282
|
-
.drawer[data-direction="left"] .drawer-handle {
|
|
283
|
-
|
|
252
|
+
.drawer[data-direction="left"] .drawer-handle {
|
|
253
|
+
right: 0;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.drawer[data-direction="right"] .drawer-handle {
|
|
257
|
+
left: 0;
|
|
258
|
+
}
|
|
284
259
|
|
|
285
|
-
.drawer[data-direction="left"] .drawer-handle
|
|
286
|
-
.drawer[data-direction="right"] .drawer-handle::before {
|
|
260
|
+
.drawer[data-direction="left"] .drawer-handle:before, .drawer[data-direction="right"] .drawer-handle:before {
|
|
287
261
|
width: var(--drawer-handle-height);
|
|
288
262
|
height: var(--drawer-handle-width);
|
|
289
263
|
}
|
|
290
264
|
|
|
291
|
-
.drawer[data-direction="left"] .drawer-handle:hover
|
|
292
|
-
.drawer[data-direction="right"] .drawer-handle:hover::before {
|
|
265
|
+
.drawer[data-direction="left"] .drawer-handle:hover:before, .drawer[data-direction="right"] .drawer-handle:hover:before {
|
|
293
266
|
width: var(--drawer-handle-height);
|
|
294
267
|
height: var(--drawer-handle-width-hover);
|
|
295
268
|
}
|
|
296
269
|
|
|
297
|
-
/* Content - structural only, no opinionated padding */
|
|
298
270
|
.drawer-content {
|
|
299
|
-
overflow-x: hidden;
|
|
300
|
-
overflow-y: auto;
|
|
301
271
|
overscroll-behavior: contain;
|
|
302
272
|
flex: 1;
|
|
303
273
|
min-height: 0;
|
|
274
|
+
overflow: hidden auto;
|
|
304
275
|
}
|
|
305
276
|
|
|
306
|
-
|
|
307
|
-
.drawer[data-direction="left"] .drawer-content,
|
|
308
|
-
.drawer[data-direction="right"] .drawer-content {
|
|
277
|
+
.drawer[data-direction="left"] .drawer-content, .drawer[data-direction="right"] .drawer-content {
|
|
309
278
|
height: 100%;
|
|
310
279
|
}
|
|
311
280
|
|
|
312
|
-
/* Reduced motion */
|
|
313
281
|
@media (prefers-reduced-motion: reduce) {
|
|
314
|
-
*,
|
|
315
|
-
transition-duration:
|
|
282
|
+
*, :before, :after {
|
|
283
|
+
transition-duration: .01ms !important;
|
|
316
284
|
}
|
|
317
285
|
|
|
318
286
|
body:has(.drawer[open]) {
|
|
319
287
|
scale: 1;
|
|
320
288
|
}
|
|
321
289
|
|
|
322
|
-
.drawer[open]:has(~ .drawer[open]),
|
|
323
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open]),
|
|
324
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open] ~ .drawer[open]),
|
|
325
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]),
|
|
326
|
-
.drawer[open]:has(~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
327
|
-
scale: 1;
|
|
328
|
-
translate: 0 0;
|
|
290
|
+
.drawer[open]:has( ~ .drawer[open]), .drawer[open]:has( ~ .drawer[open] ~ .drawer[open]), .drawer[open]:has( ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]), .drawer[open]:has( ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]), .drawer[open]:has( ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open] ~ .drawer[open]) {
|
|
329
291
|
filter: none;
|
|
292
|
+
translate: 0;
|
|
293
|
+
scale: 1;
|
|
330
294
|
}
|
|
331
295
|
}
|
|
332
|
-
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "css-drawer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Vaul-quality drawer component using native <dialog> and pure CSS animations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -47,12 +47,14 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@
|
|
51
|
-
"@types/react": "^19.2.
|
|
50
|
+
"@tsdown/css": "^0.21.10",
|
|
51
|
+
"@types/react": "^19.2.14",
|
|
52
52
|
"@types/react-dom": "^19.2.3",
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
53
|
+
"happy-dom": "^20.9.0",
|
|
54
|
+
"react": "^19.2.5",
|
|
55
|
+
"tsdown": "^0.21.10",
|
|
56
|
+
"typescript": "^6.0.3",
|
|
57
|
+
"vitest": "^4.1.7"
|
|
56
58
|
},
|
|
57
59
|
"keywords": [
|
|
58
60
|
"drawer",
|
|
@@ -86,6 +88,8 @@
|
|
|
86
88
|
],
|
|
87
89
|
"scripts": {
|
|
88
90
|
"build": "tsdown",
|
|
89
|
-
"dev": "tsdown --watch"
|
|
91
|
+
"dev": "tsdown --watch",
|
|
92
|
+
"test": "vitest run",
|
|
93
|
+
"test:watch": "vitest"
|
|
90
94
|
}
|
|
91
95
|
}
|
package/src/drawer.css
CHANGED
|
@@ -60,11 +60,16 @@ body {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
body:has(.drawer[open]) {
|
|
63
|
-
overflow: hidden;
|
|
64
63
|
scale: var(--drawer-nested-scale);
|
|
65
64
|
border-radius: var(--drawer-radius);
|
|
66
65
|
}
|
|
67
66
|
|
|
67
|
+
/* Defense-in-depth for browsers without JS scroll lock; respects opt-out.
|
|
68
|
+
The JS scroll lock in scroll-lock.ts is the load-bearing fix on iOS Safari. */
|
|
69
|
+
body:has(.drawer[open]:not([data-scroll-lock="false"])) {
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
}
|
|
72
|
+
|
|
68
73
|
/* Base drawer */
|
|
69
74
|
.drawer {
|
|
70
75
|
border: none;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=`drawer:statechange`;let t=!1;function n(){if(typeof window>`u`||t)return;t=!0;let n=()=>{let e=Array.from(document.querySelectorAll(`dialog.drawer[open]`));e.forEach((t,n)=>{n===e.length-1?t.removeAttribute(`inert`):t.setAttribute(`inert`,``)})};new MutationObserver(t=>{for(let r of t)if(r.type===`attributes`&&r.attributeName===`open`&&r.target.classList.contains(`drawer`)){n(),window.dispatchEvent(new CustomEvent(e,{detail:{target:r.target}}));break}}).observe(document.body,{subtree:!0,attributes:!0,attributeFilter:[`open`]})}n(),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`drawer:statechange`;let t=!1;function n(){if(typeof window>`u`||t)return;t=!0;let n=()=>{let e=Array.from(document.querySelectorAll(`dialog.drawer[open]`));e.forEach((t,n)=>{n===e.length-1?t.removeAttribute(`inert`):t.setAttribute(`inert`,``)})};new MutationObserver(t=>{for(let r of t)if(r.type===`attributes`&&r.attributeName===`open`&&r.target.classList.contains(`drawer`)){n(),window.dispatchEvent(new CustomEvent(e,{detail:{target:r.target}}));break}}).observe(document.body,{subtree:!0,attributes:!0,attributeFilter:[`open`]})}n();export{e as t};
|
|
2
|
-
//# sourceMappingURL=observer-DIOx0VCj.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"observer-DIOx0VCj.mjs","names":[],"sources":["../src/observer.ts"],"sourcesContent":["/**\n * Shared drawer state observer\n * Single MutationObserver that dispatches events for all drawer state changes\n */\n\nexport const DRAWER_STATE_CHANGE = 'drawer:statechange'\n\nlet initialized = false\n\nexport function initDrawerObserver(): void {\n if (typeof window === 'undefined' || initialized) return\n initialized = true\n\n const updateInertState = () => {\n const openDrawers = Array.from(\n document.querySelectorAll<HTMLDialogElement>('dialog.drawer[open]')\n )\n openDrawers.forEach((drawer, index) => {\n if (index === openDrawers.length - 1) {\n drawer.removeAttribute('inert')\n } else {\n drawer.setAttribute('inert', '')\n }\n })\n }\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'open' &&\n (mutation.target as HTMLElement).classList.contains('drawer')\n ) {\n updateInertState()\n window.dispatchEvent(new CustomEvent(DRAWER_STATE_CHANGE, {\n detail: { target: mutation.target }\n }))\n break\n }\n }\n })\n\n observer.observe(document.body, {\n subtree: true,\n attributes: true,\n attributeFilter: ['open'],\n })\n}\n\n// Auto-initialize on import\ninitDrawerObserver()\n"],"mappings":"AAKA,MAAa,EAAsB,qBAEnC,IAAI,EAAc,GAElB,SAAgB,GAA2B,CACzC,GAAI,OAAO,OAAW,KAAe,EAAa,OAClD,EAAc,GAEd,IAAM,MAAyB,CAC7B,IAAM,EAAc,MAAM,KACxB,SAAS,iBAAoC,sBAAsB,CACpE,CACD,EAAY,SAAS,EAAQ,IAAU,CACjC,IAAU,EAAY,OAAS,EACjC,EAAO,gBAAgB,QAAQ,CAE/B,EAAO,aAAa,QAAS,GAAG,EAElC,EAGa,IAAI,iBAAkB,GAAc,CACnD,IAAK,IAAM,KAAY,EACrB,GACE,EAAS,OAAS,cAClB,EAAS,gBAAkB,QAC1B,EAAS,OAAuB,UAAU,SAAS,SAAS,CAC7D,CACA,GAAkB,CAClB,OAAO,cAAc,IAAI,YAAY,EAAqB,CACxD,OAAQ,CAAE,OAAQ,EAAS,OAAQ,CACpC,CAAC,CAAC,CACH,QAGJ,CAEO,QAAQ,SAAS,KAAM,CAC9B,QAAS,GACT,WAAY,GACZ,gBAAiB,CAAC,OAAO,CAC1B,CAAC,CAIJ,GAAoB"}
|