@brytdesigns/web-component-modal 1.0.13 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { customShadowlessElement, correctElementType, toHyphenated, getContextFromProvider, invokeOnLoaded } from '@brytdesigns/web-component-utils';
2
- import { splitProps, createEffect, on, batch, onCleanup, untrack, mergeProps, onMount, createRoot } from 'solid-js';
1
+ import { createWithElementContext, customShadowlessElement, correctElementType, toHyphenated, getContextFromProvider } from '@brytdesigns/web-component-core/utils';
2
+ import { splitProps, createEffect, on, batch, onCleanup, untrack, mergeProps, onMount } from 'solid-js';
3
3
  import { animate } from 'motion';
4
4
  import { awaitAllAnimations, getTransitionConfig } from '@brytdesigns/web-component-core/animation';
5
5
  import { createContext, consume, provide } from 'component-register';
@@ -95,6 +95,7 @@ var useModal = (element) => {
95
95
  }
96
96
  return useModalContext(context);
97
97
  };
98
+ var withModalElementContext = createWithElementContext(ModalContextState);
98
99
  var getModalContext = (element) => {
99
100
  const context = getContextFromProvider(
100
101
  ModalContextState,
@@ -177,87 +178,72 @@ __export(modal_trigger_exports, {
177
178
  });
178
179
  var Name2 = "modal-trigger";
179
180
  var Component2 = (props, { element }) => {
180
- createEffect(() => {
181
- const targetProp = props.target, action = props.action, on5 = props.on, preventDefault = props.preventDefault;
182
- if (!targetProp)
183
- return console.warn(`${Name2}: target prop is required!`, element);
184
- if (!action)
185
- return console.warn(`${Name2}: action prop is required!`, element);
186
- if (action !== "close" && action !== "open" && action !== "toggle")
187
- return console.warn(
188
- `${Name2}: action prop must be 'close', 'open', or 'toggle'`
189
- );
190
- if (!on5) return console.warn(`${Name2}: on prop is required!`);
191
- const controller = new AbortController();
192
- invokeOnLoaded(
193
- () => {
194
- let target = null;
195
- try {
196
- target = document.querySelector(targetProp);
197
- } catch (e) {
181
+ withModalElementContext(
182
+ () => props.target || "",
183
+ () => ({
184
+ on: props.on,
185
+ action: props.action,
186
+ preventDefault: props.preventDefault
187
+ }),
188
+ (context, { on: on5, action, preventDefault }) => {
189
+ const controller = new AbortController();
190
+ const [state, { open, close, toggle }] = useModalContext(context);
191
+ switch (on5) {
192
+ case "enter": {
193
+ let unsubscribe = null;
194
+ if (action === "toggle") {
195
+ unsubscribe = observeElementInViewport(element, open, close);
196
+ }
197
+ if (unsubscribe)
198
+ controller.signal.addEventListener("abort", unsubscribe, {
199
+ once: true
200
+ });
201
+ break;
198
202
  }
199
- if (!target)
200
- return console.warn(`${Name2}: target element not found!`, {
201
- element,
202
- target: targetProp
203
- });
204
- createRoot((dispose) => {
205
- const [state, { open, close, toggle }] = getModalContext(target);
206
- switch (on5) {
207
- case "enter": {
208
- let unsubscribe = null;
209
- if (action === "toggle") {
210
- unsubscribe = observeElementInViewport(element, open, close);
211
- }
212
- if (unsubscribe) onCleanup(unsubscribe);
213
- break;
214
- }
215
- case "exit": {
216
- let unsubscribe = null;
217
- if (action === "toggle") {
218
- unsubscribe = observeElementInViewport(element, close, open);
219
- }
220
- if (unsubscribe) onCleanup(unsubscribe);
221
- break;
222
- }
223
- default: {
224
- element.addEventListener(
225
- on5,
226
- (event) => {
227
- if (preventDefault) event.preventDefault();
228
- if (state.isAnimating) return;
229
- switch (action) {
230
- case "close":
231
- close();
232
- break;
233
- case "open":
234
- open();
235
- break;
236
- case "toggle":
237
- toggle();
238
- break;
239
- }
240
- },
241
- { signal: controller.signal }
242
- );
243
- break;
244
- }
203
+ case "exit": {
204
+ let unsubscribe = null;
205
+ if (action === "toggle") {
206
+ unsubscribe = observeElementInViewport(element, close, open);
245
207
  }
246
- createEffect(() => {
247
- element.setAttribute("is-open", `${state.isOpen}`);
248
- element.setAttribute("is-animating", `${state.isAnimating}`);
249
- });
250
- controller.signal.addEventListener("abort", dispose, {
251
- once: true
252
- });
253
- });
254
- },
255
- { signal: controller.signal }
256
- );
257
- return onCleanup(() => {
258
- controller.abort();
259
- });
260
- });
208
+ if (unsubscribe)
209
+ controller.signal.addEventListener("abort", unsubscribe, {
210
+ once: true
211
+ });
212
+ break;
213
+ }
214
+ default: {
215
+ element.addEventListener(
216
+ //@ts-ignore
217
+ on5,
218
+ (event) => {
219
+ if (preventDefault) event.preventDefault();
220
+ if (state.isAnimating) return;
221
+ switch (action) {
222
+ case "close":
223
+ close();
224
+ break;
225
+ case "open":
226
+ open();
227
+ break;
228
+ case "toggle":
229
+ toggle();
230
+ break;
231
+ }
232
+ },
233
+ { signal: controller.signal }
234
+ );
235
+ break;
236
+ }
237
+ }
238
+ createEffect(() => {
239
+ element.setAttribute("is-open", `${state.isOpen}`);
240
+ element.setAttribute("is-animating", `${state.isAnimating}`);
241
+ });
242
+ onCleanup(() => {
243
+ controller.abort();
244
+ });
245
+ }
246
+ );
261
247
  };
262
248
 
263
249
  // src/components/modal-backdrop.ts
@@ -503,6 +489,6 @@ customShadowlessElement(
503
489
  correctElementType(modal_panel_exports.Component)
504
490
  );
505
491
 
506
- export { getModalContext, useModal };
492
+ export { getModalContext, useModal, withModalElementContext };
507
493
  //# sourceMappingURL=index.js.map
508
494
  //# sourceMappingURL=index.js.map
@@ -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 controller = new AbortController();\n\n invokeOnLoaded(\n () => {\n let target: Element | null = null;\n try {\n target = document.querySelector(targetProp);\n } catch (e) {\n e;\n }\n if (!target)\n return console.warn(`${Name}: target element not found!`, {\n element,\n target: targetProp,\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 });\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, shouldTrapFocus }) => {\n if (isOpen && !isAnimating && shouldTrapFocus)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"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-core/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\";\n\nimport type { AnimationPlaybackControlsWithThen } from \"motion\";\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\nimport {\n toHyphenated,\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\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 withModalElementContext = createWithElementContext<\n typeof ModalContextState,\n ModalContext\n>(ModalContextState);\n\nexport const getModalContext = (element: Element) => {\n const context = getContextFromProvider<ModalContext>(\n ModalContextState,\n element,\n );\n return useModalContext(context);\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport type { Action } from \"../consts\";\n\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\n\nimport { useModalContext, withModalElementContext } 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 withModalElementContext(\n () => props.target || \"\",\n () => ({\n on: props.on,\n action: props.action,\n preventDefault: props.preventDefault,\n }),\n (context, { on, action, preventDefault }) => {\n const controller = new AbortController();\n const [state, { open, close, toggle }] = useModalContext(context);\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)\n controller.signal.addEventListener(\"abort\", unsubscribe, {\n once: true,\n });\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)\n controller.signal.addEventListener(\"abort\", unsubscribe, {\n once: true,\n });\n break;\n }\n\n default: {\n element.addEventListener(\n //@ts-ignore\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 onCleanup(() => {\n controller.abort();\n });\n },\n );\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/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-core/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, shouldTrapFocus }) => {\n if (isOpen && !isAnimating && shouldTrapFocus)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"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-core/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 {\n useModal,\n getModalContext,\n withModalElementContext,\n} from \"./hooks/index.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modal-backdrop.ts"],"names":["element"],"mappings":";;;;;AAUO,MAAM,IAAO,GAAA;AAEb,MAAM,SAAyC,GAAA,CAAC,CAAG,EAAA,EAAE,SAAc,KAAA;AACxE,EAAM,MAAA,CAAC,OAAO,EAAE,oBAAA,EAAsB,OAAO,CAAA,GAAI,SAAS,OAAO,CAAA;AACjE,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,SAAS,CAAC,CAAA,MAAA,EAAS,IAAI,CAAmB,eAAA,CAAA,EAAA,CAAA,MAAA,EAAS,IAAI,CAAe,aAAA,CAAA;AAAA,OACxE;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,SAAS,CAAC,CAAA,MAAA,EAAS,IAAI,CAAiB,aAAA,CAAA,EAAA,CAAA,MAAA,EAAS,IAAI,CAAiB,eAAA,CAAA;AAAA,OACxE;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;AACH","file":"modal-backdrop.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-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"]}
1
+ {"version":3,"sources":["../../../src/components/modal-backdrop.ts"],"names":["element"],"mappings":";;;;;AAUO,MAAM,IAAO,GAAA;AAEb,MAAM,SAAyC,GAAA,CAAC,CAAG,EAAA,EAAE,SAAc,KAAA;AACxE,EAAM,MAAA,CAAC,OAAO,EAAE,oBAAA,EAAsB,OAAO,CAAA,GAAI,SAAS,OAAO,CAAA;AACjE,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,SAAS,CAAC,CAAA,MAAA,EAAS,IAAI,CAAmB,eAAA,CAAA,EAAA,CAAA,MAAA,EAAS,IAAI,CAAe,aAAA,CAAA;AAAA,OACxE;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,SAAS,CAAC,CAAA,MAAA,EAAS,IAAI,CAAiB,aAAA,CAAA,EAAA,CAAA,MAAA,EAAS,IAAI,CAAiB,eAAA,CAAA;AAAA,OACxE;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;AACH","file":"modal-backdrop.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modal-context.ts"],"names":["focusTrap","element"],"mappings":"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","file":"modal-context.js","sourcesContent":["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, shouldTrapFocus }) => {\n if (isOpen && !isAnimating && shouldTrapFocus)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"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"]}
1
+ {"version":3,"sources":["../../../src/components/modal-context.ts"],"names":["focusTrap","element"],"mappings":"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","file":"modal-context.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/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, shouldTrapFocus }) => {\n if (isOpen && !isAnimating && shouldTrapFocus)\n return disableBodyScroll(element, {\n allowTouchMove: (el: EventTarget) => {\n if (el instanceof HTMLElement) {\n let element = el as (EventTarget & HTMLElement) | null;\n while (element && element !== document.body) {\n if (element.tagName === \"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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modal-panel.ts"],"names":["element"],"mappings":"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","file":"modal-panel.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"]}
1
+ {"version":3,"sources":["../../../src/components/modal-panel.ts"],"names":["element"],"mappings":"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","file":"modal-panel.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/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"]}
@@ -1,91 +1,75 @@
1
- import { invokeOnLoaded } from '@brytdesigns/web-component-utils';
2
- import { createEffect, createRoot, onCleanup } from 'solid-js';
1
+ import { createEffect, onCleanup } from 'solid-js';
3
2
  import { observeElementInViewport } from 'observe-element-in-viewport';
