@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.
@@ -1,80 +1,53 @@
1
- import { createEffect, on, onMount, onCleanup } from 'solid-js';
2
- import { animate } from 'motion';
3
- import { getTransitionConfig } from '@brytdesigns/web-component-core/animation';
4
- import { useDrawer } from '../hooks/index.js';
5
-
6
- const Name = `drawer-backdrop`;
7
- const Component = (_, { element }) => {
8
- const [state, { updateAnimationQueue, close }] = useDrawer(element);
9
- const controller = new AbortController();
10
- let isFirstRender = true;
11
- createEffect(
12
- on(
13
- () => state.isOpen,
14
- (isOpen) => {
15
- if (!isOpen || isFirstRender) return;
16
- const animation = enter(element);
17
- updateAnimationQueue(animation);
18
- return onCleanup(() => {
19
- if (animation.state !== "finished") animation.complete();
20
- });
21
- }
22
- )
23
- );
24
- createEffect(
25
- on(
26
- () => state.isOpen,
27
- (isOpen) => {
28
- if (isOpen || isFirstRender) return;
29
- const animation = exit(element);
30
- updateAnimationQueue(animation);
31
- return onCleanup(() => {
32
- if (animation.state !== "finished") animation.complete();
33
- });
34
- }
35
- )
36
- );
37
- onMount(() => {
38
- isFirstRender = false;
39
- });
40
- function enter(element2) {
41
- const style = window.getComputedStyle(element2);
42
- const options = getTransitionConfig(style);
43
- return animate(
44
- element2,
45
- {
46
- opacity: [`var(--drawer--opacity-from)`, `var(--drawer--opacity-to)`]
47
- },
48
- options
49
- );
50
- }
51
- function exit(element2) {
52
- const style = window.getComputedStyle(element2);
53
- const options = getTransitionConfig(style);
54
- return animate(
55
- element2,
56
- {
57
- opacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`]
58
- },
59
- options
60
- );
61
- }
62
- element.addEventListener(
63
- "click",
64
- () => {
65
- if (state.isAnimating) return;
66
- close();
67
- },
68
- {
69
- signal: controller.signal
70
- }
71
- );
72
- onCleanup(() => {
73
- controller.abort();
74
- });
75
- isFirstRender = false;
1
+ import { useDrawer } from "../hooks/useDrawer.js";
2
+ import "../hooks/index.js";
3
+ import { createGuardedEffect } from "@brytdesigns/web-component-core/utils";
4
+ import { getTransitionConfig } from "@brytdesigns/web-component-core/animation";
5
+ import { animate } from "motion";
6
+ import { onCleanup, onSettled } from "solid-js";
7
+ //#region src/components/drawer-backdrop.ts
8
+ var Name = `drawer-backdrop`;
9
+ var Component = (_, { element }) => {
10
+ const [state, { updateAnimationQueue, close }] = useDrawer(element);
11
+ const controller = new AbortController();
12
+ let isFirstRender = true;
13
+ createGuardedEffect(() => state.isOpen, (isOpen) => {
14
+ if (!isOpen || isFirstRender) return;
15
+ const animation = enter(element);
16
+ updateAnimationQueue(animation);
17
+ return () => {
18
+ if (animation.state !== "finished") animation.complete();
19
+ };
20
+ });
21
+ createGuardedEffect(() => state.isOpen, (isOpen) => {
22
+ if (isOpen || isFirstRender) return;
23
+ const animation = exit(element);
24
+ updateAnimationQueue(animation);
25
+ return () => {
26
+ if (animation.state !== "finished") animation.complete();
27
+ };
28
+ });
29
+ onSettled(() => {
30
+ isFirstRender = false;
31
+ });
32
+ function enter(element) {
33
+ const style = window.getComputedStyle(element);
34
+ const options = getTransitionConfig(style);
35
+ return animate(element, { opacity: [`var(--drawer--opacity-from)`, `var(--drawer--opacity-to)`] }, options);
36
+ }
37
+ function exit(element) {
38
+ const style = window.getComputedStyle(element);
39
+ const options = getTransitionConfig(style);
40
+ return animate(element, { opacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`] }, options);
41
+ }
42
+ element.addEventListener("click", () => {
43
+ if (state.isAnimating) return;
44
+ close();
45
+ }, { signal: controller.signal });
46
+ onCleanup(() => {
47
+ controller.abort();
48
+ });
76
49
  };
77
-
50
+ //#endregion
78
51
  export { Component, Name };
