@brytdesigns/web-component-modal 1.0.8 → 1.0.9
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
CHANGED
|
@@ -188,69 +188,75 @@ var Component2 = (props, { element }) => {
|
|
|
188
188
|
`${Name2}: action prop must be 'close', 'open', or 'toggle'`
|
|
189
189
|
);
|
|
190
190
|
if (!on5) return console.warn(`${Name2}: on prop is required!`);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
element
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
191
|
+
try {
|
|
192
|
+
const target = document.querySelector(targetProp);
|
|
193
|
+
if (!target)
|
|
194
|
+
return console.warn(`${Name2}: target element not found!`, {
|
|
195
|
+
element,
|
|
196
|
+
target: targetProp
|
|
197
|
+
});
|
|
198
|
+
const controller = new AbortController();
|
|
199
|
+
invokeOnLoaded(
|
|
200
|
+
() => {
|
|
201
|
+
createRoot((dispose) => {
|
|
202
|
+
const [state, { open, close, toggle }] = getModalContext(target);
|
|
203
|
+
switch (on5) {
|
|
204
|
+
case "enter": {
|
|
205
|
+
let unsubscribe = null;
|
|
206
|
+
if (action === "toggle") {
|
|
207
|
+
unsubscribe = observeElementInViewport(element, open, close);
|
|
208
|
+
}
|
|
209
|
+
if (unsubscribe) onCleanup(unsubscribe);
|
|
210
|
+
break;
|
|
207
211
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
case "exit": {
|
|
213
|
+
let unsubscribe = null;
|
|
214
|
+
if (action === "toggle") {
|
|
215
|
+
unsubscribe = observeElementInViewport(element, close, open);
|
|
216
|
+
}
|
|
217
|
+
if (unsubscribe) onCleanup(unsubscribe);
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
default: {
|
|
221
|
+
element.addEventListener(
|
|
222
|
+
on5,
|
|
223
|
+
(event) => {
|
|
224
|
+
if (preventDefault) event.preventDefault();
|
|
225
|
+
if (state.isAnimating) return;
|
|
226
|
+
switch (action) {
|
|
227
|
+
case "close":
|
|
228
|
+
close();
|
|
229
|
+
break;
|
|
230
|
+
case "open":
|
|
231
|
+
open();
|
|
232
|
+
break;
|
|
233
|
+
case "toggle":
|
|
234
|
+
toggle();
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
{ signal: controller.signal }
|
|
239
|
+
);
|
|
240
|
+
break;
|
|
215
241
|
}
|
|
216
|
-
if (unsubscribe) onCleanup(unsubscribe);
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
default: {
|
|
220
|
-
element.addEventListener(
|
|
221
|
-
on5,
|
|
222
|
-
(event) => {
|
|
223
|
-
if (preventDefault) event.preventDefault();
|
|
224
|
-
if (state.isAnimating) return;
|
|
225
|
-
switch (action) {
|
|
226
|
-
case "close":
|
|
227
|
-
close();
|
|
228
|
-
break;
|
|
229
|
-
case "open":
|
|
230
|
-
open();
|
|
231
|
-
break;
|
|
232
|
-
case "toggle":
|
|
233
|
-
toggle();
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
{ signal: controller.signal }
|
|
238
|
-
);
|
|
239
|
-
break;
|
|
240
242
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
243
|
+
createEffect(() => {
|
|
244
|
+
element.setAttribute("is-open", `${state.isOpen}`);
|
|
245
|
+
element.setAttribute("is-animating", `${state.isAnimating}`);
|
|
246
|
+
});
|
|
247
|
+
controller.signal.addEventListener("abort", dispose, {
|
|
248
|
+
once: true
|
|
249
|
+
});
|
|
245
250
|
});
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
251
|
+
},
|
|
252
|
+
{ signal: controller.signal }
|
|
253
|
+
);
|
|
254
|
+
return onCleanup(() => {
|
|
255
|
+
controller.abort();
|
|
256
|
+
});
|
|
257
|
+
} catch (e) {
|
|
258
|
+
console.error(e);
|
|
259
|
+
}
|
|
254
260
|
});
|
|
255
261
|
};
|
|
256
262
|
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/modal-panel.ts","../../src/hooks/useModal.ts","../../src/components/modal-trigger.ts","../../src/components/modal-backdrop.ts","../../src/components/modal-context.ts","../../src/utils.ts","../../src/index.ts"],"names":["currentValue","state","open","createEffect","on","onCleanup","element","Component","Name","onMount","getTransitionConfig","animate","splitProps","focusTrap"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, onMount, on, onCleanup } from \"solid-js\";\nimport { animate } from \"motion\";\nimport { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\n\nimport { useModal } from \"../hooks/index.js\";\n\ntype Props = {};\n\nexport const Name = \"modal-panel\";\n\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\n const [state, { updateAnimationQueue }] = useModal(element);\n\n let isFirstRender = true;\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (!isOpen || isFirstRender) return;\n const animation = enter(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (isOpen || isFirstRender) return;\n const animation = exit(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n onMount(() => {\n isFirstRender = false;\n });\n\n function enter(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const transition = getTransitionConfig(style);\n\n return animate(\n element,\n {\n x: [`var(--${Name}--slide-x-from)`, `var(--${Name}--slide-x-to)`],\n y: [`var(--${Name}--slide-y-from)`, `var(--${Name}--slide-y-to)`],\n scaleY: [`var(--${Name}--scale-y-from)`, `var(--${Name}--scale-y-to)`],\n scaleX: [`var(--${Name}--scale-x-from)`, `var(--${Name}--scale-x-to)`],\n opacity: [`var(--${Name}--opacity-from)`, `var(--${Name}--opacity-to)`],\n },\n transition,\n );\n }\n\n function exit(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const transition = getTransitionConfig(style);\n return animate(\n element,\n {\n x: [`var(--${Name}--slide-x-to)`, `var(--${Name}--slide-x-from)`],\n y: [`var(--${Name}--slide-y-to)`, `var(--${Name}--slide-y-from)`],\n scaleY: [`var(--${Name}--scale-y-to)`, `var(--${Name}--scale-y-from)`],\n scaleX: [`var(--${Name}--scale-x-to)`, `var(--${Name}--scale-x-from)`],\n opacity: [`var(--${Name}--opacity-to)`, `var(--${Name}--opacity-from)`],\n },\n transition,\n );\n }\n};\n","import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n createEffect,\n mergeProps,\n on,\n batch,\n splitProps,\n untrack,\n onCleanup,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n toHyphenated,\n getContextFromProvider,\n} from \"@brytdesigns/web-component-utils\";\n\nimport type { AnimationPlaybackControlsWithThen } from \"motion\";\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\n\ntype StoreContext = {\n animationQueue: AnimationPlaybackControlsWithThen[];\n};\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n isOpen: boolean;\n isAnimating: boolean;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ModalContext = ReturnType<typeof initializeModalContext>;\n\nfunction initializeModalContext(props: CreateContextOptions) {\n const [element, stateProps] = splitProps(props, [\"root\"]);\n const [store, setStore] = createStore<StoreContext>({ animationQueue: [] });\n\n createEffect(\n on(\n () => store.animationQueue,\n (animationQueue) => {\n if (!animationQueue.length) return;\n const controller = new AbortController();\n const animations = awaitAllAnimations(animationQueue);\n const abortableAnimations = abortablePromise(\n animations,\n controller.signal,\n );\n setElementState(\"isAnimating\", true);\n abortableAnimations.finally(() => {\n batch(() => {\n setElementState(\"isAnimating\", false);\n setStore(\"animationQueue\", []);\n });\n });\n\n return onCleanup(() => {\n controller.abort(\"Aborting modal animations\");\n });\n },\n ),\n );\n\n function setElementState(\n key: keyof Omit<CreateContextOptions, \"root\">,\n value: boolean | ((v: boolean) => boolean),\n ) {\n const currentValue = untrack(() => props[key]);\n if (typeof value === \"function\") {\n const currentValue = untrack(() => props[key]);\n const result = value(currentValue || false);\n if (`${currentValue}` === `${value}`) return;\n element.root.setAttribute(toHyphenated(key), `${result}`);\n return;\n }\n if (`${currentValue}` === `${value}`) return;\n return element.root.setAttribute(toHyphenated(key), `${value}`);\n }\n\n return [\n mergeProps(store, stateProps),\n { setElementState, setStore },\n ] as const;\n}\n\nconst ModalContextState = createContext(initializeModalContext);\n\nexport const provideModalContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): ModalContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(ModalContextState, props, element);\n};\n\nexport const useModalContext = (context: ModalContext) => {\n const [state, { setElementState, setStore: setState }] = context;\n\n function updateAnimationQueue(animation: AnimationPlaybackControlsWithThen) {\n setState(\"animationQueue\", (state) => [...state, animation]);\n }\n\n function close() {\n setElementState(\"isOpen\", false);\n }\n\n function open() {\n setElementState(\"isOpen\", true);\n }\n\n function toggle() {\n setElementState(\"isOpen\", (open) => !open);\n }\n\n return [state, { updateAnimationQueue, close, open, toggle }] as const;\n};\n\nexport const useModal = (element: HTMLElement & ICustomElement) => {\n const context: ModalContext = consume(ModalContextState, element);\n\n if (!context) {\n throw console.error(\n \"ModalContext not found! Please ensure to wrap your custom element with modal-context element.\",\n );\n }\n\n return useModalContext(context);\n};\n\nexport const getModalContext = (element: Element) => {\n const context = getContextFromProvider<ModalContext>(\n ModalContextState,\n element,\n );\n return useModalContext(context);\n};\n","import {\n invokeOnLoaded,\n type CorrectComponentType,\n} from \"@brytdesigns/web-component-utils\";\nimport type { Action } from \"../consts\";\n\nimport { createEffect, createRoot, on as _on, onCleanup } from \"solid-js\";\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\n\nimport { getModalContext } from \"../hooks/index.js\";\n\ntype Props = {\n target?: string;\n action?: Action | \"\";\n on?: keyof HTMLElementEventMap | \"enter\" | \"exit\";\n preventDefault: boolean;\n};\n\nexport const Name = \"modal-trigger\";\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n createEffect(() => {\n const targetProp = props.target,\n action = props.action,\n on = props.on,\n preventDefault = props.preventDefault;\n\n if (!targetProp)\n return console.warn(`${Name}: target prop is required!`, element);\n if (!action)\n return console.warn(`${Name}: action prop is required!`, element);\n if (action !== \"close\" && action !== \"open\" && action !== \"toggle\")\n return console.warn(\n `${Name}: action prop must be 'close', 'open', or 'toggle'`,\n );\n if (!on) return console.warn(`${Name}: on prop is required!`);\n\n const target = document.querySelector(targetProp);\n if (!target)\n return console.warn(`${Name}: target element not found!`, {\n element,\n target: targetProp,\n });\n\n const controller = new AbortController();\n\n invokeOnLoaded(\n () => {\n createRoot((dispose) => {\n const [state, { open, close, toggle }] = getModalContext(target);\n\n switch (on) {\n case \"enter\": {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, open, close);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n break;\n }\n case \"exit\": {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, close, open);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n break;\n }\n\n default: {\n element.addEventListener(\n on,\n (event) => {\n if (preventDefault) event.preventDefault();\n if (state.isAnimating) return;\n switch (action) {\n case \"close\":\n close();\n break;\n case \"open\":\n open();\n break;\n case \"toggle\":\n toggle();\n break;\n }\n },\n { signal: controller.signal },\n );\n break;\n }\n }\n\n createEffect(() => {\n element.setAttribute(\"is-open\", `${state.isOpen}`);\n element.setAttribute(\"is-animating\", `${state.isAnimating}`);\n });\n\n controller.signal.addEventListener(\"abort\", dispose, { once: true });\n });\n },\n { signal: controller.signal },\n );\n\n return onCleanup(() => {\n controller.abort();\n });\n });\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, onMount, on, onCleanup } from \"solid-js\";\nimport { animate } from \"motion\";\nimport { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\n\nimport { useModal } from \"../hooks/index.js\";\n\ntype Props = {};\n\nexport const Name = \"modal-backdrop\";\n\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\n const [state, { updateAnimationQueue, close }] = useModal(element);\n const controller = new AbortController();\n\n let isFirstRender = true;\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (!isOpen || isFirstRender) return;\n const animation = enter(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (isOpen || isFirstRender) return;\n const animation = exit(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n onMount(() => {\n isFirstRender = false;\n });\n\n function enter(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const options = getTransitionConfig(style);\n return animate(\n element,\n {\n opacity: [`var(--${Name}--opacity-from)`, `var(--${Name}--opacity-to)`],\n },\n options,\n );\n }\n\n function exit(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const options = getTransitionConfig(style);\n return animate(\n element,\n {\n opacity: [`var(--${Name}--opacity-to)`, `var(--${Name}--opacity-from)`],\n },\n options,\n );\n }\n\n element.addEventListener(\n \"click\",\n () => {\n if (state.isAnimating) return;\n close();\n },\n {\n signal: controller.signal,\n },\n );\n\n onCleanup(() => {\n controller.abort();\n });\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, on, onCleanup, onMount, splitProps } from \"solid-js\";\nimport { enableBodyScroll, disableBodyScroll } from \"body-scroll-lock-upgrade\";\nimport { createFocusTrap } from \"@brytdesigns/web-component-core/focusTrap\";\n\nimport { provideModalContext, useModalContext } from \"../hooks/index.js\";\nimport { hideElement, showElement } from \"../utils.js\";\n\ntype ModalContextProps = {\n isOpen: boolean;\n id: string;\n closeOnEscape: boolean;\n shouldTrapFocus: boolean;\n isAnimating: boolean;\n delay: number;\n};\n\nexport const Name = \"modal-context\";\n\nexport const Component: CorrectComponentType<ModalContextProps> = (\n props,\n { element },\n) => {\n const [contextProps, restProps] = splitProps(props, [\n \"isOpen\",\n \"isAnimating\",\n ]);\n\n const context = provideModalContext(contextProps, element);\n\n const [state, { setElementState }] = context;\n\n const [_, { updateAnimationQueue, ...events }] = useModalContext(context);\n\n element.actions = events;\n\n const focusTrap = createFocusTrap(element, () => ({\n allowOutsideClick: true,\n escapeDeactivates: restProps.closeOnEscape,\n onDeactivate: () => {\n setElementState(\"isOpen\", false);\n },\n }));\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n const eventName = isOpen ? \"modal:open\" : \"modal:close\";\n element.dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n detail: { isOpen, relatedTarget: element },\n }),\n );\n element.dispatchEvent(\n new CustomEvent(\"drawer:toggle\", {\n bubbles: true,\n detail: { isOpen, relatedTarget: element },\n }),\n );\n },\n ),\n );\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n focusTrap: focusTrap(),\n shouldTrapFocus: restProps.shouldTrapFocus,\n }),\n ({ isOpen, focusTrap, shouldTrapFocus }) => {\n if (!isOpen) return;\n showElement(element);\n if (!shouldTrapFocus) return;\n focusTrap.activate();\n onCleanup(focusTrap.deactivate);\n },\n ),\n );\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n isAnimating: state.isAnimating,\n shouldTrapFocus: restProps.shouldTrapFocus,\n }),\n ({ isOpen, isAnimating }) => {\n if (isOpen && !isAnimating)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"MODAL-PANEL\") {\n return true;\n }\n\n element = element.parentElement;\n }\n }\n return false;\n },\n });\n onCleanup(() => {\n enableBodyScroll(element);\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),\n ({ isOpen, animationQueue }) => {\n if (isOpen) return;\n return Promise.all(animationQueue).then(() => hideElement(element));\n },\n ),\n );\n\n let openAfterDelayTimeoutId: any = null;\n\n onMount(() => {\n if (!restProps.delay || contextProps.isOpen) return;\n\n openAfterDelayTimeoutId = setTimeout(() => {\n setElementState(\"isOpen\", true);\n }, props.delay);\n\n return onCleanup(() => {\n clearTimeout(openAfterDelayTimeoutId);\n });\n });\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n openAfterDelay: restProps.delay > 0,\n }),\n ({ isOpen, openAfterDelay }) => {\n if (!openAfterDelay && openAfterDelayTimeoutId)\n clearTimeout(openAfterDelayTimeoutId);\n if (isOpen && openAfterDelayTimeoutId)\n clearTimeout(openAfterDelayTimeoutId);\n },\n ),\n );\n\n onCleanup(() => {\n disableBodyScroll(element);\n });\n};\n","export function hideElement<T extends HTMLElement>(element: T) {\n element.style.display = \"none\";\n}\n\nexport function showElement<T extends HTMLElement>(element: T) {\n element.style.display = \"block\";\n}\n","import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-utils\";\n\nimport {\n ModalTrigger,\n ModalContext,\n ModalBackdrop,\n ModalPanel,\n} from \"./components/index.js\";\n\ncustomShadowlessElement(\n ModalContext.Name,\n {\n isOpen: false,\n id: \"\",\n closeOnEscape: false,\n shouldTrapFocus: false,\n isAnimating: false,\n openAfterDelay: false,\n delay: 0,\n },\n correctElementType(ModalContext.Component),\n);\n\ncustomShadowlessElement(\n ModalTrigger.Name,\n { target: \"\", action: \"\", on: \"click\", preventDefault: true },\n correctElementType(ModalTrigger.Component),\n);\n\ncustomShadowlessElement(\n ModalBackdrop.Name,\n {},\n correctElementType(ModalBackdrop.Component),\n);\n\ncustomShadowlessElement(\n ModalPanel.Name,\n {},\n correctElementType(ModalPanel.Component),\n);\n\nexport { useModal, getModalContext } from \"./hooks/index.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/modal-panel.ts","../../src/hooks/useModal.ts","../../src/components/modal-trigger.ts","../../src/components/modal-backdrop.ts","../../src/components/modal-context.ts","../../src/utils.ts","../../src/index.ts"],"names":["currentValue","state","open","createEffect","on","onCleanup","element","Component","Name","onMount","getTransitionConfig","animate","splitProps","focusTrap"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, onMount, on, onCleanup } from \"solid-js\";\nimport { animate } from \"motion\";\nimport { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\n\nimport { useModal } from \"../hooks/index.js\";\n\ntype Props = {};\n\nexport const Name = \"modal-panel\";\n\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\n const [state, { updateAnimationQueue }] = useModal(element);\n\n let isFirstRender = true;\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (!isOpen || isFirstRender) return;\n const animation = enter(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (isOpen || isFirstRender) return;\n const animation = exit(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n onMount(() => {\n isFirstRender = false;\n });\n\n function enter(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const transition = getTransitionConfig(style);\n\n return animate(\n element,\n {\n x: [`var(--${Name}--slide-x-from)`, `var(--${Name}--slide-x-to)`],\n y: [`var(--${Name}--slide-y-from)`, `var(--${Name}--slide-y-to)`],\n scaleY: [`var(--${Name}--scale-y-from)`, `var(--${Name}--scale-y-to)`],\n scaleX: [`var(--${Name}--scale-x-from)`, `var(--${Name}--scale-x-to)`],\n opacity: [`var(--${Name}--opacity-from)`, `var(--${Name}--opacity-to)`],\n },\n transition,\n );\n }\n\n function exit(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const transition = getTransitionConfig(style);\n return animate(\n element,\n {\n x: [`var(--${Name}--slide-x-to)`, `var(--${Name}--slide-x-from)`],\n y: [`var(--${Name}--slide-y-to)`, `var(--${Name}--slide-y-from)`],\n scaleY: [`var(--${Name}--scale-y-to)`, `var(--${Name}--scale-y-from)`],\n scaleX: [`var(--${Name}--scale-x-to)`, `var(--${Name}--scale-x-from)`],\n opacity: [`var(--${Name}--opacity-to)`, `var(--${Name}--opacity-from)`],\n },\n transition,\n );\n }\n};\n","import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n createEffect,\n mergeProps,\n on,\n batch,\n splitProps,\n untrack,\n onCleanup,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n toHyphenated,\n getContextFromProvider,\n} from \"@brytdesigns/web-component-utils\";\n\nimport type { AnimationPlaybackControlsWithThen } from \"motion\";\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\n\ntype StoreContext = {\n animationQueue: AnimationPlaybackControlsWithThen[];\n};\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n isOpen: boolean;\n isAnimating: boolean;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ModalContext = ReturnType<typeof initializeModalContext>;\n\nfunction initializeModalContext(props: CreateContextOptions) {\n const [element, stateProps] = splitProps(props, [\"root\"]);\n const [store, setStore] = createStore<StoreContext>({ animationQueue: [] });\n\n createEffect(\n on(\n () => store.animationQueue,\n (animationQueue) => {\n if (!animationQueue.length) return;\n const controller = new AbortController();\n const animations = awaitAllAnimations(animationQueue);\n const abortableAnimations = abortablePromise(\n animations,\n controller.signal,\n );\n setElementState(\"isAnimating\", true);\n abortableAnimations.finally(() => {\n batch(() => {\n setElementState(\"isAnimating\", false);\n setStore(\"animationQueue\", []);\n });\n });\n\n return onCleanup(() => {\n controller.abort(\"Aborting modal animations\");\n });\n },\n ),\n );\n\n function setElementState(\n key: keyof Omit<CreateContextOptions, \"root\">,\n value: boolean | ((v: boolean) => boolean),\n ) {\n const currentValue = untrack(() => props[key]);\n if (typeof value === \"function\") {\n const currentValue = untrack(() => props[key]);\n const result = value(currentValue || false);\n if (`${currentValue}` === `${value}`) return;\n element.root.setAttribute(toHyphenated(key), `${result}`);\n return;\n }\n if (`${currentValue}` === `${value}`) return;\n return element.root.setAttribute(toHyphenated(key), `${value}`);\n }\n\n return [\n mergeProps(store, stateProps),\n { setElementState, setStore },\n ] as const;\n}\n\nconst ModalContextState = createContext(initializeModalContext);\n\nexport const provideModalContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): ModalContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(ModalContextState, props, element);\n};\n\nexport const useModalContext = (context: ModalContext) => {\n const [state, { setElementState, setStore: setState }] = context;\n\n function updateAnimationQueue(animation: AnimationPlaybackControlsWithThen) {\n setState(\"animationQueue\", (state) => [...state, animation]);\n }\n\n function close() {\n setElementState(\"isOpen\", false);\n }\n\n function open() {\n setElementState(\"isOpen\", true);\n }\n\n function toggle() {\n setElementState(\"isOpen\", (open) => !open);\n }\n\n return [state, { updateAnimationQueue, close, open, toggle }] as const;\n};\n\nexport const useModal = (element: HTMLElement & ICustomElement) => {\n const context: ModalContext = consume(ModalContextState, element);\n\n if (!context) {\n throw console.error(\n \"ModalContext not found! Please ensure to wrap your custom element with modal-context element.\",\n );\n }\n\n return useModalContext(context);\n};\n\nexport const getModalContext = (element: Element) => {\n const context = getContextFromProvider<ModalContext>(\n ModalContextState,\n element,\n );\n return useModalContext(context);\n};\n","import {\n invokeOnLoaded,\n type CorrectComponentType,\n} from \"@brytdesigns/web-component-utils\";\nimport type { Action } from \"../consts\";\n\nimport { createEffect, createRoot, on as _on, onCleanup } from \"solid-js\";\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\n\nimport { getModalContext } from \"../hooks/index.js\";\n\ntype Props = {\n target?: string;\n action?: Action | \"\";\n on?: keyof HTMLElementEventMap | \"enter\" | \"exit\";\n preventDefault: boolean;\n};\n\nexport const Name = \"modal-trigger\";\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n createEffect(() => {\n const targetProp = props.target,\n action = props.action,\n on = props.on,\n preventDefault = props.preventDefault;\n\n if (!targetProp)\n return console.warn(`${Name}: target prop is required!`, element);\n if (!action)\n return console.warn(`${Name}: action prop is required!`, element);\n if (action !== \"close\" && action !== \"open\" && action !== \"toggle\")\n return console.warn(\n `${Name}: action prop must be 'close', 'open', or 'toggle'`,\n );\n if (!on) return console.warn(`${Name}: on prop is required!`);\n\n try {\n const target = document.querySelector(targetProp);\n if (!target)\n return console.warn(`${Name}: target element not found!`, {\n element,\n target: targetProp,\n });\n\n const controller = new AbortController();\n\n invokeOnLoaded(\n () => {\n createRoot((dispose) => {\n const [state, { open, close, toggle }] = getModalContext(target);\n\n switch (on) {\n case \"enter\": {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, open, close);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n break;\n }\n case \"exit\": {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, close, open);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n break;\n }\n\n default: {\n element.addEventListener(\n on,\n (event) => {\n if (preventDefault) event.preventDefault();\n if (state.isAnimating) return;\n switch (action) {\n case \"close\":\n close();\n break;\n case \"open\":\n open();\n break;\n case \"toggle\":\n toggle();\n break;\n }\n },\n { signal: controller.signal },\n );\n break;\n }\n }\n\n createEffect(() => {\n element.setAttribute(\"is-open\", `${state.isOpen}`);\n element.setAttribute(\"is-animating\", `${state.isAnimating}`);\n });\n\n controller.signal.addEventListener(\"abort\", dispose, {\n once: true,\n });\n });\n },\n { signal: controller.signal },\n );\n\n return onCleanup(() => {\n controller.abort();\n });\n } catch (e) {\n console.error(e);\n }\n });\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, onMount, on, onCleanup } from \"solid-js\";\nimport { animate } from \"motion\";\nimport { getTransitionConfig } from \"@brytdesigns/web-component-core/animation\";\n\nimport { useModal } from \"../hooks/index.js\";\n\ntype Props = {};\n\nexport const Name = \"modal-backdrop\";\n\nexport const Component: CorrectComponentType<Props> = (_, { element }) => {\n const [state, { updateAnimationQueue, close }] = useModal(element);\n const controller = new AbortController();\n\n let isFirstRender = true;\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (!isOpen || isFirstRender) return;\n const animation = enter(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n if (isOpen || isFirstRender) return;\n const animation = exit(element);\n updateAnimationQueue(animation);\n return onCleanup(() => {\n if (animation.state !== \"finished\") animation.complete();\n });\n },\n ),\n );\n\n onMount(() => {\n isFirstRender = false;\n });\n\n function enter(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const options = getTransitionConfig(style);\n return animate(\n element,\n {\n opacity: [`var(--${Name}--opacity-from)`, `var(--${Name}--opacity-to)`],\n },\n options,\n );\n }\n\n function exit(element: HTMLElement) {\n const style = window.getComputedStyle(element);\n const options = getTransitionConfig(style);\n return animate(\n element,\n {\n opacity: [`var(--${Name}--opacity-to)`, `var(--${Name}--opacity-from)`],\n },\n options,\n );\n }\n\n element.addEventListener(\n \"click\",\n () => {\n if (state.isAnimating) return;\n close();\n },\n {\n signal: controller.signal,\n },\n );\n\n onCleanup(() => {\n controller.abort();\n });\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\n\nimport { createEffect, on, onCleanup, onMount, splitProps } from \"solid-js\";\nimport { enableBodyScroll, disableBodyScroll } from \"body-scroll-lock-upgrade\";\nimport { createFocusTrap } from \"@brytdesigns/web-component-core/focusTrap\";\n\nimport { provideModalContext, useModalContext } from \"../hooks/index.js\";\nimport { hideElement, showElement } from \"../utils.js\";\n\ntype ModalContextProps = {\n isOpen: boolean;\n id: string;\n closeOnEscape: boolean;\n shouldTrapFocus: boolean;\n isAnimating: boolean;\n delay: number;\n};\n\nexport const Name = \"modal-context\";\n\nexport const Component: CorrectComponentType<ModalContextProps> = (\n props,\n { element },\n) => {\n const [contextProps, restProps] = splitProps(props, [\n \"isOpen\",\n \"isAnimating\",\n ]);\n\n const context = provideModalContext(contextProps, element);\n\n const [state, { setElementState }] = context;\n\n const [_, { updateAnimationQueue, ...events }] = useModalContext(context);\n\n element.actions = events;\n\n const focusTrap = createFocusTrap(element, () => ({\n allowOutsideClick: true,\n escapeDeactivates: restProps.closeOnEscape,\n onDeactivate: () => {\n setElementState(\"isOpen\", false);\n },\n }));\n\n createEffect(\n on(\n () => state.isOpen,\n (isOpen) => {\n const eventName = isOpen ? \"modal:open\" : \"modal:close\";\n element.dispatchEvent(\n new CustomEvent(eventName, {\n bubbles: true,\n detail: { isOpen, relatedTarget: element },\n }),\n );\n element.dispatchEvent(\n new CustomEvent(\"drawer:toggle\", {\n bubbles: true,\n detail: { isOpen, relatedTarget: element },\n }),\n );\n },\n ),\n );\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n focusTrap: focusTrap(),\n shouldTrapFocus: restProps.shouldTrapFocus,\n }),\n ({ isOpen, focusTrap, shouldTrapFocus }) => {\n if (!isOpen) return;\n showElement(element);\n if (!shouldTrapFocus) return;\n focusTrap.activate();\n onCleanup(focusTrap.deactivate);\n },\n ),\n );\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n isAnimating: state.isAnimating,\n shouldTrapFocus: restProps.shouldTrapFocus,\n }),\n ({ isOpen, isAnimating }) => {\n if (isOpen && !isAnimating)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"MODAL-PANEL\") {\n return true;\n }\n\n element = element.parentElement;\n }\n }\n return false;\n },\n });\n onCleanup(() => {\n enableBodyScroll(element);\n });\n },\n ),\n );\n\n createEffect(\n on(\n () => ({ isOpen: state.isOpen, animationQueue: state.animationQueue }),\n ({ isOpen, animationQueue }) => {\n if (isOpen) return;\n return Promise.all(animationQueue).then(() => hideElement(element));\n },\n ),\n );\n\n let openAfterDelayTimeoutId: any = null;\n\n onMount(() => {\n if (!restProps.delay || contextProps.isOpen) return;\n\n openAfterDelayTimeoutId = setTimeout(() => {\n setElementState(\"isOpen\", true);\n }, props.delay);\n\n return onCleanup(() => {\n clearTimeout(openAfterDelayTimeoutId);\n });\n });\n\n createEffect(\n on(\n () => ({\n isOpen: state.isOpen,\n openAfterDelay: restProps.delay > 0,\n }),\n ({ isOpen, openAfterDelay }) => {\n if (!openAfterDelay && openAfterDelayTimeoutId)\n clearTimeout(openAfterDelayTimeoutId);\n if (isOpen && openAfterDelayTimeoutId)\n clearTimeout(openAfterDelayTimeoutId);\n },\n ),\n );\n\n onCleanup(() => {\n disableBodyScroll(element);\n });\n};\n","export function hideElement<T extends HTMLElement>(element: T) {\n element.style.display = \"none\";\n}\n\nexport function showElement<T extends HTMLElement>(element: T) {\n element.style.display = \"block\";\n}\n","import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-utils\";\n\nimport {\n ModalTrigger,\n ModalContext,\n ModalBackdrop,\n ModalPanel,\n} from \"./components/index.js\";\n\ncustomShadowlessElement(\n ModalContext.Name,\n {\n isOpen: false,\n id: \"\",\n closeOnEscape: false,\n shouldTrapFocus: false,\n isAnimating: false,\n openAfterDelay: false,\n delay: 0,\n },\n correctElementType(ModalContext.Component),\n);\n\ncustomShadowlessElement(\n ModalTrigger.Name,\n { target: \"\", action: \"\", on: \"click\", preventDefault: true },\n correctElementType(ModalTrigger.Component),\n);\n\ncustomShadowlessElement(\n ModalBackdrop.Name,\n {},\n correctElementType(ModalBackdrop.Component),\n);\n\ncustomShadowlessElement(\n ModalPanel.Name,\n {},\n correctElementType(ModalPanel.Component),\n);\n\nexport { useModal, getModalContext } from \"./hooks/index.js\";\n"]}
|
|
@@ -16,69 +16,75 @@ const Component = (props, { element }) => {
|
|
|
16
16
|
`${Name}: action prop must be 'close', 'open', or 'toggle'`
|
|
17
17
|
);
|
|
18
18
|
if (!on) return console.warn(`${Name}: on prop is required!`);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
element
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
try {
|
|
20
|
+
const target = document.querySelector(targetProp);
|
|
21
|
+
if (!target)
|
|
22
|
+
return console.warn(`${Name}: target element not found!`, {
|
|
23
|
+
element,
|
|
24
|
+
target: targetProp
|
|
25
|
+
});
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
invokeOnLoaded(
|
|
28
|
+
() => {
|
|
29
|
+
createRoot((dispose) => {
|
|
30
|
+
const [state, { open, close, toggle }] = getModalContext(target);
|
|
31
|
+
switch (on) {
|
|
32
|
+
case "enter": {
|
|
33
|
+
let unsubscribe = null;
|
|
34
|
+
if (action === "toggle") {
|
|
35
|
+
unsubscribe = observeElementInViewport(element, open, close);
|
|
36
|
+
}
|
|
37
|
+
if (unsubscribe) onCleanup(unsubscribe);
|
|
38
|
+
break;
|
|
35
39
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
case "exit": {
|
|
41
|
+
let unsubscribe = null;
|
|
42
|
+
if (action === "toggle") {
|
|
43
|
+
unsubscribe = observeElementInViewport(element, close, open);
|
|
44
|
+
}
|
|
45
|
+
if (unsubscribe) onCleanup(unsubscribe);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
default: {
|
|
49
|
+
element.addEventListener(
|
|
50
|
+
on,
|
|
51
|
+
(event) => {
|
|
52
|
+
if (preventDefault) event.preventDefault();
|
|
53
|
+
if (state.isAnimating) return;
|
|
54
|
+
switch (action) {
|
|
55
|
+
case "close":
|
|
56
|
+
close();
|
|
57
|
+
break;
|
|
58
|
+
case "open":
|
|
59
|
+
open();
|
|
60
|
+
break;
|
|
61
|
+
case "toggle":
|
|
62
|
+
toggle();
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{ signal: controller.signal }
|
|
67
|
+
);
|
|
68
|
+
break;
|
|
43
69
|
}
|
|
44
|
-
if (unsubscribe) onCleanup(unsubscribe);
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
default: {
|
|
48
|
-
element.addEventListener(
|
|
49
|
-
on,
|
|
50
|
-
(event) => {
|
|
51
|
-
if (preventDefault) event.preventDefault();
|
|
52
|
-
if (state.isAnimating) return;
|
|
53
|
-
switch (action) {
|
|
54
|
-
case "close":
|
|
55
|
-
close();
|
|
56
|
-
break;
|
|
57
|
-
case "open":
|
|
58
|
-
open();
|
|
59
|
-
break;
|
|
60
|
-
case "toggle":
|
|
61
|
-
toggle();
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
{ signal: controller.signal }
|
|
66
|
-
);
|
|
67
|
-
break;
|
|
68
70
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
createEffect(() => {
|
|
72
|
+
element.setAttribute("is-open", `${state.isOpen}`);
|
|
73
|
+
element.setAttribute("is-animating", `${state.isAnimating}`);
|
|
74
|
+
});
|
|
75
|
+
controller.signal.addEventListener("abort", dispose, {
|
|
76
|
+
once: true
|
|
77
|
+
});
|
|
73
78
|
});
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
},
|
|
80
|
+
{ signal: controller.signal }
|
|
81
|
+
);
|
|
82
|
+
return onCleanup(() => {
|
|
83
|
+
controller.abort();
|
|
84
|
+
});
|
|
85
|
+
} catch (e) {
|
|
86
|
+
console.error(e);
|
|
87
|
+
}
|
|
82
88
|
});
|
|
83
89
|
};
|
|
84
90
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/modal-trigger.ts"],"names":[],"mappings":";;;;;AAkBO,MAAM,IAAO,GAAA;AAEb,MAAM,SAAyC,GAAA,CAAC,KAAO,EAAA,EAAE,SAAc,KAAA;AAC5E,EAAA,YAAA,CAAa,MAAM;AACjB,IAAM,MAAA,UAAA,GAAa,KAAM,CAAA,MAAA,EACvB,MAAS,GAAA,KAAA,CAAM,QACf,EAAK,GAAA,KAAA,CAAM,EACX,EAAA,cAAA,GAAiB,KAAM,CAAA,cAAA;AAEzB,IAAA,IAAI,CAAC,UAAA;AACH,MAAA,OAAO,OAAQ,CAAA,IAAA,CAAK,CAAG,EAAA,IAAI,8BAA8B,OAAO,CAAA;AAClE,IAAA,IAAI,CAAC,MAAA;AACH,MAAA,OAAO,OAAQ,CAAA,IAAA,CAAK,CAAG,EAAA,IAAI,8BAA8B,OAAO,CAAA;AAClE,IAAA,IAAI,MAAW,KAAA,OAAA,IAAW,MAAW,KAAA,MAAA,IAAU,MAAW,KAAA,QAAA;AACxD,MAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,QACb,GAAG,IAAI,CAAA,kDAAA;AAAA,OACT;AACF,IAAA,IAAI,CAAC,EAAI,EAAA,OAAO,QAAQ,IAAK,CAAA,CAAA,EAAG,IAAI,CAAwB,sBAAA,CAAA,CAAA;AAE5D,
|
|
1
|
+
{"version":3,"sources":["../../../src/components/modal-trigger.ts"],"names":[],"mappings":"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","file":"modal-trigger.js","sourcesContent":["import {\n invokeOnLoaded,\n type CorrectComponentType,\n} from \"@brytdesigns/web-component-utils\";\nimport type { Action } from \"../consts\";\n\nimport { createEffect, createRoot, on as _on, onCleanup } from \"solid-js\";\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\n\nimport { getModalContext } from \"../hooks/index.js\";\n\ntype Props = {\n target?: string;\n action?: Action | \"\";\n on?: keyof HTMLElementEventMap | \"enter\" | \"exit\";\n preventDefault: boolean;\n};\n\nexport const Name = \"modal-trigger\";\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n createEffect(() => {\n const targetProp = props.target,\n action = props.action,\n on = props.on,\n preventDefault = props.preventDefault;\n\n if (!targetProp)\n return console.warn(`${Name}: target prop is required!`, element);\n if (!action)\n return console.warn(`${Name}: action prop is required!`, element);\n if (action !== \"close\" && action !== \"open\" && action !== \"toggle\")\n return console.warn(\n `${Name}: action prop must be 'close', 'open', or 'toggle'`,\n );\n if (!on) return console.warn(`${Name}: on prop is required!`);\n\n try {\n const target = document.querySelector(targetProp);\n if (!target)\n return console.warn(`${Name}: target element not found!`, {\n element,\n target: targetProp,\n });\n\n const controller = new AbortController();\n\n invokeOnLoaded(\n () => {\n createRoot((dispose) => {\n const [state, { open, close, toggle }] = getModalContext(target);\n\n switch (on) {\n case \"enter\": {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, open, close);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n break;\n }\n case \"exit\": {\n let unsubscribe = null;\n if (action === \"toggle\") {\n unsubscribe = observeElementInViewport(element, close, open);\n }\n\n if (unsubscribe) onCleanup(unsubscribe);\n break;\n }\n\n default: {\n element.addEventListener(\n on,\n (event) => {\n if (preventDefault) event.preventDefault();\n if (state.isAnimating) return;\n switch (action) {\n case \"close\":\n close();\n break;\n case \"open\":\n open();\n break;\n case \"toggle\":\n toggle();\n break;\n }\n },\n { signal: controller.signal },\n );\n break;\n }\n }\n\n createEffect(() => {\n element.setAttribute(\"is-open\", `${state.isOpen}`);\n element.setAttribute(\"is-animating\", `${state.isAnimating}`);\n });\n\n controller.signal.addEventListener(\"abort\", dispose, {\n once: true,\n });\n });\n },\n { signal: controller.signal },\n );\n\n return onCleanup(() => {\n controller.abort();\n });\n } catch (e) {\n console.error(e);\n }\n });\n};\n"]}
|