@brytdesigns/web-component-drawer 1.1.11 → 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/main/components/drawer-backdrop.js +50 -77
- package/dist/main/components/drawer-backdrop.js.map +1 -1
- package/dist/main/components/drawer-content.js +60 -83
- package/dist/main/components/drawer-content.js.map +1 -1
- package/dist/main/components/drawer-context.js +119 -113
- package/dist/main/components/drawer-context.js.map +1 -1
- package/dist/main/components/drawer-trigger.js +90 -71
- package/dist/main/components/drawer-trigger.js.map +1 -1
- package/dist/main/components/index.js +4 -10
- package/dist/main/consts.js +8 -13
- package/dist/main/consts.js.map +1 -1
- package/dist/main/hooks/index.js +2 -3
- package/dist/main/hooks/useDrawer.js +85 -81
- package/dist/main/hooks/useDrawer.js.map +1 -1
- package/dist/main/index.d.ts +32 -30
- package/dist/main/index.js +27 -31
- package/dist/main/index.js.map +1 -1
- package/dist/main/utils.js +5 -4
- package/dist/main/utils.js.map +1 -1
- package/package.json +8 -9
- package/dist/esm/index.js +0 -491
- package/dist/esm/index.js.map +0 -1
- package/dist/main/components/index.js.map +0 -1
- package/dist/main/hooks/index.js.map +0 -1
package/dist/main/index.js
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import { getDrawerContext, useDrawer, useDrawerAt } from "./hooks/useDrawer.js";
|
|
2
|
+
import "./hooks/index.js";
|
|
3
|
+
import { Component, Name } from "./components/drawer-backdrop.js";
|
|
4
|
+
import { Component as Component$1, Name as Name$1 } from "./components/drawer-content.js";
|
|
5
|
+
import { Component as Component$2, Name as Name$2 } from "./components/drawer-context.js";
|
|
6
|
+
import { Component as Component$3, Name as Name$3 } from "./components/drawer-trigger.js";
|
|
7
|
+
import "./components/index.js";
|
|
8
|
+
import { customShadowlessElement } from "@brytdesigns/web-component-core/utils";
|
|
9
|
+
//#region src/index.ts
|
|
10
|
+
customShadowlessElement(Name$2, {
|
|
11
|
+
isOpen: false,
|
|
12
|
+
id: crypto.randomUUID(),
|
|
13
|
+
closeOnEscape: true,
|
|
14
|
+
shouldTrapFocus: true,
|
|
15
|
+
isAnimating: false,
|
|
16
|
+
debug: false
|
|
17
|
+
}, Component$2);
|
|
18
|
+
customShadowlessElement(Name$3, {
|
|
19
|
+
target: "",
|
|
20
|
+
action: "",
|
|
21
|
+
on: "click",
|
|
22
|
+
preventDefault: true
|
|
23
|
+
}, Component$3);
|
|
24
|
+
customShadowlessElement(Name, {}, Component);
|
|
25
|
+
customShadowlessElement(Name$1, {}, Component$1);
|
|
26
|
+
//#endregion
|
|
27
|
+
export { getDrawerContext, useDrawer, useDrawerAt };
|
|
4
28
|
|
|
5
|
-
customShadowlessElement(
|
|
6
|
-
DrawerContext.Name,
|
|
7
|
-
{
|
|
8
|
-
isOpen: false,
|
|
9
|
-
id: crypto.randomUUID(),
|
|
10
|
-
closeOnEscape: false,
|
|
11
|
-
shouldTrapFocus: false,
|
|
12
|
-
isAnimating: false,
|
|
13
|
-
debug: false
|
|
14
|
-
},
|
|
15
|
-
correctElementType(DrawerContext.Component)
|
|
16
|
-
);
|
|
17
|
-
customShadowlessElement(
|
|
18
|
-
DrawerTrigger.Name,
|
|
19
|
-
{ target: "", action: "", on: "click", preventDefault: true },
|
|
20
|
-
correctElementType(DrawerTrigger.Component)
|
|
21
|
-
);
|
|
22
|
-
customShadowlessElement(
|
|
23
|
-
DrawerBackdrop.Name,
|
|
24
|
-
{},
|
|
25
|
-
correctElementType(DrawerBackdrop.Component)
|
|
26
|
-
);
|
|
27
|
-
customShadowlessElement(
|
|
28
|
-
DrawerContent.Name,
|
|
29
|
-
{},
|
|
30
|
-
correctElementType(DrawerContent.Component)
|
|
31
|
-
);
|
|
32
|
-
//# sourceMappingURL=index.js.map
|
|
33
29
|
//# sourceMappingURL=index.js.map
|
package/dist/main/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["import { customShadowlessElement } from \"@brytdesigns/web-component-core/utils\";\n\nimport {\n\tDrawerBackdrop,\n\tDrawerContent,\n\tDrawerContext,\n\tDrawerTrigger,\n} from \"./components/index.js\";\n\nexport type DrawerContentProps = DrawerContent.Props;\nexport type DrawerContextProps = DrawerContext.Props;\nexport type DrawerTriggerProps = DrawerTrigger.Props;\nexport type DrawerBackdropProps = DrawerBackdrop.Props;\n\ncustomShadowlessElement(\n\tDrawerContext.Name,\n\t{\n\t\tisOpen: false,\n\t\tid: crypto.randomUUID(),\n\t\t// On by default: an overlay that traps nothing and closes on no key is\n\t\t// not a dialog. Set close-on-escape=\"false\" / should-trap-focus=\"false\"\n\t\t// in markup to opt out.\n\t\tcloseOnEscape: true,\n\t\tshouldTrapFocus: true,\n\t\tisAnimating: false,\n\t\tdebug: false,\n\t},\n\tDrawerContext.Component,\n);\n\ncustomShadowlessElement(\n\tDrawerTrigger.Name,\n\t{ target: \"\", action: \"\", on: \"click\", preventDefault: true },\n\tDrawerTrigger.Component,\n);\n\ncustomShadowlessElement(DrawerBackdrop.Name, {}, DrawerBackdrop.Component);\n\ncustomShadowlessElement(DrawerContent.Name, {}, DrawerContent.Component);\n\nexport {\n\tgetDrawerContext,\n\tuseDrawer,\n\tuseDrawerAt,\n} from \"./hooks/index.js\";\n"],"mappings":";;;;;;;;;AAcA,wBACC,QACA;CACC,QAAQ;CACR,IAAI,OAAO,WAAW;CAItB,eAAe;CACf,iBAAiB;CACjB,aAAa;CACb,OAAO;AACR,GACA,WACD;AAEA,wBACC,QACA;CAAE,QAAQ;CAAI,QAAQ;CAAI,IAAI;CAAS,gBAAgB;AAAK,GAC5D,WACD;AAEA,wBAAwB,MAAqB,CAAC,GAAG,SAAwB;AAEzE,wBAAwB,QAAoB,CAAC,GAAG,WAAuB"}
|
package/dist/main/utils.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
//#region src/utils.ts
|
|
1
2
|
function hideElement(element) {
|
|
2
|
-
|
|
3
|
+
element.style.display = "none";
|
|
3
4
|
}
|
|
4
5
|
function showElement(element) {
|
|
5
|
-
|
|
6
|
+
element.style.display = "block";
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
+
//#endregion
|
|
8
9
|
export { hideElement, showElement };
|
|
9
|
-
|
|
10
|
+
|
|
10
11
|
//# sourceMappingURL=utils.js.map
|
package/dist/main/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["export function hideElement<T extends HTMLElement>(element: T) {\n\telement.style.display = \"none\";\n}\n\nexport function showElement<T extends HTMLElement>(element: T) {\n\telement.style.display = \"block\";\n}\n"],"mappings":";AAAA,SAAgB,YAAmC,SAAY;CAC9D,QAAQ,MAAM,UAAU;AACzB;AAEA,SAAgB,YAAmC,SAAY;CAC9D,QAAQ,MAAM,UAAU;AACzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brytdesigns/web-component-drawer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Headless drawer web component",
|
|
5
5
|
"main": "./dist/main/index.js",
|
|
6
6
|
"module": "./dist/main/index.js",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./dist/main/index.d.ts",
|
|
12
|
-
"
|
|
12
|
+
"default": "./dist/main/index.js"
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
@@ -20,20 +20,19 @@
|
|
|
20
20
|
"license": "ISC",
|
|
21
21
|
"peer-dependencies": {},
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"@brytdesigns/web-component-core": "3.0.0",
|
|
23
24
|
"body-scroll-lock-upgrade": "^1.1.0",
|
|
24
25
|
"component-register": "0.8.7",
|
|
25
|
-
"motion": "^12.
|
|
26
|
+
"motion": "^12.43.0",
|
|
26
27
|
"observe-element-in-viewport": "^0.0.15",
|
|
27
|
-
"solid-
|
|
28
|
-
"solid-js": "^1.9.9",
|
|
29
|
-
"@brytdesigns/web-component-core": "1.1.6"
|
|
28
|
+
"solid-js": "2.0.0-rc.14"
|
|
30
29
|
},
|
|
31
30
|
"devDependencies": {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
31
|
+
"@repo/vite-config": "0.0.0",
|
|
32
|
+
"vite": "^8.2.2"
|
|
34
33
|
},
|
|
35
34
|
"scripts": {
|
|
36
|
-
"build": "
|
|
35
|
+
"build": "vite build",
|
|
37
36
|
"typecheck": "tsc --noEmit"
|
|
38
37
|
}
|
|
39
38
|
}
|
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
|