79
- //# sourceMappingURL=drawer-backdrop.js.map
52
+
80
53
  //# sourceMappingURL=drawer-backdrop.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/drawer-backdrop.ts"],"names":["element"],"mappings":";;;;;AAUO,MAAM,IAAO,GAAA,CAAA,eAAA;AAEb,MAAM,SAAyC,GAAA,CAAC,CAAG,EAAA,EAAE,SAAc,KAAA;AACxE,EAAM,MAAA,CAAC,OAAO,EAAE,oBAAA,EAAsB,OAAO,CAAA,GAAI,UAAU,OAAO,CAAA;AAClE,EAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,EAAA;AAEvC,EAAA,IAAI,aAAgB,GAAA,IAAA;AAEpB,EAAA,YAAA;AAAA,IACE,EAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAI,IAAA,CAAC,UAAU,aAAe,EAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,MAAM,OAAO,CAAA;AAC/B,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAC9B,QAAA,OAAO,UAAU,MAAM;AACrB,UAAA,IAAI,SAAU,CAAA,KAAA,KAAU,UAAY,EAAA,SAAA,CAAU,QAAS,EAAA;AAAA,SACxD,CAAA;AAAA;AACH;AACF,GACF;AAEA,EAAA,YAAA;AAAA,IACE,EAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAA,IAAI,UAAU,aAAe,EAAA;AAC7B,QAAM,MAAA,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAC9B,QAAA,OAAO,UAAU,MAAM;AACrB,UAAA,IAAI,SAAU,CAAA,KAAA,KAAU,UAAY,EAAA,SAAA,CAAU,QAAS,EAAA;AAAA,SACxD,CAAA;AAAA;AACH;AACF,GACF;AAEA,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAgB,aAAA,GAAA,KAAA;AAAA,GACjB,CAAA;AAED,EAAA,SAAS,MAAMA,QAAsB,EAAA;AACnC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,gBAAA,CAAiBA,QAAO,CAAA;AAC7C,IAAM,MAAA,OAAA,GAAU,oBAAoB,KAAK,CAAA;AACzC,IAAO,OAAA,OAAA;AAAA,MACLA,QAAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,CAAC,CAAA,2BAAA,CAAA,EAA+B,CAA2B,yBAAA,CAAA;AAAA,OACtE;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,IAAO,OAAA,OAAA;AAAA,MACLA,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;AAAA,IACN,OAAA;AAAA,IACA,MAAM;AACJ,MAAA,IAAI,MAAM,WAAa,EAAA;AACvB,MAAM,KAAA,EAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,QAAQ,UAAW,CAAA;AAAA;AACrB,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,KAAM,EAAA;AAAA,GAClB,CAAA;AAED,EAAgB,aAAA,GAAA,KAAA;AAClB","file":"drawer-backdrop.js","sourcesContent":["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"]}
