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.
@@ -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: hsl(0 0% 0% / 0.4);
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
- /* Handle */
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 0.5rem;
14
+ --drawer-handle-padding-block: 1rem .5rem;
22
15
  --drawer-handle-padding-inline: 0;
23
-
24
- /* Shadows */
25
- --drawer-shadow-bottom: 0 -10px 60px hsl(0 0% 0% / 0.12), 0 -4px 20px hsl(0 0% 0% / 0.08);
26
- --drawer-shadow-top: 0 10px 60px hsl(0 0% 0% / 0.12), 0 4px 20px hsl(0 0% 0% / 0.08);
27
- --drawer-shadow-right: -10px 0 60px hsl(0 0% 0% / 0.12), -4px 0 20px hsl(0 0% 0% / 0.08);
28
- --drawer-shadow-left: 10px 0 60px hsl(0 0% 0% / 0.12), 4px 0 20px hsl(0 0% 0% / 0.08);
29
- --drawer-shadow-modal: 0 25px 50px -12px hsl(0 0% 0% / 0.25);
30
-
31
- /* Animation */
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: 0.92;
40
- --drawer-nested-backdrop: hsl(0 0% 0% / 0.15);
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: hsl(0 0% 12%);
46
- --drawer-handle-bg: hsl(0 0% 35%);
47
- --drawer-handle-bg-hover: hsl(0 0% 50%);
48
- --drawer-shadow-bottom: 0 -10px 60px hsl(0 0% 0% / 0.4), 0 -4px 20px hsl(0 0% 0% / 0.3);
49
- --drawer-shadow-top: 0 10px 60px hsl(0 0% 0% / 0.4), 0 4px 20px hsl(0 0% 0% / 0.3);
50
- --drawer-shadow-right: -10px 0 60px hsl(0 0% 0% / 0.4), -4px 0 20px hsl(0 0% 0% / 0.3);
51
- --drawer-shadow-left: 10px 0 60px hsl(0 0% 0% / 0.4), 4px 0 20px hsl(0 0% 0% / 0.3);
52
- --drawer-shadow-modal: 0 25px 50px -12px hsl(0 0% 0% / 0.5);
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: center top;
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
- /* Base drawer */
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
- transition:
80
- display var(--drawer-duration-close) allow-discrete,
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
- inset: auto 0 0 0;
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
- translate: 0 0;
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 0.15s ease;
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 0.2s ease;
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] { opacity: 0; translate: var(--_translate-closed); }
131
- .drawer[open]::backdrop { opacity: 0; }
132
- }
112
+ .drawer[open] {
113
+ opacity: 0;
114
+ translate: var(--_translate-closed);
115
+ }
133
116
 
134
- /* ===== DIRECTIONS ===== */
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
- /* ===== AUTO-NESTING (up to 5 levels) ===== */
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
- /* 2+ open drawers after */
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
- /* 3+ open drawers after */
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
- /* 4+ open drawers after */
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
- /* 5+ open drawers after */
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::before {
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::before {
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
- /* Vertical handle for left/right drawers */
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 { right: 0; }
283
- .drawer[data-direction="right"] .drawer-handle { left: 0; }
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::before,
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::before,
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
- /* Content sizing for directions */
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
- *, *::before, *::after {
315
- transition-duration: 0.01ms !important;
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.1",
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
- "@bosh-code/tsdown-plugin-inject-css": "^2.0.0",
51
- "@types/react": "^19.2.9",
50
+ "@tsdown/css": "^0.21.10",
51
+ "@types/react": "^19.2.14",
52
52
  "@types/react-dom": "^19.2.3",
53
- "react": "^19.2.3",
54
- "tsdown": "^0.18.4",
55
- "typescript": "^5.9.3"
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"}