@omerdlw/base-framework 1.0.6 → 2.0.1
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/atoms/index.js +1 -103
- package/dist/atoms/index.js.map +1 -1
- package/dist/chunk-3BUP64Q6.js +105 -0
- package/dist/chunk-3BUP64Q6.js.map +1 -0
- package/dist/chunk-4GMQKD6F.js +353 -0
- package/dist/chunk-4GMQKD6F.js.map +1 -0
- package/dist/chunk-6SG7V77J.js +577 -0
- package/dist/chunk-6SG7V77J.js.map +1 -0
- package/dist/chunk-6ZJVLUBE.js +26 -0
- package/dist/chunk-6ZJVLUBE.js.map +1 -0
- package/dist/chunk-7HQMXTNP.js +419 -0
- package/dist/chunk-7HQMXTNP.js.map +1 -0
- package/dist/chunk-7TAVYJ3A.js +371 -0
- package/dist/chunk-7TAVYJ3A.js.map +1 -0
- package/dist/chunk-A5RE3F6O.js +9905 -0
- package/dist/chunk-A5RE3F6O.js.map +1 -0
- package/dist/chunk-AQ4BNXA2.js +349 -0
- package/dist/chunk-AQ4BNXA2.js.map +1 -0
- package/dist/chunk-CGHZSSFR.js +2166 -0
- package/dist/chunk-CGHZSSFR.js.map +1 -0
- package/dist/chunk-DGCQWQLZ.js +61 -0
- package/dist/chunk-DGCQWQLZ.js.map +1 -0
- package/dist/chunk-FIMPHODX.js +67 -0
- package/dist/chunk-FIMPHODX.js.map +1 -0
- package/dist/chunk-GF7TUX5I.js +1889 -0
- package/dist/chunk-GF7TUX5I.js.map +1 -0
- package/dist/chunk-JELG4JLT.js +454 -0
- package/dist/chunk-JELG4JLT.js.map +1 -0
- package/dist/chunk-K676GL7Z.js +51 -0
- package/dist/chunk-K676GL7Z.js.map +1 -0
- package/dist/chunk-QI3ALLIB.js +38 -0
- package/dist/chunk-QI3ALLIB.js.map +1 -0
- package/dist/chunk-QXR55VVS.js +1139 -0
- package/dist/chunk-QXR55VVS.js.map +1 -0
- package/dist/chunk-R2YGFJDJ.js +408 -0
- package/dist/chunk-R2YGFJDJ.js.map +1 -0
- package/dist/chunk-RFZQWLC5.js +27 -0
- package/dist/chunk-RFZQWLC5.js.map +1 -0
- package/dist/chunk-SKBITB5X.js +888 -0
- package/dist/chunk-SKBITB5X.js.map +1 -0
- package/dist/chunk-SYAVGTOX.js +521 -0
- package/dist/chunk-SYAVGTOX.js.map +1 -0
- package/dist/chunk-TV3WEF5G.js +784 -0
- package/dist/chunk-TV3WEF5G.js.map +1 -0
- package/dist/chunk-XASQT4CQ.js +280 -0
- package/dist/chunk-XASQT4CQ.js.map +1 -0
- package/dist/error/index.js +5 -682
- package/dist/error/index.js.map +1 -1
- package/dist/error/reporter.d.ts.map +1 -1
- package/dist/error/theme.d.ts +1 -1
- package/dist/error/theme.d.ts.map +1 -1
- package/dist/events.js +1 -7
- package/dist/events.js.map +1 -1
- package/dist/hooks/index.js +1 -358
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-global-event.d.ts +1 -1
- package/dist/index.js +18 -20029
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2035
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/modules/ambient/analyze.d.ts +46 -0
- package/dist/modules/ambient/analyze.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +1 -5
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/context.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +11 -12
- package/dist/modules/ambient/dom.d.ts.map +1 -1
- package/dist/modules/ambient/extractor.d.ts +10 -10
- package/dist/modules/ambient/extractor.d.ts.map +1 -1
- package/dist/modules/ambient/hooks.d.ts +1 -1
- package/dist/modules/ambient/hooks.d.ts.map +1 -1
- package/dist/modules/ambient/index.d.ts +6 -4
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +7 -762
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts +1 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/ambient/oklab.d.ts +36 -0
- package/dist/modules/ambient/oklab.d.ts.map +1 -0
- package/dist/modules/ambient/pipeline.d.ts +28 -0
- package/dist/modules/ambient/pipeline.d.ts.map +1 -0
- package/dist/modules/ambient/quantize.d.ts +22 -0
- package/dist/modules/ambient/quantize.d.ts.map +1 -0
- package/dist/modules/ambient/server/address.d.ts +8 -0
- package/dist/modules/ambient/server/address.d.ts.map +1 -0
- package/dist/modules/ambient/server/index.d.ts +53 -0
- package/dist/modules/ambient/server/index.d.ts.map +1 -0
- package/dist/modules/ambient/server/index.js +221 -0
- package/dist/modules/ambient/server/index.js.map +1 -0
- package/dist/modules/ambient/settings.d.ts +19 -0
- package/dist/modules/ambient/settings.d.ts.map +1 -0
- package/dist/modules/ambient/types.d.ts +105 -9
- package/dist/modules/ambient/types.d.ts.map +1 -1
- package/dist/modules/ambient/worker/index.d.ts +15 -0
- package/dist/modules/ambient/worker/index.d.ts.map +1 -0
- package/dist/modules/ambient/worker/index.js +114 -0
- package/dist/modules/ambient/worker/index.js.map +1 -0
- package/dist/modules/background/constants.d.ts +2 -2
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +1 -1
- package/dist/modules/background/index.js +6 -3078
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/motion.d.ts +9 -7
- package/dist/modules/background/motion.d.ts.map +1 -1
- package/dist/modules/background/overlay.d.ts +3 -8
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/types.d.ts +16 -2
- package/dist/modules/background/types.d.ts.map +1 -1
- package/dist/modules/context-menu/constants.d.ts +2 -2
- package/dist/modules/context-menu/constants.d.ts.map +1 -1
- package/dist/modules/context-menu/hooks.d.ts +1 -1
- package/dist/modules/context-menu/index.js +10 -1896
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/context-menu/motion.d.ts +1 -8
- package/dist/modules/context-menu/motion.d.ts.map +1 -1
- package/dist/modules/context-menu/overlay.d.ts.map +1 -1
- package/dist/modules/context-menu/types.d.ts +16 -2
- package/dist/modules/context-menu/types.d.ts.map +1 -1
- package/dist/modules/controls/constants.d.ts +1 -1
- package/dist/modules/controls/constants.d.ts.map +1 -1
- package/dist/modules/controls/entries.d.ts +1 -1
- package/dist/modules/controls/hooks.d.ts +1 -1
- package/dist/modules/controls/index.js +4 -1110
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/overlay.d.ts +1 -1
- package/dist/modules/controls/types.d.ts +2 -2
- package/dist/modules/dock/cards.d.ts +711 -24
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/constants.d.ts +2 -2
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/helpers.d.ts +2 -2
- package/dist/modules/dock/hooks.d.ts +2 -2
- package/dist/modules/dock/index.d.ts +1 -1
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +9 -12132
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/layout.d.ts.map +1 -1
- package/dist/modules/dock/module.d.ts +1 -1
- package/dist/modules/dock/motion.d.ts +44 -912
- package/dist/modules/dock/motion.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts +1 -23
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/styles.d.ts +4 -4
- package/dist/modules/dock/surface/hooks.d.ts +5 -20
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
- package/dist/modules/dock/surface/machine.d.ts +4 -3
- package/dist/modules/dock/surface/machine.d.ts.map +1 -1
- package/dist/modules/dock/surface/stack.d.ts.map +1 -1
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +162 -3
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +16 -17883
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/constants.d.ts +1 -1
- package/dist/modules/loading/constants.d.ts.map +1 -1
- package/dist/modules/loading/context.d.ts +1 -1
- package/dist/modules/loading/hooks.d.ts +1 -1
- package/dist/modules/loading/index.js +5 -1153
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/types.d.ts +2 -2
- package/dist/modules/media/context.d.ts +1 -1
- package/dist/modules/media/index.js +3 -570
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/media/types.d.ts +2 -2
- package/dist/modules/modal/constants.d.ts +2 -2
- package/dist/modules/modal/constants.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts +1 -1
- package/dist/modules/modal/hooks.d.ts +3 -3
- package/dist/modules/modal/index.js +8 -2355
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/modal/motion.d.ts +3 -8
- package/dist/modules/modal/motion.d.ts.map +1 -1
- package/dist/modules/modal/overlay.d.ts.map +1 -1
- package/dist/modules/modal/types.d.ts +21 -0
- package/dist/modules/modal/types.d.ts.map +1 -1
- package/dist/modules/notification/constants.d.ts +2 -2
- package/dist/modules/notification/constants.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +1 -1
- package/dist/modules/notification/hooks.d.ts +1 -1
- package/dist/modules/notification/index.js +4 -828
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/motion.d.ts +1 -7
- package/dist/modules/notification/motion.d.ts.map +1 -1
- package/dist/modules/notification/overlay.d.ts.map +1 -1
- package/dist/modules/notification/types.d.ts +9 -1
- package/dist/modules/notification/types.d.ts.map +1 -1
- package/dist/overlay-TZ6L52A5.js +9 -0
- package/dist/overlay-TZ6L52A5.js.map +1 -0
- package/dist/provider.d.ts +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +6 -1968
- package/dist/provider.js.map +1 -1
- package/dist/result.js +2 -63
- package/dist/result.js.map +1 -1
- package/dist/theme.d.ts +45 -8
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +3 -41
- package/dist/theme.js.map +1 -1
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +126 -155
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/motion-config.d.ts +44 -0
- package/dist/tokens/motion-config.d.ts.map +1 -0
- package/dist/tokens/motion.d.ts +23 -174
- package/dist/tokens/motion.d.ts.map +1 -1
- package/dist/utils/index.js +4 -82
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/report.d.ts.map +1 -1
- package/docs/README.md +1 -0
- package/docs/architecture-and-rules.md +4 -3
- package/docs/core-engine.md +7 -10
- package/docs/getting-started.md +4 -2
- package/docs/modules/ambient.md +194 -80
- package/docs/modules/background.md +3 -3
- package/docs/modules/context-menu.md +2 -2
- package/docs/modules/dock.md +9 -6
- package/docs/modules/modal.md +2 -2
- package/docs/modules/notification.md +2 -2
- package/docs/theming.md +81 -9
- package/package.json +22 -5
- package/templates/AGENTS.md +1 -1
- package/templates/motion/background.ts +17 -0
- package/templates/motion/context-menu.ts +63 -0
- package/templates/motion/dock.ts +327 -0
- package/templates/motion/modal.ts +79 -0
- package/templates/motion/notification.ts +27 -0
- package/templates/motion/tokens.ts +47 -0
- package/templates/tsconfig.json +7 -0
- package/dist/modules/ambient/color.d.ts +0 -21
- package/dist/modules/ambient/color.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/modal/constants.ts","../src/modules/modal/state.ts","../src/modules/modal/identity.ts","../src/modules/modal/layout.ts","../src/modules/modal/context.tsx","../src/modules/modal/dom.ts","../src/modules/modal/hooks.ts"],"names":["useMemo","useRef","useState"],"mappings":"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","file":"chunk-7HQMXTNP.js","sourcesContent":["import { defineThemeSpec } from \"@/theme\";\nimport { type ModalMotion, type ModalThemeSlot } from \"./types\";\n\nexport const MODAL_POSITIONS = Object.freeze({\n BOTTOM: \"bottom\",\n CENTER: \"center\",\n LEFT: \"left\",\n RIGHT: \"right\",\n TOP: \"top\",\n} as const);\n\nexport const MODAL_CHROME = Object.freeze({\n BARE: \"bare\",\n PANEL: \"panel\",\n} as const);\n\nexport const MODAL_BREAKPOINTS = Object.freeze({\n MOBILE_MAX_WIDTH: 639,\n} as const);\n\nexport const SMOOTH_SCROLL_LOCK_EVENT = \"modal:smooth-scroll-lock\";\n\nexport const FOCUSABLE_SELECTOR =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])';\n\nexport const HEIGHT_CONSTRAINT_PATTERN = /(\\s|^)(?:[\\w-]+:)*(?:h|max-h)-/;\n\nexport const modalTheme = defineThemeSpec<ModalThemeSlot, ModalMotion>(\"modal\");\n","import { MODAL_CHROME, MODAL_POSITIONS } from \"./constants\";\nimport { type ModalEntry, type ModalState } from \"./types\";\n\nexport function createModalState(modalStack: ModalEntry[] = []): ModalState {\n const activeModal = modalStack[modalStack.length - 1] || null;\n return {\n activeModalId: activeModal?.id || null,\n chrome: activeModal?.chrome || MODAL_CHROME.PANEL,\n headerActions: activeModal?.headerActions || null,\n isOpen: modalStack.length > 0,\n modalStack,\n modalType: activeModal?.modalType || null,\n position: activeModal?.position || MODAL_POSITIONS.CENTER,\n props: activeModal?.props || {},\n responsivePosition: activeModal?.responsivePosition || null,\n showClose: activeModal?.showClose ?? true,\n title: activeModal?.title || null,\n };\n}\n\nexport const INITIAL_MODAL_STATE = createModalState([]);\n","import {\n type DefineModalOptions,\n type ModalComponent,\n type ModalInput,\n} from \"./types\";\n\nexport function getModalIdentity(input: ModalInput | DefineModalOptions): {\n component: ModalComponent | null;\n type: string;\n} {\n if (typeof input === \"string\") return { component: null, type: input };\n const options = typeof input === \"function\" ? { component: input } : input;\n const component = options.component ?? null;\n return {\n component,\n type:\n (\"type\" in options && options.type) ||\n (\"id\" in options && options.id) ||\n component?.displayName ||\n component?.name ||\n \"modal\",\n };\n}\n\nexport function getModalLabel(modalType?: string | null): string {\n if (typeof modalType !== \"string\" || !modalType.trim()) return \"Modal\";\n return modalType\n .trim()\n .toLowerCase()\n .split(/[_-]+/)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n","import { isPlainObject } from \"@/utils\";\nimport {\n HEIGHT_CONSTRAINT_PATTERN,\n MODAL_BREAKPOINTS,\n MODAL_POSITIONS,\n} from \"./constants\";\nimport {\n type ModalLayout,\n type ModalPosition,\n type ResponsiveModalPosition,\n} from \"./types\";\n\nexport function hasHeightConstraint(className?: string): boolean {\n return (\n typeof className === \"string\" && HEIGHT_CONSTRAINT_PATTERN.test(className)\n );\n}\n\nexport function isSidePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.LEFT || position === MODAL_POSITIONS.RIGHT\n );\n}\n\nexport function isVerticalEdgePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.TOP || position === MODAL_POSITIONS.BOTTOM\n );\n}\n\nexport function getModalPosition(position: ModalPosition): ModalPosition {\n return position === MODAL_POSITIONS.TOP ||\n position === MODAL_POSITIONS.BOTTOM ||\n position === MODAL_POSITIONS.LEFT ||\n position === MODAL_POSITIONS.RIGHT\n ? position\n : MODAL_POSITIONS.CENTER;\n}\nexport function getModalLayout(\n position: ModalPosition,\n isMobile: boolean,\n): ModalLayout {\n const resolved = getModalPosition(position);\n if (!isMobile) return resolved;\n if (resolved === MODAL_POSITIONS.TOP || resolved === MODAL_POSITIONS.BOTTOM)\n return `${resolved}-mobile`;\n if (resolved === MODAL_POSITIONS.LEFT || resolved === MODAL_POSITIONS.RIGHT)\n return \"side-mobile\";\n return resolved;\n}\n\nexport function getViewportIsMobile(): boolean {\n if (\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return false;\n }\n return window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n ).matches;\n}\n\nexport function resolveActivePosition(\n position: ModalPosition,\n responsivePosition: ResponsiveModalPosition | null | undefined,\n isMobileViewport: boolean,\n): ModalPosition {\n if (!isPlainObject(responsivePosition)) return position;\n const responsive = isMobileViewport\n ? responsivePosition.mobile\n : responsivePosition.desktop;\n return (responsive || position) as ModalPosition;\n}\n\nexport function normalizePosition(\n input: ModalPosition | ResponsiveModalPosition | undefined,\n): {\n position: ModalPosition;\n responsivePosition: ResponsiveModalPosition | null;\n} {\n if (typeof input === \"string\") {\n return { position: input, responsivePosition: null };\n }\n if (!isPlainObject(input)) {\n return { position: MODAL_POSITIONS.CENTER, responsivePosition: null };\n }\n return {\n position: resolveActivePosition(\n MODAL_POSITIONS.CENTER,\n input,\n getViewportIsMobile(),\n ),\n responsivePosition: input,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore, report, type ExternalStore } from \"@/utils\";\nimport { MODAL_CHROME } from \"./constants\";\nimport {\n type ModalActions,\n type ModalEntry,\n type ModalOptions,\n type ModalProviderProps,\n type ModalState,\n} from \"./types\";\nimport { INITIAL_MODAL_STATE, createModalState } from \"./state\";\nimport { getModalIdentity } from \"./identity\";\nimport { normalizePosition } from \"./layout\";\n\nexport interface ModalContextValue {\n actions: ModalActions;\n store: ExternalStore<ModalState>;\n}\n\nexport const ModalContext = getOrCreateGlobalContext<ModalContextValue | null>(\n \"ModalContext\",\n null,\n);\n\ninterface PendingModal {\n onClose?: ModalOptions[\"onClose\"];\n resolve: (result?: unknown) => void;\n}\n\nexport function ModalProvider({\n children,\n modalRenderer: ModalRenderer = null,\n}: ModalProviderProps) {\n const [store] = useState(() =>\n createStore<ModalState>(INITIAL_MODAL_STATE, { freezeSnapshots: false }),\n );\n\n const modalStackRef = useRef<ModalEntry[]>([]);\n const pendingRef = useRef<Map<number, PendingModal>>(new Map());\n const modalIdRef = useRef(0);\n\n const syncModalStack = useCallback(\n (nextStack: ModalEntry[]) => {\n modalStackRef.current = nextStack;\n store.publish(createModalState(nextStack));\n },\n [store],\n );\n\n const settleModal = useCallback((modalId: number, result: unknown) => {\n const pending = pendingRef.current.get(modalId);\n if (!pending) return;\n pendingRef.current.delete(modalId);\n\n try {\n const outcome = pending.onClose?.(result);\n if (outcome instanceof Promise) {\n outcome.catch((error) => report(\"Modal onClose\", error));\n }\n } catch (error) {\n report(\"Modal onClose\", error);\n }\n pending.resolve(result);\n }, []);\n\n const openModal = useCallback<ModalActions[\"openModal\"]>(\n (modalInput, options = {}) => {\n if (!modalInput) return Promise.resolve(null);\n\n const stack = modalStackRef.current;\n const { component, type } = getModalIdentity(modalInput);\n const topEntry = stack[stack.length - 1];\n if (\n topEntry &&\n (topEntry.modalType === type ||\n (component && topEntry.component === component))\n ) {\n return Promise.resolve(null);\n }\n\n const definition =\n typeof modalInput === \"object\" ? modalInput : undefined;\n const merged: ModalOptions & { defaultData?: Record<string, unknown> } = {\n ...definition,\n ...options,\n };\n const data = { ...definition?.defaultData, ...options.data };\n const modalId = ++modalIdRef.current;\n\n const entry: ModalEntry = {\n chrome: merged.chrome || MODAL_CHROME.PANEL,\n component,\n headerActions: merged.actions || null,\n id: modalId,\n modalType: type,\n props: data,\n showClose: merged.showClose ?? true,\n title:\n typeof merged.title === \"function\"\n ? merged.title(data)\n : (merged.title ?? null),\n ...normalizePosition(merged.position),\n };\n\n return new Promise((resolve) => {\n pendingRef.current.set(modalId, { onClose: merged.onClose, resolve });\n syncModalStack([...stack, entry]);\n });\n },\n [syncModalStack],\n );\n\n const closeModal = useCallback<ModalActions[\"closeModal\"]>(\n (result = null, targetModalId = null) => {\n const stack = modalStackRef.current;\n const modalId = targetModalId || stack[stack.length - 1]?.id;\n if (!modalId || !stack.some((entry) => entry.id === modalId)) return;\n\n syncModalStack(stack.filter((entry) => entry.id !== modalId));\n settleModal(modalId, result);\n },\n [settleModal, syncModalStack],\n );\n\n const closeAllModals = useCallback<ModalActions[\"closeAllModals\"]>(\n (result = null) => {\n const stack = modalStackRef.current;\n if (stack.length === 0) return;\n\n syncModalStack([]);\n stack.forEach((entry) => settleModal(entry.id, result));\n },\n [settleModal, syncModalStack],\n );\n\n const actionsValue = useMemo<ModalActions>(\n () => ({ closeAllModals, closeModal, openModal }),\n [openModal, closeModal, closeAllModals],\n );\n\n const contextValue = useMemo<ModalContextValue>(\n () => ({ actions: actionsValue, store }),\n [actionsValue, store],\n );\n\n return (\n <ModalContext value={contextValue}>\n {ModalRenderer && <ModalRenderer />}\n {children}\n </ModalContext>\n );\n}\n\n","import {\n FOCUSABLE_SELECTOR,\n SMOOTH_SCROLL_LOCK_EVENT,\n} from \"./constants\";\n\nexport function dispatchSmoothScrollLock(locked: boolean): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SMOOTH_SCROLL_LOCK_EVENT, {\n detail: { locked, source: \"modal\" },\n }),\n );\n}\n\nexport function getFocusableElements(\n container: HTMLElement | null,\n): HTMLElement[] {\n if (!container || typeof container.querySelectorAll !== \"function\") return [];\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter(\n (element) =>\n !element.hasAttribute(\"disabled\") &&\n element.getAttribute(\"aria-hidden\") !== \"true\",\n );\n}\n\nexport function trapFocus(\n event: KeyboardEvent,\n container: HTMLElement | null,\n): void {\n if (event.key !== \"Tab\" || !container) return;\n const elements = getFocusableElements(container);\n if (elements.length === 0) return;\n\n const firstElement = elements[0];\n const lastElement = elements[elements.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n}\n","\"use client\";\n\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n useRegistryEntries,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { acquireGlobalScrollLock } from \"@/utils\";\nimport { useModuleTheme } from \"@/theme\";\nimport {\n MODAL_BREAKPOINTS,\n MODAL_CHROME,\n MODAL_POSITIONS,\n modalTheme,\n} from \"./constants\";\nimport { ModalContext } from \"./context\";\nimport { getModalIdentity } from \"./identity\";\nimport {\n type ModalActions,\n type ModalComponent,\n type ModalEntry,\n type ModalHookBinding,\n type ModalHookControls,\n type ModalInput,\n type ModalOpenFn,\n type ModalPageConfig,\n type ModalState,\n} from \"./types\";\nimport {\n dispatchSmoothScrollLock,\n getFocusableElements,\n trapFocus,\n} from \"./dom\";\nimport {\n getViewportIsMobile,\n isSidePosition,\n isVerticalEdgePosition,\n resolveActivePosition,\n} from \"./layout\";\n\nexport function useModalRegistration(\n config: ModalPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"modal\", config, options);\n}\n\nexport function useModalRegistryEntries(): {\n get: (type: string) => ModalComponent | undefined;\n} {\n const entries = useRegistryEntries<\"modal\", ModalComponent>(\"modal\");\n return useMemo(() => ({ get: (type: string) => entries[type] }), [entries]);\n}\n\nexport function useModalActions(): ModalActions {\n return useRequiredContext(ModalContext, \"useModalActions\", \"ModalProvider\")\n .actions;\n}\n\nexport function useModalState(): ModalState {\n const { store } = useRequiredContext(\n ModalContext,\n \"useModalState\",\n \"ModalProvider\",\n );\n return useStore(store);\n}\n\nexport function useModal(): ModalState & ModalActions;\nexport function useModal(modalInput: ModalInput): ModalHookBinding;\nexport function useModal(\n modalInput?: ModalInput | null,\n): (ModalState & ModalActions) | ModalHookBinding {\n const actions = useModalActions();\n const state = useModalState();\n\n return useMemo(() => {\n if (!modalInput) return { ...actions, ...state };\n\n const { component, type } = getModalIdentity(modalInput);\n const isOpen = state.modalStack.some(\n (entry) =>\n entry.modalType === type ||\n (component && entry.component === component),\n );\n const open: ModalOpenFn = (data, overrides) =>\n actions.openModal(modalInput, { ...overrides, data });\n const controls: ModalHookControls = {\n close: actions.closeModal,\n closeAll: actions.closeAllModals,\n isOpen,\n state,\n };\n\n return Object.assign([open, controls], controls, { open });\n }, [actions, modalInput, state]) as\n (ModalState & ModalActions) | ModalHookBinding;\n}\n\nconst emptySubscribe = () => () => {};\n\nexport function useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n}) {\n const modalRef = useRef<HTMLDivElement | null>(null);\n const activePosition = useMemo(\n () =>\n resolveActivePosition(\n entry.position,\n entry.responsivePosition,\n isMobileViewport,\n ),\n [entry.position, entry.responsivePosition, isMobileViewport],\n );\n const ActiveModalComponent = entry.component || registry.get(entry.modalType);\n const isPanelChrome = entry.chrome !== MODAL_CHROME.BARE;\n const isLeftModal = activePosition === MODAL_POSITIONS.LEFT;\n const isSide = isSidePosition(activePosition);\n const isVerticalEdge = isVerticalEdgePosition(activePosition);\n const previousEntry = modalStack[stackIndex - 1] || null;\n const baseZIndex = Z_INDEX.MODAL;\n useEffect(() => {\n if (!isTopModal || !modalRef.current) return;\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n const initialElements = getFocusableElements(modalRef.current);\n if (initialElements.length > 0) initialElements[0].focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") closeModal(null, entry.id);\n else trapFocus(event, modalRef.current);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n if (previouslyFocusedElement?.isConnected)\n previouslyFocusedElement.focus();\n };\n }, [closeModal, entry.id, isTopModal]);\n\n return {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n isLeftModal,\n isSide,\n isVerticalEdge,\n previousEntry,\n baseZIndex,\n };\n}\n\nexport function useModalContainerModel() {\n return { theme: useModuleTheme(modalTheme) };\n}\n\nexport function useModalModel() {\n const { modalStack = [], isOpen, closeModal } = useModal();\n const registry = useModalRegistryEntries();\n const visibleModalStack = useMemo(\n () =>\n modalStack.filter((entry: ModalEntry) =>\n Boolean(entry.component || registry.get(entry.modalType)),\n ),\n [modalStack, registry],\n );\n const topModalEntry = visibleModalStack[visibleModalStack.length - 1] || null;\n const isModalVisible = Boolean(isOpen && topModalEntry);\n const mounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n const [isMobileViewport, setIsMobileViewport] = useState(getViewportIsMobile);\n const [isTopExitSettling, setIsTopExitSettling] = useState(false);\n const previousTopModalIdRef = useRef<number | null>(null);\n const releaseScrollLockRef = useRef<(() => void) | null>(null);\n useLayoutEffect(() => {\n const currentTopModalId = topModalEntry?.id || null;\n const previousTopModalId = previousTopModalIdRef.current;\n const previousTopStillMounted = visibleModalStack.some(\n (entry: ModalEntry) => entry.id === previousTopModalId,\n );\n\n if (\n previousTopModalId &&\n previousTopModalId !== currentTopModalId &&\n !previousTopStillMounted\n ) {\n setIsTopExitSettling(true);\n }\n previousTopModalIdRef.current = currentTopModalId;\n }, [topModalEntry?.id, visibleModalStack]);\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n );\n const handleViewportChange = (e: MediaQueryListEvent) =>\n setIsMobileViewport(e.matches);\n\n mediaQuery.addEventListener(\"change\", handleViewportChange);\n return () => mediaQuery.removeEventListener(\"change\", handleViewportChange);\n }, []);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n if (isModalVisible) {\n releaseScrollLockRef.current ??= acquireGlobalScrollLock();\n } else if (releaseScrollLockRef.current) {\n releaseScrollLockRef.current();\n releaseScrollLockRef.current = null;\n }\n dispatchSmoothScrollLock(isModalVisible);\n }, [isModalVisible]);\n useEffect(() => {\n return () => {\n releaseScrollLockRef.current?.();\n releaseScrollLockRef.current = null;\n dispatchSmoothScrollLock(false);\n };\n }, []);\n\n return {\n modalStack,\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme: useModuleTheme(modalTheme),\n };\n}\n"]}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { getOrCreateGlobalContext } from './chunk-GF7TUX5I.js';
|
|
2
|
+
import { useContext, createElement, useMemo } from 'react';
|
|
3
|
+
import { MotionConfig, useReducedMotion } from 'motion/react';
|
|
4
|
+
|
|
5
|
+
// src/tokens/motion.ts
|
|
6
|
+
var REDUCED_MOTION_TRANSITION = Object.freeze({
|
|
7
|
+
duration: 0.08,
|
|
8
|
+
ease: "linear"
|
|
9
|
+
});
|
|
10
|
+
function tween(duration, ease) {
|
|
11
|
+
return Object.freeze({ type: "tween", duration, ease });
|
|
12
|
+
}
|
|
13
|
+
function safeNumber(value, fallback) {
|
|
14
|
+
const source = value && typeof value === "object" && "get" in value && typeof value.get === "function" ? value.get() : value;
|
|
15
|
+
const number = Number.parseFloat(String(source));
|
|
16
|
+
return Number.isFinite(number) ? number : fallback;
|
|
17
|
+
}
|
|
18
|
+
function gpuTransform(y = 0, scale = 1, x = 0) {
|
|
19
|
+
const translateY = Math.round(safeNumber(y, 0));
|
|
20
|
+
const translateX = Math.round(safeNumber(x, 0));
|
|
21
|
+
const scaleValue = Math.round(safeNumber(scale, 1) * 1e3) / 1e3;
|
|
22
|
+
return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;
|
|
23
|
+
}
|
|
24
|
+
function durationForDistance(distancePx, {
|
|
25
|
+
base,
|
|
26
|
+
min,
|
|
27
|
+
max,
|
|
28
|
+
reference = 320,
|
|
29
|
+
gain = 0.22
|
|
30
|
+
}) {
|
|
31
|
+
const distance = Math.abs(Number(distancePx) || 0);
|
|
32
|
+
const safeMin = Math.max(0, min);
|
|
33
|
+
const safeMax = Math.max(safeMin, max);
|
|
34
|
+
const safeReference = Math.max(1, reference);
|
|
35
|
+
const duration = base + Math.sqrt(distance / safeReference) * gain;
|
|
36
|
+
return Math.min(safeMax, Math.max(safeMin, duration));
|
|
37
|
+
}
|
|
38
|
+
function surfaceResizeTransition(distancePx, {
|
|
39
|
+
base,
|
|
40
|
+
min,
|
|
41
|
+
max,
|
|
42
|
+
reference = 320,
|
|
43
|
+
gain = 0.22,
|
|
44
|
+
ease
|
|
45
|
+
}) {
|
|
46
|
+
return tween(
|
|
47
|
+
durationForDistance(distancePx, { base, min, max, reference, gain }),
|
|
48
|
+
ease
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
function contentSwapTransitions({
|
|
52
|
+
duration,
|
|
53
|
+
exitDuration,
|
|
54
|
+
enterEase,
|
|
55
|
+
exitEase
|
|
56
|
+
}) {
|
|
57
|
+
return Object.freeze({
|
|
58
|
+
enter: tween(duration, enterEase),
|
|
59
|
+
exit: tween(exitDuration, exitEase)
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function contentSwap({
|
|
63
|
+
travel = 6,
|
|
64
|
+
exitTravel = travel * 0.7,
|
|
65
|
+
enterScale = 0.99,
|
|
66
|
+
exitScale = 0.99,
|
|
67
|
+
...transitionOptions
|
|
68
|
+
}) {
|
|
69
|
+
const transitions = contentSwapTransitions(transitionOptions);
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
hidden: Object.freeze({
|
|
72
|
+
opacity: 0,
|
|
73
|
+
transform: gpuTransform(travel, enterScale)
|
|
74
|
+
}),
|
|
75
|
+
visible: Object.freeze({
|
|
76
|
+
opacity: 1,
|
|
77
|
+
transform: gpuTransform(0),
|
|
78
|
+
transition: transitions.enter
|
|
79
|
+
}),
|
|
80
|
+
exit: Object.freeze({
|
|
81
|
+
opacity: 0,
|
|
82
|
+
transform: gpuTransform(-exitTravel, exitScale),
|
|
83
|
+
transition: transitions.exit
|
|
84
|
+
})
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function overlaySurface({
|
|
88
|
+
travel = 16,
|
|
89
|
+
exitTravel = travel * 0.5,
|
|
90
|
+
enterScale = 0.97,
|
|
91
|
+
exitScale = 0.985,
|
|
92
|
+
duration,
|
|
93
|
+
exitDuration = duration * 0.68,
|
|
94
|
+
enterEase,
|
|
95
|
+
exitEase
|
|
96
|
+
}) {
|
|
97
|
+
const transitions = contentSwapTransitions({
|
|
98
|
+
duration,
|
|
99
|
+
exitDuration,
|
|
100
|
+
enterEase,
|
|
101
|
+
exitEase
|
|
102
|
+
});
|
|
103
|
+
return Object.freeze({
|
|
104
|
+
hidden: Object.freeze({
|
|
105
|
+
opacity: 0,
|
|
106
|
+
transform: gpuTransform(travel, enterScale)
|
|
107
|
+
}),
|
|
108
|
+
visible: Object.freeze({
|
|
109
|
+
opacity: 1,
|
|
110
|
+
transform: gpuTransform(0),
|
|
111
|
+
transition: transitions.enter
|
|
112
|
+
}),
|
|
113
|
+
exit: Object.freeze({
|
|
114
|
+
opacity: 0,
|
|
115
|
+
transform: gpuTransform(exitTravel, exitScale),
|
|
116
|
+
transition: transitions.exit
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function staggerDelay(index, { base = 0.028, cap = 0.16, exponent = 0.82 } = {}) {
|
|
121
|
+
const safeIndex = Math.max(0, Number(index) || 0);
|
|
122
|
+
return Math.min(cap, base * Math.pow(safeIndex, exponent));
|
|
123
|
+
}
|
|
124
|
+
function chip({
|
|
125
|
+
duration,
|
|
126
|
+
exitDuration,
|
|
127
|
+
enterEase,
|
|
128
|
+
exitEase
|
|
129
|
+
}) {
|
|
130
|
+
const transitions = contentSwapTransitions({
|
|
131
|
+
duration,
|
|
132
|
+
exitDuration,
|
|
133
|
+
enterEase,
|
|
134
|
+
exitEase
|
|
135
|
+
});
|
|
136
|
+
return Object.freeze({
|
|
137
|
+
hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),
|
|
138
|
+
visible: Object.freeze({
|
|
139
|
+
opacity: 1,
|
|
140
|
+
transform: gpuTransform(0),
|
|
141
|
+
transition: transitions.enter
|
|
142
|
+
}),
|
|
143
|
+
exit: Object.freeze({
|
|
144
|
+
opacity: 0,
|
|
145
|
+
transform: gpuTransform(0, 0.96),
|
|
146
|
+
transition: transitions.exit
|
|
147
|
+
})
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function press({
|
|
151
|
+
tapScale,
|
|
152
|
+
spring
|
|
153
|
+
}) {
|
|
154
|
+
return Object.freeze({
|
|
155
|
+
variants: Object.freeze({
|
|
156
|
+
idle: Object.freeze({ transform: gpuTransform(0, 1) }),
|
|
157
|
+
hover: Object.freeze({ transform: gpuTransform(0, 1) }),
|
|
158
|
+
tap: Object.freeze({ transform: gpuTransform(0, tapScale) })
|
|
159
|
+
}),
|
|
160
|
+
transition: Object.freeze({ type: "spring", ...spring })
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// src/tokens/motion-config.ts
|
|
165
|
+
function defineMotion(tokens) {
|
|
166
|
+
const tempo = tokens.tempo ?? 1;
|
|
167
|
+
if (!Number.isFinite(tempo) || tempo <= 0) {
|
|
168
|
+
throw new Error(`Motion tempo must be a positive number, got ${tempo}.`);
|
|
169
|
+
}
|
|
170
|
+
return Object.freeze({
|
|
171
|
+
...tokens,
|
|
172
|
+
tempo,
|
|
173
|
+
reducedMotion: tokens.reducedMotion ?? "user"
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
var TIME_KEYS = [
|
|
177
|
+
"duration",
|
|
178
|
+
"delay",
|
|
179
|
+
"delayChildren",
|
|
180
|
+
"staggerChildren",
|
|
181
|
+
"repeatDelay",
|
|
182
|
+
"visualDuration"
|
|
183
|
+
];
|
|
184
|
+
var REDUCED = Object.freeze({
|
|
185
|
+
type: "tween",
|
|
186
|
+
...REDUCED_MOTION_TRANSITION
|
|
187
|
+
});
|
|
188
|
+
function isPlainObject(value) {
|
|
189
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
190
|
+
const prototype = Object.getPrototypeOf(value);
|
|
191
|
+
return prototype === Object.prototype || prototype === null;
|
|
192
|
+
}
|
|
193
|
+
function isSpring(value) {
|
|
194
|
+
return value.type === "spring" || typeof value.stiffness === "number" || typeof value.damping === "number";
|
|
195
|
+
}
|
|
196
|
+
function isTransition(value) {
|
|
197
|
+
return isSpring(value) || TIME_KEYS.some((key) => typeof value[key] === "number");
|
|
198
|
+
}
|
|
199
|
+
function retimeTransition(value, clock) {
|
|
200
|
+
if (clock.reduced) return { ...REDUCED };
|
|
201
|
+
const { tempo } = clock;
|
|
202
|
+
const next = {};
|
|
203
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
204
|
+
next[key] = isPlainObject(entry) ? retimeNode(entry, clock) : entry;
|
|
205
|
+
}
|
|
206
|
+
for (const key of TIME_KEYS) {
|
|
207
|
+
if (typeof value[key] === "number") next[key] = value[key] * tempo;
|
|
208
|
+
}
|
|
209
|
+
if (typeof value.stiffness === "number") {
|
|
210
|
+
next.stiffness = value.stiffness / (tempo * tempo);
|
|
211
|
+
}
|
|
212
|
+
if (typeof value.damping === "number") next.damping = value.damping / tempo;
|
|
213
|
+
return next;
|
|
214
|
+
}
|
|
215
|
+
function retimeNode(value, clock) {
|
|
216
|
+
if (typeof value === "function") {
|
|
217
|
+
const fn = value;
|
|
218
|
+
return (...args) => retimeNode(fn(...args), clock);
|
|
219
|
+
}
|
|
220
|
+
if (!isPlainObject(value)) return value;
|
|
221
|
+
if (isTransition(value)) return retimeTransition(value, clock);
|
|
222
|
+
const next = {};
|
|
223
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
224
|
+
next[key] = retimeNode(entry, clock);
|
|
225
|
+
}
|
|
226
|
+
return next;
|
|
227
|
+
}
|
|
228
|
+
function retime(value, clock) {
|
|
229
|
+
if (clock.tempo === 1 && !clock.reduced) return value;
|
|
230
|
+
return retimeNode(value, clock);
|
|
231
|
+
}
|
|
232
|
+
function retimeSeconds(value, clock) {
|
|
233
|
+
if (typeof value === "number") {
|
|
234
|
+
return clock.reduced ? Math.min(value, REDUCED.duration) : value * clock.tempo;
|
|
235
|
+
}
|
|
236
|
+
if (!isPlainObject(value)) return value;
|
|
237
|
+
const next = {};
|
|
238
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
239
|
+
next[key] = retimeSeconds(entry, clock);
|
|
240
|
+
}
|
|
241
|
+
return next;
|
|
242
|
+
}
|
|
243
|
+
function retimeModuleMotion(motion, clock) {
|
|
244
|
+
if (clock.tempo === 1 && !clock.reduced) return motion;
|
|
245
|
+
if (!isPlainObject(motion)) return retime(motion, clock);
|
|
246
|
+
const next = {};
|
|
247
|
+
for (const [key, entry] of Object.entries(motion)) {
|
|
248
|
+
next[key] = key === "timings" ? retimeSeconds(entry, clock) : retimeNode(entry, clock);
|
|
249
|
+
}
|
|
250
|
+
return next;
|
|
251
|
+
}
|
|
252
|
+
function cssEasing(ease) {
|
|
253
|
+
if (Array.isArray(ease)) return `cubic-bezier(${ease.join(", ")})`;
|
|
254
|
+
if (typeof ease === "string" && ease.trim()) return ease;
|
|
255
|
+
return "ease";
|
|
256
|
+
}
|
|
257
|
+
function cssTransition(property, transition) {
|
|
258
|
+
const duration = `${Math.round((transition.duration ?? 0) * 1e3)}ms`;
|
|
259
|
+
const delay = transition.delay ? ` ${Math.round(transition.delay * 1e3)}ms` : "";
|
|
260
|
+
return `${property} ${duration} ${cssEasing(transition.ease)}${delay}`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// src/theme.tsx
|
|
264
|
+
function defineThemeSpec(id) {
|
|
265
|
+
return Object.freeze({ id });
|
|
266
|
+
}
|
|
267
|
+
function defineTheme(spec, config) {
|
|
268
|
+
return { id: spec.id, config };
|
|
269
|
+
}
|
|
270
|
+
var EMPTY = /* @__PURE__ */ new Map();
|
|
271
|
+
var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
|
|
272
|
+
var DEFAULT_MOTION = defineMotion({});
|
|
273
|
+
var NO_MOTION_PROVIDER = Object.freeze({
|
|
274
|
+
reduced: false,
|
|
275
|
+
tempo: 1,
|
|
276
|
+
tokens: DEFAULT_MOTION
|
|
277
|
+
});
|
|
278
|
+
var MotionContext = getOrCreateGlobalContext(
|
|
279
|
+
"MotionContext",
|
|
280
|
+
NO_MOTION_PROVIDER
|
|
281
|
+
);
|
|
282
|
+
function MotionProvider({
|
|
283
|
+
children,
|
|
284
|
+
tokens
|
|
285
|
+
}) {
|
|
286
|
+
const prefersReduced = useReducedMotion() === true;
|
|
287
|
+
const reduced = tokens.reducedMotion === "always" || tokens.reducedMotion === "user" && prefersReduced;
|
|
288
|
+
const state = useMemo(
|
|
289
|
+
() => Object.freeze({ reduced, tempo: tokens.tempo, tokens }),
|
|
290
|
+
[reduced, tokens]
|
|
291
|
+
);
|
|
292
|
+
return createElement(MotionContext.Provider, { value: state }, children);
|
|
293
|
+
}
|
|
294
|
+
function ThemeProvider({
|
|
295
|
+
children,
|
|
296
|
+
motion,
|
|
297
|
+
themes
|
|
298
|
+
}) {
|
|
299
|
+
const configs = new Map(themes.map((entry) => [entry.id, entry.config]));
|
|
300
|
+
const inherited = useContext(MotionContext) !== NO_MOTION_PROVIDER;
|
|
301
|
+
return createElement(
|
|
302
|
+
ThemeContext.Provider,
|
|
303
|
+
{ value: configs },
|
|
304
|
+
motion || !inherited ? createElement(
|
|
305
|
+
MotionProvider,
|
|
306
|
+
{ tokens: motion ?? DEFAULT_MOTION },
|
|
307
|
+
children
|
|
308
|
+
) : children
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
function missingTheme(id) {
|
|
312
|
+
return new Error(
|
|
313
|
+
`Theme "${id}" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
function useTheme(spec) {
|
|
317
|
+
const config = useContext(ThemeContext).get(spec.id);
|
|
318
|
+
if (!config) throw missingTheme(spec.id);
|
|
319
|
+
return {
|
|
320
|
+
slots: config.slots,
|
|
321
|
+
styles: config.styles ?? {}
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
function useMotionTokens() {
|
|
325
|
+
const state = useContext(MotionContext);
|
|
326
|
+
return useMemo(
|
|
327
|
+
() => ({ ...state.tokens, reduced: state.reduced }),
|
|
328
|
+
[state]
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
var resolvedMotion = /* @__PURE__ */ new WeakMap();
|
|
332
|
+
function useModuleMotion(spec) {
|
|
333
|
+
const config = useContext(ThemeContext).get(spec.id);
|
|
334
|
+
const state = useContext(MotionContext);
|
|
335
|
+
if (!config) throw missingTheme(spec.id);
|
|
336
|
+
if (!config.motion || typeof config.motion !== "object") {
|
|
337
|
+
throw new Error(
|
|
338
|
+
`Motion for theme "${spec.id}" is missing. Add \`motion\` to its defineTheme(...) next to \`slots\` (start from the framework's templates/motion/).`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
return resolveModuleMotion(state, config.motion);
|
|
342
|
+
}
|
|
343
|
+
function useOptionalModuleMotion(spec) {
|
|
344
|
+
const motion = useContext(ThemeContext).get(spec.id)?.motion;
|
|
345
|
+
const state = useContext(MotionContext);
|
|
346
|
+
if (!motion || typeof motion !== "object") return null;
|
|
347
|
+
return resolveModuleMotion(state, motion);
|
|
348
|
+
}
|
|
349
|
+
function resolveModuleMotion(state, motion) {
|
|
350
|
+
let byConfig = resolvedMotion.get(state);
|
|
351
|
+
if (!byConfig) {
|
|
352
|
+
byConfig = /* @__PURE__ */ new WeakMap();
|
|
353
|
+
resolvedMotion.set(state, byConfig);
|
|
354
|
+
}
|
|
355
|
+
if (!byConfig.has(motion)) {
|
|
356
|
+
byConfig.set(motion, retimeModuleMotion(motion, state));
|
|
357
|
+
}
|
|
358
|
+
return byConfig.get(motion);
|
|
359
|
+
}
|
|
360
|
+
function ModuleMotionConfig({ children }) {
|
|
361
|
+
const { tokens } = useContext(MotionContext);
|
|
362
|
+
return createElement(
|
|
363
|
+
MotionConfig,
|
|
364
|
+
{ reducedMotion: tokens.reducedMotion },
|
|
365
|
+
children
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export { ModuleMotionConfig, REDUCED_MOTION_TRANSITION, ThemeProvider, chip, contentSwap, contentSwapTransitions, cssEasing, cssTransition, defineMotion, defineTheme, defineThemeSpec, durationForDistance, gpuTransform, overlaySurface, press, retime, retimeModuleMotion, staggerDelay, surfaceResizeTransition, useModuleMotion, useMotionTokens, useOptionalModuleMotion, useTheme };
|
|
370
|
+
//# sourceMappingURL=chunk-7TAVYJ3A.js.map
|
|
371
|
+
//# sourceMappingURL=chunk-7TAVYJ3A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tokens/motion.ts","../src/tokens/motion-config.ts","../src/theme.tsx"],"names":[],"mappings":"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","file":"chunk-7TAVYJ3A.js","sourcesContent":["// Builders for the motion an app writes in its theme files. They hold shapes\n// (travel, scale, how a duration grows with distance), never the app's timing:\n// every duration, easing and spring is passed in.\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: 0.08,\n ease: \"linear\",\n} as const);\n\ntype Ease = readonly [number, number, number, number];\n\ntype TweenOptions = {\n duration: number;\n exitDuration: number;\n enterEase: Ease;\n exitEase: Ease;\n};\n\ntype Spring = {\n type?: \"spring\";\n stiffness: number;\n damping: number;\n mass: number;\n};\n\nfunction tween(duration: number, ease: Ease) {\n return Object.freeze({ type: \"tween\" as const, duration, ease });\n}\n\nfunction safeNumber(value: unknown, fallback: number): number {\n const source =\n value &&\n typeof value === \"object\" &&\n \"get\" in value &&\n typeof value.get === \"function\"\n ? value.get()\n : value;\n const number = Number.parseFloat(String(source));\n return Number.isFinite(number) ? number : fallback;\n}\n\nexport function gpuTransform(\n y: unknown = 0,\n scale: unknown = 1,\n x: unknown = 0,\n): string {\n const translateY = Math.round(safeNumber(y, 0));\n const translateX = Math.round(safeNumber(x, 0));\n const scaleValue = Math.round(safeNumber(scale, 1) * 1000) / 1000;\n return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;\n}\n\nexport function durationForDistance(\n distancePx: number,\n {\n base,\n min,\n max,\n reference = 320,\n gain = 0.22,\n }: {\n base: number;\n min: number;\n max: number;\n reference?: number;\n gain?: number;\n },\n): number {\n const distance = Math.abs(Number(distancePx) || 0);\n const safeMin = Math.max(0, min);\n const safeMax = Math.max(safeMin, max);\n const safeReference = Math.max(1, reference);\n const duration = base + Math.sqrt(distance / safeReference) * gain;\n return Math.min(safeMax, Math.max(safeMin, duration));\n}\n\nexport function surfaceResizeTransition(\n distancePx: number,\n {\n base,\n min,\n max,\n reference = 320,\n gain = 0.22,\n ease,\n }: {\n base: number;\n min: number;\n max: number;\n reference?: number;\n gain?: number;\n ease: Ease;\n },\n) {\n return tween(\n durationForDistance(distancePx, { base, min, max, reference, gain }),\n ease,\n );\n}\n\nexport function contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n}: TweenOptions) {\n return Object.freeze({\n enter: tween(duration, enterEase),\n exit: tween(exitDuration, exitEase),\n });\n}\n\nexport function contentSwap({\n travel = 6,\n exitTravel = travel * 0.7,\n enterScale = 0.99,\n exitScale = 0.99,\n ...transitionOptions\n}: TweenOptions & {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n}) {\n const transitions = contentSwapTransitions(transitionOptions);\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function overlaySurface({\n travel = 16,\n exitTravel = travel * 0.5,\n enterScale = 0.97,\n exitScale = 0.985,\n duration,\n exitDuration = duration * 0.68,\n enterEase,\n exitEase,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n duration: number;\n exitDuration?: number;\n enterEase: Ease;\n exitEase: Ease;\n}) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function staggerDelay(\n index: number,\n { base = 0.028, cap = 0.16, exponent = 0.82 } = {},\n): number {\n const safeIndex = Math.max(0, Number(index) || 0);\n return Math.min(cap, base * Math.pow(safeIndex, exponent));\n}\n\nexport function chip({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n}: TweenOptions) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n return Object.freeze({\n hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(0, 0.96),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function press({\n tapScale,\n spring,\n}: {\n tapScale: number;\n spring: Spring;\n}) {\n return Object.freeze({\n variants: Object.freeze({\n idle: Object.freeze({ transform: gpuTransform(0, 1) }),\n hover: Object.freeze({ transform: gpuTransform(0, 1) }),\n tap: Object.freeze({ transform: gpuTransform(0, tapScale) }),\n }),\n transition: Object.freeze({ type: \"spring\" as const, ...spring }),\n });\n}\n","import { REDUCED_MOTION_TRANSITION } from \"./motion\";\n\n// Motion is owned by the app, like its styles. The app names its own\n// durations, easings and springs and writes every module's motion with them;\n// the framework only reads the tempo and the reduced-motion policy, and applies\n// both to whatever the app wrote.\n\nexport type MotionEase = readonly [number, number, number, number];\n\nexport type ReducedMotionPolicy = \"user\" | \"always\" | \"never\";\n\nexport interface MotionSpring {\n readonly type?: \"spring\";\n readonly stiffness?: number;\n readonly damping?: number;\n readonly mass?: number;\n readonly bounce?: number;\n readonly visualDuration?: number;\n}\n\nexport interface MotionTokensInput {\n /** Stretches every module duration, delay, stagger, timer and spring. */\n readonly tempo?: number;\n /** \"user\" follows the OS setting. */\n readonly reducedMotion?: ReducedMotionPolicy;\n readonly durations?: Readonly<Record<string, number>>;\n readonly easings?: Readonly<Record<string, MotionEase>>;\n readonly springs?: Readonly<Record<string, MotionSpring>>;\n}\n\nexport type MotionTokens<T extends MotionTokensInput = MotionTokensInput> =\n Readonly<\n Omit<T, \"tempo\" | \"reducedMotion\"> & {\n tempo: number;\n reducedMotion: ReducedMotionPolicy;\n }\n >;\n\nexport function defineMotion<T extends MotionTokensInput>(\n tokens: T,\n): MotionTokens<T> {\n const tempo = tokens.tempo ?? 1;\n if (!Number.isFinite(tempo) || tempo <= 0) {\n throw new Error(`Motion tempo must be a positive number, got ${tempo}.`);\n }\n return Object.freeze({\n ...tokens,\n tempo,\n reducedMotion: tokens.reducedMotion ?? \"user\",\n }) as MotionTokens<T>;\n}\n\nexport interface MotionClock {\n readonly tempo: number;\n readonly reduced: boolean;\n}\n\nconst TIME_KEYS = [\n \"duration\",\n \"delay\",\n \"delayChildren\",\n \"staggerChildren\",\n \"repeatDelay\",\n \"visualDuration\",\n] as const;\n\nconst REDUCED = Object.freeze({\n type: \"tween\" as const,\n ...REDUCED_MOTION_TRANSITION,\n});\n\ntype Plain = Record<string, unknown>;\n\nfunction isPlainObject(value: unknown): value is Plain {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isSpring(value: Plain): boolean {\n return (\n value.type === \"spring\" ||\n typeof value.stiffness === \"number\" ||\n typeof value.damping === \"number\"\n );\n}\n\nfunction isTransition(value: Plain): boolean {\n return (\n isSpring(value) ||\n TIME_KEYS.some((key) => typeof value[key] === \"number\")\n );\n}\n\nfunction retimeTransition(value: Plain, clock: MotionClock): Plain {\n if (clock.reduced) return { ...REDUCED };\n const { tempo } = clock;\n const next: Plain = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = isPlainObject(entry) ? retimeNode(entry, clock) : entry;\n }\n for (const key of TIME_KEYS) {\n if (typeof value[key] === \"number\") next[key] = (value[key] as number) * tempo;\n }\n // A spring takes tempo× as long at the same damping ratio when its\n // stiffness falls by tempo² and its damping by tempo.\n if (typeof value.stiffness === \"number\") {\n next.stiffness = value.stiffness / (tempo * tempo);\n }\n if (typeof value.damping === \"number\") next.damping = value.damping / tempo;\n return next;\n}\n\nfunction retimeNode(value: unknown, clock: MotionClock): unknown {\n if (typeof value === \"function\") {\n const fn = value as (...args: unknown[]) => unknown;\n return (...args: unknown[]) => retimeNode(fn(...args), clock);\n }\n if (!isPlainObject(value)) return value;\n if (isTransition(value)) return retimeTransition(value, clock);\n const next: Plain = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = retimeNode(entry, clock);\n }\n return next;\n}\n\n/** Applies tempo, or the reduced-motion collapse, to transitions anywhere in a motion tree. */\nexport function retime<T>(value: T, clock: MotionClock): T {\n if (clock.tempo === 1 && !clock.reduced) return value;\n return retimeNode(value, clock) as T;\n}\n\nfunction retimeSeconds(value: unknown, clock: MotionClock): unknown {\n if (typeof value === \"number\") {\n return clock.reduced\n ? Math.min(value, REDUCED.duration)\n : value * clock.tempo;\n }\n if (!isPlainObject(value)) return value;\n const next: Plain = {};\n for (const [key, entry] of Object.entries(value)) {\n next[key] = retimeSeconds(entry, clock);\n }\n return next;\n}\n\n/**\n * Retimes a module's resolved motion. Every number under its `timings` key is\n * seconds (choreography timers, staggers); everything else is walked for\n * transitions.\n */\nexport function retimeModuleMotion<M>(motion: M, clock: MotionClock): M {\n if (clock.tempo === 1 && !clock.reduced) return motion;\n if (!isPlainObject(motion)) return retime(motion, clock);\n const next: Plain = {};\n for (const [key, entry] of Object.entries(motion)) {\n next[key] =\n key === \"timings\" ? retimeSeconds(entry, clock) : retimeNode(entry, clock);\n }\n return next as M;\n}\n\nexport function cssEasing(ease: unknown): string {\n if (Array.isArray(ease)) return `cubic-bezier(${ease.join(\", \")})`;\n if (typeof ease === \"string\" && ease.trim()) return ease;\n return \"ease\";\n}\n\n/** A CSS `transition` value for one property, from a motion tween. */\nexport function cssTransition(\n property: string,\n transition: { duration?: number; delay?: number; ease?: unknown },\n): string {\n const duration = `${Math.round((transition.duration ?? 0) * 1000)}ms`;\n const delay = transition.delay\n ? ` ${Math.round(transition.delay * 1000)}ms`\n : \"\";\n return `${property} ${duration} ${cssEasing(transition.ease)}${delay}`;\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n useMemo,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { MotionConfig, useReducedMotion } from \"motion/react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport {\n defineMotion,\n retimeModuleMotion,\n type MotionClock,\n type MotionTokens,\n} from \"@/tokens\";\n\n/**\n * A module's theme contract: the slots it styles and, for modules that\n * animate, the motion it plays. Both are written by the app.\n */\nexport interface ThemeSpec<S extends string = string, M = never> {\n readonly id: string;\n readonly _slots?: S;\n readonly _motion?: M;\n}\n\ninterface ThemeVisuals<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport type ThemeConfig<S extends string, M = never> = ThemeVisuals<S> &\n ([M] extends [never] ? { motion?: undefined } : { motion: M });\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeVisuals<string> & { motion?: unknown };\n}\n\nexport function defineThemeSpec<S extends string, M = never>(\n id: string,\n): ThemeSpec<S, M> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string, M = never>(\n spec: ThemeSpec<S, M>,\n config: ThemeConfig<NoInfer<S>, NoInfer<M>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\ninterface MotionState extends MotionClock {\n readonly tokens: MotionTokens;\n}\n\nconst DEFAULT_MOTION = defineMotion({});\nconst NO_MOTION_PROVIDER: MotionState = Object.freeze({\n reduced: false,\n tempo: 1,\n tokens: DEFAULT_MOTION,\n});\nconst MotionContext = getOrCreateGlobalContext<MotionState>(\n \"MotionContext\",\n NO_MOTION_PROVIDER,\n);\n\nfunction MotionProvider({\n children,\n tokens,\n}: {\n children?: ReactNode;\n tokens: MotionTokens;\n}) {\n const prefersReduced = useReducedMotion() === true;\n const reduced =\n tokens.reducedMotion === \"always\" ||\n (tokens.reducedMotion === \"user\" && prefersReduced);\n const state = useMemo<MotionState>(\n () => Object.freeze({ reduced, tempo: tokens.tempo, tokens }),\n [reduced, tokens],\n );\n return createElement(MotionContext.Provider, { value: state }, children);\n}\n\nexport function ThemeProvider({\n children,\n motion,\n themes,\n}: {\n children?: ReactNode;\n /** The app's motion tokens, from `defineMotion` (tempo, reduced-motion policy, vocabulary). */\n motion?: MotionTokens;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n // A nested ThemeProvider without motion keeps the app's motion from above.\n const inherited = useContext(MotionContext) !== NO_MOTION_PROVIDER;\n return createElement(\n ThemeContext.Provider,\n { value: configs },\n motion || !inherited\n ? createElement(\n MotionProvider,\n { tokens: motion ?? DEFAULT_MOTION },\n children,\n )\n : children,\n );\n}\n\nfunction missingTheme(id: string): Error {\n return new Error(\n `Theme \"${id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S, unknown>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) throw missingTheme(spec.id);\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n/** The app's motion tokens, plus whether reduced motion is in effect. */\nexport function useMotionTokens<\n T extends MotionTokens = MotionTokens,\n>(): T & { readonly reduced: boolean } {\n const state = useContext(MotionContext);\n return useMemo(\n () => ({ ...(state.tokens as T), reduced: state.reduced }),\n [state],\n );\n}\n\nconst resolvedMotion = new WeakMap<MotionState, WeakMap<object, unknown>>();\n\n/**\n * The motion a module plays, as the app wrote it in `defineTheme(spec, { motion })`,\n * retimed by the app's tempo or collapsed for reduced motion. Stable per\n * (tokens, theme) so it can be a dependency.\n */\nexport function useModuleMotion<M>(spec: ThemeSpec<string, M>): M {\n const config = useContext(ThemeContext).get(spec.id);\n const state = useContext(MotionContext);\n if (!config) throw missingTheme(spec.id);\n if (!config.motion || typeof config.motion !== \"object\") {\n throw new Error(\n `Motion for theme \"${spec.id}\" is missing. Add \\`motion\\` to its defineTheme(...) next to \\`slots\\` (start from the framework's templates/motion/).`,\n );\n }\n return resolveModuleMotion(state, config.motion) as M;\n}\n\n/** Like useModuleMotion, but null when the app hasn't themed the module. */\nexport function useOptionalModuleMotion<M>(\n spec: ThemeSpec<string, M>,\n): M | null {\n const motion = useContext(ThemeContext).get(spec.id)?.motion;\n const state = useContext(MotionContext);\n if (!motion || typeof motion !== \"object\") return null;\n return resolveModuleMotion(state, motion) as M;\n}\n\nfunction resolveModuleMotion(state: MotionState, motion: object): unknown {\n let byConfig = resolvedMotion.get(state);\n if (!byConfig) {\n byConfig = new WeakMap();\n resolvedMotion.set(state, byConfig);\n }\n if (!byConfig.has(motion)) {\n byConfig.set(motion, retimeModuleMotion(motion, state));\n }\n return byConfig.get(motion);\n}\n\n/**\n * Applies the app's reduced-motion policy to the motion components inside a\n * module (positional values such as width, height, x and scale jump instead of\n * animating). CoreProvider wraps every module backdrop and overlay in it.\n */\nexport function ModuleMotionConfig({ children }: { children?: ReactNode }) {\n const { tokens } = useContext(MotionContext);\n return createElement(\n MotionConfig,\n { reducedMotion: tokens.reducedMotion },\n children,\n );\n}\n"]}
|