1
+ {"version":3,"file":"drawer-backdrop.js","names":[],"sources":["../../../src/components/drawer-backdrop.ts"],"sourcesContent":["import { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\nimport type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport { createGuardedEffect } from \"@brytdesigns/web-component-core/utils\";\nimport { animate } from \"motion\";\nimport { onCleanup, onSettled } from \"solid-js\";\n\nimport { useDrawer } from \"../hooks/index.js\";\n\nexport type Props = {};\n\nexport const Name = `drawer-backdrop`;\n\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\n\tconst [state, { updateAnimationQueue, close }] = useDrawer(element);\n\tconst controller = new AbortController();\n\n\tlet isFirstRender = true;\n\n\tcreateGuardedEffect(\n\t\t() => state.isOpen,\n\t\t(isOpen) => {\n\t\t\tif (!isOpen || isFirstRender) return;\n\t\t\tconst animation = enter(element);\n\t\t\tupdateAnimationQueue(animation);\n\t\t\treturn () => {\n\t\t\t\tif (animation.state !== \"finished\") animation.complete();\n\t\t\t};\n\t\t},\n\t);\n\n\tcreateGuardedEffect(\n\t\t() => state.isOpen,\n\t\t(isOpen) => {\n\t\t\tif (isOpen || isFirstRender) return;\n\t\t\tconst animation = exit(element);\n\t\t\tupdateAnimationQueue(animation);\n\t\t\treturn () => {\n\t\t\t\tif (animation.state !== \"finished\") animation.complete();\n\t\t\t};\n\t\t},\n\t);\n\n\tonSettled(() => {\n\t\tisFirstRender = false;\n\t});\n\n\tfunction enter(element: HTMLElement) {\n\t\tconst style = window.getComputedStyle(element);\n\t\tconst options = getTransitionConfig(style);\n\t\treturn animate(\n\t\t\telement,\n\t\t\t{\n\t\t\t\topacity: [`var(--drawer--opacity-from)`, `var(--drawer--opacity-to)`],\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\tfunction exit(element: HTMLElement) {\n\t\tconst style = window.getComputedStyle(element);\n\t\tconst options = getTransitionConfig(style);\n\t\treturn animate(\n\t\t\telement,\n\t\t\t{\n\t\t\t\topacity: [`var(--drawer--opacity-to)`, `var(--drawer--opacity-from)`],\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n\n\telement.addEventListener(\n\t\t\"click\",\n\t\t() => {\n\t\t\tif (state.isAnimating) return;\n\t\t\tclose();\n\t\t},\n\t\t{\n\t\t\tsignal: controller.signal,\n\t\t},\n\t);\n\n\tonCleanup(() => {\n\t\tcontroller.abort();\n\t});\n};\n"],"mappings":";;;;;;;AAUA,IAAa,OAAO;AAEpB,IAAa,aAA0C,GAAG,EAAE,cAAc;CACzE,MAAM,CAAC,OAAO,EAAE,sBAAsB,WAAW,UAAU,OAAO;CAClE,MAAM,aAAa,IAAI,gBAAgB;CAEvC,IAAI,gBAAgB;CAEpB,0BACO,MAAM,SACX,WAAW;EACX,IAAI,CAAC,UAAU,eAAe;EAC9B,MAAM,YAAY,MAAM,OAAO;EAC/B,qBAAqB,SAAS;EAC9B,aAAa;GACZ,IAAI,UAAU,UAAU,YAAY,UAAU,SAAS;EACxD;CACD,CACD;CAEA,0BACO,MAAM,SACX,WAAW;EACX,IAAI,UAAU,eAAe;EAC7B,MAAM,YAAY,KAAK,OAAO;EAC9B,qBAAqB,SAAS;EAC9B,aAAa;GACZ,IAAI,UAAU,UAAU,YAAY,UAAU,SAAS;EACxD;CACD,CACD;CAEA,gBAAgB;EACf,gBAAgB;CACjB,CAAC;CAED,SAAS,MAAM,SAAsB;EACpC,MAAM,QAAQ,OAAO,iBAAiB,OAAO;EAC7C,MAAM,UAAU,oBAAoB,KAAK;EACzC,OAAO,QACN,SACA,EACC,SAAS,CAAC,+BAA+B,2BAA2B,EACrE,GACA,OACD;CACD;CAEA,SAAS,KAAK,SAAsB;EACnC,MAAM,QAAQ,OAAO,iBAAiB,OAAO;EAC7C,MAAM,UAAU,oBAAoB,KAAK;EACzC,OAAO,QACN,SACA,EACC,SAAS,CAAC,6BAA6B,6BAA6B,EACrE,GACA,OACD;CACD;CAEA,QAAQ,iBACP,eACM;EACL,IAAI,MAAM,aAAa;EACvB,MAAM;CACP,GACA,EACC,QAAQ,WAAW,OACpB,CACD;CAEA,gBAAgB;EACf,WAAW,MAAM;CAClB,CAAC;AACF"}
@@ -1,86 +1,63 @@
1
- import { createEffect, on, onMount, onCleanup } from 'solid-js';
2
- import { animate } from 'motion';
3
- import { getTransitionConfig } from '@brytdesigns/web-component-core/animation';
4
- import { useDrawer } from '../hooks/index.js';
5
- import { POSITION } from '../consts.js';
6
-
7
- const Name = `drawer-content`;
8
- const Component = (_, { element }) => {
9
- const [state, { updateAnimationQueue }] = useDrawer(element);
10
- let isFirstRender = true;
11
- createEffect(
12
- on(
13
- () => state.isOpen,
14
- (isOpen) => {
15
- if (!isOpen || isFirstRender) return;
16
- const animation = enter(element);
17
- updateAnimationQueue(animation);
18
- return onCleanup(() => {
19
- if (animation.state !== "finished") animation.complete();
20
- });
21
- }
22
- )
23
- );
24
- createEffect(
25
- on(
26
- () => state.isOpen,
27
- (isOpen) => {
28
- if (isOpen || isFirstRender) return;
29
- const animation = exit(element);
30
- updateAnimationQueue(animation);
31
- return onCleanup(() => {
32
- if (animation.state !== "finished") animation.complete();
33
- });
34
- }
35
- )
36
- );
37
- onMount(() => {
38
- isFirstRender = false;
39
- });
40
- function enter(element2) {
41
- const style = window.getComputedStyle(element2);
42
- const transition = getTransitionConfig(style);
43
- let position = style.getPropertyValue(`--drawer--position`);
44
- if (!position) position = POSITION.LEFT;
45
- let transform = {
46
- x: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`]
47
- };
48
- if (position === POSITION.TOP || position === POSITION.BOTTOM) {
49
- transform = {
50
- y: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`]
51
- };
52
- }
53
- return animate(
54
- element2,
55
- {
56
- ...transform
57
- },
58
- transition
59
- );
60
- }
61
- function exit(element2) {
62
- const style = window.getComputedStyle(element2);
63
- const transition = getTransitionConfig(style);
64
- let position = style.getPropertyValue(`--drawer--position`);
65
- if (!position) position = POSITION.LEFT;
66
- let transform = {
67
- x: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`]
68
- };
69
- if (position === POSITION.TOP || position === POSITION.BOTTOM) {
70
- transform = {
71
- y: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`]
72
- };
73
- }
74
- return animate(
75
- element2,
76
- {
77
- ...transform
78
- },
79
- transition
80
- );
81
- }
1
+ import { useDrawer } from "../hooks/useDrawer.js";
2
+ import "../hooks/index.js";
3
+ import { POSITION } from "../consts.js";
4
+ import { createGuardedEffect } from "@brytdesigns/web-component-core/utils";
5
+ import { getTransitionConfig } from "@brytdesigns/web-component-core/animation";
6
+ import { animate } from "motion";
7
+ import { onSettled } from "solid-js";
8
+ //#region src/components/drawer-content.ts
9
+ var Name = `drawer-content`;
10
+ var Component = (_, { element }) => {
11
+ const [state, { updateAnimationQueue }] = useDrawer(element);
12
+ let isFirstRender = true;
13
+ if (!element.hasAttribute("role")) element.setAttribute("role", "dialog");
14
+ if (!element.hasAttribute("tabindex")) element.setAttribute("tabindex", "-1");
15
+ onSettled(() => {
16
+ if (!(element.hasAttribute("aria-labelledby") || element.hasAttribute("aria-label"))) console.warn("drawer-content: no accessible name. Add an aria-label, or an aria-labelledby pointing at the heading inside it.", element);
17
+ });
18
+ createGuardedEffect(() => state.isOpen, (isOpen) => {
19
+ if (isOpen) element.setAttribute("aria-modal", "true");
20
+ else element.removeAttribute("aria-modal");
21
+ });
22
+ createGuardedEffect(() => state.isOpen, (isOpen) => {
23
+ if (!isOpen || isFirstRender) return;
24
+ const animation = enter(element);
25
+ updateAnimationQueue(animation);
26
+ return () => {
27
+ if (animation.state !== "finished") animation.complete();
28
+ };
29
+ });
30
+ createGuardedEffect(() => state.isOpen, (isOpen) => {
31
+ if (isOpen || isFirstRender) return;
32
+ const animation = exit(element);
33
+ updateAnimationQueue(animation);
34
+ return () => {
35
+ if (animation.state !== "finished") animation.complete();
36
+ };
37
+ });
38
+ onSettled(() => {
39
+ isFirstRender = false;
40
+ });
41
+ function enter(element) {
42
+ const style = window.getComputedStyle(element);
43
+ const transition = getTransitionConfig(style);
44
+ let position = style.getPropertyValue(`--drawer--position`);
45
+ if (!position) position = POSITION.LEFT;
46
+ let transform = { x: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`] };
47
+ if (position === POSITION.TOP || position === POSITION.BOTTOM) transform = { y: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`] };
48
+ return animate(element, { ...transform }, transition);
49
+ }
50
+ function exit(element) {
51
+ const style = window.getComputedStyle(element);
52
+ const transition = getTransitionConfig(style);
53
+ let position = style.getPropertyValue(`--drawer--position`);
54
+ if (!position) position = POSITION.LEFT;
55
+ let transform = { x: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`] };
56
+ if (position === POSITION.TOP || position === POSITION.BOTTOM) transform = { y: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`] };
57
+ return animate(element, { ...transform }, transition);
58
+ }
82
59
  };
