@brytdesigns/web-component-drawer 1.1.12 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js DELETED
@@ -1,491 +0,0 @@
1
- import { createWithElementContext, customShadowlessElement, correctElementType, toHyphenated, getContextFromProvider, disableBodyScroll, enableBodyScroll } from '@brytdesigns/web-component-core/utils';
2
- import { splitProps, createEffect, on, batch, onCleanup, untrack, mergeProps, onMount } from 'solid-js';
3
- import { animate } from 'motion';
4
- import { awaitAllAnimations, getTransitionConfig } from '@brytdesigns/web-component-core/animation';
5
- import { createContext, consume, provide } from 'component-register';
6
- import { createStore } from 'solid-js/store';
7
- import { abortablePromise } from '@brytdesigns/web-component-core/promise';
8
- import { observeElementInViewport } from 'observe-element-in-viewport';
9
- import { createFocusTrap } from '@brytdesigns/web-component-core/focusTrap';
10
-
11
- var __defProp = Object.defineProperty;
12
- var __export = (target, all) => {
13
- for (var name in all)
14
- __defProp(target, name, { get: all[name], enumerable: true });
15
- };
16
-
17
- // src/components/drawer-content.ts
18
- var drawer_content_exports = {};
19
- __export(drawer_content_exports, {
20
- Component: () => Component,
21
- Name: () => Name
22
- });
23
- function initializeDrawerContext(props) {
24
- const [_internal, _state] = splitProps(props, ["root"]);
25
- const [store, setStore] = createStore({ animationQueue: [] });
26
- createEffect(
27
- on(
28
- () => store.animationQueue,
29
- (animationQueue) => {
30
- if (!animationQueue.length) return;
31
- const controller = new AbortController();
32
- const animations = awaitAllAnimations(animationQueue);
33
- const abortableAnimations = abortablePromise(
34
- animations,
35
- controller.signal
36
- );
37
- setElementState("isAnimating", true);
38
- abortableAnimations.finally(() => {
39
- batch(() => {
40
- setElementState("isAnimating", false);
41
- setStore("animationQueue", []);
42
- });
43
- });
44
- return onCleanup(() => {
45
- controller.abort("Aborting drawer animations");
46
- });
47
- }
48
- )
49
- );
50
- function setElementState(key, value) {
51
- const currentValue = untrack(() => props[key]);
52
- if (typeof value === "function") {
53
- const result = value(currentValue || false);
54
- if (`${currentValue}` === `${result}`) return;
55
- _internal.root.setAttribute(toHyphenated(key), `${result}`);
56
- return;
57
- }
58
- if (`${currentValue}` === `${value}`) return;
59
- return _internal.root.setAttribute(toHyphenated(key), `${value}`);
60
- }
61
- return [mergeProps(_state, store), { setElementState, setStore }];
62
- }
63
- var DrawerContextState = createContext(initializeDrawerContext);
64
- var provideDrawerContext = (initialState, element) => {
65
- const props = mergeProps(initialState, { root: element });
66
- return provide(DrawerContextState, props, element);
67
- };
68
- var useDrawerContext = (context) => {
69
- const [state, { setElementState, setStore: setState }] = context;
70
- function updateAnimationQueue(animation) {
71
- setState("animationQueue", (state2) => [...state2, animation]);
72
- }
73
- function close() {
74
- setElementState("isOpen", false);
75
- }
76
- function open() {
77
- setElementState("isOpen", true);
78
- }
79
- function toggle() {
80
- setElementState("isOpen", (open2) => !open2);
81
- }
82
- return [state, { updateAnimationQueue, close, open, toggle }];
83
- };
84
- var useDrawer = (element) => {
85
- const context = consume(DrawerContextState, element);
86
- if (!context) {
87
- throw console.error(
88
- "DrawerContext not found! Please ensure to wrap your custom element with drawer-context element."
89
- );
90
- }
91
- return useDrawerContext(context);
92
- };
93
- var withDrawerElementContext = createWithElementContext(DrawerContextState);
94
- var getDrawerContext = (element) => {
95
- const context = getContextFromProvider(
96
- DrawerContextState,
97
- element
98
- );
99
- return useDrawerContext(context);
100
- };
101
-
102
- // src/consts.ts
103
- var POSITION = {
104
- TOP: "top",
105
- BOTTOM: "bottom",
106
- LEFT: "left"};
107
-
108
- // src/components/drawer-content.ts
109
- var Name = `drawer-content`;
110
- var Component = (_, { element }) => {
111
- const [state, { updateAnimationQueue }] = useDrawer(element);
112
- let isFirstRender = true;
113
- createEffect(
114
- on(
115
- () => state.isOpen,
116
- (isOpen) => {
117
- if (!isOpen || isFirstRender) return;
118
- const animation = enter(element);
119
- updateAnimationQueue(animation);
120
- return onCleanup(() => {
121
- if (animation.state !== "finished") animation.complete();
122
- });
123
- }
124
- )
125
- );
126
- createEffect(
127
- on(
128
- () => state.isOpen,
129
- (isOpen) => {
130
- if (isOpen || isFirstRender) return;
131
- const animation = exit(element);
132
- updateAnimationQueue(animation);
133
- return onCleanup(() => {
134
- if (animation.state !== "finished") animation.complete();
135
- });
136
- }
137
- )
138
- );
139
- onMount(() => {
140
- isFirstRender = false;
141
- });
142
- function enter(element2) {
143
- const style = window.getComputedStyle(element2);
144
- const transition = getTransitionConfig(style);
145
- let position = style.getPropertyValue(`--drawer--position`);
146
- if (!position) position = POSITION.LEFT;
147
- let transform = {
148
- x: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`]
149
- };
150
- if (position === POSITION.TOP || position === POSITION.BOTTOM) {
151
- transform = {
152
- y: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`]
153
- };
154
- }
155
- return animate(
156
- element2,
157
- {
158
- ...transform
159
- },
160
- transition
161
- );
162
- }
163
- function exit(element2) {
164
- const style = window.getComputedStyle(element2);
165
- const transition = getTransitionConfig(style);
166
- let position = style.getPropertyValue(`--drawer--position`);
167
- if (!position) position = POSITION.LEFT;
168
- let transform = {
169
- x: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`]
170
- };
171
- if (position === POSITION.TOP || position === POSITION.BOTTOM) {
172
- transform = {
173
- y: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`]
174
- };
175
- }
176
- return animate(
177
- element2,
178
- {
179
- ...transform
180
- },
181
- transition
182
- );
183
- }
184
- };
185
-
186
- // src/components/drawer-trigger.ts
187
- var drawer_trigger_exports = {};
188
- __export(drawer_trigger_exports, {
189
- Component: () => Component2,
190
- Name: () => Name2
191
- });
192
- var Name2 = "drawer-trigger";
193
- var Component2 = (props, { element }) => {
194
- withDrawerElementContext(
195
- () => props.target || "",
196
- () => {
197
- return {
198
- action: props.action,
199
- on: props.on,
200
- preventDefault: props.preventDefault
201
- };
202
- },
203
- (context, props2) => {
204
- const controller = new AbortController();
205
- const { action, on: on5, preventDefault } = props2;
206
- const [state, { open, close, toggle }] = useDrawerContext(context);
207
- switch (on5) {
208
- case "enter": {
209
- let unsubscribe = null;
210
- if (action === "toggle") {
211
- unsubscribe = observeElementInViewport(element, open, close);
212
- }
213
- if (unsubscribe) onCleanup(unsubscribe);
214
- break;
215
- }
216
- case "exit": {
217
- let unsubscribe = null;
218
- if (action === "toggle") {
219
- unsubscribe = observeElementInViewport(element, close, open);
220
- }
221
- if (unsubscribe) onCleanup(unsubscribe);
222
- break;
223
- }
224
- default: {
225
- element.addEventListener(
226
- //@ts-ignore
227
- on5,
228
- (event) => {
229
- if (preventDefault) event.preventDefault();
230
- if (state.isAnimating) return;
231
- switch (action) {
232
- case "close":
233
- close();
234
- break;
235
- case "open":
236
- open();
237
- break;
238
- case "toggle":
239
- toggle();
240
- break;
241
- }
242
- },
243
- { signal: controller.signal }
244
- );
245
- break;
246
- }
247
- }
248
- createEffect(() => {
249
- element.setAttribute("is-open", `${state.isOpen}`);
250
- element.setAttribute("is-animating", `${state.isAnimating}`);
251
- });
252
- onCleanup(() => {
253
- controller.abort();
254
- });
255
- }
256
- );
257
- };
258
-
259
- // src/components/drawer-backdrop.ts
260
- var drawer_backdrop_exports = {};
261
- __export(drawer_backdrop_exports, {
262
- Component: () => Component3,
263
- Name: () => Name3
264
- });
265
- var Name3 = `drawer-backdrop`;
266
- var Component3 = (_, { element }) => {
267
- const [state, { updateAnimationQueue, close }] = useDrawer(element);
268
- const controller = new AbortController();
269
- let isFirstRender = true;
270
- createEffect(
271
- on(
272
- () => state.isOpen,
273
- (isOpen) => {
274
- if (!isOpen || isFirstRender) return;
275
- const animation = enter(element);
276
- updateAnimationQueue(animation);
277
- return onCleanup(() => {
278
- if (animation.state !== "finished") animation.complete();
279
- });
280
- }
281
- )
282
- );
283
- createEffect(
284
- on(
285
- () => state.isOpen,
286
- (isOpen) => {
287
- if (isOpen || isFirstRender) return;
288
- const animation = exit(element);
289
- updateAnimationQueue(animation);
290
- return onCleanup(() => {
291
- if (animation.state !== "finished") animation.complete();
292
- });
293
- }
294
- )
295
- );
296
- onMount(() => {
297
- isFirstRender = false;
298
- });
299
- function enter(element2) {
300
- const style = window.getComputedStyle(element2);
301
- const options = getTransitionConfig(style);
302
- return animate(
303
- element2,
304
- {
305
- opacity: [`var(--drawer--opacity-from)`, `var(--drawer--opacity-to)`]
306
- },
307
- options
308
- );
309
- }
310
- function exit(element2) {
311
- const style = window.getComputedStyle(element2);
312
- const options = getTransitionConfig(style);
313
- return animate(
314
- element2,
315
- {
316
- opacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`]
317
- },
318
- options
319
- );
320
- }
321
- element.addEventListener(
322
- "click",
323
- () => {
324
- if (state.isAnimating) return;
325
- close();
326
- },
327
- {
328
- signal: controller.signal
329
- }
330
- );
331
- onCleanup(() => {
332
- controller.abort();
333
- });
334
- isFirstRender = false;
335
- };
336
-
337
- // src/components/drawer-context.ts
338
- var drawer_context_exports = {};
339
- __export(drawer_context_exports, {
340
- Component: () => Component4,
341
- Name: () => Name4
342
- });
343
-
344
- // src/utils.ts
345
- function hideElement(element) {
346
- element.style.display = "none";
347
- }
348
- function showElement(element) {
349
- element.style.display = "block";
350
- }
351
-
352
- // src/components/drawer-context.ts
353
- var Name4 = `drawer-context`;
354
- var Component4 = (props, { element }) => {
355
- const [contextProps, restProps] = splitProps(props, [
356
- "isOpen",
357
- "isAnimating"
358
- ]);
359
- const context = provideDrawerContext(contextProps, element);
360
- const [state, { setElementState }] = context;
361
- const [_, { updateAnimationQueue, ...events }] = useDrawerContext(context);
362
- element.actions = events;
363
- const focusTrap = createFocusTrap(element, () => ({
364
- allowOutsideClick: true,
365
- escapeDeactivates: restProps.closeOnEscape,
366
- onDeactivate: () => {
367
- setElementState("isOpen", false);
368
- }
369
- }));
370
- createEffect(() => {
371
- if (!props.debug) return;
372
- console.table({
373
- ...state
374
- });
375
- });
376
- createEffect(
377
- on(
378
- () => state.isOpen,
379
- (isOpen) => {
380
- const eventName = isOpen ? "drawer:open" : "drawer:close";
381
- element.dispatchEvent(
382
- new CustomEvent(eventName, {
383
- bubbles: true,
384
- detail: { isOpen, relatedTarget: element }
385
- })
386
- );
387
- element.dispatchEvent(
388
- new CustomEvent("drawer:toggle", {
389
- bubbles: true,
390
- detail: { isOpen, relatedTarget: element }
391
- })
392
- );
393
- }
394
- )
395
- );
396
- createEffect(
397
- on(
398
- () => ({
399
- isOpen: state.isOpen,
400
- focusTrap: focusTrap(),
401
- shouldTrapFocus: restProps.shouldTrapFocus
402
- }),
403
- ({ isOpen, focusTrap: focusTrap2, shouldTrapFocus }) => {
404
- if (!isOpen) return;
405
- if (props.debug) console.log("Showing element", element);
406
- showElement(element);
407
- if (!shouldTrapFocus) return;
408
- focusTrap2.activate();
409
- onCleanup(focusTrap2.deactivate);
410
- }
411
- )
412
- );
413
- createEffect(
414
- on(
415
- () => ({
416
- isOpen: state.isOpen,
417
- isAnimating: state.isAnimating,
418
- shouldTrapFocus: props.shouldTrapFocus
419
- }),
420
- ({ isOpen, isAnimating, shouldTrapFocus }) => {
421
- if (isOpen && !isAnimating && shouldTrapFocus)
422
- return disableBodyScroll(element, {
423
- allowTouchMove: (el) => {
424
- if (el instanceof HTMLElement) {
425
- let element2 = el;
426
- while (element2 && element2 !== document.body) {
427
- if (element2.tagName === "DRAWER-CONTENT") {
428
- return true;
429
- }
430
- element2 = element2.parentElement;
431
- }
432
- }
433
- return false;
434
- }
435
- });
436
- onCleanup(() => {
437
- enableBodyScroll(element);
438
- });
439
- }
440
- )
441
- );
442
- createEffect(
443
- on(
444
- () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),
445
- ({ isOpen, animationQueue }) => {
446
- if (isOpen) return;
447
- if (props.debug)
448
- console.log("Waiting for animations to complete...", animationQueue);
449
- return Promise.all(animationQueue).then(() => hideElement(element)).then(() => {
450
- if (props.debug) console.log("Hiding element", element);
451
- });
452
- }
453
- )
454
- );
455
- onCleanup(() => {
456
- enableBodyScroll(element);
457
- });
458
- };
459
-
460
- // src/index.ts
461
- customShadowlessElement(
462
- drawer_context_exports.Name,
463
- {
464
- isOpen: false,
465
- id: crypto.randomUUID(),
466
- closeOnEscape: false,
467
- shouldTrapFocus: false,
468
- isAnimating: false,
469
- debug: false
470
- },
471
- correctElementType(drawer_context_exports.Component)
472
- );
473
- customShadowlessElement(
474
- drawer_trigger_exports.Name,
475
- { target: "", action: "", on: "click", preventDefault: true },
476
- correctElementType(drawer_trigger_exports.Component)
477
- );
478
- customShadowlessElement(
479
- drawer_backdrop_exports.Name,
480
- {},
481
- correctElementType(drawer_backdrop_exports.Component)
482
- );
483
- customShadowlessElement(
484
- drawer_content_exports.Name,
485
- {},
486
- correctElementType(drawer_content_exports.Component)
487
- );
488
-
489
- export { getDrawerContext, useDrawer, withDrawerElementContext };
490
- //# sourceMappingURL=index.js.map
491
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/drawer-content.ts","../../src/hooks/useDrawer.ts","../../src/consts.ts","../../src/components/drawer-trigger.ts","../../src/components/drawer-backdrop.ts","../../src/components/drawer-context.ts","../../src/utils.ts","../../src/index.ts"],"names":["state","open","createEffect","on","onCleanup","element","Component","Name","props","onMount","getTransitionConfig","animate","splitProps","focusTrap"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\r\n\r\nimport { createEffect, on, onCleanup, onMount } from \"solid-js\";\r\nimport { animate } from \"motion\";\r\nimport { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\r\n\r\nimport { useDrawer } from \"../hooks/index.js\";\r\nimport { POSITION, type Position } from \"../consts.js\";\r\n\r\nexport type Props = {};\r\n\r\nexport const Name = `drawer-content`;\r\n\r\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\r\n const [state, { updateAnimationQueue }] = useDrawer(element);\r\n\r\n let isFirstRender = true;\r\n\r\n createEffect(\r\n on(\r\n () => state.isOpen,\r\n (isOpen) => {\r\n if (!isOpen || isFirstRender) return;\r\n const animation = enter(element);\r\n updateAnimationQueue(animation);\r\n return onCleanup(() => {\r\n if (animation.state !== \"finished\") animation.complete();\r\n });\r\n },\r\n ),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => state.isOpen,\r\n (isOpen) => {\r\n if (isOpen || isFirstRender) return;\r\n const animation = exit(element);\r\n updateAnimationQueue(animation);\r\n return onCleanup(() => {\r\n if (animation.state !== \"finished\") animation.complete();\r\n });\r\n },\r\n ),\r\n );\r\n\r\n onMount(() => {\r\n isFirstRender = false;\r\n });\r\n\r\n function enter(element: HTMLElement) {\r\n const style = window.getComputedStyle(element);\r\n const transition = getTransitionConfig(style);\r\n let position = style.getPropertyValue(`--drawer--position`) as Position;\r\n if (!position) position = POSITION.LEFT;\r\n\r\n let transform: Record<string, string[]> = {\r\n x: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`],\r\n };\r\n\r\n if (position === POSITION.TOP || position === POSITION.BOTTOM) {\r\n transform = {\r\n y: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`],\r\n };\r\n }\r\n\r\n return animate(\r\n element,\r\n {\r\n ...transform,\r\n },\r\n transition,\r\n );\r\n }\r\n\r\n function exit(element: HTMLElement) {\r\n const style = window.getComputedStyle(element);\r\n const transition = getTransitionConfig(style);\r\n let position = style.getPropertyValue(`--drawer--position`) as Position;\r\n if (!position) position = POSITION.LEFT;\r\n\r\n let transform: Record<string, string[]> = {\r\n x: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`],\r\n };\r\n\r\n if (position === POSITION.TOP || position === POSITION.BOTTOM) {\r\n transform = {\r\n y: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`],\r\n };\r\n }\r\n\r\n return animate(\r\n element,\r\n {\r\n ...transform,\r\n },\r\n transition,\r\n );\r\n }\r\n};\r\n","import {\r\n type ICustomElement,\r\n createContext,\r\n provide,\r\n consume,\r\n} from \"component-register\";\r\nimport {\r\n createEffect,\r\n on,\r\n batch,\r\n splitProps,\r\n untrack,\r\n mergeProps,\r\n onCleanup,\r\n} from \"solid-js\";\r\nimport { createStore } from \"solid-js/store\";\r\n\r\nimport type { AnimationPlaybackControlsWithThen } from \"motion\";\r\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\r\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\r\nimport {\r\n createWithElementContext,\r\n toHyphenated,\r\n getContextFromProvider,\r\n} from \"@brytdesigns/web-component-core/utils\";\r\n\r\ntype StoreContext = {\r\n animationQueue: AnimationPlaybackControlsWithThen[];\r\n};\r\n\r\ntype CreateContextOptions = {\r\n root: HTMLElement & ICustomElement;\r\n isOpen: boolean;\r\n isAnimating: boolean;\r\n};\r\n\r\ntype WalkableNode = Parameters<typeof provide>[2];\r\n\r\ntype DrawerContext = ReturnType<typeof initializeDrawerContext>;\r\n\r\nfunction initializeDrawerContext(props: CreateContextOptions) {\r\n const [_internal, _state] = splitProps(props, [\"root\"]);\r\n const [store, setStore] = createStore<StoreContext>({ animationQueue: [] });\r\n\r\n createEffect(\r\n on(\r\n () => store.animationQueue,\r\n (animationQueue) => {\r\n if (!animationQueue.length) return;\r\n const controller = new AbortController();\r\n const animations = awaitAllAnimations(animationQueue);\r\n const abortableAnimations = abortablePromise(\r\n animations,\r\n controller.signal,\r\n );\r\n setElementState(\"isAnimating\", true);\r\n abortableAnimations.finally(() => {\r\n batch(() => {\r\n setElementState(\"isAnimating\", false);\r\n setStore(\"animationQueue\", []);\r\n });\r\n });\r\n\r\n return onCleanup(() => {\r\n controller.abort(\"Aborting drawer animations\");\r\n });\r\n },\r\n ),\r\n );\r\n\r\n function setElementState(\r\n key: keyof Omit<CreateContextOptions, \"root\">,\r\n value: boolean | ((v: boolean) => boolean),\r\n ) {\r\n const currentValue = untrack(() => props[key]);\r\n if (typeof value === \"function\") {\r\n const result = value(currentValue || false);\r\n if (`${currentValue}` === `${result}`) return;\r\n _internal.root.setAttribute(toHyphenated(key), `${result}`);\r\n return;\r\n }\r\n if (`${currentValue}` === `${value}`) return;\r\n return _internal.root.setAttribute(toHyphenated(key), `${value}`);\r\n }\r\n\r\n return [mergeProps(_state, store), { setElementState, setStore }] as const;\r\n}\r\n\r\nconst DrawerContextState = createContext(initializeDrawerContext);\r\n\r\nexport const provideDrawerContext = (\r\n initialState: Omit<CreateContextOptions, \"root\">,\r\n element: WalkableNode,\r\n): DrawerContext => {\r\n const props = mergeProps(initialState, { root: element });\r\n return provide(DrawerContextState, props, element);\r\n};\r\n\r\nexport const useDrawerContext = (context: DrawerContext) => {\r\n const [state, { setElementState, setStore: setState }] = context;\r\n\r\n function updateAnimationQueue(animation: AnimationPlaybackControlsWithThen) {\r\n setState(\"animationQueue\", (state) => [...state, animation]);\r\n }\r\n\r\n function close() {\r\n setElementState(\"isOpen\", false);\r\n }\r\n\r\n function open() {\r\n setElementState(\"isOpen\", true);\r\n }\r\n\r\n function toggle() {\r\n setElementState(\"isOpen\", (open) => !open);\r\n }\r\n\r\n return [state, { updateAnimationQueue, close, open, toggle }] as const;\r\n};\r\n\r\nexport const useDrawer = (element: HTMLElement & ICustomElement) => {\r\n const context: DrawerContext = consume(DrawerContextState, element);\r\n\r\n if (!context) {\r\n throw console.error(\r\n \"DrawerContext not found! Please ensure to wrap your custom element with drawer-context element.\",\r\n );\r\n }\r\n\r\n return useDrawerContext(context);\r\n};\r\n\r\nexport const withDrawerElementContext = createWithElementContext<\r\n typeof DrawerContextState,\r\n DrawerContext\r\n>(DrawerContextState);\r\n\r\nexport const getDrawerContext = (element: Element) => {\r\n const context = getContextFromProvider<DrawerContext>(\r\n DrawerContextState,\r\n element,\r\n );\r\n return useDrawerContext(context);\r\n};\r\n","export type Position = (typeof POSITION)[keyof typeof POSITION];\r\nexport type Action = (typeof ACTION)[keyof typeof ACTION];\r\n\r\nexport const POSITION = {\r\n TOP: \"top\",\r\n BOTTOM: \"bottom\",\r\n LEFT: \"left\",\r\n RIGHT: \"right\",\r\n} as const;\r\n\r\nexport const ACTION = {\r\n OPEN: \"open\",\r\n CLOSE: \"close\",\r\n TOGGLE: \"toggle\",\r\n};\r\n\r\nexport const EVENT_NAMESPACE = `bryt:drawer` as const;\r\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\r\nimport type { Action } from \"../consts\";\r\n\r\nimport { createEffect, onCleanup } from \"solid-js\";\r\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\r\n\r\nimport { withDrawerElementContext, useDrawerContext } from \"../hooks/index.js\";\r\n\r\nexport type Props = {\r\n target?: string;\r\n action?: Action | \"\";\r\n on?: keyof HTMLElementEventMap | \"enter\" | \"exit\";\r\n preventDefault: boolean;\r\n};\r\n\r\nexport const Name = \"drawer-trigger\";\r\n\r\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\r\n withDrawerElementContext(\r\n () => props.target || \"\",\r\n () => {\r\n return {\r\n action: props.action,\r\n on: props.on,\r\n preventDefault: props.preventDefault,\r\n };\r\n },\r\n (context, props) => {\r\n const controller = new AbortController();\r\n const { action, on, preventDefault } = props;\r\n const [state, { open, close, toggle }] = useDrawerContext(context);\r\n\r\n switch (on) {\r\n case \"enter\": {\r\n let unsubscribe = null;\r\n if (action === \"toggle\") {\r\n unsubscribe = observeElementInViewport(element, open, close);\r\n }\r\n\r\n if (unsubscribe) onCleanup(unsubscribe);\r\n break;\r\n }\r\n case \"exit\": {\r\n let unsubscribe = null;\r\n if (action === \"toggle\") {\r\n unsubscribe = observeElementInViewport(element, close, open);\r\n }\r\n\r\n if (unsubscribe) onCleanup(unsubscribe);\r\n break;\r\n }\r\n\r\n default: {\r\n element.addEventListener(\r\n //@ts-ignore\r\n on,\r\n (event) => {\r\n if (preventDefault) event.preventDefault();\r\n if (state.isAnimating) return;\r\n switch (action) {\r\n case \"close\":\r\n close();\r\n break;\r\n case \"open\":\r\n open();\r\n break;\r\n case \"toggle\":\r\n toggle();\r\n break;\r\n }\r\n },\r\n { signal: controller.signal },\r\n );\r\n break;\r\n }\r\n }\r\n\r\n createEffect(() => {\r\n element.setAttribute(\"is-open\", `${state.isOpen}`);\r\n element.setAttribute(\"is-animating\", `${state.isAnimating}`);\r\n });\r\n\r\n onCleanup(() => {\r\n controller.abort();\r\n });\r\n },\r\n );\r\n};\r\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\r\n\r\nimport { createEffect, onMount, on, onCleanup } from \"solid-js\";\r\nimport { animate } from \"motion\";\r\nimport { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\r\n\r\nimport { useDrawer } from \"../hooks/index.js\";\r\n\r\nexport type Props = {};\r\n\r\nexport const Name = `drawer-backdrop`;\r\n\r\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\r\n const [state, { updateAnimationQueue, close }] = useDrawer(element);\r\n const controller = new AbortController();\r\n\r\n let isFirstRender = true;\r\n\r\n createEffect(\r\n on(\r\n () => state.isOpen,\r\n (isOpen) => {\r\n if (!isOpen || isFirstRender) return;\r\n const animation = enter(element);\r\n updateAnimationQueue(animation);\r\n return onCleanup(() => {\r\n if (animation.state !== \"finished\") animation.complete();\r\n });\r\n },\r\n ),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => state.isOpen,\r\n (isOpen) => {\r\n if (isOpen || isFirstRender) return;\r\n const animation = exit(element);\r\n updateAnimationQueue(animation);\r\n return onCleanup(() => {\r\n if (animation.state !== \"finished\") animation.complete();\r\n });\r\n },\r\n ),\r\n );\r\n\r\n onMount(() => {\r\n isFirstRender = false;\r\n });\r\n\r\n function enter(element: HTMLElement) {\r\n const style = window.getComputedStyle(element);\r\n const options = getTransitionConfig(style);\r\n return animate(\r\n element,\r\n {\r\n opacity: [`var(--drawer--opacity-from)`, `var(--drawer--opacity-to)`],\r\n },\r\n options,\r\n );\r\n }\r\n\r\n function exit(element: HTMLElement) {\r\n const style = window.getComputedStyle(element);\r\n const options = getTransitionConfig(style);\r\n return animate(\r\n element,\r\n {\r\n opacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`],\r\n },\r\n options,\r\n );\r\n }\r\n\r\n element.addEventListener(\r\n \"click\",\r\n () => {\r\n if (state.isAnimating) return;\r\n close();\r\n },\r\n {\r\n signal: controller.signal,\r\n },\r\n );\r\n\r\n onCleanup(() => {\r\n controller.abort();\r\n });\r\n\r\n isFirstRender = false;\r\n};\r\n","import {\r\n type CorrectComponentType,\r\n enableBodyScroll,\r\n disableBodyScroll,\r\n} from \"@brytdesigns/web-component-core/utils\";\r\n\r\nimport { createEffect, on, onCleanup, splitProps } from \"solid-js\";\r\nimport { createFocusTrap } from \"@brytdesigns/web-component-core/focusTrap\";\r\n\r\nimport { provideDrawerContext, useDrawerContext } from \"../hooks/index.js\";\r\nimport { hideElement, showElement } from \"../utils.js\";\r\n\r\nexport type Props = {\r\n isOpen: boolean;\r\n id: string;\r\n closeOnEscape: boolean;\r\n shouldTrapFocus: boolean;\r\n isAnimating: boolean;\r\n debug?: boolean;\r\n};\r\n\r\nexport const Name = `drawer-context`;\r\n\r\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\r\n const [contextProps, restProps] = splitProps(props, [\r\n \"isOpen\",\r\n \"isAnimating\",\r\n ]);\r\n\r\n const context = provideDrawerContext(contextProps, element);\r\n\r\n const [state, { setElementState }] = context;\r\n\r\n const [_, { updateAnimationQueue, ...events }] = useDrawerContext(context);\r\n\r\n element.actions = events;\r\n\r\n const focusTrap = createFocusTrap(element, () => ({\r\n allowOutsideClick: true,\r\n escapeDeactivates: restProps.closeOnEscape,\r\n onDeactivate: () => {\r\n setElementState(\"isOpen\", false);\r\n },\r\n }));\r\n\r\n createEffect(() => {\r\n if (!props.debug) return;\r\n console.table({\r\n ...state,\r\n });\r\n });\r\n\r\n createEffect(\r\n on(\r\n () => state.isOpen,\r\n (isOpen) => {\r\n const eventName = isOpen ? \"drawer:open\" : \"drawer:close\";\r\n element.dispatchEvent(\r\n new CustomEvent(eventName, {\r\n bubbles: true,\r\n detail: { isOpen, relatedTarget: element },\r\n }),\r\n );\r\n element.dispatchEvent(\r\n new CustomEvent(\"drawer:toggle\", {\r\n bubbles: true,\r\n detail: { isOpen, relatedTarget: element },\r\n }),\r\n );\r\n },\r\n ),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => ({\r\n isOpen: state.isOpen,\r\n focusTrap: focusTrap(),\r\n shouldTrapFocus: restProps.shouldTrapFocus,\r\n }),\r\n ({ isOpen, focusTrap, shouldTrapFocus }) => {\r\n if (!isOpen) return;\r\n if (props.debug) console.log(\"Showing element\", element);\r\n showElement(element);\r\n if (!shouldTrapFocus) return;\r\n focusTrap.activate();\r\n onCleanup(focusTrap.deactivate);\r\n },\r\n ),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => ({\r\n isOpen: state.isOpen,\r\n isAnimating: state.isAnimating,\r\n shouldTrapFocus: props.shouldTrapFocus,\r\n }),\r\n ({ isOpen, isAnimating, shouldTrapFocus }) => {\r\n if (isOpen && !isAnimating && shouldTrapFocus)\r\n return disableBodyScroll(element, {\r\n allowTouchMove: (el: EventTarget) => {\r\n if (el instanceof HTMLElement) {\r\n let element = el as (EventTarget & HTMLElement) | null;\r\n while (element && element !== document.body) {\r\n if (element.tagName === \"DRAWER-CONTENT\") {\r\n return true;\r\n }\r\n\r\n element = element.parentElement;\r\n }\r\n }\r\n return false;\r\n },\r\n });\r\n onCleanup(() => {\r\n enableBodyScroll(element);\r\n });\r\n },\r\n ),\r\n );\r\n\r\n createEffect(\r\n on(\r\n () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),\r\n ({ isOpen, animationQueue }) => {\r\n if (isOpen) return;\r\n if (props.debug)\r\n console.log(\"Waiting for animations to complete...\", animationQueue);\r\n return Promise.all(animationQueue)\r\n .then(() => hideElement(element))\r\n .then(() => {\r\n if (props.debug) console.log(\"Hiding element\", element);\r\n });\r\n },\r\n ),\r\n );\r\n\r\n onCleanup(() => {\r\n enableBodyScroll(element);\r\n });\r\n};\r\n","export function hideElement<T extends HTMLElement>(element: T) {\r\n element.style.display = \"none\";\r\n}\r\n\r\nexport function showElement<T extends HTMLElement>(element: T) {\r\n element.style.display = \"block\";\r\n}\r\n","import {\r\n\tcustomShadowlessElement,\r\n\tcorrectElementType,\r\n} from \"@brytdesigns/web-component-core/utils\";\r\n\r\nimport {\r\n\tDrawerContent,\r\n\tDrawerContext,\r\n\tDrawerTrigger,\r\n\tDrawerBackdrop,\r\n} from \"./components/index.js\";\r\n\r\nexport type DrawerContentProps = DrawerContent.Props;\r\nexport type DrawerContextProps = DrawerContext.Props;\r\nexport type DrawerTriggerProps = DrawerTrigger.Props;\r\nexport type DrawerBackdropProps = DrawerBackdrop.Props;\r\n\r\ncustomShadowlessElement(\r\n\tDrawerContext.Name,\r\n\t{\r\n\t\tisOpen: false,\r\n\t\tid: crypto.randomUUID(),\r\n\t\tcloseOnEscape: false,\r\n\t\tshouldTrapFocus: false,\r\n\t\tisAnimating: false,\r\n\t\tdebug: false,\r\n\t},\r\n\tcorrectElementType(DrawerContext.Component),\r\n);\r\n\r\ncustomShadowlessElement(\r\n\tDrawerTrigger.Name,\r\n\t{ target: \"\", action: \"\", on: \"click\", preventDefault: true },\r\n\tcorrectElementType(DrawerTrigger.Component),\r\n);\r\n\r\ncustomShadowlessElement(\r\n\tDrawerBackdrop.Name,\r\n\t{},\r\n\tcorrectElementType(DrawerBackdrop.Component),\r\n);\r\n\r\ncustomShadowlessElement(\r\n\tDrawerContent.Name,\r\n\t{},\r\n\tcorrectElementType(DrawerContent.Component),\r\n);\r\n\r\nexport {\r\n\tuseDrawer,\r\n\twithDrawerElementContext,\r\n\tgetDrawerContext,\r\n} from \"./hooks/index.js\";\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}