@brytdesigns/web-component-drawer 1.0.6 → 1.0.8

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.
@@ -0,0 +1,476 @@
1
+ import { customShadowlessElement, correctElementType, toHyphenated, getContextFromProvider } from '@brytdesigns/web-component-utils';
2
+ import { splitProps, createEffect, on, batch, untrack, mergeProps, createMemo, onCleanup } from 'solid-js';
3
+ import { animate } from 'motion';
4
+ import { createContext, provide, consume } from 'component-register';
5
+ import { createStore } from 'solid-js/store';
6
+ import { observeElementInViewport } from 'observe-element-in-viewport';
7
+ import { disableBodyScroll, enableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock-upgrade';
8
+ import { createFocusTrap } from 'focus-trap';
9
+
10
+ // src/index.ts
11
+ function initializeDrawerContext(props) {
12
+ const [element, stateProps] = splitProps(props, ["root"]);
13
+ const [store, setStore] = createStore({ animationQueue: [] });
14
+ createEffect(
15
+ on(
16
+ () => store.animationQueue,
17
+ (animationQueue) => {
18
+ if (!animationQueue.length) return;
19
+ const animations = Promise.all(store.animationQueue);
20
+ setElementState("isAnimating", true);
21
+ animations.then(() => {
22
+ batch(() => {
23
+ setElementState("isAnimating", false);
24
+ setStore("animationQueue", []);
25
+ });
26
+ });
27
+ }
28
+ )
29
+ );
30
+ function setElementState(key, value) {
31
+ const currentValue = untrack(() => props[key]);
32
+ if (typeof value === "function") {
33
+ const currentValue2 = untrack(() => props[key]);
34
+ const result = value(currentValue2 || false);
35
+ if (`${currentValue2}` === `${value}`) return;
36
+ element.root.setAttribute(toHyphenated(key), `${result}`);
37
+ return;
38
+ }
39
+ if (`${currentValue}` === `${value}`) return;
40
+ return element.root.setAttribute(toHyphenated(key), `${value}`);
41
+ }
42
+ return [
43
+ mergeProps(store, stateProps),
44
+ { setElementState, setStore }
45
+ ];
46
+ }
47
+ var DrawerContextState = createContext(initializeDrawerContext);
48
+ var provideDrawerContext = (initialState, element) => {
49
+ const props = mergeProps(initialState, { root: element });
50
+ return provide(DrawerContextState, props, element);
51
+ };
52
+ var useDrawerContext = (context) => {
53
+ const [state, { setElementState, setStore: setState }] = context;
54
+ function updateAnimationQueue(animation) {
55
+ setState("animationQueue", (state2) => [...state2, animation]);
56
+ }
57
+ function close() {
58
+ setElementState("isOpen", false);
59
+ }
60
+ function open() {
61
+ setElementState("isOpen", true);
62
+ }
63
+ function toggle() {
64
+ setElementState("isOpen", (open2) => !open2);
65
+ }
66
+ return [state, { updateAnimationQueue, close, open, toggle }];
67
+ };
68
+ var useDrawer = (element) => {
69
+ const context = consume(DrawerContextState, element);
70
+ if (!context) {
71
+ throw console.error(
72
+ "DrawerContext not found! Please ensure to wrap your custom element with drawer-context element."
73
+ );
74
+ }
75
+ return useDrawerContext(context);
76
+ };
77
+ var getDrawerContext = (element) => {
78
+ const context = getContextFromProvider(
79
+ DrawerContextState,
80
+ element
81
+ );
82
+ return useDrawerContext(context);
83
+ };
84
+
85
+ // src/consts.ts
86
+ var POSITION = {
87
+ TOP: "top",
88
+ BOTTOM: "bottom",
89
+ LEFT: "left"};
90
+
91
+ // src/utils.ts
92
+ function hideElement(element) {
93
+ element.style.display = "none";
94
+ }
95
+ function showElement(element) {
96
+ element.style.display = "block";
97
+ }
98
+ async function controlPromise(controls) {
99
+ return new Promise((resolve) => {
100
+ controls.then(() => resolve(null));
101
+ });
102
+ }
103
+ function convertPositionToTranslate(position) {
104
+ if (position === POSITION.TOP || position === POSITION.BOTTOM)
105
+ return [
106
+ "translateY(var(--drawer--slide-from))",
107
+ "translateY(var(--drawer--slide-to))"
108
+ ];
109
+ return [
110
+ "translateX(var(--drawer--slide-from))",
111
+ "translateX(var(--drawer--slide-to))"
112
+ ];
113
+ }
114
+ function getTransitionConfig(style) {
115
+ const properties = {
116
+ autoplay: style.getPropertyValue("--motion--autoplay"),
117
+ bounce: style.getPropertyValue("--motion--bounce"),
118
+ bounceDamping: style.getPropertyValue("--motion--bounce-damping"),
119
+ bounceStiffness: style.getPropertyValue("--motion--bounce-stiffness"),
120
+ duration: style.getPropertyValue("--motion--duration"),
121
+ damping: style.getPropertyValue("--motion--damping"),
122
+ delay: style.getPropertyValue("--motion--delay"),
123
+ ease: style.getPropertyValue("--motion--ease"),
124
+ elapsed: style.getPropertyValue("--motion--elapsed"),
125
+ mass: style.getPropertyValue("--motion--mass"),
126
+ max: style.getPropertyValue("--motion--max"),
127
+ min: style.getPropertyValue("--motion--min"),
128
+ power: style.getPropertyValue("--motion--power"),
129
+ repeat: style.getPropertyValue("--motion--repeat"),
130
+ repeatDelay: style.getPropertyValue("--motion--repeat-delay"),
131
+ repeatType: style.getPropertyValue("--motion--repeat-type"),
132
+ restDelta: style.getPropertyValue("--motion--rest-delta"),
133
+ restSpeed: style.getPropertyValue("--motion--rest-speed"),
134
+ startTime: style.getPropertyValue("--motion--start-time"),
135
+ timeConstant: style.getPropertyValue("--motion--time-constant"),
136
+ times: style.getPropertyValue("--motion--times"),
137
+ type: style.getPropertyValue("--motion--type"),
138
+ velocity: style.getPropertyValue("--motion--velocity"),
139
+ visualDuration: style.getPropertyValue("--motion--visual-duration")
140
+ };
141
+ return {
142
+ autoplay: properties.autoplay === "true",
143
+ bounce: properties.bounce ? parseFloat(properties.bounce) : void 0,
144
+ bounceDamping: properties.bounceDamping ? parseFloat(properties.bounceDamping) : void 0,
145
+ bounceStiffness: properties.bounceStiffness ? parseFloat(properties.bounceStiffness) : void 0,
146
+ duration: properties.duration ? parseFloat(properties.duration) : void 0,
147
+ damping: properties.damping ? parseFloat(properties.damping) : void 0,
148
+ delay: properties.delay ? parseFloat(properties.delay) : void 0,
149
+ ease: properties.ease,
150
+ elapsed: properties.elapsed ? parseFloat(properties.elapsed) : void 0,
151
+ mass: properties.mass ? parseFloat(properties.mass) : void 0,
152
+ max: properties.max ? parseFloat(properties.max) : void 0,
153
+ min: properties.min ? parseFloat(properties.min) : void 0,
154
+ power: properties.power ? parseFloat(properties.power) : void 0,
155
+ repeat: properties.repeat ? parseInt(properties.repeat) : void 0,
156
+ repeatDelay: properties.repeatDelay ? parseFloat(properties.repeatDelay) : void 0,
157
+ repeatType: properties.repeatType,
158
+ restDelta: properties.restDelta ? parseFloat(properties.restDelta) : void 0,
159
+ restSpeed: properties.restSpeed ? parseFloat(properties.restSpeed) : void 0,
160
+ startTime: properties.startTime ? parseFloat(properties.startTime) : void 0,
161
+ timeConstant: properties.timeConstant ? parseFloat(properties.timeConstant) : void 0,
162
+ type: properties.type,
163
+ velocity: properties.velocity ? parseFloat(properties.velocity) : void 0,
164
+ visualDuration: properties.visualDuration ? parseFloat(properties.visualDuration) : void 0
165
+ };
166
+ }
167
+
168
+ // src/components/drawer-content.ts
169
+ var DrawerContent = (props, { element }) => {
170
+ const [state, { updateAnimationQueue }] = useDrawer(element);
171
+ createEffect(
172
+ on(
173
+ () => state.isOpen,
174
+ (isOpen) => {
175
+ if (!isOpen) return;
176
+ const animation = enter(element);
177
+ updateAnimationQueue(controlPromise(animation));
178
+ return onCleanup(animation.complete);
179
+ }
180
+ )
181
+ );
182
+ createEffect(
183
+ on(
184
+ () => state.isOpen,
185
+ (isOpen) => {
186
+ if (isOpen) return;
187
+ const animation = exit(element);
188
+ updateAnimationQueue(controlPromise(animation));
189
+ return onCleanup(animation.complete);
190
+ }
191
+ )
192
+ );
193
+ function enter(element2) {
194
+ const style = window.getComputedStyle(element2);
195
+ const transition = getTransitionConfig(style);
196
+ let position = style.getPropertyValue("--d-position");
197
+ if (!position) position = POSITION.LEFT;
198
+ const transform = convertPositionToTranslate(position);
199
+ return animate(
200
+ element2,
201
+ {
202
+ transform
203
+ },
204
+ transition
205
+ );
206
+ }
207
+ function exit(element2) {
208
+ const style = window.getComputedStyle(element2);
209
+ const transition = getTransitionConfig(style);
210
+ let position = style.getPropertyValue("--d-position");
211
+ if (!position) position = POSITION.LEFT;
212
+ const transform = convertPositionToTranslate(position);
213
+ return animate(
214
+ element2,
215
+ {
216
+ transform
217
+ },
218
+ transition
219
+ );
220
+ }
221
+ };
222
+ var DrawerTrigger = (props, { element }) => {
223
+ if (!props.target)
224
+ return console.warn("DrawerTrigger: target prop is required!");
225
+ if (!props.action)
226
+ return console.warn("DrawerTrigger: action prop is required!");
227
+ if (props.action !== "close" && props.action !== "open" && props.action !== "toggle")
228
+ return console.warn(
229
+ "DrawerTrigger: action prop must be 'close', 'open', or 'toggle'"
230
+ );
231
+ if (!props.on) return console.warn("DrawerTrigger: on prop is required!");
232
+ const target = document.querySelector(props.target);
233
+ if (!target) return console.warn("DrawerTrigger: target element not found!");
234
+ const [state, { open, close, toggle }] = getDrawerContext(target);
235
+ function dispatchAction(action) {
236
+ switch (action) {
237
+ case "close":
238
+ close();
239
+ break;
240
+ case "open":
241
+ open();
242
+ break;
243
+ case "toggle":
244
+ toggle();
245
+ break;
246
+ }
247
+ }
248
+ createEffect(() => {
249
+ element.setAttribute("is-open", `${state.isOpen}`);
250
+ element.setAttribute("is-animating", `${state.isAnimating}`);
251
+ });
252
+ createEffect(
253
+ on(
254
+ () => ({
255
+ action: props.action,
256
+ on: props.on,
257
+ preventDefault: props.preventDefault
258
+ }),
259
+ ({ action, on: on6, preventDefault }) => {
260
+ if (!on6 || !action) return;
261
+ switch (on6) {
262
+ case "enter":
263
+ return handleOnEnter(action);
264
+ case "exit":
265
+ return handleOnExit(action);
266
+ default: {
267
+ let handleEvent2 = function(event) {
268
+ if (preventDefault) event.preventDefault();
269
+ dispatchAction(action);
270
+ };
271
+ element.addEventListener(on6, handleEvent2);
272
+ return onCleanup(
273
+ () => element.removeEventListener(on6, handleEvent2)
274
+ );
275
+ }
276
+ }
277
+ }
278
+ )
279
+ );
280
+ function handleOnEnter(action) {
281
+ let unsubscribe = null;
282
+ if (action === "toggle") {
283
+ unsubscribe = observeElementInViewport(element, open, close);
284
+ }
285
+ if (unsubscribe) onCleanup(unsubscribe);
286
+ return;
287
+ }
288
+ function handleOnExit(action) {
289
+ let unsubscribe = null;
290
+ if (action === "toggle") {
291
+ unsubscribe = observeElementInViewport(element, close, open);
292
+ }
293
+ if (unsubscribe) onCleanup(unsubscribe);
294
+ return;
295
+ }
296
+ };
297
+ var DrawerBackdrop = (_, { element }) => {
298
+ const [state, { updateAnimationQueue, close }] = useDrawer(element);
299
+ createEffect(
300
+ on(
301
+ () => state.isOpen,
302
+ (isOpen) => {
303
+ if (!isOpen) return;
304
+ const animation = enter(element);
305
+ updateAnimationQueue(controlPromise(animation));
306
+ return onCleanup(animation.complete);
307
+ }
308
+ )
309
+ );
310
+ createEffect(
311
+ on(
312
+ () => state.isOpen,
313
+ (isOpen) => {
314
+ if (isOpen) return;
315
+ const animation = exit(element);
316
+ updateAnimationQueue(controlPromise(animation));
317
+ return onCleanup(animation.complete);
318
+ }
319
+ )
320
+ );
321
+ function enter(element2) {
322
+ const style = window.getComputedStyle(element2);
323
+ const options = getTransitionConfig(style);
324
+ return animate(
325
+ element2,
326
+ {
327
+ opacity: [`var(--opacity-from)`, `var(--opacity-to)`]
328
+ },
329
+ options
330
+ );
331
+ }
332
+ function exit(element2) {
333
+ const style = window.getComputedStyle(element2);
334
+ const options = getTransitionConfig(style);
335
+ return animate(
336
+ element2,
337
+ {
338
+ opacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`]
339
+ },
340
+ options
341
+ );
342
+ }
343
+ element.addEventListener("click", close);
344
+ onCleanup(() => {
345
+ element.removeEventListener("click", close);
346
+ });
347
+ };
348
+ var DrawerContext = (props, { element }) => {
349
+ const [contextProps, restProps] = splitProps(props, [
350
+ "isOpen",
351
+ "isAnimating"
352
+ ]);
353
+ const context = provideDrawerContext(contextProps, element);
354
+ const [state, { setElementState }] = context;
355
+ const [_, { updateAnimationQueue, ...events }] = useDrawerContext(context);
356
+ element.actions = events;
357
+ const focusTrap = createMemo(() => {
358
+ return createFocusTrap(element, {
359
+ allowOutsideClick: true,
360
+ escapeDeactivates: restProps.closeOnEscape,
361
+ onDeactivate: () => {
362
+ setElementState("isOpen", false);
363
+ }
364
+ });
365
+ });
366
+ createEffect(
367
+ on(
368
+ () => state.isOpen,
369
+ (isOpen) => {
370
+ const eventName = isOpen ? "drawer:open" : "drawer:close";
371
+ element.dispatchEvent(
372
+ new CustomEvent(eventName, {
373
+ bubbles: true,
374
+ detail: { isOpen, relatedTarget: element }
375
+ })
376
+ );
377
+ element.dispatchEvent(
378
+ new CustomEvent("drawer:toggle", {
379
+ bubbles: true,
380
+ detail: { isOpen, relatedTarget: element }
381
+ })
382
+ );
383
+ }
384
+ )
385
+ );
386
+ createEffect(
387
+ on(
388
+ () => ({
389
+ isOpen: state.isOpen,
390
+ focusTrap: focusTrap(),
391
+ shouldTrapFocus: restProps.shouldTrapFocus
392
+ }),
393
+ ({ isOpen, focusTrap: focusTrap2, shouldTrapFocus }) => {
394
+ if (!isOpen) return;
395
+ showElement(element);
396
+ if (!shouldTrapFocus) return;
397
+ focusTrap2.activate();
398
+ onCleanup(focusTrap2.deactivate);
399
+ }
400
+ )
401
+ );
402
+ createEffect(
403
+ on(
404
+ () => ({
405
+ isOpen: state.isOpen,
406
+ isAnimating: state.isAnimating,
407
+ shouldTrapFocus: restProps.shouldTrapFocus
408
+ }),
409
+ ({ isOpen, isAnimating, shouldTrapFocus }) => {
410
+ if (isOpen && !isAnimating && shouldTrapFocus)
411
+ return disableBodyScroll(element, {
412
+ allowTouchMove: (el) => {
413
+ if (el instanceof HTMLElement) {
414
+ let element2 = el;
415
+ while (element2 && element2 !== document.body) {
416
+ if (element2.tagName === "DRAWER-CONTENT") {
417
+ return true;
418
+ }
419
+ element2 = element2.parentElement;
420
+ }
421
+ }
422
+ return false;
423
+ }
424
+ });
425
+ onCleanup(() => {
426
+ if (!shouldTrapFocus) return;
427
+ enableBodyScroll(element);
428
+ });
429
+ }
430
+ )
431
+ );
432
+ createEffect(
433
+ on(
434
+ () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),
435
+ ({ isOpen, animationQueue }) => {
436
+ if (isOpen) return;
437
+ return Promise.all(animationQueue).then(() => hideElement(element));
438
+ }
439
+ )
440
+ );
441
+ onCleanup(() => {
442
+ clearAllBodyScrollLocks();
443
+ });
444
+ };
445
+
446
+ // src/index.ts
447
+ customShadowlessElement(
448
+ "drawer-context",
449
+ {
450
+ isOpen: false,
451
+ id: "",
452
+ closeOnEscape: false,
453
+ shouldTrapFocus: false,
454
+ isAnimating: false
455
+ },
456
+ correctElementType(DrawerContext)
457
+ );
458
+ customShadowlessElement(
459
+ "drawer-trigger",
460
+ { target: "", action: "", on: "click", preventDefault: true },
461
+ correctElementType(DrawerTrigger)
462
+ );
463
+ customShadowlessElement(
464
+ "drawer-backdrop",
465
+ {},
466
+ correctElementType(DrawerBackdrop)
467
+ );
468
+ customShadowlessElement(
469
+ "drawer-content",
470
+ {},
471
+ correctElementType(DrawerContent)
472
+ );
473
+
474
+ export { getDrawerContext, useDrawer };
475
+ //# sourceMappingURL=index.js.map
476
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useDrawer.ts","../../src/consts.ts","../../src/utils.ts","../../src/components/drawer-content.ts","../../src/components/drawer-trigger.ts","../../src/components/drawer-backdrop.ts","../../src/components/drawer-context.ts","../../src/index.ts"],"names":["currentValue","state","open","createEffect","on","element","handleEvent","onCleanup","animate","splitProps","focusTrap"],"mappings":";;;;;;;;;;AAkCA,SAAS,wBAAwB,KAA6B,EAAA;AAC5D,EAAM,MAAA,CAAC,SAAS,UAAU,CAAA,GAAI,WAAW,KAAO,EAAA,CAAC,MAAM,CAAC,CAAA;AACxD,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,YAA0B,EAAE,cAAA,EAAgB,EAAC,EAAG,CAAA;AAE1E,EAAA,YAAA;AAAA,IACE,EAAA;AAAA,MACE,MAAM,KAAM,CAAA,cAAA;AAAA,MACZ,CAAC,cAAmB,KAAA;AAClB,QAAI,IAAA,CAAC,eAAe,MAAQ,EAAA;AAC5B,QAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,CAAM,cAAc,CAAA;AACnD,QAAA,eAAA,CAAgB,eAAe,IAAI,CAAA;AACnC,QAAA,UAAA,CAAW,KAAK,MAAM;AACpB,UAAA,KAAA,CAAM,MAAM;AACV,YAAA,eAAA,CAAgB,eAAe,KAAK,CAAA;AACpC,YAAS,QAAA,CAAA,gBAAA,EAAkB,EAAE,CAAA;AAAA,WAC9B,CAAA;AAAA,SACF,CAAA;AAAA;AACH;AACF,GACF;AAEA,EAAS,SAAA,eAAA,CACP,KACA,KACA,EAAA;AACA,IAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7C,IAAI,IAAA,OAAO,UAAU,UAAY,EAAA;AAC/B,MAAA,MAAMA,aAAe,GAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7C,MAAM,MAAA,MAAA,GAAS,KAAMA,CAAAA,aAAAA,IAAgB,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAGA,EAAAA,aAAY,CAAO,CAAA,KAAA,CAAA,EAAG,KAAK,CAAI,CAAA,EAAA;AACtC,MAAA,OAAA,CAAQ,KAAK,YAAa,CAAA,YAAA,CAAa,GAAG,CAAG,EAAA,CAAA,EAAG,MAAM,CAAE,CAAA,CAAA;AACxD,MAAA;AAAA;AAEF,IAAA,IAAI,CAAG,EAAA,YAAY,CAAO,CAAA,KAAA,CAAA,EAAG,KAAK,CAAI,CAAA,EAAA;AACtC,IAAO,OAAA,OAAA,CAAQ,KAAK,YAAa,CAAA,YAAA,CAAa,GAAG,CAAG,EAAA,CAAA,EAAG,KAAK,CAAE,CAAA,CAAA;AAAA;AAGhE,EAAO,OAAA;AAAA,IACL,UAAA,CAAW,OAAO,UAAU,CAAA;AAAA,IAC5B,EAAE,iBAAiB,QAAS;AAAA,GAC9B;AACF;AAEA,IAAM,kBAAA,GAAqB,cAAc,uBAAuB,CAAA;AAEzD,IAAM,oBAAA,GAAuB,CAClC,YAAA,EACA,OACkB,KAAA;AAClB,EAAA,MAAM,QAAQ,UAAW,CAAA,YAAA,EAAc,EAAE,IAAA,EAAM,SAAS,CAAA;AACxD,EAAO,OAAA,OAAA,CAAQ,kBAAoB,EAAA,KAAA,EAAO,OAAO,CAAA;AACnD,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,OAA2B,KAAA;AAC1D,EAAA,MAAM,CAAC,KAAO,EAAA,EAAE,iBAAiB,QAAU,EAAA,QAAA,EAAU,CAAI,GAAA,OAAA;AAEzD,EAAA,SAAS,qBAAqB,SAA6B,EAAA;AACzD,IAAA,QAAA,CAAS,kBAAkB,CAACC,MAAAA,KAAU,CAAC,GAAGA,MAAAA,EAAO,SAAS,CAAC,CAAA;AAAA;AAG7D,EAAA,SAAS,KAAQ,GAAA;AACf,IAAA,eAAA,CAAgB,UAAU,KAAK,CAAA;AAAA;AAGjC,EAAA,SAAS,IAAO,GAAA;AACd,IAAA,eAAA,CAAgB,UAAU,IAAI,CAAA;AAAA;AAGhC,EAAA,SAAS,MAAS,GAAA;AAChB,IAAA,eAAA,CAAgB,QAAU,EAAA,CAACC,KAAS,KAAA,CAACA,KAAI,CAAA;AAAA;AAG3C,EAAA,OAAO,CAAC,KAAO,EAAA,EAAE,sBAAsB,KAAO,EAAA,IAAA,EAAM,QAAQ,CAAA;AAC9D,CAAA;AAEa,IAAA,SAAA,GAAY,CAAC,OAA0C,KAAA;AAClE,EAAM,MAAA,OAAA,GAAyB,OAAQ,CAAA,kBAAA,EAAoB,OAAO,CAAA;AAElE,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,OAAQ,CAAA,KAAA;AAAA,MACZ;AAAA,KACF;AAAA;AAGF,EAAA,OAAO,iBAAiB,OAAO,CAAA;AACjC;AAEa,IAAA,gBAAA,GAAmB,CAAC,OAAqB,KAAA;AACpD,EAAA,MAAM,OAAU,GAAA,sBAAA;AAAA,IACd,kBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,iBAAiB,OAAO,CAAA;AACjC;;;AC5HO,IAAM,QAAW,GAAA;AAAA,EACtB,GAAK,EAAA,KAAA;AAAA,EACL,MAAQ,EAAA,QAAA;AAAA,EACR,IAAM,EAAA,MAER,CAAA;;;ACCO,SAAS,YAAmC,OAAY,EAAA;AAC7D,EAAA,OAAA,CAAQ,MAAM,OAAU,GAAA,MAAA;AAC1B;AAEO,SAAS,YAAmC,OAAY,EAAA;AAC7D,EAAA,OAAA,CAAQ,MAAM,OAAU,GAAA,OAAA;AAC1B;AAEA,eAAsB,eAAe,QAAqC,EAAA;AACxE,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,IAAA,QAAA,CAAS,IAAK,CAAA,MAAM,OAAQ,CAAA,IAAI,CAAC,CAAA;AAAA,GAClC,CAAA;AACH;AAEO,SAAS,2BAA2B,QAAoB,EAAA;AAC7D,EAAA,IAAI,QAAa,KAAA,QAAA,CAAS,GAAO,IAAA,QAAA,KAAa,QAAS,CAAA,MAAA;AACrD,IAAO,OAAA;AAAA,MACL,uCAAA;AAAA,MACA;AAAA,KACF;AAEF,EAAO,OAAA;AAAA,IACL,uCAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,oBAAoB,KAA4B,EAAA;AAC9D,EAAA,MAAM,UAAa,GAAA;AAAA,IACjB,QAAA,EAAU,KAAM,CAAA,gBAAA,CAAiB,oBAAoB,CAAA;AAAA,IACrD,MAAA,EAAQ,KAAM,CAAA,gBAAA,CAAiB,kBAAkB,CAAA;AAAA,IACjD,aAAA,EAAe,KAAM,CAAA,gBAAA,CAAiB,0BAA0B,CAAA;AAAA,IAChE,eAAA,EAAiB,KAAM,CAAA,gBAAA,CAAiB,4BAA4B,CAAA;AAAA,IACpE,QAAA,EAAU,KAAM,CAAA,gBAAA,CAAiB,oBAAoB,CAAA;AAAA,IACrD,OAAA,EAAS,KAAM,CAAA,gBAAA,CAAiB,mBAAmB,CAAA;AAAA,IACnD,KAAA,EAAO,KAAM,CAAA,gBAAA,CAAiB,iBAAiB,CAAA;AAAA,IAC/C,IAAA,EAAM,KAAM,CAAA,gBAAA,CAAiB,gBAAgB,CAAA;AAAA,IAC7C,OAAA,EAAS,KAAM,CAAA,gBAAA,CAAiB,mBAAmB,CAAA;AAAA,IACnD,IAAA,EAAM,KAAM,CAAA,gBAAA,CAAiB,gBAAgB,CAAA;AAAA,IAC7C,GAAA,EAAK,KAAM,CAAA,gBAAA,CAAiB,eAAe,CAAA;AAAA,IAC3C,GAAA,EAAK,KAAM,CAAA,gBAAA,CAAiB,eAAe,CAAA;AAAA,IAC3C,KAAA,EAAO,KAAM,CAAA,gBAAA,CAAiB,iBAAiB,CAAA;AAAA,IAC/C,MAAA,EAAQ,KAAM,CAAA,gBAAA,CAAiB,kBAAkB,CAAA;AAAA,IACjD,WAAA,EAAa,KAAM,CAAA,gBAAA,CAAiB,wBAAwB,CAAA;AAAA,IAC5D,UAAA,EAAY,KAAM,CAAA,gBAAA,CAAiB,uBAAuB,CAAA;AAAA,IAC1D,SAAA,EAAW,KAAM,CAAA,gBAAA,CAAiB,sBAAsB,CAAA;AAAA,IACxD,SAAA,EAAW,KAAM,CAAA,gBAAA,CAAiB,sBAAsB,CAAA;AAAA,IACxD,SAAA,EAAW,KAAM,CAAA,gBAAA,CAAiB,sBAAsB,CAAA;AAAA,IACxD,YAAA,EAAc,KAAM,CAAA,gBAAA,CAAiB,yBAAyB,CAAA;AAAA,IAC9D,KAAA,EAAO,KAAM,CAAA,gBAAA,CAAiB,iBAAiB,CAAA;AAAA,IAC/C,IAAA,EAAM,KAAM,CAAA,gBAAA,CAAiB,gBAAgB,CAAA;AAAA,IAC7C,QAAA,EAAU,KAAM,CAAA,gBAAA,CAAiB,oBAAoB,CAAA;AAAA,IACrD,cAAA,EAAgB,KAAM,CAAA,gBAAA,CAAiB,2BAA2B;AAAA,GACpE;AACA,EAAO,OAAA;AAAA,IACL,QAAA,EAAU,WAAW,QAAa,KAAA,MAAA;AAAA,IAClC,QAAQ,UAAW,CAAA,MAAA,GAAS,UAAW,CAAA,UAAA,CAAW,MAAM,CAAI,GAAA,MAAA;AAAA,IAC5D,eAAe,UAAW,CAAA,aAAA,GACtB,UAAW,CAAA,UAAA,CAAW,aAAa,CACnC,GAAA,MAAA;AAAA,IACJ,iBAAiB,UAAW,CAAA,eAAA,GACxB,UAAW,CAAA,UAAA,CAAW,eAAe,CACrC,GAAA,MAAA;AAAA,IACJ,UAAU,UAAW,CAAA,QAAA,GAAW,UAAW,CAAA,UAAA,CAAW,QAAQ,CAAI,GAAA,MAAA;AAAA,IAClE,SAAS,UAAW,CAAA,OAAA,GAAU,UAAW,CAAA,UAAA,CAAW,OAAO,CAAI,GAAA,MAAA;AAAA,IAC/D,OAAO,UAAW,CAAA,KAAA,GAAQ,UAAW,CAAA,UAAA,CAAW,KAAK,CAAI,GAAA,MAAA;AAAA,IACzD,MAAM,UAAW,CAAA,IAAA;AAAA,IACjB,SAAS,UAAW,CAAA,OAAA,GAAU,UAAW,CAAA,UAAA,CAAW,OAAO,CAAI,GAAA,MAAA;AAAA,IAC/D,MAAM,UAAW,CAAA,IAAA,GAAO,UAAW,CAAA,UAAA,CAAW,IAAI,CAAI,GAAA,MAAA;AAAA,IACtD,KAAK,UAAW,CAAA,GAAA,GAAM,UAAW,CAAA,UAAA,CAAW,GAAG,CAAI,GAAA,MAAA;AAAA,IACnD,KAAK,UAAW,CAAA,GAAA,GAAM,UAAW,CAAA,UAAA,CAAW,GAAG,CAAI,GAAA,MAAA;AAAA,IACnD,OAAO,UAAW,CAAA,KAAA,GAAQ,UAAW,CAAA,UAAA,CAAW,KAAK,CAAI,GAAA,MAAA;AAAA,IACzD,QAAQ,UAAW,CAAA,MAAA,GAAS,QAAS,CAAA,UAAA,CAAW,MAAM,CAAI,GAAA,MAAA;AAAA,IAC1D,aAAa,UAAW,CAAA,WAAA,GACpB,UAAW,CAAA,UAAA,CAAW,WAAW,CACjC,GAAA,MAAA;AAAA,IACJ,YAAY,UAAW,CAAA,UAAA;AAAA,IACvB,WAAW,UAAW,CAAA,SAAA,GAClB,UAAW,CAAA,UAAA,CAAW,SAAS,CAC/B,GAAA,MAAA;AAAA,IACJ,WAAW,UAAW,CAAA,SAAA,GAClB,UAAW,CAAA,UAAA,CAAW,SAAS,CAC/B,GAAA,MAAA;AAAA,IACJ,WAAW,UAAW,CAAA,SAAA,GAClB,UAAW,CAAA,UAAA,CAAW,SAAS,CAC/B,GAAA,MAAA;AAAA,IACJ,cAAc,UAAW,CAAA,YAAA,GACrB,UAAW,CAAA,UAAA,CAAW,YAAY,CAClC,GAAA,MAAA;AAAA,IACJ,MAAM,UAAW,CAAA,IAAA;AAAA,IACjB,UAAU,UAAW,CAAA,QAAA,GAAW,UAAW,CAAA,UAAA,CAAW,QAAQ,CAAI,GAAA,MAAA;AAAA,IAClE,gBAAgB,UAAW,CAAA,cAAA,GACvB,UAAW,CAAA,UAAA,CAAW,cAAc,CACpC,GAAA;AAAA,GACN;AACF;;;ACzFO,IAAM,aAA0D,GAAA,CACrE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,MAAM,CAAC,KAAO,EAAA,EAAE,sBAAsB,CAAA,GAAI,UAAU,OAAO,CAAA;AAE3D,EAAAC,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAA,IAAI,CAAC,MAAQ,EAAA;AACb,QAAM,MAAA,SAAA,GAAY,MAAM,OAAO,CAAA;AAC/B,QAAqB,oBAAA,CAAA,cAAA,CAAe,SAAS,CAAC,CAAA;AAC9C,QAAO,OAAA,SAAA,CAAU,UAAU,QAAQ,CAAA;AAAA;AACrC;AACF,GACF;AAEA,EAAAD,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAA,IAAI,MAAQ,EAAA;AACZ,QAAM,MAAA,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,QAAqB,oBAAA,CAAA,cAAA,CAAe,SAAS,CAAC,CAAA;AAC9C,QAAO,OAAA,SAAA,CAAU,UAAU,QAAQ,CAAA;AAAA;AACrC;AACF,GACF;AAEA,EAAA,SAAS,MAAMC,QAAsB,EAAA;AACnC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,gBAAA,CAAiBA,QAAO,CAAA;AAC7C,IAAM,MAAA,UAAA,GAAa,oBAAoB,KAAK,CAAA;AAC5C,IAAI,IAAA,QAAA,GAAW,KAAM,CAAA,gBAAA,CAAiB,cAAc,CAAA;AACpD,IAAI,IAAA,CAAC,QAAU,EAAA,QAAA,GAAW,QAAS,CAAA,IAAA;AACnC,IAAM,MAAA,SAAA,GAAY,2BAA2B,QAAQ,CAAA;AAErD,IAAO,OAAA,OAAA;AAAA,MACLA,QAAAA;AAAA,MACA;AAAA,QACE;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA;AAGF,EAAA,SAAS,KAAKA,QAAsB,EAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,gBAAA,CAAiBA,QAAO,CAAA;AAC7C,IAAM,MAAA,UAAA,GAAa,oBAAoB,KAAK,CAAA;AAC5C,IAAI,IAAA,QAAA,GAAW,KAAM,CAAA,gBAAA,CAAiB,cAAc,CAAA;AACpD,IAAI,IAAA,CAAC,QAAU,EAAA,QAAA,GAAW,QAAS,CAAA,IAAA;AACnC,IAAM,MAAA,SAAA,GAAY,2BAA2B,QAAQ,CAAA;AACrD,IAAO,OAAA,OAAA;AAAA,MACLA,QAAAA;AAAA,MACA;AAAA,QACE;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA;AAEJ,CAAA;AC5DO,IAAM,aAA0D,GAAA,CACrE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,IAAI,CAAC,KAAM,CAAA,MAAA;AACT,IAAO,OAAA,OAAA,CAAQ,KAAK,yCAAyC,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAM,CAAA,MAAA;AACT,IAAO,OAAA,OAAA,CAAQ,KAAK,yCAAyC,CAAA;AAC/D,EAAA,IACE,MAAM,MAAW,KAAA,OAAA,IACjB,MAAM,MAAW,KAAA,MAAA,IACjB,MAAM,MAAW,KAAA,QAAA;AAEjB,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb;AAAA,KACF;AACF,EAAA,IAAI,CAAC,KAAM,CAAA,EAAA,EAAW,OAAA,OAAA,CAAQ,KAAK,qCAAqC,CAAA;AAExE,EAAA,MAAM,MAAS,GAAA,QAAA,CAAS,aAAc,CAAA,KAAA,CAAM,MAAO,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAe,OAAA,OAAA,CAAQ,KAAK,0CAA0C,CAAA;AAE3E,EAAM,MAAA,CAAC,OAAO,EAAE,IAAA,EAAM,OAAO,MAAO,EAAC,CAAI,GAAA,gBAAA,CAAiB,MAAM,CAAA;AAEhE,EAAA,SAAS,eAAe,MAAgB,EAAA;AACtC,IAAA,QAAQ,MAAQ;AAAA,MACd,KAAK,OAAA;AACH,QAAM,KAAA,EAAA;AACN,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAK,IAAA,EAAA;AACL,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAO,MAAA,EAAA;AACP,QAAA;AAAA;AACJ;AAGF,EAAAF,aAAa,MAAM;AACjB,IAAA,OAAA,CAAQ,YAAa,CAAA,SAAA,EAAW,CAAG,EAAA,KAAA,CAAM,MAAM,CAAE,CAAA,CAAA;AACjD,IAAA,OAAA,CAAQ,YAAa,CAAA,cAAA,EAAgB,CAAG,EAAA,KAAA,CAAM,WAAW,CAAE,CAAA,CAAA;AAAA,GAC5D,CAAA;AAED,EAAAA,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,OAAO;AAAA,QACL,QAAQ,KAAM,CAAA,MAAA;AAAA,QACd,IAAI,KAAM,CAAA,EAAA;AAAA,QACV,gBAAgB,KAAM,CAAA;AAAA,OACxB,CAAA;AAAA,MACA,CAAC,EAAE,MAAA,EAAQ,EAAAA,EAAAA,GAAAA,EAAI,gBAAqB,KAAA;AAClC,QAAI,IAAA,CAACA,GAAM,IAAA,CAAC,MAAQ,EAAA;AAEpB,QAAA,QAAQA,GAAI;AAAA,UACV,KAAK,OAAA;AACH,YAAA,OAAO,cAAc,MAAM,CAAA;AAAA,UAC7B,KAAK,MAAA;AACH,YAAA,OAAO,aAAa,MAAM,CAAA;AAAA,UAC5B,SAAS;AACP,YAASE,IAAAA,YAAAA,GAAT,SAAqB,KAAc,EAAA;AACjC,cAAI,IAAA,cAAA,QAAsB,cAAe,EAAA;AACzC,cAAA,cAAA,CAAe,MAAM,CAAA;AAAA,aACvB;AAEA,YAAQ,OAAA,CAAA,gBAAA,CAAiBF,KAAIE,YAAW,CAAA;AAExC,YAAOC,OAAAA,SAAAA;AAAA,cAAU,MACf,OAAA,CAAQ,mBAAoBH,CAAAA,GAAAA,EAAIE,YAAW;AAAA,aAC7C;AAAA;AACF;AACF;AACF;AACF,GACF;AAGA,EAAA,SAAS,cAAc,MAAgB,EAAA;AACrC,IAAA,IAAI,WAAc,GAAA,IAAA;AAClB,IAAA,IAAI,WAAW,QAAU,EAAA;AACvB,MAAc,WAAA,GAAA,wBAAA,CAAyB,OAAS,EAAA,IAAA,EAAM,KAAK,CAAA;AAAA;AAG7D,IAAI,IAAA,WAAA,EAAaC,SAAAA,CAAU,WAAW,CAAA;AACtC,IAAA;AAAA;AAGF,EAAA,SAAS,aAAa,MAAgB,EAAA;AACpC,IAAA,IAAI,WAAc,GAAA,IAAA;AAClB,IAAA,IAAI,WAAW,QAAU,EAAA;AACvB,MAAc,WAAA,GAAA,wBAAA,CAAyB,OAAS,EAAA,KAAA,EAAO,IAAI,CAAA;AAAA;AAG7D,IAAI,IAAA,WAAA,EAAaA,SAAAA,CAAU,WAAW,CAAA;AACtC,IAAA;AAAA;AAEJ,CAAA;ACnGO,IAAM,cAA4D,GAAA,CACvE,CACA,EAAA,EAAE,SACC,KAAA;AACH,EAAM,MAAA,CAAC,OAAO,EAAE,oBAAA,EAAsB,OAAO,CAAA,GAAI,UAAU,OAAO,CAAA;AAElE,EAAAJ,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAA,IAAI,CAAC,MAAQ,EAAA;AACb,QAAM,MAAA,SAAA,GAAY,MAAM,OAAO,CAAA;AAC/B,QAAqB,oBAAA,CAAA,cAAA,CAAe,SAAS,CAAC,CAAA;AAC9C,QAAOG,OAAAA,SAAAA,CAAU,UAAU,QAAQ,CAAA;AAAA;AACrC;AACF,GACF;AAEA,EAAAJ,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAA,IAAI,MAAQ,EAAA;AACZ,QAAM,MAAA,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,QAAqB,oBAAA,CAAA,cAAA,CAAe,SAAS,CAAC,CAAA;AAC9C,QAAOG,OAAAA,SAAAA,CAAU,UAAU,QAAQ,CAAA;AAAA;AACrC;AACF,GACF;AAEA,EAAA,SAAS,MAAMF,QAAsB,EAAA;AACnC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,gBAAA,CAAiBA,QAAO,CAAA;AAC7C,IAAM,MAAA,OAAA,GAAU,oBAAoB,KAAK,CAAA;AACzC,IAAOG,OAAAA,OAAAA;AAAA,MACLH,QAAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,CAAC,CAAA,mBAAA,CAAA,EAAuB,CAAmB,iBAAA,CAAA;AAAA,OACtD;AAAA,MACA;AAAA,KACF;AAAA;AAGF,EAAA,SAAS,KAAKA,QAAsB,EAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,gBAAA,CAAiBA,QAAO,CAAA;AAC7C,IAAM,MAAA,OAAA,GAAU,oBAAoB,KAAK,CAAA;AACzC,IAAOG,OAAAA,OAAAA;AAAA,MACLH,QAAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,CAAC,CAAA,yBAAA,CAAA,EAA6B,CAA6B,2BAAA,CAAA;AAAA,OACtE;AAAA,MACA;AAAA,KACF;AAAA;AAGF,EAAQ,OAAA,CAAA,gBAAA,CAAiB,SAAS,KAAK,CAAA;AAEvC,EAAAE,UAAU,MAAM;AACd,IAAQ,OAAA,CAAA,mBAAA,CAAoB,SAAS,KAAK,CAAA;AAAA,GAC3C,CAAA;AACH,CAAA;AChDO,IAAM,aAA0D,GAAA,CACrE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,MAAM,CAAC,YAAA,EAAc,SAAS,CAAA,GAAIE,WAAW,KAAO,EAAA;AAAA,IAClD,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAM,MAAA,OAAA,GAAU,oBAAqB,CAAA,YAAA,EAAc,OAAO,CAAA;AAE1D,EAAA,MAAM,CAAC,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAI,GAAA,OAAA;AAErC,EAAM,MAAA,CAAC,GAAG,EAAE,oBAAA,EAAsB,GAAG,MAAO,EAAC,CAAI,GAAA,gBAAA,CAAiB,OAAO,CAAA;AAEzE,EAAA,OAAA,CAAQ,OAAU,GAAA,MAAA;AAElB,EAAM,MAAA,SAAA,GAAY,WAAW,MAAM;AACjC,IAAA,OAAO,gBAAgB,OAAS,EAAA;AAAA,MAC9B,iBAAmB,EAAA,IAAA;AAAA,MACnB,mBAAmB,SAAU,CAAA,aAAA;AAAA,MAC7B,cAAc,MAAM;AAClB,QAAA,eAAA,CAAgB,UAAU,KAAK,CAAA;AAAA;AACjC,KACD,CAAA;AAAA,GACF,CAAA;AAED,EAAAN,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAM,MAAA,SAAA,GAAY,SAAS,aAAgB,GAAA,cAAA;AAC3C,QAAQ,OAAA,CAAA,aAAA;AAAA,UACN,IAAI,YAAY,SAAW,EAAA;AAAA,YACzB,OAAS,EAAA,IAAA;AAAA,YACT,MAAQ,EAAA,EAAE,MAAQ,EAAA,aAAA,EAAe,OAAQ;AAAA,WAC1C;AAAA,SACH;AACA,QAAQ,OAAA,CAAA,aAAA;AAAA,UACN,IAAI,YAAY,eAAiB,EAAA;AAAA,YAC/B,OAAS,EAAA,IAAA;AAAA,YACT,MAAQ,EAAA,EAAE,MAAQ,EAAA,aAAA,EAAe,OAAQ;AAAA,WAC1C;AAAA,SACH;AAAA;AACF;AACF,GACF;AAEA,EAAAD,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,OAAO;AAAA,QACL,QAAQ,KAAM,CAAA,MAAA;AAAA,QACd,WAAW,SAAU,EAAA;AAAA,QACrB,iBAAiB,SAAU,CAAA;AAAA,OAC7B,CAAA;AAAA,MACA,CAAC,EAAE,MAAA,EAAQ,SAAAM,EAAAA,UAAAA,EAAW,iBAAsB,KAAA;AAC1C,QAAA,IAAI,CAAC,MAAQ,EAAA;AACb,QAAA,WAAA,CAAY,OAAO,CAAA;AACnB,QAAA,IAAI,CAAC,eAAiB,EAAA;AACtB,QAAAA,WAAU,QAAS,EAAA;AACnB,QAAAH,SAAAA,CAAUG,WAAU,UAAU,CAAA;AAAA;AAChC;AACF,GACF;AAEA,EAAAP,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,OAAO;AAAA,QACL,QAAQ,KAAM,CAAA,MAAA;AAAA,QACd,aAAa,KAAM,CAAA,WAAA;AAAA,QACnB,iBAAiB,SAAU,CAAA;AAAA,OAC7B,CAAA;AAAA,MACA,CAAC,EAAE,MAAQ,EAAA,WAAA,EAAa,iBAAsB,KAAA;AAC5C,QAAI,IAAA,MAAA,IAAU,CAAC,WAAe,IAAA,eAAA;AAC5B,UAAA,OAAO,kBAAkB,OAAS,EAAA;AAAA,YAChC,cAAA,EAAgB,CAAC,EAAoB,KAAA;AACnC,cAAA,IAAI,cAAc,WAAa,EAAA;AAC7B,gBAAA,IAAIC,QAAU,GAAA,EAAA;AACd,gBAAOA,OAAAA,QAAAA,IAAWA,QAAY,KAAA,QAAA,CAAS,IAAM,EAAA;AAC3C,kBAAIA,IAAAA,QAAAA,CAAQ,YAAY,gBAAkB,EAAA;AACxC,oBAAO,OAAA,IAAA;AAAA;AAGT,kBAAAA,WAAUA,QAAQ,CAAA,aAAA;AAAA;AACpB;AAEF,cAAO,OAAA,KAAA;AAAA;AACT,WACD,CAAA;AACH,QAAAE,UAAU,MAAM;AACd,UAAA,IAAI,CAAC,eAAiB,EAAA;AACtB,UAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,SACzB,CAAA;AAAA;AACH;AACF,GACF;AAEA,EAAAJ,YAAAA;AAAA,IACEC,EAAAA;AAAA,MACE,OAAO,EAAE,MAAA,EAAQ,MAAM,MAAQ,EAAA,cAAA,EAAgB,MAAM,cAAe,EAAA,CAAA;AAAA,MACpE,CAAC,EAAE,MAAQ,EAAA,cAAA,EAAqB,KAAA;AAC9B,QAAA,IAAI,MAAQ,EAAA;AACZ,QAAO,OAAA,OAAA,CAAQ,IAAI,cAAc,CAAA,CAAE,KAAK,MAAM,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA;AACpE;AACF,GACF;AAEA,EAAAG,UAAU,MAAM;AACd,IAAwB,uBAAA,EAAA;AAAA,GACzB,CAAA;AACH,CAAA;;;ACvHA,uBAAA;AAAA,EACE,gBAAA;AAAA,EACA;AAAA,IACE,MAAQ,EAAA,KAAA;AAAA,IACR,EAAI,EAAA,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,eAAiB,EAAA,KAAA;AAAA,IACjB,WAAa,EAAA;AAAA,GACf;AAAA,EACA,mBAAmB,aAAa;AAClC,CAAA;AAEA,uBAAA;AAAA,EACE,gBAAA;AAAA,EACA,EAAE,QAAQ,EAAI,EAAA,MAAA,EAAQ,IAAI,EAAI,EAAA,OAAA,EAAS,gBAAgB,IAAK,EAAA;AAAA,EAC5D,mBAAmB,aAAa;AAClC,CAAA;AAEA,uBAAA;AAAA,EACE,iBAAA;AAAA,EACA,EAAC;AAAA,EACD,mBAAmB,cAAc;AACnC,CAAA;AAEA,uBAAA;AAAA,EACE,gBAAA;AAAA,EACA,EAAC;AAAA,EACD,mBAAmB,aAAa;AAClC,CAAA","file":"index.js","sourcesContent":["import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n createEffect,\n mergeProps,\n on,\n batch,\n splitProps,\n untrack,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n toHyphenated,\n getContextFromProvider,\n} from \"@brytdesigns/web-component-utils\";\n\ntype StoreContext = {\n animationQueue: Promise<unknown>[];\n};\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n isOpen: boolean;\n isAnimating: boolean;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype DrawerContext = ReturnType<typeof initializeDrawerContext>;\n\nfunction initializeDrawerContext(props: CreateContextOptions) {\n const [element, stateProps] = splitProps(props, [\"root\"]);\n const [store, setStore] = createStore<StoreContext>({ animationQueue: [] });\n\n createEffect(\n on(\n () => store.animationQueue,\n (animationQueue) => {\n if (!animationQueue.length) return;\n const animations = Promise.all(store.animationQueue);\n setElementState(\"isAnimating\", true);\n animations.then(() => {\n batch(() => {\n setElementState(\"isAnimating\", false);\n setStore(\"animationQueue\", []);\n });\n });\n },\n ),\n );\n\n function setElementState(\n key: keyof Omit<CreateContextOptions, \"root\">,\n value: boolean | ((v: boolean) => boolean),\n ) {\n const currentValue = untrack(() => props[key]);\n if (typeof value === \"function\") {\n const currentValue = untrack(() => props[key]);\n const result = value(currentValue || false);\n if (`${currentValue}` === `${value}`) return;\n element.root.setAttribute(toHyphenated(key), `${result}`);\n return;\n }\n if (`${currentValue}` === `${value}`) return;\n return element.root.setAttribute(toHyphenated(key), `${value}`);\n }\n\n return [\n mergeProps(store, stateProps),\n { setElementState, setStore },\n ] as const;\n}\n\nconst DrawerContextState = createContext(initializeDrawerContext);\n\nexport const provideDrawerContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): DrawerContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(DrawerContextState, props, element);\n};\n\nexport const useDrawerContext = (context: DrawerContext) => {\n const [state, { setElementState, setStore: setState }] = context;\n\n function updateAnimationQueue(animation: Promise<unknown>) {\n setState(\"animationQueue\", (state) => [...state, animation]);\n }\n\n function close() {\n setElementState(\"isOpen\", false);\n }\n\n function open() {\n setElementState(\"isOpen\", true);\n }\n\n function toggle() {\n setElementState(\"isOpen\", (open) => !open);\n }\n\n return [state, { updateAnimationQueue, close, open, toggle }] as const;\n};\n\nexport const useDrawer = (element: HTMLElement & ICustomElement) => {\n const context: DrawerContext = consume(DrawerContextState, element);\n\n if (!context) {\n throw console.error(\n \"DrawerContext not found! Please ensure to wrap your custom element with drawer-context element.\",\n );\n }\n\n return useDrawerContext(context);\n};\n\nexport const getDrawerContext = (element: Element) => {\n const context = getContextFromProvider<DrawerContext>(\n DrawerContextState,\n element,\n );\n return useDrawerContext(context);\n};\n","export type Position = (typeof POSITION)[keyof typeof POSITION];\nexport type Action = (typeof ACTION)[keyof typeof ACTION];\n\nexport const POSITION = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n LEFT: \"left\",\n RIGHT: \"right\",\n} as const;\n\nexport const ACTION = {\n OPEN: \"open\",\n CLOSE: \"close\",\n TOGGLE: \"toggle\",\n};\n\nexport const EVENT_NAMESPACE = `bryt:drawer` as const;\n","import type {\n AnimationGeneratorType,\n AnimationPlaybackControls,\n Easing,\n RepeatType,\n Transition,\n} from \"motion\";\nimport { POSITION, type Position } from \"./consts\";\n\nexport function hideElement<T extends HTMLElement>(element: T) {\n element.style.display = \"none\";\n}\n\nexport function showElement<T extends HTMLElement>(element: T) {\n element.style.display = \"block\";\n}\n\nexport async function controlPromise(controls: AnimationPlaybackControls) {\n return new Promise((resolve) => {\n controls.then(() => resolve(null));\n });\n}\n\nexport function convertPositionToTranslate(position: Position) {\n if (position === POSITION.TOP || position === POSITION.BOTTOM)\n return [\n \"translateY(var(--drawer--slide-from))\",\n \"translateY(var(--drawer--slide-to))\",\n ];\n\n return [\n \"translateX(var(--drawer--slide-from))\",\n \"translateX(var(--drawer--slide-to))\",\n ];\n}\n\nexport function getTransitionConfig(style: CSSStyleDeclaration) {\n const properties = {\n autoplay: style.getPropertyValue(\"--motion--autoplay\"),\n bounce: style.getPropertyValue(\"--motion--bounce\"),\n bounceDamping: style.getPropertyValue(\"--motion--bounce-damping\"),\n bounceStiffness: style.getPropertyValue(\"--motion--bounce-stiffness\"),\n duration: style.getPropertyValue(\"--motion--duration\"),\n damping: style.getPropertyValue(\"--motion--damping\"),\n delay: style.getPropertyValue(\"--motion--delay\"),\n ease: style.getPropertyValue(\"--motion--ease\"),\n elapsed: style.getPropertyValue(\"--motion--elapsed\"),\n mass: style.getPropertyValue(\"--motion--mass\"),\n max: style.getPropertyValue(\"--motion--max\"),\n min: style.getPropertyValue(\"--motion--min\"),\n power: style.getPropertyValue(\"--motion--power\"),\n repeat: style.getPropertyValue(\"--motion--repeat\"),\n repeatDelay: style.getPropertyValue(\"--motion--repeat-delay\"),\n repeatType: style.getPropertyValue(\"--motion--repeat-type\"),\n restDelta: style.getPropertyValue(\"--motion--rest-delta\"),\n restSpeed: style.getPropertyValue(\"--motion--rest-speed\"),\n startTime: style.getPropertyValue(\"--motion--start-time\"),\n timeConstant: style.getPropertyValue(\"--motion--time-constant\"),\n times: style.getPropertyValue(\"--motion--times\"),\n type: style.getPropertyValue(\"--motion--type\"),\n velocity: style.getPropertyValue(\"--motion--velocity\"),\n visualDuration: style.getPropertyValue(\"--motion--visual-duration\"),\n };\n return {\n autoplay: properties.autoplay === \"true\",\n bounce: properties.bounce ? parseFloat(properties.bounce) : undefined,\n bounceDamping: properties.bounceDamping\n ? parseFloat(properties.bounceDamping)\n : undefined,\n bounceStiffness: properties.bounceStiffness\n ? parseFloat(properties.bounceStiffness)\n : undefined,\n duration: properties.duration ? parseFloat(properties.duration) : undefined,\n damping: properties.damping ? parseFloat(properties.damping) : undefined,\n delay: properties.delay ? parseFloat(properties.delay) : undefined,\n ease: properties.ease as Easing,\n elapsed: properties.elapsed ? parseFloat(properties.elapsed) : undefined,\n mass: properties.mass ? parseFloat(properties.mass) : undefined,\n max: properties.max ? parseFloat(properties.max) : undefined,\n min: properties.min ? parseFloat(properties.min) : undefined,\n power: properties.power ? parseFloat(properties.power) : undefined,\n repeat: properties.repeat ? parseInt(properties.repeat) : undefined,\n repeatDelay: properties.repeatDelay\n ? parseFloat(properties.repeatDelay)\n : undefined,\n repeatType: properties.repeatType as RepeatType,\n restDelta: properties.restDelta\n ? parseFloat(properties.restDelta)\n : undefined,\n restSpeed: properties.restSpeed\n ? parseFloat(properties.restSpeed)\n : undefined,\n startTime: properties.startTime\n ? parseFloat(properties.startTime)\n : undefined,\n timeConstant: properties.timeConstant\n ? parseFloat(properties.timeConstant)\n : undefined,\n type: properties.type as AnimationGeneratorType,\n velocity: properties.velocity ? parseFloat(properties.velocity) : undefined,\n visualDuration: properties.visualDuration\n ? parseFloat(properties.visualDuration)\n : undefined,\n } satisfies Transition;\n}\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, on, onCleanup } from \"solid-js\";\nimport { animate } from \"motion\";\n\nimport { useDrawer } from \"../hooks/index.js\";\nimport {\n controlPromise,\n convertPositionToTranslate,\n getTransitionConfig,\n} from \"../utils.js\";\nimport { POSITION, type Position } from \"../consts.js\";\n\ntype DrawerContentProps = {};\n\nexport const DrawerContent: CorrectComponentType<DrawerContentProps> = (\n props,\n { element },\n) => {\n const [state, { updateAnimationQueue }] = useDrawer(element);\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (!isOpen) return;\n const animation = enter(element);\n updateAnimationQueue(controlPromise(animation));\n return onCleanup(animation.complete);\n },\n ),\n );\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (isOpen) return;\n const animation = exit(element);\n updateAnimationQueue(controlPromise(animation));\n return onCleanup(animation.complete);\n },\n ),\n );\n\n function enter(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const transition = getTransitionConfig(style);\n let position = style.getPropertyValue(\"--d-position\") as Position;\n if (!position) position = POSITION.LEFT;\n const transform = convertPositionToTranslate(position);\n\n return animate(\n element,\n {\n transform,\n },\n transition,\n );\n }\n\n function exit(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const transition = getTransitionConfig(style);\n let position = style.getPropertyValue(\"--d-position\") as Position;\n if (!position) position = POSITION.LEFT;\n const transform = convertPositionToTranslate(position);\n return animate(\n element,\n {\n transform,\n },\n transition,\n );\n }\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\nimport type { Action } from \"../consts\";\n\nimport { createEffect, on, onCleanup } from \"solid-js\";\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\n\nimport { getDrawerContext } from \"../hooks/index.js\";\n\ntype DrawerTriggerProps = {\n target?: string;\n action?: Action | \"\";\n on?: keyof HTMLElementEventMap | \"enter\" | \"exit\";\n preventDefault: boolean;\n};\n\nexport const DrawerTrigger: CorrectComponentType<DrawerTriggerProps> = (\n props,\n { element },\n) => {\n if (!props.target)\n return console.warn(\"DrawerTrigger: target prop is required!\");\n if (!props.action)\n return console.warn(\"DrawerTrigger: action prop is required!\");\n if (\n props.action !== \"close\" &&\n props.action !== \"open\" &&\n props.action !== \"toggle\"\n )\n return console.warn(\n \"DrawerTrigger: action prop must be 'close', 'open', or 'toggle'\",\n );\n if (!props.on) return console.warn(\"DrawerTrigger: on prop is required!\");\n\n const target = document.querySelector(props.target!);\n if (!target) return console.warn(\"DrawerTrigger: target element not found!\");\n\n const [state, { open, close, toggle }] = getDrawerContext(target);\n\n function dispatchAction(action: Action) {\n switch (action) {\n case \"close\":\n close();\n break;\n case \"open\":\n open();\n break;\n case \"toggle\":\n toggle();\n break;\n }\n }\n\n createEffect(() => {\n element.setAttribute(\"is-open\", `${state.isOpen}`);\n element.setAttribute(\"is-animating\", `${state.isAnimating}`);\n });\n\n createEffect(\n on(\n () => ({\n action: props.action!,\n on: props.on,\n preventDefault: props.preventDefault,\n }),\n ({ action, on, preventDefault }) => {\n if (!on || !action) return;\n\n switch (on) {\n case \"enter\":\n return handleOnEnter(action);\n case \"exit\":\n return handleOnExit(action);\n default: {\n function handleEvent(event: Event) {\n if (preventDefault) event.preventDefault();\n dispatchAction(action);\n }\n\n element.addEventListener(on, handleEvent);\n\n return onCleanup(() =>\n element.removeEventListener(on, handleEvent),\n );\n }\n }\n },\n ),\n );\n\n // Handles the enter/exit events for the drawer.\n function handleOnEnter(action: Action) {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, open, close);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n return;\n }\n\n function handleOnExit(action: Action) {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, close, open);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n return;\n }\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, on, onCleanup } from \"solid-js\";\nimport { animate } from \"motion\";\n\nimport { useDrawer } from \"../hooks/index.js\";\nimport { controlPromise, getTransitionConfig } from \"../utils.js\";\n\ntype DrawerBackdropProps = {};\n\nexport const DrawerBackdrop: CorrectComponentType<DrawerBackdropProps> = (\n _,\n { element }\n) => {\n const [state, { updateAnimationQueue, close }] = useDrawer(element);\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (!isOpen) return;\n const animation = enter(element);\n updateAnimationQueue(controlPromise(animation));\n return onCleanup(animation.complete);\n }\n )\n );\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (isOpen) return;\n const animation = exit(element);\n updateAnimationQueue(controlPromise(animation));\n return onCleanup(animation.complete);\n }\n )\n );\n\n function enter(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const options = getTransitionConfig(style);\n return animate(\n element,\n {\n opacity: [`var(--opacity-from)`, `var(--opacity-to)`],\n },\n options\n );\n }\n\n function exit(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const options = getTransitionConfig(style);\n return animate(\n element,\n {\n opacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`],\n },\n options\n );\n }\n\n element.addEventListener(\"click\", close);\n\n onCleanup(() => {\n element.removeEventListener(\"click\", close);\n });\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createMemo, createEffect, on, onCleanup, splitProps } from \"solid-js\";\nimport {\n enableBodyScroll,\n disableBodyScroll,\n clearAllBodyScrollLocks,\n} from \"body-scroll-lock-upgrade\";\nimport { createFocusTrap } from \"focus-trap\";\n\nimport { provideDrawerContext, useDrawerContext } from \"../hooks/index.js\";\nimport { hideElement, showElement } from \"../utils.js\";\n\ntype DrawerContextProps = {\n isOpen: boolean;\n id: string;\n closeOnEscape: boolean;\n shouldTrapFocus: boolean;\n isAnimating: boolean;\n};\n\nexport const DrawerContext: CorrectComponentType<DrawerContextProps> = (\n props,\n { element },\n) => {\n const [contextProps, restProps] = splitProps(props, [\n \"isOpen\",\n \"isAnimating\",\n ]);\n\n const context = provideDrawerContext(contextProps, element);\n\n const [state, { setElementState }] = context;\n\n const [_, { updateAnimationQueue, ...events }] = useDrawerContext(context);\n\n element.actions = events;\n\n const focusTrap = createMemo(() => {\n return createFocusTrap(element, {\n allowOutsideClick: true,\n escapeDeactivates: restProps.closeOnEscape,\n onDeactivate: () => {\n setElementState(\"isOpen\", false);\n },\n });\n });\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n const eventName = isOpen ? \"drawer:open\" : \"drawer:close\";\n element.dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n detail: { isOpen, relatedTarget: element },\n }),\n );\n element.dispatchEvent(\n new CustomEvent(\"drawer:toggle\", {\n bubbles: true,\n detail: { isOpen, relatedTarget: element },\n }),\n );\n },\n ),\n );\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n focusTrap: focusTrap(),\n shouldTrapFocus: restProps.shouldTrapFocus,\n }),\n ({ isOpen, focusTrap, shouldTrapFocus }) => {\n if (!isOpen) return;\n showElement(element);\n if (!shouldTrapFocus) return;\n focusTrap.activate();\n onCleanup(focusTrap.deactivate);\n },\n ),\n );\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n isAnimating: state.isAnimating,\n shouldTrapFocus: restProps.shouldTrapFocus,\n }),\n ({ isOpen, isAnimating, shouldTrapFocus }) => {\n if (isOpen && !isAnimating && shouldTrapFocus)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"DRAWER-CONTENT\") {\n return true;\n }\n\n element = element.parentElement;\n }\n }\n return false;\n },\n });\n onCleanup(() => {\n if (!shouldTrapFocus) return;\n enableBodyScroll(element);\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),\n ({ isOpen, animationQueue }) => {\n if (isOpen) return;\n return Promise.all(animationQueue).then(() => hideElement(element));\n },\n ),\n );\n\n onCleanup(() => {\n clearAllBodyScrollLocks();\n });\n};\n","import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-utils\";\n\nimport {\n DrawerContent,\n DrawerContext,\n DrawerTrigger,\n DrawerBackdrop,\n} from \"./components/index.js\";\n\ncustomShadowlessElement(\n \"drawer-context\",\n {\n isOpen: false,\n id: \"\",\n closeOnEscape: false,\n shouldTrapFocus: false,\n isAnimating: false,\n },\n correctElementType(DrawerContext),\n);\n\ncustomShadowlessElement(\n \"drawer-trigger\",\n { target: \"\", action: \"\", on: \"click\", preventDefault: true },\n correctElementType(DrawerTrigger),\n);\n\ncustomShadowlessElement(\n \"drawer-backdrop\",\n {},\n correctElementType(DrawerBackdrop),\n);\n\ncustomShadowlessElement(\n \"drawer-content\",\n {},\n correctElementType(DrawerContent),\n);\n\nexport { useDrawer, getDrawerContext } from \"./hooks/index.js\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brytdesigns/web-component-drawer",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Headless drawer web component",
5
5
  "main": "./dist/main/index.js",
6
6
  "module": "./dist/main/index.js",
@@ -26,7 +26,7 @@
26
26
  "observe-element-in-viewport": "^0.0.15",
27
27
  "solid-element": "^1.9.1",
28
28
  "solid-js": "^1.9.7",
29
- "@brytdesigns/web-component-utils": "0.1.12"
29
+ "@brytdesigns/web-component-utils": "0.1.13"
30
30
  },
31
31
  "devDependencies": {
32
32
  "dts-bundle-generator": "^9.5.1",