83
-
60
+ //#endregion
84
61
  export { Component, Name };
85
- //# sourceMappingURL=drawer-content.js.map
62
+
86
63
  //# sourceMappingURL=drawer-content.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/drawer-content.ts"],"names":["element"],"mappings":";;;;;;AAWO,MAAM,IAAO,GAAA,CAAA,cAAA;AAEb,MAAM,SAAyC,GAAA,CAAC,CAAG,EAAA,EAAE,SAAc,KAAA;AACxE,EAAA,MAAM,CAAC,KAAO,EAAA,EAAE,sBAAsB,CAAA,GAAI,UAAU,OAAO,CAAA;AAE3D,EAAA,IAAI,aAAgB,GAAA,IAAA;AAEpB,EAAA,YAAA;AAAA,IACE,EAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAI,IAAA,CAAC,UAAU,aAAe,EAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,MAAM,OAAO,CAAA;AAC/B,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAC9B,QAAA,OAAO,UAAU,MAAM;AACrB,UAAA,IAAI,SAAU,CAAA,KAAA,KAAU,UAAY,EAAA,SAAA,CAAU,QAAS,EAAA;AAAA,SACxD,CAAA;AAAA;AACH;AACF,GACF;AAEA,EAAA,YAAA;AAAA,IACE,EAAA;AAAA,MACE,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,CAAC,MAAW,KAAA;AACV,QAAA,IAAI,UAAU,aAAe,EAAA;AAC7B,QAAM,MAAA,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAC9B,QAAA,OAAO,UAAU,MAAM;AACrB,UAAA,IAAI,SAAU,CAAA,KAAA,KAAU,UAAY,EAAA,SAAA,CAAU,QAAS,EAAA;AAAA,SACxD,CAAA;AAAA;AACH;AACF,GACF;AAEA,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAgB,aAAA,GAAA,KAAA;AAAA,GACjB,CAAA;AAED,EAAA,SAAS,MAAMA,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,CAAoB,kBAAA,CAAA,CAAA;AAC1D,IAAI,IAAA,CAAC,QAAU,EAAA,QAAA,GAAW,QAAS,CAAA,IAAA;AAEnC,IAAA,IAAI,SAAsC,GAAA;AAAA,MACxC,CAAA,EAAG,CAAC,CAAA,yBAAA,CAAA,EAA6B,CAAyB,uBAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,IAAI,QAAa,KAAA,QAAA,CAAS,GAAO,IAAA,QAAA,KAAa,SAAS,MAAQ,EAAA;AAC7D,MAAY,SAAA,GAAA;AAAA,QACV,CAAA,EAAG,CAAC,CAAA,yBAAA,CAAA,EAA6B,CAAyB,uBAAA,CAAA;AAAA,OAC5D;AAAA;AAGF,IAAO,OAAA,OAAA;AAAA,MACLA,QAAAA;AAAA,MACA;AAAA,QACE,GAAG;AAAA,OACL;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,CAAoB,kBAAA,CAAA,CAAA;AAC1D,IAAI,IAAA,CAAC,QAAU,EAAA,QAAA,GAAW,QAAS,CAAA,IAAA;AAEnC,IAAA,IAAI,SAAsC,GAAA;AAAA,MACxC,CAAA,EAAG,CAAC,CAAA,uBAAA,CAAA,EAA2B,CAA2B,yBAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,IAAI,QAAa,KAAA,QAAA,CAAS,GAAO,IAAA,QAAA,KAAa,SAAS,MAAQ,EAAA;AAC7D,MAAY,SAAA,GAAA;AAAA,QACV,CAAA,EAAG,CAAC,CAAA,uBAAA,CAAA,EAA2B,CAA2B,yBAAA,CAAA;AAAA,OAC5D;AAAA;AAGF,IAAO,OAAA,OAAA;AAAA,MACLA,QAAAA;AAAA,MACA;AAAA,QACE,GAAG;AAAA,OACL;AAAA,MACA;AAAA,KACF;AAAA;AAEJ","file":"drawer-content.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"]}