4
- import { getModalContext } from '../hooks/index.js';
3
+ import { withModalElementContext, useModalContext } from '../hooks/index.js';
5
4
 
6
5
  const Name = "modal-trigger";
7
6
  const Component = (props, { element }) => {
8
- createEffect(() => {
9
- const targetProp = props.target, action = props.action, on = props.on, preventDefault = props.preventDefault;
10
- if (!targetProp)
11
- return console.warn(`${Name}: target prop is required!`, element);
12
- if (!action)
13
- return console.warn(`${Name}: action prop is required!`, element);
14
- if (action !== "close" && action !== "open" && action !== "toggle")
15
- return console.warn(
16
- `${Name}: action prop must be 'close', 'open', or 'toggle'`
17
- );
18
- if (!on) return console.warn(`${Name}: on prop is required!`);
19
- const controller = new AbortController();
20
- invokeOnLoaded(
21
- () => {
22
- let target = null;
23
- try {
24
- target = document.querySelector(targetProp);
25
- } catch (e) {
7
+ withModalElementContext(
8
+ () => props.target || "",
9
+ () => ({
10
+ on: props.on,
11
+ action: props.action,
12
+ preventDefault: props.preventDefault
13
+ }),
14
+ (context, { on, action, preventDefault }) => {
15
+ const controller = new AbortController();
16
+ const [state, { open, close, toggle }] = useModalContext(context);
17
+ switch (on) {
18
+ case "enter": {
19
+ let unsubscribe = null;
20
+ if (action === "toggle") {
21
+ unsubscribe = observeElementInViewport(element, open, close);
22
+ }
23
+ if (unsubscribe)
24
+ controller.signal.addEventListener("abort", unsubscribe, {
25
+ once: true
26
+ });
27
+ break;
26
28
  }
27
- if (!target)
28
- return console.warn(`${Name}: target element not found!`, {
29
- element,
30
- target: targetProp
31
- });
32
- createRoot((dispose) => {
33
- const [state, { open, close, toggle }] = getModalContext(target);
34
- switch (on) {
35
- case "enter": {
36
- let unsubscribe = null;
37
- if (action === "toggle") {
38
- unsubscribe = observeElementInViewport(element, open, close);
39
- }
40
- if (unsubscribe) onCleanup(unsubscribe);
41
- break;
42
- }
43
- case "exit": {
44
- let unsubscribe = null;
45
- if (action === "toggle") {
46
- unsubscribe = observeElementInViewport(element, close, open);
47
- }
48
- if (unsubscribe) onCleanup(unsubscribe);
49
- break;
50
- }
51
- default: {
52
- element.addEventListener(
53
- on,
54
- (event) => {
55
- if (preventDefault) event.preventDefault();
56
- if (state.isAnimating) return;
57
- switch (action) {
58
- case "close":
59
- close();
60
- break;
61
- case "open":
62
- open();
63
- break;
64
- case "toggle":
65
- toggle();
66
- break;
67
- }
68
- },
69
- { signal: controller.signal }
70
- );
71
- break;
72
- }
29
+ case "exit": {
30
+ let unsubscribe = null;
31
+ if (action === "toggle") {
32
+ unsubscribe = observeElementInViewport(element, close, open);
73
33
  }
74
- createEffect(() => {
75
- element.setAttribute("is-open", `${state.isOpen}`);
76
- element.setAttribute("is-animating", `${state.isAnimating}`);
77
- });
78
- controller.signal.addEventListener("abort", dispose, {
79
- once: true
80
- });
81
- });
82
- },
83
- { signal: controller.signal }
84
- );
85
- return onCleanup(() => {
86
- controller.abort();
87
- });
88
- });
34
+ if (unsubscribe)
35
+ controller.signal.addEventListener("abort", unsubscribe, {
36
+ once: true
37
+ });
38
+ break;
39
+ }
40
+ default: {
41
+ element.addEventListener(
42
+ //@ts-ignore
43
+ on,
44
+ (event) => {
45
+ if (preventDefault) event.preventDefault();
46
+ if (state.isAnimating) return;
47
+ switch (action) {
48
+ case "close":
49
+ close();
50
+ break;
51
+ case "open":
52
+ open();
53
+ break;
54
+ case "toggle":
55
+ toggle();
56
+ break;
57
+ }
58
+ },
59
+ { signal: controller.signal }
60
+ );
61
+ break;
62
+ }
63
+ }
64
+ createEffect(() => {
65
+ element.setAttribute("is-open", `${state.isOpen}`);
66
+ element.setAttribute("is-animating", `${state.isAnimating}`);
67
+ });
68
+ onCleanup(() => {
69
+ controller.abort();
70
+ });
71
+ }
72
+ );
89
73
  };
90
74
 
91
75
  export { Component, Name };
@@ -1 +1 @@
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 const controller = new AbortController();\n\n invokeOnLoaded(\n () => {\n let target: Element | null = null;\n try {\n target = document.querySelector(targetProp);\n } catch (e) {\n e;\n }\n if (!target)\n return console.warn(`${Name}: target element not found!`, {\n element,\n target: targetProp,\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 });\n};\n"]}
1
+ {"version":3,"sources":["../../../src/components/modal-trigger.ts"],"names":[],"mappings":";;;;AAeO,MAAM,IAAO,GAAA;AAEb,MAAM,SAAyC,GAAA,CAAC,KAAO,EAAA,EAAE,SAAc,KAAA;AAC5E,EAAA,uBAAA;AAAA,IACE,MAAM,MAAM,MAAU,IAAA,EAAA;AAAA,IACtB,OAAO;AAAA,MACL,IAAI,KAAM,CAAA,EAAA;AAAA,MACV,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,gBAAgB,KAAM,CAAA;AAAA,KACxB,CAAA;AAAA,IACA,CAAC,OAAS,EAAA,EAAE,EAAI,EAAA,MAAA,EAAQ,gBAAqB,KAAA;AAC3C,MAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,EAAA;AACvC,MAAM,MAAA,CAAC,OAAO,EAAE,IAAA,EAAM,OAAO,MAAO,EAAC,CAAI,GAAA,eAAA,CAAgB,OAAO,CAAA;AAChE,MAAA,QAAQ,EAAI;AAAA,QACV,KAAK,OAAS,EAAA;AACZ,UAAA,IAAI,WAAc,GAAA,IAAA;AAClB,UAAA,IAAI,WAAW,QAAU,EAAA;AACvB,YAAc,WAAA,GAAA,wBAAA,CAAyB,OAAS,EAAA,IAAA,EAAM,KAAK,CAAA;AAAA;AAG7D,UAAI,IAAA,WAAA;AACF,YAAW,UAAA,CAAA,MAAA,CAAO,gBAAiB,CAAA,OAAA,EAAS,WAAa,EAAA;AAAA,cACvD,IAAM,EAAA;AAAA,aACP,CAAA;AACH,UAAA;AAAA;AACF,QACA,KAAK,MAAQ,EAAA;AACX,UAAA,IAAI,WAAc,GAAA,IAAA;AAClB,UAAA,IAAI,WAAW,QAAU,EAAA;AACvB,YAAc,WAAA,GAAA,wBAAA,CAAyB,OAAS,EAAA,KAAA,EAAO,IAAI,CAAA;AAAA;AAG7D,UAAI,IAAA,WAAA;AACF,YAAW,UAAA,CAAA,MAAA,CAAO,gBAAiB,CAAA,OAAA,EAAS,WAAa,EAAA;AAAA,cACvD,IAAM,EAAA;AAAA,aACP,CAAA;AACH,UAAA;AAAA;AACF,QAEA,SAAS;AACP,UAAQ,OAAA,CAAA,gBAAA;AAAA;AAAA,YAEN,EAAA;AAAA,YACA,CAAC,KAAU,KAAA;AACT,cAAI,IAAA,cAAA,QAAsB,cAAe,EAAA;AACzC,cAAA,IAAI,MAAM,WAAa,EAAA;AACvB,cAAA,QAAQ,MAAQ;AAAA,gBACd,KAAK,OAAA;AACH,kBAAM,KAAA,EAAA;AACN,kBAAA;AAAA,gBACF,KAAK,MAAA;AACH,kBAAK,IAAA,EAAA;AACL,kBAAA;AAAA,gBACF,KAAK,QAAA;AACH,kBAAO,MAAA,EAAA;AACP,kBAAA;AAAA;AACJ,aACF;AAAA,YACA,EAAE,MAAQ,EAAA,UAAA,CAAW,MAAO;AAAA,WAC9B;AACA,UAAA;AAAA;AACF;AAGF,MAAA,YAAA,CAAa,MAAM;AACjB,QAAA,OAAA,CAAQ,YAAa,CAAA,SAAA,EAAW,CAAG,EAAA,KAAA,CAAM,MAAM,CAAE,CAAA,CAAA;AACjD,QAAA,OAAA,CAAQ,YAAa,CAAA,cAAA,EAAgB,CAAG,EAAA,KAAA,CAAM,WAAW,CAAE,CAAA,CAAA;AAAA,OAC5D,CAAA;AAED,MAAA,SAAA,CAAU,MAAM;AACd,QAAA,UAAA,CAAW,KAAM,EAAA;AAAA,OAClB,CAAA;AAAA;AACH,GACF;AACF","file":"modal-trigger.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport type { Action } from \"../consts\";\n\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { observeElementInViewport } from \"observe-element-in-viewport\";\n\nimport { useModalContext, withModalElementContext } 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 withModalElementContext(\n () => props.target || \"\",\n () => ({\n on: props.on,\n action: props.action,\n preventDefault: props.preventDefault,\n }),\n (context, { on, action, preventDefault }) => {\n const controller = new AbortController();\n const [state, { open, close, toggle }] = useModalContext(context);\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)\n controller.signal.addEventListener(\"abort\", unsubscribe, {\n once: true,\n });\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)\n controller.signal.addEventListener(\"abort\", unsubscribe, {\n once: true,\n });\n break;\n }\n\n default: {\n element.addEventListener(\n //@ts-ignore\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 onCleanup(() => {\n controller.abort();\n });\n },\n );\n};\n"]}
@@ -1,9 +1,9 @@
1
1
  import { createContext, provide, consume } from 'component-register';
2
2
  import { splitProps, createEffect, on, batch, onCleanup, untrack, mergeProps } from 'solid-js';
3
3
  import { createStore } from 'solid-js/store';
4
- import { toHyphenated, getContextFromProvider } from '@brytdesigns/web-component-utils';
5
4
  import { abortablePromise } from '@brytdesigns/web-component-core/promise';
6
5
  import { awaitAllAnimations } from '@brytdesigns/web-component-core/animation';
6
+ import { createWithElementContext, toHyphenated, getContextFromProvider } from '@brytdesigns/web-component-core/utils';
7
7
 
8
8
  function initializeModalContext(props) {
9
9
  const [element, stateProps] = splitProps(props, ["root"]);
@@ -79,6 +79,7 @@ const useModal = (element) => {
79
79
  }
80
80
  return useModalContext(context);
81
81
  };
82
+ const withModalElementContext = createWithElementContext(ModalContextState);
82
83
  const getModalContext = (element) => {
83
84
  const context = getContextFromProvider(
84
85
  ModalContextState,
@@ -87,6 +88,6 @@ const getModalContext = (element) => {
87
88
  return useModalContext(context);
88
89
  };
89
90
 
90
- export { getModalContext, provideModalContext, useModal, useModalContext };
91
+ export { getModalContext, provideModalContext, useModal, useModalContext, withModalElementContext };
91
92
  //# sourceMappingURL=useModal.js.map
92
93
  //# sourceMappingURL=useModal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useModal.ts"],"names":["currentValue","state","open"],"mappings":"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","file":"useModal.js","sourcesContent":["import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n createEffect,\n mergeProps,\n on,\n batch,\n splitProps,\n untrack,\n 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"]}
1
+ {"version":3,"sources":["../../../src/hooks/useModal.ts"],"names":["currentValue","state","open"],"mappings":"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","file":"useModal.js","sourcesContent":["import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n createEffect,\n mergeProps,\n on,\n batch,\n splitProps,\n untrack,\n onCleanup,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\n\nimport type { AnimationPlaybackControlsWithThen } from \"motion\";\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\nimport {\n toHyphenated,\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\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 withModalElementContext = createWithElementContext<\n typeof ModalContextState,\n ModalContext\n>(ModalContextState);\n\nexport const getModalContext = (element: Element) => {\n const context = getContextFromProvider<ModalContext>(\n ModalContextState,\n element,\n );\n return useModalContext(context);\n};\n"]}
@@ -3,6 +3,14 @@
3
3
  import { ICustomElement } from 'component-register';
4
4
  import { AnimationPlaybackControlsWithThen } from 'motion';
5
5
 
6
+ export type StoreContext = {
7
+ animationQueue: AnimationPlaybackControlsWithThen[];
8
+ };
9
+ export type CreateContextOptions = {
10
+ root: HTMLElement & ICustomElement;
11
+ isOpen: boolean;
12
+ isAnimating: boolean;
13
+ };
6
14
  export declare const useModal: (element: HTMLElement & ICustomElement) => readonly [
7
15
  {
8
16
  animationQueue: AnimationPlaybackControlsWithThen[];
@@ -16,6 +24,17 @@ export declare const useModal: (element: HTMLElement & ICustomElement) => readon
16
24
  readonly toggle: () => void;
17
25
  }
18
26
  ];
27
+ export declare const withModalElementContext: <D extends unknown>(selector: string | import("solid-js").Accessor<string>, dependencies: import("solid-js").Accessor<D> | undefined, cb: (context: readonly [
28
+ {
29
+ animationQueue: AnimationPlaybackControlsWithThen[];
30
+ isOpen: boolean;
31
+ isAnimating: boolean;
32
+ },
33
+ {
34
+ readonly setElementState: (key: keyof Omit<CreateContextOptions, "root">, value: boolean | ((v: boolean) => boolean)) => void;
35
+ readonly setStore: import("solid-js/store").SetStoreFunction<StoreContext>;
36
+ }
37
+ ], dependencies: D) => void | (() => void)) => void;
19
38
  export declare const getModalContext: (element: Element) => readonly [
20
39
  {
21
40
  animationQueue: AnimationPlaybackControlsWithThen[];
@@ -1,6 +1,6 @@
1
- import { customShadowlessElement, correctElementType } from '@brytdesigns/web-component-utils';
1
+ import { customShadowlessElement, correctElementType } from '@brytdesigns/web-component-core/utils';
2
2
  import { ModalContext, ModalTrigger, ModalBackdrop, ModalPanel } from './components/index.js';
3
- export { getModalContext, useModal } from './hooks/index.js';
3
+ export { getModalContext, useModal, withModalElementContext } from './hooks/index.js';
4
4
 
5
5
  customShadowlessElement(
6
6
  ModalContext.Name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAYA,uBAAA;AAAA,EACE,YAAa,CAAA,IAAA;AAAA,EACb;AAAA,IACE,MAAQ,EAAA,KAAA;AAAA,IACR,EAAI,EAAA,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,eAAiB,EAAA,KAAA;AAAA,IACjB,WAAa,EAAA,KAAA;AAAA,IACb,cAAgB,EAAA,KAAA;AAAA,IAChB,KAAO,EAAA;AAAA,GACT;AAAA,EACA,kBAAA,CAAmB,aAAa,SAAS;AAC3C,CAAA;AAEA,uBAAA;AAAA,EACE,YAAa,CAAA,IAAA;AAAA,EACb,EAAE,QAAQ,EAAI,EAAA,MAAA,EAAQ,IAAI,EAAI,EAAA,OAAA,EAAS,gBAAgB,IAAK,EAAA;AAAA,EAC5D,kBAAA,CAAmB,aAAa,SAAS;AAC3C,CAAA;AAEA,uBAAA;AAAA,EACE,aAAc,CAAA,IAAA;AAAA,EACd,EAAC;AAAA,EACD,kBAAA,CAAmB,cAAc,SAAS;AAC5C,CAAA;AAEA,uBAAA;AAAA,EACE,UAAW,CAAA,IAAA;AAAA,EACX,EAAC;AAAA,EACD,kBAAA,CAAmB,WAAW,SAAS;AACzC,CAAA","file":"index.js","sourcesContent":["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/index.ts"],"names":[],"mappings":";;;;AAYA,uBAAA;AAAA,EACE,YAAa,CAAA,IAAA;AAAA,EACb;AAAA,IACE,MAAQ,EAAA,KAAA;AAAA,IACR,EAAI,EAAA,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,eAAiB,EAAA,KAAA;AAAA,IACjB,WAAa,EAAA,KAAA;AAAA,IACb,cAAgB,EAAA,KAAA;AAAA,IAChB,KAAO,EAAA;AAAA,GACT;AAAA,EACA,kBAAA,CAAmB,aAAa,SAAS;AAC3C,CAAA;AAEA,uBAAA;AAAA,EACE,YAAa,CAAA,IAAA;AAAA,EACb,EAAE,QAAQ,EAAI,EAAA,MAAA,EAAQ,IAAI,EAAI,EAAA,OAAA,EAAS,gBAAgB,IAAK,EAAA;AAAA,EAC5D,kBAAA,CAAmB,aAAa,SAAS;AAC3C,CAAA;AAEA,uBAAA;AAAA,EACE,aAAc,CAAA,IAAA;AAAA,EACd,EAAC;AAAA,EACD,kBAAA,CAAmB,cAAc,SAAS;AAC5C,CAAA;AAEA,uBAAA;AAAA,EACE,UAAW,CAAA,IAAA;AAAA,EACX,EAAC;AAAA,EACD,kBAAA,CAAmB,WAAW,SAAS;AACzC,CAAA","file":"index.js","sourcesContent":["import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-core/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 {\n useModal,\n getModalContext,\n withModalElementContext,\n} from \"./hooks/index.js\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brytdesigns/web-component-modal",
3
- "version": "1.0.13",
3
+ "version": "1.1.0",
4
4
  "description": "Headless modal web component",
5
5
  "main": "./dist/main/index.js",
6
6
  "module": "./dist/main/index.js",
@@ -25,7 +25,6 @@
25
25
  "observe-element-in-viewport": "^0.0.15",
26
26
  "solid-element": "^1.9.1",
27
27
  "solid-js": "^1.9.7",
28
- "@brytdesigns/web-component-utils": "0.1.14",
29
28
  "@brytdesigns/web-component-core": "1.1.0"
30
29
  },
31
30
  "devDependencies": {