1
+ {"version":3,"file":"drawer-content.js","names":[],"sources":["../../../src/components/drawer-content.ts"],"sourcesContent":["import { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\nimport type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport { createGuardedEffect } from \"@brytdesigns/web-component-core/utils\";\nimport { animate } from \"motion\";\nimport { onSettled } from \"solid-js\";\nimport { POSITION, type Position } from \"../consts.js\";\nimport { useDrawer } from \"../hooks/index.js\";\n\nexport type Props = {};\n\nexport const Name = `drawer-content`;\n\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\n\tconst [state, { updateAnimationQueue }] = useDrawer(element);\n\n\tlet isFirstRender = true;\n\n\t// The element that *is* the dialog, as far as assistive tech is concerned.\n\t// Until now this published nothing: no role, no name, no aria-modal, so a\n\t// screen reader saw an unlabelled div that happened to hold the focus.\n\t//\n\t// An authored role or tabindex is left alone — a theme that already made\n\t// this an alertdialog knows something this component does not.\n\tif (!element.hasAttribute(\"role\")) element.setAttribute(\"role\", \"dialog\");\n\tif (!element.hasAttribute(\"tabindex\")) element.setAttribute(\"tabindex\", \"-1\");\n\n\tonSettled(() => {\n\t\tconst named =\n\t\t\telement.hasAttribute(\"aria-labelledby\") ||\n\t\t\telement.hasAttribute(\"aria-label\");\n\t\tif (!named) {\n\t\t\tconsole.warn(\n\t\t\t\t\"drawer-content: no accessible name. Add an aria-label, or an aria-labelledby pointing at the heading inside it.\",\n\t\t\t\telement,\n\t\t\t);\n\t\t}\n\t});\n\n\tcreateGuardedEffect(\n\t\t() => state.isOpen,\n\t\t(isOpen) => {\n\t\t\t// `aria-modal` claims focus is confined to this subtree, which is only\n\t\t\t// true while it is open. Left on a closed overlay it tells assistive\n\t\t\t// tech the rest of the page is unavailable when it is not.\n\t\t\tif (isOpen) element.setAttribute(\"aria-modal\", \"true\");\n\t\t\telse element.removeAttribute(\"aria-modal\");\n\t\t},\n\t);\n\n\tcreateGuardedEffect(\n\t\t() => state.isOpen,\n\t\t(isOpen) => {\n\t\t\tif (!isOpen || isFirstRender) return;\n\t\t\tconst animation = enter(element);\n\t\t\tupdateAnimationQueue(animation);\n\t\t\treturn () => {\n\t\t\t\tif (animation.state !== \"finished\") animation.complete();\n\t\t\t};\n\t\t},\n\t);\n\n\tcreateGuardedEffect(\n\t\t() => state.isOpen,\n\t\t(isOpen) => {\n\t\t\tif (isOpen || isFirstRender) return;\n\t\t\tconst animation = exit(element);\n\t\t\tupdateAnimationQueue(animation);\n\t\t\treturn () => {\n\t\t\t\tif (animation.state !== \"finished\") animation.complete();\n\t\t\t};\n\t\t},\n\t);\n\n\tonSettled(() => {\n\t\tisFirstRender = false;\n\t});\n\n\tfunction enter(element: HTMLElement) {\n\t\tconst style = window.getComputedStyle(element);\n\t\tconst transition = getTransitionConfig(style);\n\t\tlet position = style.getPropertyValue(`--drawer--position`) as Position;\n\t\tif (!position) position = POSITION.LEFT;\n\n\t\tlet transform: Record<string, string[]> = {\n\t\t\tx: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`],\n\t\t};\n\n\t\tif (position === POSITION.TOP || position === POSITION.BOTTOM) {\n\t\t\ttransform = {\n\t\t\t\ty: [`var(--drawer--slide-from)`, `var(--drawer--slide-to)`],\n\t\t\t};\n\t\t}\n\n\t\treturn animate(\n\t\t\telement,\n\t\t\t{\n\t\t\t\t...transform,\n\t\t\t},\n\t\t\ttransition,\n\t\t);\n\t}\n\n\tfunction exit(element: HTMLElement) {\n\t\tconst style = window.getComputedStyle(element);\n\t\tconst transition = getTransitionConfig(style);\n\t\tlet position = style.getPropertyValue(`--drawer--position`) as Position;\n\t\tif (!position) position = POSITION.LEFT;\n\n\t\tlet transform: Record<string, string[]> = {\n\t\t\tx: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`],\n\t\t};\n\n\t\tif (position === POSITION.TOP || position === POSITION.BOTTOM) {\n\t\t\ttransform = {\n\t\t\t\ty: [`var(--drawer--slide-to)`, `var(--drawer--slide-from)`],\n\t\t\t};\n\t\t}\n\n\t\treturn animate(\n\t\t\telement,\n\t\t\t{\n\t\t\t\t...transform,\n\t\t\t},\n\t\t\ttransition,\n\t\t);\n\t}\n};\n"],"mappings":";;;;;;;;AAUA,IAAa,OAAO;AAEpB,IAAa,aAA0C,GAAG,EAAE,cAAc;CACzE,MAAM,CAAC,OAAO,EAAE,0BAA0B,UAAU,OAAO;CAE3D,IAAI,gBAAgB;CAQpB,IAAI,CAAC,QAAQ,aAAa,MAAM,GAAG,QAAQ,aAAa,QAAQ,QAAQ;CACxE,IAAI,CAAC,QAAQ,aAAa,UAAU,GAAG,QAAQ,aAAa,YAAY,IAAI;CAE5E,gBAAgB;EAIf,IAAI,EAFH,QAAQ,aAAa,iBAAiB,KACtC,QAAQ,aAAa,YAAY,IAEjC,QAAQ,KACP,mHACA,OACD;CAEF,CAAC;CAED,0BACO,MAAM,SACX,WAAW;EAIX,IAAI,QAAQ,QAAQ,aAAa,cAAc,MAAM;OAChD,QAAQ,gBAAgB,YAAY;CAC1C,CACD;CAEA,0BACO,MAAM,SACX,WAAW;EACX,IAAI,CAAC,UAAU,eAAe;EAC9B,MAAM,YAAY,MAAM,OAAO;EAC/B,qBAAqB,SAAS;EAC9B,aAAa;GACZ,IAAI,UAAU,UAAU,YAAY,UAAU,SAAS;EACxD;CACD,CACD;CAEA,0BACO,MAAM,SACX,WAAW;EACX,IAAI,UAAU,eAAe;EAC7B,MAAM,YAAY,KAAK,OAAO;EAC9B,qBAAqB,SAAS;EAC9B,aAAa;GACZ,IAAI,UAAU,UAAU,YAAY,UAAU,SAAS;EACxD;CACD,CACD;CAEA,gBAAgB;EACf,gBAAgB;CACjB,CAAC;CAED,SAAS,MAAM,SAAsB;EACpC,MAAM,QAAQ,OAAO,iBAAiB,OAAO;EAC7C,MAAM,aAAa,oBAAoB,KAAK;EAC5C,IAAI,WAAW,MAAM,iBAAiB,oBAAoB;EAC1D,IAAI,CAAC,UAAU,WAAW,SAAS;EAEnC,IAAI,YAAsC,EACzC,GAAG,CAAC,6BAA6B,yBAAyB,EAC3D;EAEA,IAAI,aAAa,SAAS,OAAO,aAAa,SAAS,QACtD,YAAY,EACX,GAAG,CAAC,6BAA6B,yBAAyB,EAC3D;EAGD,OAAO,QACN,SACA,EACC,GAAG,UACJ,GACA,UACD;CACD;CAEA,SAAS,KAAK,SAAsB;EACnC,MAAM,QAAQ,OAAO,iBAAiB,OAAO;EAC7C,MAAM,aAAa,oBAAoB,KAAK;EAC5C,IAAI,WAAW,MAAM,iBAAiB,oBAAoB;EAC1D,IAAI,CAAC,UAAU,WAAW,SAAS;EAEnC,IAAI,YAAsC,EACzC,GAAG,CAAC,2BAA2B,2BAA2B,EAC3D;EAEA,IAAI,aAAa,SAAS,OAAO,aAAa,SAAS,QACtD,YAAY,EACX,GAAG,CAAC,2BAA2B,2BAA2B,EAC3D;EAGD,OAAO,QACN,SACA,EACC,GAAG,UACJ,GACA,UACD;CACD;AACD"}
@@ -1,116 +1,122 @@
1
- import { disableBodyScroll, enableBodyScroll } from '@brytdesigns/web-component-core/utils';
2
- import { splitProps, createEffect, on, onCleanup } from 'solid-js';
3
- import { createFocusTrap } from '@brytdesigns/web-component-core/focusTrap';
4
- import { provideDrawerContext, useDrawerContext } from '../hooks/index.js';
5
- import { showElement, hideElement } from '../utils.js';
6
-
7
- const Name = `drawer-context`;
8
- const Component = (props, { element }) => {
9
- const [contextProps, restProps] = splitProps(props, [
10
- "isOpen",
11
- "isAnimating"
12
- ]);
13
- const context = provideDrawerContext(contextProps, element);
14
- const [state, { setElementState }] = context;
15
- const [_, { updateAnimationQueue, ...events }] = useDrawerContext(context);
16
- element.actions = events;
17
- const focusTrap = createFocusTrap(element, () => ({
18
- allowOutsideClick: true,
19
- escapeDeactivates: restProps.closeOnEscape,
20
- onDeactivate: () => {
21
- setElementState("isOpen", false);
22
- }
23
- }));
24
- createEffect(() => {
25
- if (!props.debug) return;
26
- console.table({
27
- ...state
28
- });
29
- });
30
- createEffect(
31
- on(
32
- () => state.isOpen,
33
- (isOpen) => {
34
- const eventName = isOpen ? "drawer:open" : "drawer:close";
35
- element.dispatchEvent(
36
- new CustomEvent(eventName, {
37
- bubbles: true,
38
- detail: { isOpen, relatedTarget: element }
39
- })
40
- );
41
- element.dispatchEvent(
42
- new CustomEvent("drawer:toggle", {
43
- bubbles: true,
44
- detail: { isOpen, relatedTarget: element }
45
- })
46
- );
47
- }
48
- )
49
- );
50
- createEffect(
51
- on(
52
- () => ({
53
- isOpen: state.isOpen,
54
- focusTrap: focusTrap(),
55
- shouldTrapFocus: restProps.shouldTrapFocus
56
- }),
57
- ({ isOpen, focusTrap: focusTrap2, shouldTrapFocus }) => {
58
- if (!isOpen) return;
59
- if (props.debug) console.log("Showing element", element);
60
- showElement(element);
61
- if (!shouldTrapFocus) return;
62
- focusTrap2.activate();
63
- onCleanup(focusTrap2.deactivate);
64
- }
65
- )
66
- );
67
- createEffect(
68
- on(
69
- () => ({
70
- isOpen: state.isOpen,
71
- isAnimating: state.isAnimating,
72
- shouldTrapFocus: props.shouldTrapFocus
73
- }),
74
- ({ isOpen, isAnimating, shouldTrapFocus }) => {
75
- if (isOpen && !isAnimating && shouldTrapFocus)
76
- return disableBodyScroll(element, {
77
- allowTouchMove: (el) => {
78
- if (el instanceof HTMLElement) {
79
- let element2 = el;
80
- while (element2 && element2 !== document.body) {
81
- if (element2.tagName === "DRAWER-CONTENT") {
82
- return true;
83
- }
84
- element2 = element2.parentElement;
85
- }
86
- }
87
- return false;
88
- }
89
- });
90
- onCleanup(() => {
91
- enableBodyScroll(element);
92
- });
93
- }
94
- )
95
- );
96
- createEffect(
97
- on(
98
- () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),
99
- ({ isOpen, animationQueue }) => {
100
- if (isOpen) return;
101
- if (props.debug)
102
- console.log("Waiting for animations to complete...", animationQueue);
103
- return Promise.all(animationQueue).then(() => hideElement(element)).then(() => {
104
- if (props.debug) console.log("Hiding element", element);
105
- });
106
- }
107
- )
108
- );
109
- onCleanup(() => {
110
- enableBodyScroll(element);
111
- });
1
+ import { provideDrawerContext, useDrawerContext } from "../hooks/useDrawer.js";
2
+ import "../hooks/index.js";
3
+ import { hideElement, showElement } from "../utils.js";
4
+ import { closeNestedOverlays, createEscapeHandler, createFocusReturn, createGuardedEffect, disableBodyScroll, enableBodyScroll, findOverlayPanel } from "@brytdesigns/web-component-core/utils";
5
+ import { omit, onCleanup, untrack } from "solid-js";
6
+ import { createFocusTrap } from "@brytdesigns/web-component-core/focusTrap";
7
+ //#region src/components/drawer-context.ts
8
+ var Name = `drawer-context`;
9
+ var Component = (props, { element }) => {
10
+ const debug = untrack(() => props.debug);
11
+ const restProps = omit(props, "isOpen", "isAnimating");
12
+ const context = provideDrawerContext({
13
+ get isOpen() {
14
+ return props.isOpen;
15
+ },
16
+ get isAnimating() {
17
+ return props.isAnimating;
18
+ }
19
+ }, element);
20
+ const [state, { setElementState }] = context;
21
+ const [_, { updateAnimationQueue, ...events }] = useDrawerContext(context);
22
+ element.actions = events;
23
+ const panel = () => findOverlayPanel(element, "drawer-content");
24
+ const focusReturn = createFocusReturn(element);
25
+ const focusTrap = createFocusTrap(element, () => ({
26
+ allowOutsideClick: true,
27
+ escapeDeactivates: false,
28
+ returnFocusOnDeactivate: false,
29
+ initialFocus: () => panel() ?? false,
30
+ fallbackFocus: () => panel() ?? element
31
+ }));
32
+ createGuardedEffect(() => ({
33
+ isOpen: state.isOpen,
34
+ closeOnEscape: restProps.closeOnEscape
35
+ }), ({ isOpen, closeOnEscape }) => {
36
+ if (!isOpen || !closeOnEscape) return;
37
+ return createEscapeHandler({
38
+ element,
39
+ onEscape: () => setElementState("isOpen", false)
40
+ });
41
+ });
42
+ createGuardedEffect(() => ({
43
+ debug,
44
+ snapshot: { ...state }
45
+ }), ({ debug, snapshot }) => {
46
+ if (!debug) return;
47
+ console.table(snapshot);
48
+ });
49
+ createGuardedEffect(() => state.isOpen, (isOpen) => {
50
+ const eventName = isOpen ? "drawer:open" : "drawer:close";
51
+ element.dispatchEvent(new CustomEvent(eventName, {
52
+ bubbles: true,
53
+ detail: {
54
+ isOpen,
55
+ relatedTarget: element
56
+ }
57
+ }));
58
+ element.dispatchEvent(new CustomEvent("drawer:toggle", {
59
+ bubbles: true,
60
+ detail: {
61
+ isOpen,
62
+ relatedTarget: element
63
+ }
64
+ }));
65
+ });
66
+ createGuardedEffect(() => ({
67
+ isOpen: state.isOpen,
68
+ isAnimating: state.isAnimating,
69
+ focusTrap: focusTrap(),
70
+ shouldTrapFocus: restProps.shouldTrapFocus
71
+ }), ({ isOpen, isAnimating, focusTrap, shouldTrapFocus }) => {
72
+ if (!isOpen) return;
73
+ if (debug) console.log("Showing element", element);
74
+ showElement(element);
75
+ if (!shouldTrapFocus || isAnimating) return;
76
+ focusReturn.record();
77
+ focusTrap.activate();
78
+ return () => {
79
+ focusTrap.deactivate();
80
+ focusReturn.restore();
81
+ };
82
+ });
83
+ createGuardedEffect(() => ({
84
+ isOpen: state.isOpen,
85
+ isAnimating: state.isAnimating,
86
+ shouldTrapFocus: props.shouldTrapFocus
87
+ }), ({ isOpen, isAnimating, shouldTrapFocus }) => {
88
+ if (!isOpen || isAnimating || !shouldTrapFocus) return;
89
+ disableBodyScroll(element, { allowTouchMove: (el) => {
90
+ if (el instanceof HTMLElement) {
91
+ let element = el;
92
+ while (element && element !== document.body) {
93
+ if (element.tagName === "DRAWER-CONTENT") return true;
94
+ element = element.parentElement;
95
+ }
96
+ }
97
+ return false;
98
+ } });
99
+ return () => enableBodyScroll(element);
100
+ });
101
+ createGuardedEffect(() => state.isOpen, (isOpen, previous) => {
102
+ if (previous === void 0 || isOpen) return;
103
+ closeNestedOverlays(element);
104
+ });
105
+ createGuardedEffect(() => ({
106
+ isOpen: state.isOpen,
107
+ animationQueue: state.animationQueue
108
+ }), ({ isOpen, animationQueue }) => {
109
+ if (isOpen) return;
110
+ if (debug) console.log("Waiting for animations to complete...", animationQueue);
111
+ Promise.all(animationQueue).then(() => hideElement(element)).then(() => {
112
+ if (debug) console.log("Hiding element", element);
113
+ });
114
+ });
115
+ onCleanup(() => {
116
+ enableBodyScroll(element);
117
+ });
112
118
  };
113
-
119
+ //#endregion
114
120
  export { Component, Name };
115
- //# sourceMappingURL=drawer-context.js.map
121
+
116
122
  //# sourceMappingURL=drawer-context.js.map