@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/utils/string.ts","../../../src/utils/dom.ts","../../../src/utils/object.ts","../../../src/utils/report.ts","../../../src/utils/store.ts","../../../src/tokens/motion.ts","../../../src/kernel/constants.ts","../../../src/kernel/context-registry.ts","../../../src/kernel/utils.ts","../../../src/kernel/schema.ts","../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/kernel/provider.tsx","../../../src/kernel/installed.ts","../../../src/kernel/handlers.ts","../../../src/kernel/hooks.ts","../../../src/kernel/module.tsx","../../../src/kernel/adapters.ts","../../../src/theme.tsx","../../../src/modules/background/constants.ts","../../../src/modules/background/visual.ts","../../../src/modules/background/playback.ts","../../../src/modules/background/motion.ts","../../../src/modules/media/constants.ts","../../../src/modules/media/context.tsx","../../../src/modules/media/hooks.ts","../../../src/modules/background/youtube/parse.ts","../../../src/modules/background/state.ts","../../../src/modules/background/context.tsx","../../../src/modules/background/hooks.ts","../../../src/atoms/icon.tsx","../../../src/atoms/spinner.tsx","../../../src/modules/background/youtube/iframe.ts","../../../src/modules/background/youtube/player.tsx","../../../src/modules/background/overlay.tsx","../../../src/modules/background/module.tsx"],"names":["useCallback","useSyncExternalStore","use","hasChanged","stabilizedValue","useRef","useState","useMemo","useContext","usePathname","videoElement","isPlaying","useEffect","jsx","IconifyIcon","YouTubeBackgroundPlayer","jsxs","Fragment","memo","BackgroundGradients","EdgeGradient","NoiseOverlay","SolidOverlay","objectPosition"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","export function trimToNull(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function stripTrailingSlash(url: unknown): string {\n if (typeof url !== \"string\") return \"\";\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function normalizePath(path: unknown): string {\n const trimmed = trimToNull(path);\n if (!trimmed) return \"\";\n if (trimmed === \"/\") return \"/\";\n return stripTrailingSlash(trimmed);\n}\n\nexport function isImageIconSource(icon: unknown): boolean {\n return (\n typeof icon === \"string\" &&\n (icon.startsWith(\"http://\") ||\n icon.startsWith(\"https://\") ||\n icon.startsWith(\"/\") ||\n icon.startsWith(\"data:image/\"))\n );\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","export const DURATION_TOKENS = Object.freeze({\n INSTANT: 0.08,\n MICRO: 0.18,\n FAST: 0.28,\n BASE: 0.36,\n MODERATE: 0.44,\n SLOW: 0.58,\n CINEMATIC: 0.86,\n} as const);\n\nexport const EASING_CURVES = Object.freeze({\n OUT_EXPO: [0.16, 1, 0.3, 1] as const,\n OUT_QUART: [0.25, 1, 0.5, 1] as const,\n OUT_QUINT: [0.22, 1, 0.36, 1] as const,\n IN_OUT_CUBIC: [0.65, 0, 0.35, 1] as const,\n IN_CUBIC: [0.5, 0, 1, 1] as const,\n OUT_BACK: [0.34, 1.56, 0.64, 1] as const,\n} as const);\n\nexport const MOTION_EASINGS = Object.freeze({\n ENTER: EASING_CURVES.OUT_QUART,\n ENTER_EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nexport const MOTION_TIERS = Object.freeze({\n MICRO: Object.freeze({\n distance: 4,\n duration: DURATION_TOKENS.MICRO,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.008,\n }),\n FAST: Object.freeze({\n distance: 9,\n duration: DURATION_TOKENS.FAST,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.012,\n }),\n STANDARD: Object.freeze({\n distance: 18,\n duration: DURATION_TOKENS.MODERATE,\n ease: MOTION_EASINGS.ENTER,\n scaleDelta: 0.018,\n }),\n SURFACE: Object.freeze({\n distance: 28,\n duration: DURATION_TOKENS.SLOW,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.024,\n }),\n} as const);\n\nexport const SPRING_PRESETS = Object.freeze({\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.6,\n stiffness: 520,\n type: \"spring\",\n } as const),\n SNAPPY: Object.freeze({\n damping: 28,\n mass: 0.8,\n stiffness: 380,\n type: \"spring\",\n } as const),\n GENTLE: Object.freeze({\n damping: 30,\n mass: 1,\n stiffness: 260,\n type: \"spring\",\n } as const),\n BOUNCY: Object.freeze({\n damping: 20,\n mass: 0.85,\n stiffness: 340,\n type: \"spring\",\n } as const),\n} as const);\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.INSTANT,\n ease: \"linear\",\n} as const);\n\nexport const COMPOSITOR_GPU_STYLE = Object.freeze({\n backfaceVisibility: \"hidden\",\n transform: \"translate3d(0, 0, 0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nexport const TAP_SCALE_SUBTLE = 0.97;\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 = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\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 = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n ease = EASING_CURVES.IN_OUT_CUBIC,\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 = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\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 distance,\n duration,\n exitDuration,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n distance?: number;\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n} = {}) {\n const enterDuration =\n duration ??\n (distance === undefined\n ? DURATION_TOKENS.BASE\n : durationForDistance(distance));\n const transitions = contentSwapTransitions({\n duration: enterDuration,\n exitDuration: exitDuration ?? enterDuration * 0.68,\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 staggerItem({\n base = 0.028,\n cap = 0.16,\n duration = DURATION_TOKENS.BASE,\n travel = 10,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitDuration = DURATION_TOKENS.MICRO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n base?: number;\n cap?: number;\n duration?: number;\n travel?: number;\n enterEase?: Ease;\n exitDuration?: number;\n exitEase?: Ease;\n} = {}) {\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, 0.985),\n }),\n visible: (index: number = 0) => ({\n opacity: 1,\n transform: gpuTransform(0),\n transition: Object.freeze({\n ...tween(duration, enterEase),\n delay: staggerDelay(index, { base, cap }),\n }),\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-travel * 0.6, 0.99),\n transition: tween(exitDuration, exitEase),\n }),\n });\n}\n\nexport function chip({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.IN_OUT_CUBIC,\n exitEase = EASING_CURVES.IN_CUBIC,\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 = TAP_SCALE_SUBTLE,\n spring = SPRING_PRESETS.MICRO,\n}: { tapScale?: number; spring?: Spring } = {}) {\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\nexport function dragDismiss({\n constraints = { top: 0, bottom: 0 },\n elastic = { top: 0.05, bottom: 0.5 },\n thresholds = { offsetY: 65, velocityY: 400 },\n interpolation = {\n range: [0, 180] as const,\n opacity: [1, 0.75] as const,\n scale: [1, 0.96] as const,\n },\n} = {}) {\n return Object.freeze({\n constraints: Object.freeze(constraints),\n elastic: Object.freeze(elastic),\n thresholds: Object.freeze(thresholds),\n interpolation: Object.freeze(interpolation),\n });\n}\n","import type {\n RegistryLifecycle,\n RegistryScopeKind,\n RegistrySource,\n RegistryValidationMode,\n} from \"./types\";\n\nexport const DEFAULT_SOURCE: RegistrySource = \"dynamic\";\n\nexport const REGISTRY_SOURCES: Readonly<Record<string, RegistrySource>> =\n Object.freeze({\n STATIC: \"static\",\n DYNAMIC: \"dynamic\",\n USER: \"user\",\n });\n\nexport const REGISTRY_LIFECYCLES: Readonly<Record<string, RegistryLifecycle>> =\n Object.freeze({\n IMMEDIATE: \"immediate\",\n GRACEFUL: \"graceful\",\n PERSISTENT: \"persistent\",\n ROUTE: \"route\",\n });\n\nexport const REGISTRY_VALIDATION_MODES: Readonly<\n Record<string, RegistryValidationMode>\n> = Object.freeze({\n WARN: \"warn\",\n STRICT: \"strict\",\n});\n\nexport const REGISTRY_METADATA_KEYS: readonly string[] = Object.freeze([\n \"cleanup\",\n \"cleanupDelayMs\",\n \"instanceId\",\n \"lifecycle\",\n \"priority\",\n \"source\",\n \"scope\",\n \"validation\",\n]);\n\nexport const REGISTRY_SOURCE_PRIORITY: Readonly<Record<string, number>> =\n Object.freeze({\n [REGISTRY_SOURCES.STATIC]: 100,\n [REGISTRY_SOURCES.DYNAMIC]: 200,\n [REGISTRY_SOURCES.USER]: 300,\n });\n\nexport const REGISTRY_SOURCE_RANK: Readonly<Record<string, number>> =\n Object.freeze({\n [REGISTRY_SOURCES.STATIC]: 10,\n [REGISTRY_SOURCES.DYNAMIC]: 20,\n [REGISTRY_SOURCES.USER]: 30,\n });\n\nexport const REGISTRY_LIFECYCLE_VALUES: ReadonlySet<string> = new Set(\n Object.values(REGISTRY_LIFECYCLES),\n);\n\nexport const REGISTRY_METADATA_KEY_SET: ReadonlySet<string> = new Set(\n REGISTRY_METADATA_KEYS,\n);\n\nconst REGISTRY_SCOPE_KINDS: Readonly<Record<string, RegistryScopeKind>> =\n Object.freeze({\n APP: \"app\",\n SESSION: \"session\",\n ROUTE: \"route\",\n INSTANCE: \"instance\",\n WORKSPACE: \"workspace\",\n });\n\nexport const DEFAULT_REGISTRY_SCOPE: RegistryScopeKind =\n REGISTRY_SCOPE_KINDS.APP;\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","import {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_RANK,\n} from \"./constants\";\nimport type { RegistryMetadata } from \"./types\";\nimport { isObject, trimToNull } from \"@/utils\";\n\nexport function hasOwnProperty(target: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nexport function parseFiniteNumber(value: unknown): number | null {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function getValidString(\n value: unknown,\n fallback: string | null = null,\n): string | null {\n return trimToNull(value) ?? fallback;\n}\n\nexport function resolveInstanceId(value: unknown): string | null {\n return isObject(value) && typeof value.instanceId === \"string\"\n ? value.instanceId\n : null;\n}\n\nexport function getSourceRank(source: string): number {\n return REGISTRY_SOURCE_RANK[source] ?? 0;\n}\n\nexport function resolveRegisterInput(\n sourceOrOptions: unknown,\n optionsArg?: unknown,\n): { source: string; options: RegistryMetadata } {\n if (typeof sourceOrOptions === \"string\") {\n return {\n source: sourceOrOptions,\n options: isObject(optionsArg) ? optionsArg : {},\n };\n }\n if (isObject(sourceOrOptions)) {\n return {\n source:\n typeof sourceOrOptions.source === \"string\"\n ? sourceOrOptions.source\n : DEFAULT_SOURCE,\n options: sourceOrOptions,\n };\n }\n return {\n source: DEFAULT_SOURCE,\n options: isObject(optionsArg) ? optionsArg : {},\n };\n}\n\nexport function resolveScope(\n options: RegistryMetadata | null | undefined,\n): string {\n return typeof options?.scope === \"string\" && options.scope.trim()\n ? options.scope.trim()\n : DEFAULT_REGISTRY_SCOPE;\n}\n\nexport function resolveUnregisterInput(sourceOrOptions: unknown): {\n instanceId: string | null;\n scope: string | null;\n source: string;\n} {\n if (typeof sourceOrOptions === \"string\") {\n return { instanceId: null, scope: null, source: sourceOrOptions };\n }\n if (isObject(sourceOrOptions)) {\n return {\n instanceId: resolveInstanceId(sourceOrOptions),\n scope:\n typeof sourceOrOptions.scope === \"string\" &&\n sourceOrOptions.scope.trim()\n ? sourceOrOptions.scope.trim()\n : null,\n source:\n typeof sourceOrOptions.source === \"string\"\n ? sourceOrOptions.source\n : DEFAULT_SOURCE,\n };\n }\n return { instanceId: null, scope: null, source: DEFAULT_SOURCE };\n}\n\nexport function mergeModuleConfigs<T extends object>(\n base: T,\n patch: Partial<T>,\n): T {\n const source = base as Record<string, unknown>;\n const changes = patch as Record<string, unknown>;\n const result: Record<string, unknown> = { ...source };\n Object.keys(changes).forEach((key) => {\n const baseVal = source[key];\n const patchVal = changes[key];\n if (\n baseVal &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal) &&\n patchVal &&\n typeof patchVal === \"object\" &&\n !Array.isArray(patchVal)\n ) {\n result[key] = { ...baseVal, ...patchVal };\n } else {\n result[key] = patchVal;\n }\n });\n return result as T;\n}\n","import {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLE_VALUES,\n REGISTRY_LIFECYCLES,\n REGISTRY_METADATA_KEY_SET,\n REGISTRY_METADATA_KEYS,\n REGISTRY_VALIDATION_MODES,\n} from \"./constants\";\nimport { isObject, isPlainObject } from \"@/utils\";\nimport { getValidString, parseFiniteNumber } from \"./utils\";\nimport type {\n NormalizedRegistryMetadata,\n RegistryDefinitions,\n RegistryLifecycle,\n RegistryMetadata,\n RegistryValidationMode,\n ValidationResult,\n} from \"./types\";\n\nfunction resolveLifecycle(\n metadata: RegistryMetadata | null | undefined,\n fallback: RegistryLifecycle | null,\n): RegistryLifecycle | null {\n const lifecycle = metadata?.lifecycle ?? metadata?.cleanup;\n return lifecycle && REGISTRY_LIFECYCLE_VALUES.has(lifecycle)\n ? lifecycle\n : fallback;\n}\n\nexport function validateRegistryMetadata(metadata: unknown): ValidationResult {\n if (metadata === undefined || metadata === null)\n return { issues: [], valid: true };\n if (!isObject(metadata))\n return { issues: [\"registry metadata must be an object\"], valid: false };\n\n const issues: string[] = [];\n\n Object.keys(metadata).forEach((key) => {\n if (!REGISTRY_METADATA_KEY_SET.has(key))\n issues.push(`unknown registry metadata field: ${key}`);\n });\n\n if (metadata.source !== undefined && !getValidString(metadata.source))\n issues.push(\"source must be a non-empty string\");\n if (metadata.instanceId !== undefined && !getValidString(metadata.instanceId))\n issues.push(\"instanceId must be a non-empty string\");\n if (metadata.scope !== undefined && !getValidString(metadata.scope))\n issues.push(\"scope must be a non-empty string\");\n if (\n metadata.priority !== undefined &&\n parseFiniteNumber(metadata.priority) === null\n )\n issues.push(\"priority must be a finite number\");\n\n if (metadata.cleanupDelayMs !== undefined) {\n const delay = parseFiniteNumber(metadata.cleanupDelayMs);\n if (delay === null || delay < 0)\n issues.push(\"cleanupDelayMs must be a non-negative finite number\");\n }\n\n const lifecycle = metadata.lifecycle ?? metadata.cleanup;\n if (\n lifecycle !== undefined &&\n !REGISTRY_LIFECYCLE_VALUES.has(String(lifecycle))\n ) {\n issues.push(\n `lifecycle must be one of: ${[...REGISTRY_LIFECYCLE_VALUES].join(\", \")}`,\n );\n }\n\n if (\n metadata.validation !== undefined &&\n !Object.values<unknown>(REGISTRY_VALIDATION_MODES).includes(\n metadata.validation,\n )\n ) {\n issues.push(\n `validation must be one of: ${Object.values(REGISTRY_VALIDATION_MODES).join(\", \")}`,\n );\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function validateRegistryKey(\n type: string,\n key: unknown,\n definitions: RegistryDefinitions,\n): ValidationResult {\n const definition = definitions.get(type);\n const issues: string[] = [];\n\n if (!definition) issues.push(`unknown registry type: ${String(type)}`);\n if (!getValidString(key))\n return {\n issues: [...issues, \"key must be a non-empty string\"],\n valid: false,\n };\n\n const normalizedKey = String(key).trim();\n\n if (definition?.keyPolicy === \"singleton\") {\n const expectedKey = definition.singletonKey;\n if (expectedKey && normalizedKey !== expectedKey)\n issues.push(`${type} key must be ${expectedKey}`);\n } else if (definition?.keyPolicy === \"path\") {\n if (!normalizedKey.startsWith(\"/\"))\n issues.push(`${type} key must be an absolute path`);\n } else if (definition?.keyPolicy === \"route\") {\n if (\n !normalizedKey.startsWith(\"/\") &&\n !definition.reservedKeys?.includes(normalizedKey)\n ) {\n issues.push(`${type} key must be a route path or a reserved route key`);\n }\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function validateRegistryValue(\n type: string,\n key: unknown,\n value: unknown,\n definitions: RegistryDefinitions,\n): ValidationResult {\n const definition = definitions.get(type);\n const issues = [...validateRegistryKey(type, key, definitions).issues];\n const valueKind = definition?.valueKind ?? \"object\";\n\n if (definition && valueKind === \"object\" && !isPlainObject(value)) {\n issues.push(`${type} values must be plain objects`);\n }\n if (\n definition &&\n valueKind === \"component\" &&\n typeof value !== \"function\" &&\n !isPlainObject(value)\n ) {\n issues.push(\n `${type} values must be component functions or component objects`,\n );\n }\n\n const validation = definition?.validate?.(value);\n if (validation && !validation.valid && Array.isArray(validation.issues)) {\n issues.push(...validation.issues);\n }\n\n return { issues, valid: issues.length === 0 };\n}\n\nexport function normalizeRegistryMetadata(\n metadata: unknown,\n {\n defaultCleanupDelayMs = null,\n defaultLifecycle = null,\n defaultSource = DEFAULT_SOURCE,\n }: {\n defaultCleanupDelayMs?: number | null;\n defaultLifecycle?: RegistryLifecycle | null;\n defaultSource?: string;\n } = {},\n): NormalizedRegistryMetadata {\n const registryMeta = isObject(metadata) ? metadata : {};\n\n const normalizedDefaultDelay = parseFiniteNumber(defaultCleanupDelayMs);\n const fallbackCleanupDelayMs =\n normalizedDefaultDelay !== null && normalizedDefaultDelay >= 0\n ? normalizedDefaultDelay\n : null;\n const fallbackLifecycle =\n defaultLifecycle && REGISTRY_LIFECYCLE_VALUES.has(defaultLifecycle)\n ? defaultLifecycle\n : null;\n\n const source =\n getValidString(registryMeta.source) ||\n getValidString(defaultSource, DEFAULT_SOURCE) ||\n DEFAULT_SOURCE;\n const scope = getValidString(registryMeta.scope);\n const priority = parseFiniteNumber(registryMeta.priority);\n const lifecycle = resolveLifecycle(registryMeta, fallbackLifecycle);\n const validation = isValidationMode(registryMeta.validation)\n ? registryMeta.validation\n : null;\n\n const cleanupDelayCandidate = parseFiniteNumber(registryMeta.cleanupDelayMs);\n let cleanupDelayMs =\n cleanupDelayCandidate !== null && cleanupDelayCandidate >= 0\n ? cleanupDelayCandidate\n : fallbackCleanupDelayMs;\n\n if (lifecycle === REGISTRY_LIFECYCLES.IMMEDIATE) {\n cleanupDelayMs = 0;\n } else if (\n (lifecycle === REGISTRY_LIFECYCLES.GRACEFUL ||\n lifecycle === REGISTRY_LIFECYCLES.ROUTE) &&\n cleanupDelayMs === null\n ) {\n cleanupDelayMs = fallbackCleanupDelayMs;\n }\n\n return {\n cleanupDelayMs,\n lifecycle,\n priority,\n registerOptions: {\n ...(priority !== null && { priority }),\n ...(validation === REGISTRY_VALIDATION_MODES.STRICT && { validation }),\n ...(scope && { scope }),\n },\n source,\n ...(scope && { scope }),\n ...(validation && { validation }),\n };\n}\n\nfunction isValidationMode(value: unknown): value is RegistryValidationMode {\n return Object.values<unknown>(REGISTRY_VALIDATION_MODES).includes(value);\n}\n\nexport function pickRegistryMetadata(options: unknown): RegistryMetadata {\n if (!isObject(options)) return {};\n return Object.fromEntries(\n REGISTRY_METADATA_KEYS.filter((key) => options[key] !== undefined).map(\n (key) => [key, options[key]],\n ),\n );\n}\n","\"use client\";\n\nimport { use, type Context } from \"react\";\n\nexport function useRequiredContext<T>(\n context: Context<T | null>,\n hookName: string,\n providerName: string,\n): T {\n const value = use(context);\n if (value === null) {\n throw new Error(`${hookName} must be used within ${providerName}`);\n }\n return value;\n}\n","\"use client\";\n\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { type ExternalStore } from \"../utils\";\n\nexport function useStore<TState, TSlice = TState>(\n store: ExternalStore<TState>,\n selector: (state: TState) => TSlice = (state: TState) =>\n state as unknown as TSlice,\n isEqual: (a: TSlice, b: TSlice) => boolean = Object.is,\n): TSlice {\n const cacheRef = useRef<{\n isEqual: ((a: TSlice, b: TSlice) => boolean) | null;\n selected: TSlice | undefined;\n selector: ((state: TState) => TSlice) | null;\n snapshot: TState | null;\n }>({\n isEqual: null,\n selected: undefined,\n selector: null,\n snapshot: null,\n });\n\n const getSelectedSnapshot = useCallback(() => {\n const snapshot = store.getSnapshot();\n const cache = cacheRef.current;\n if (\n cache.snapshot === snapshot &&\n cache.selector === selector &&\n cache.isEqual === isEqual\n ) {\n return cache.selected as TSlice;\n }\n\n const selected = selector(snapshot);\n if (\n cache.snapshot !== null &&\n cache.isEqual === isEqual &&\n isEqual(cache.selected as TSlice, selected)\n ) {\n cache.snapshot = snapshot;\n cache.selector = selector;\n return cache.selected as TSlice;\n }\n\n cacheRef.current = {\n isEqual,\n selected,\n selector,\n snapshot,\n };\n return selected;\n }, [isEqual, selector, store]);\n\n return useSyncExternalStore(\n store.subscribe,\n getSelectedSnapshot,\n getSelectedSnapshot,\n );\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n","\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useRequiredContext } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nimport type {\n RegistryDefinitions,\n RegistrySchema,\n RegistryStore,\n} from \"./types\";\nimport { createRegistryStore, type InitialRegistryEntries } from \"./store\";\n\ntype RegistryValueOf<K extends string> = K extends keyof RegistrySchema\n ? RegistrySchema[K]\n : unknown;\n\ninterface RegistryContextValue {\n actions: Pick<\n RegistryStore,\n \"batch\" | \"register\" | \"transaction\" | \"unregister\"\n >;\n subscription: Pick<\n RegistryStore,\n \"getEntriesSnapshot\" | \"getSnapshot\" | \"subscribe\"\n >;\n}\n\nconst RegistryContext = getOrCreateGlobalContext<RegistryContextValue | null>(\n\n \"RegistryContext\",\n null,\n);\n\nexport function RegistryProvider({\n children,\n definitions,\n initialEntries = [],\n}: {\n children?: ReactNode;\n definitions?: RegistryDefinitions;\n initialEntries?: InitialRegistryEntries;\n}) {\n const [store] = useState(() =>\n createRegistryStore(initialEntries, definitions),\n );\n\n const contextValue = useMemo(\n () => ({\n actions: {\n batch: store.batch,\n register: store.register,\n transaction: store.transaction,\n unregister: store.unregister,\n },\n subscription: {\n getEntriesSnapshot: store.getEntriesSnapshot,\n getSnapshot: store.getSnapshot,\n subscribe: store.subscribe,\n },\n }),\n [store],\n );\n\n return <RegistryContext value={contextValue}>{children}</RegistryContext>;\n}\n\nexport function useRegistryActions(): RegistryContextValue[\"actions\"] {\n return useRequiredContext(\n RegistryContext,\n \"useRegistryActions\",\n \"RegistryProvider\",\n ).actions;\n}\n\nfunction useRegistrySubscription(): RegistryContextValue[\"subscription\"] {\n return useRequiredContext(\n RegistryContext,\n \"useRegistrySubscription\",\n \"RegistryProvider\",\n ).subscription;\n}\n\nexport function useRegistryValue<\n K extends string = string,\n T = RegistryValueOf<K>,\n>(type: K, key: string): T | undefined {\n const { getSnapshot, subscribe } = useRegistrySubscription();\n\n const subscribeToKey = useCallback(\n (listener: () => void) => subscribe(type, key, listener),\n [key, subscribe, type],\n );\n const getValue = useCallback(\n () => getSnapshot<K, T>(type, key),\n [getSnapshot, key, type],\n );\n\n return useSyncExternalStore(subscribeToKey, getValue, getValue);\n}\n\nexport function useRegistryEntries<\n K extends string = string,\n T = RegistryValueOf<K>,\n>(type: K): Record<string, T> {\n const { getEntriesSnapshot, subscribe } = useRegistrySubscription();\n\n const subscribeToType = useCallback(\n (listener: () => void) => subscribe(type, null, listener),\n [subscribe, type],\n );\n const getEntries = useCallback(\n () => getEntriesSnapshot<K, T>(type),\n [getEntriesSnapshot, type],\n );\n\n return useSyncExternalStore(subscribeToType, getEntries, getEntries);\n}\n","\"use client\";\n\nimport { use, type ComponentType, type ReactNode } from \"react\";\nimport { isObject } from \"@/utils\";\nimport { getOrCreateGlobalContext } from \"./context-registry\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistryDefinition,\n RegistryDefinitions,\n RegistryMetadata,\n} from \"./types\";\n\nexport type BoundaryComponent = ComponentType<{\n children?: ReactNode;\n name?: string;\n}>;\n\nexport interface ModuleHostValue {\n Boundary: BoundaryComponent;\n byId: ReadonlyMap<string, AnyCoreModule>;\n definitions: RegistryDefinitions;\n modules: readonly AnyCoreModule[];\n}\n\nexport const EMPTY_MODULES: readonly AnyCoreModule[] = Object.freeze([]);\n\nexport const PassthroughBoundary: BoundaryComponent = ({ children }) =>\n children;\n\nexport const ModuleHostContext =\n getOrCreateGlobalContext<ModuleHostValue | null>(\"ModuleHostContext\", null);\n\n\nexport function selectModuleSlice(\n coreModule: AnyCoreModule,\n config: PageConfig,\n): unknown {\n const slice = coreModule.page?.select\n ? coreModule.page.select(config)\n : (config as Record<string, unknown>)[coreModule.id];\n return slice ?? null;\n}\n\nexport function createModulePayload(\n modules: readonly AnyCoreModule[],\n config: PageConfig,\n metadata: RegistryMetadata = {},\n): PageConfig | null {\n const payload: Record<string, unknown> = {};\n let hasSlices = false;\n for (const coreModule of modules) {\n if (!coreModule.page?.entries) continue;\n const slice = selectModuleSlice(coreModule, config);\n if (slice === null) continue;\n payload[coreModule.id] = slice;\n hasSlices = true;\n }\n if (!hasSlices) return null;\n return {\n ...payload,\n registry: {\n ...metadata,\n ...(isObject(config.registry) ? config.registry : {}),\n },\n } as PageConfig;\n}\n\nconst MODULE_ID_PATTERN = /^[a-z][a-zA-Z0-9]*$/;\n\nexport function sortModules(\n modules: readonly AnyCoreModule[],\n): AnyCoreModule[] {\n const byId = new Map<string, AnyCoreModule>();\n for (const coreModule of modules) {\n if (!MODULE_ID_PATTERN.test(coreModule.id)) {\n throw new Error(\n `[Core] Invalid module id \"${coreModule.id}\": use a camelCase name such as \"contextMenu\".`,\n );\n }\n if (byId.has(coreModule.id)) {\n throw new Error(`[Core] Module \"${coreModule.id}\" is installed twice.`);\n }\n byId.set(coreModule.id, coreModule);\n }\n\n const sorted: AnyCoreModule[] = [];\n const state = new Map<string, \"visiting\" | \"done\">();\n const visit = (coreModule: AnyCoreModule, path: string[]) => {\n const current = state.get(coreModule.id);\n if (current === \"done\") return;\n if (current === \"visiting\") {\n throw new Error(\n `[Core] Module dependency cycle: ${[...path, coreModule.id].join(\" -> \")}`,\n );\n }\n state.set(coreModule.id, \"visiting\");\n for (const id of coreModule.uses ?? []) {\n const dependency = byId.get(id);\n if (dependency) visit(dependency, [...path, coreModule.id]);\n }\n state.set(coreModule.id, \"done\");\n sorted.push(coreModule);\n };\n modules.forEach((coreModule) => visit(coreModule, []));\n return sorted;\n}\n\nexport function createModuleRegistryDefinitions(\n modules: readonly AnyCoreModule[],\n): RegistryDefinitions {\n const definitions = new Map<string, RegistryDefinition>();\n for (const coreModule of modules) {\n if (coreModule.registry)\n definitions.set(coreModule.id, coreModule.registry);\n }\n return definitions;\n}\n\nexport function useInstalledModules(): readonly AnyCoreModule[] {\n return use(ModuleHostContext)?.modules ?? EMPTY_MODULES;\n}\n","import { DEFAULT_SOURCE, REGISTRY_LIFECYCLES } from \"./constants\";\nimport {\n normalizeRegistryMetadata,\n validateRegistryMetadata,\n} from \"./schema\";\nimport { isObject, report } from \"@/utils\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistrationEntry,\n RegistryApplyContext,\n RegistryCleanupTimer,\n RegistryMetadata,\n RegistryQueue,\n} from \"./types\";\n\ntype CleanupScope = Map<string, RegistryCleanupTimer>;\n\nfunction isPersistentLifecycle(lifecycle: unknown): boolean {\n return lifecycle === REGISTRY_LIFECYCLES.PERSISTENT;\n}\n\nfunction runRegistrationBatch(\n context: RegistryApplyContext,\n executor: (queue: RegistryQueue) => void,\n): number | void {\n return typeof context.batch === \"function\"\n ? context.batch(executor)\n : executor(context);\n}\n\nfunction createEntryCleanupKey(\n type: string,\n key: string,\n source: string,\n instanceId: string | null,\n scope: string | undefined,\n): string {\n return JSON.stringify([\n \"entry\",\n type,\n key,\n scope ?? null,\n source,\n instanceId,\n ]);\n}\n\nfunction getCleanupScope(\n context: RegistryApplyContext | null | undefined,\n): CleanupScope {\n return context?.cleanupScope || new Map();\n}\n\nfunction clearCleanupTimer(scope: CleanupScope, cleanupKey: string): void {\n const lifecycle = scope.get(cleanupKey);\n if (!lifecycle) return;\n lifecycle.cancelled = true;\n if (lifecycle.timerId !== null) clearTimeout(lifecycle.timerId);\n scope.delete(cleanupKey);\n}\n\nfunction scheduleCleanup(\n scope: CleanupScope,\n cleanupKey: string,\n callback: () => void,\n delayMs: number,\n): void {\n clearCleanupTimer(scope, cleanupKey);\n const lifecycle: RegistryCleanupTimer = {\n cancelled: false,\n timerId: null,\n };\n\n lifecycle.timerId = setTimeout(() => {\n if (lifecycle.cancelled || scope.get(cleanupKey) !== lifecycle) return;\n scope.delete(cleanupKey);\n callback();\n }, delayMs);\n\n scope.set(cleanupKey, lifecycle);\n}\n\ntype ModuleRegistration = RegistrationEntry & {\n cleanupKey: string;\n type: string;\n};\n\nfunction collectModuleRegistrations(\n coreModule: AnyCoreModule,\n slice: unknown,\n pageMetadata: RegistryMetadata,\n context: RegistryApplyContext,\n): ModuleRegistration[] {\n const definition = coreModule.registry;\n const toEntries = coreModule.page?.entries;\n if (!definition || !toEntries || slice == null || slice === false) return [];\n\n const type = coreModule.id;\n const items = Array.isArray(slice) ? slice : [slice];\n const registrations: ModuleRegistration[] = [];\n\n for (const item of items) {\n if (item == null || item === false) continue;\n const itemMetadata =\n isObject(item) && isObject(item.registry) ? item.registry : {};\n const metadata = { ...pageMetadata, ...itemMetadata };\n if (\n metadata.validation === \"strict\" &&\n !validateRegistryMetadata(metadata).valid\n ) {\n continue;\n }\n\n const payload = isObject(item)\n ? Object.fromEntries(\n Object.entries(item).filter(([key]) => key !== \"registry\"),\n )\n : item;\n const { cleanupDelayMs, lifecycle, registerOptions, scope, source } =\n normalizeRegistryMetadata(metadata, {\n defaultCleanupDelayMs: definition.cleanupDelayMs ?? null,\n defaultLifecycle: definition.lifecycle,\n defaultSource: DEFAULT_SOURCE,\n });\n\n for (const { key, value } of toEntries(payload, context) ?? []) {\n const validation = definition.validate?.(value);\n if (validation && !validation.valid) {\n report(`Registry ${type} config is invalid`, validation.issues, \"warn\");\n continue;\n }\n registrations.push({\n cleanupDelayMs,\n cleanupKey: createEntryCleanupKey(\n type,\n key,\n source,\n context.instanceId,\n scope,\n ),\n key,\n lifecycle,\n registerOptions,\n scope,\n source,\n type,\n value,\n });\n }\n }\n return registrations;\n}\n\nconst NO_CLEANUP = () => {};\n\nexport function applyRegistryConfig(\n config: PageConfig | null | undefined,\n context: RegistryApplyContext,\n): () => void {\n const modules = context.modules ?? [];\n if (!config || modules.length === 0) return NO_CLEANUP;\n const pageMetadata = isObject(config.registry) ? config.registry : {};\n const slices = config as Record<string, unknown>;\n\n const registrations = modules.flatMap((coreModule) => {\n try {\n return collectModuleRegistrations(\n coreModule,\n slices[coreModule.id],\n pageMetadata,\n context,\n );\n } catch (error) {\n report(`Registry apply (${coreModule.id})`, error);\n return [];\n }\n });\n if (registrations.length === 0) return NO_CLEANUP;\n\n const cleanupScope = getCleanupScope(context);\n const owner = (registration: ModuleRegistration) => ({\n instanceId: context.instanceId,\n scope: registration.scope,\n source: registration.source,\n });\n\n runRegistrationBatch(context, (queue) => {\n registrations.forEach(\n ({ cleanupKey, key, registerOptions, source, type, value }) => {\n clearCleanupTimer(cleanupScope, cleanupKey);\n queue.register(type, key, value, source, registerOptions);\n },\n );\n });\n\n return () => {\n const immediate: ModuleRegistration[] = [];\n registrations.forEach((registration) => {\n if (isPersistentLifecycle(registration.lifecycle)) return;\n const { cleanupDelayMs, cleanupKey, key, type } = registration;\n if (typeof cleanupDelayMs === \"number\" && cleanupDelayMs > 0) {\n scheduleCleanup(\n cleanupScope,\n cleanupKey,\n () => context.unregister(type, key, owner(registration)),\n cleanupDelayMs,\n );\n } else {\n immediate.push(registration);\n }\n });\n if (immediate.length === 0) return;\n runRegistrationBatch(context, (queue) => {\n immediate.forEach((registration) =>\n queue.unregister(\n registration.type,\n registration.key,\n owner(registration),\n ),\n );\n });\n };\n}\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { applyRegistryConfig } from \"./handlers\";\nimport { createModulePayload, useInstalledModules } from \"./installed\";\nimport { useRegistryActions } from \"./provider\";\nimport { isObject, shallowEqual } from \"@/utils\";\nimport type {\n PageConfig,\n RegistryCleanupTimer,\n RegistryApplyContext,\n RegistryMetadata,\n RegistryQueue,\n RegistrySourceOrOptions,\n StableFunctionEntry,\n AnyFunction,\n} from \"./types\";\n\nfunction withInstanceId(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): {\n optionsArg: RegistryMetadata | undefined;\n sourceOrOptions: RegistrySourceOrOptions;\n} {\n if (typeof sourceOrOptions === \"string\") {\n return {\n optionsArg: { ...(isObject(optionsArg) ? optionsArg : {}), instanceId },\n sourceOrOptions,\n };\n }\n if (isObject(sourceOrOptions)) {\n return {\n optionsArg,\n sourceOrOptions: { ...sourceOrOptions, instanceId },\n };\n }\n return {\n optionsArg: undefined,\n sourceOrOptions: {\n ...(isObject(optionsArg) ? optionsArg : {}),\n instanceId,\n },\n };\n}\n\nfunction withInstanceIdForUnregister(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n): RegistryMetadata {\n if (typeof sourceOrOptions === \"string\") {\n return { instanceId, source: sourceOrOptions };\n }\n if (isObject(sourceOrOptions)) {\n return { ...sourceOrOptions, instanceId };\n }\n return { instanceId };\n}\n\nfunction resolveRegisterArgsWithInstance(\n instanceId: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): [RegistrySourceOrOptions, RegistryMetadata | undefined] {\n const input = withInstanceId(instanceId, sourceOrOptions, optionsArg);\n return [input.sourceOrOptions, input.optionsArg];\n}\n\nexport function useShallowStable<T extends object>(value: T): T {\n const ref = useRef(value);\n if (ref.current !== value && !shallowEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n\nconst MAX_STABILIZATION_DEPTH = 64;\n\nfunction createStableFunctionEntry(fn: AnyFunction): StableFunctionEntry {\n const entry: StableFunctionEntry = {\n current: fn,\n stable(this: unknown, ...args: unknown[]) {\n return entry.current?.apply(this, args);\n },\n };\n return entry;\n}\n\ninterface StabilizeScope {\n componentSlices: ReadonlySet<string>;\n functionEntries: Map<string, StableFunctionEntry>;\n usedPaths: Set<string>;\n}\n\nfunction isDirectRegistryComponentPath(\n path: string,\n componentSlices: ReadonlySet<string>,\n): boolean {\n const match = /^config\\.([^.[]+)\\.[^.[]+$/.exec(path);\n return Boolean(match && componentSlices.has(match[1]));\n}\n\nfunction isReactNodeLike(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n isValidElement(value)\n );\n}\n\nfunction isStabilizableObject(\n value: unknown,\n): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !isValidElement(value)\n );\n}\n\nfunction hasSameObjectKeys(\n previousValue: unknown,\n nextValue: unknown,\n): boolean {\n if (\n !isStabilizableObject(previousValue) ||\n !isStabilizableObject(nextValue)\n ) {\n return false;\n }\n const previousKeys = Object.keys(previousValue);\n const nextKeys = Object.keys(nextValue);\n if (previousKeys.length !== nextKeys.length) return false;\n return nextKeys.every((key) =>\n Object.prototype.hasOwnProperty.call(previousValue, key),\n );\n}\n\nfunction stabilizeRegistryValue(\n value: unknown,\n path: string,\n scope: StabilizeScope,\n previousValue?: unknown,\n seen = new WeakSet<object>(),\n depth = 0,\n): unknown {\n if (depth > MAX_STABILIZATION_DEPTH) return value;\n\n if (typeof value === \"function\") {\n const isComponent = value.name && /^[A-Z]/.test(value.name);\n if (\n isComponent ||\n isDirectRegistryComponentPath(path, scope.componentSlices)\n ) {\n return value;\n }\n scope.usedPaths.add(path);\n let entry = scope.functionEntries.get(path);\n if (!entry) {\n entry = createStableFunctionEntry(value as AnyFunction);\n scope.functionEntries.set(path, entry);\n } else {\n entry.current = value as AnyFunction;\n }\n return entry.stable;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n\n if (isValidElement(value)) {\n const nextProps = stabilizeRegistryValue(\n value.props,\n `${path}.props`,\n scope,\n isValidElement(previousValue) ? previousValue.props : undefined,\n seen,\n depth + 1,\n ) as Record<string, unknown>;\n if (\n isValidElement(previousValue) &&\n previousValue.type === value.type &&\n previousValue.key === value.key &&\n previousValue.props === nextProps\n ) {\n return previousValue;\n }\n return cloneElement(value, nextProps);\n }\n\n if (Array.isArray(value)) {\n const nextValue = value.every(isReactNodeLike)\n ? Children.toArray(value)\n : value;\n const previousArray = Array.isArray(previousValue) ? previousValue : null;\n let hasChanged =\n !previousArray || previousArray.length !== nextValue.length;\n\n const stabilizedValue: unknown[] = nextValue.map((item, index) => {\n const nextItem = stabilizeRegistryValue(\n item,\n `${path}[${index}]`,\n scope,\n previousArray?.[index],\n seen,\n depth + 1,\n );\n if (!previousArray || nextItem !== previousArray[index]) {\n hasChanged = true;\n }\n return nextItem;\n });\n return !hasChanged ? previousArray : stabilizedValue;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n const source = value as Record<string, unknown>;\n const previousRecord = previousValue as Record<string, unknown> | undefined;\n const stabilizedValue: Record<string, unknown> = {};\n const canReusePrevious = hasSameObjectKeys(previousValue, value);\n let hasChanged = !canReusePrevious;\n\n Object.keys(source).forEach((key) => {\n const nextValue = stabilizeRegistryValue(\n source[key],\n `${path}.${key}`,\n scope,\n previousRecord?.[key],\n seen,\n depth + 1,\n );\n stabilizedValue[key] = nextValue;\n if (!canReusePrevious || nextValue !== previousRecord?.[key]) {\n hasChanged = true;\n }\n });\n\n return !hasChanged ? previousValue : stabilizedValue;\n}\n\nfunction useAppliedRegistryConfig(\n payload: PageConfig | null,\n context: RegistryApplyContext,\n componentSlices: ReadonlySet<string>,\n): void {\n const functionEntriesRef = useRef(new Map<string, StableFunctionEntry>());\n const appliedRef = useRef<{\n cleanup: () => void;\n config: unknown;\n context: RegistryApplyContext;\n payload: PageConfig | null;\n } | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n const previous = appliedRef.current;\n if (\n previous &&\n previous.payload === payload &&\n previous.context === context\n ) {\n return;\n }\n const functionEntries = functionEntriesRef.current;\n const usedPaths = new Set<string>();\n const config = stabilizeRegistryValue(\n payload,\n \"config\",\n { componentSlices, functionEntries, usedPaths },\n previous?.config,\n );\n functionEntries.forEach((_entry, path) => {\n if (!usedPaths.has(path)) functionEntries.delete(path);\n });\n\n if (\n previous &&\n previous.config === config &&\n previous.context === context\n ) {\n previous.payload = payload;\n return;\n }\n previous?.cleanup();\n appliedRef.current = {\n cleanup: applyRegistryConfig(config as PageConfig | null, context),\n config,\n context,\n payload,\n };\n });\n\n useIsomorphicLayoutEffect(\n () => () => {\n appliedRef.current?.cleanup();\n appliedRef.current = null;\n },\n [],\n );\n}\n\nexport function createRegistryApplyContext(\n actions: RegistryQueue & Pick<RegistryApplyContext, \"batch\">,\n {\n cleanupScope = new Map<string, RegistryCleanupTimer>(),\n instanceId,\n modules = [],\n pathname,\n }: Pick<RegistryApplyContext, \"instanceId\" | \"modules\" | \"pathname\"> & {\n cleanupScope?: RegistryApplyContext[\"cleanupScope\"];\n },\n): RegistryApplyContext {\n const stamp = (queue: RegistryQueue): RegistryQueue =>\n ({\n register: (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n ) =>\n queue.register(\n type,\n key,\n item,\n ...resolveRegisterArgsWithInstance(\n instanceId,\n sourceOrOptions,\n optionsArg,\n ),\n ),\n unregister: (\n type: string,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n ) =>\n queue.unregister(\n type,\n key,\n withInstanceIdForUnregister(instanceId, sourceOrOptions),\n ),\n }) as RegistryQueue;\n\n return {\n ...stamp(actions),\n batch: (executor) =>\n typeof executor === \"function\"\n ? actions.batch((queue) => executor(stamp(queue)))\n : 0,\n cleanupScope,\n instanceId,\n modules,\n pathname,\n };\n}\n\nexport function useRegistry(\n config?: PageConfig | null,\n metadata?: RegistryMetadata,\n): void {\n const { batch, register, unregister } = useRegistryActions();\n const pathname = usePathname();\n const modules = useInstalledModules();\n const instanceId = `registry-instance-${useId()}`;\n const [cleanupScope] = useState(\n () => new Map<string, RegistryCleanupTimer>(),\n );\n\n const context = useMemo(\n () =>\n createRegistryApplyContext(\n { batch, register, unregister },\n {\n cleanupScope,\n instanceId,\n modules,\n pathname,\n },\n ),\n [batch, cleanupScope, instanceId, modules, pathname, register, unregister],\n );\n\n const payload = useMemo(\n () => (config ? createModulePayload(modules, config, metadata) : null),\n [config, metadata, modules],\n );\n const componentSlices = useMemo(\n () =>\n new Set(\n modules\n .filter(\n (coreModule) => coreModule.registry?.valueKind === \"component\",\n )\n .map((coreModule) => coreModule.id),\n ),\n [modules],\n );\n useAppliedRegistryConfig(payload, context, componentSlices);\n}\n","\"use client\";\n\nimport { createElement, use, useState, type ReactNode } from \"react\";\nimport { useStore } from \"@/hooks\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport {\n EMPTY_MODULES,\n ModuleHostContext,\n PassthroughBoundary,\n createModuleRegistryDefinitions,\n sortModules,\n type BoundaryComponent,\n type ModuleHostValue,\n} from \"./installed\";\nimport { PageControllerProvider } from \"./page-controller\";\nimport { RegistryProvider } from \"./provider\";\nimport type {\n AnyCoreModule,\n AppRegistryEntry,\n CoreModule,\n CoreModules,\n ModuleId,\n ModuleRuntimeOf,\n ModuleStateOf,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport function defineModule<\n TId extends string,\n TRuntime = never,\n TSlice = never,\n TController = never,\n>(\n coreModule: CoreModule<TId, TRuntime, TSlice, TController>,\n): CoreModule<TId, TRuntime, TSlice, TController> {\n return Object.freeze({ ...coreModule });\n}\n\nfunction warnMissingPeers(modules: readonly AnyCoreModule[]): void {\n const installed = new Set(modules.map((coreModule) => coreModule.id));\n for (const { id, uses } of modules) {\n const missing = (uses ?? []).filter((peer) => !installed.has(peer));\n if (missing.length > 0) {\n report(\n `Module \"${id}\" runs without its optional peers`,\n missing.join(\", \"),\n \"warn\",\n );\n }\n }\n}\n\nfunction createModuleHost(\n modules: readonly AnyCoreModule[],\n Boundary: BoundaryComponent,\n): ModuleHostValue {\n const sorted = sortModules(modules);\n if (process.env.NODE_ENV !== \"production\") warnMissingPeers(sorted);\n return {\n Boundary,\n byId: new Map(sorted.map((coreModule) => [coreModule.id, coreModule])),\n definitions: createModuleRegistryDefinitions(sorted),\n modules: Object.freeze(sorted),\n };\n}\n\nexport interface ModuleHostProps {\n boundary?: BoundaryComponent;\n children?: ReactNode;\n modules?: readonly AnyCoreModule[];\n registryEntries?: readonly AppRegistryEntry[];\n}\n\nexport function ModuleHost({\n boundary = PassthroughBoundary,\n children,\n modules = EMPTY_MODULES,\n registryEntries,\n}: ModuleHostProps) {\n const [host] = useState(() => createModuleHost(modules, boundary));\n const { Boundary } = host;\n\n const content = (\n <>\n {host.modules.map(({ Backdrop, id }) =>\n Backdrop ? (\n <Boundary key={id} name={id}>\n <Backdrop />\n </Boundary>\n ) : null,\n )}\n {children}\n {host.modules.map(({ Overlay, id }) =>\n Overlay ? (\n <Boundary key={id} name={id}>\n <Overlay />\n </Boundary>\n ) : null,\n )}\n </>\n );\n\n const tree = host.modules.reduceRight<ReactNode>(\n (inner, { Provider }) => (Provider ? <Provider>{inner}</Provider> : inner),\n content,\n );\n\n return (\n <RegistryProvider\n definitions={host.definitions}\n initialEntries={registryEntries}\n >\n <ModuleHostContext value={host}>\n <PageControllerProvider>{tree}</PageControllerProvider>\n </ModuleHostContext>\n </RegistryProvider>\n );\n}\n\nexport function useModule<K extends ModuleId>(\n id: K,\n): ModuleRuntimeOf<CoreModules[K]> | null {\n const coreModule = use(ModuleHostContext)?.byId.get(id);\n return coreModule?.context ? (use(coreModule.context) ?? null) : null;\n}\n\ntype ModuleActionsOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends { actions: infer TActions }\n ? TActions\n : never;\n\nexport interface ModulePeer<K extends ModuleId> {\n useActions(): ModuleActionsOf<K>;\n useRuntime(): ModuleRuntimeOf<CoreModules[K]>;\n useState<T>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ): T;\n}\n\nexport function definePeer<K extends ModuleId>(\n id: K,\n inert: ModuleRuntimeOf<CoreModules[K]>,\n): ModulePeer<K> {\n const useRuntime = (): ModuleRuntimeOf<CoreModules[K]> =>\n useModule(id) ?? inert;\n return {\n useRuntime,\n useActions: () => useRuntime().actions as ModuleActionsOf<K>,\n useState: <T,>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ) =>\n useStore<ModuleStateOf<K>, T>(\n (useRuntime() as { store: ExternalStore<ModuleStateOf<K>> }).store,\n selector,\n isEqual,\n ),\n };\n}\n\nconst NO_MODULE_STORE: ExternalStore<unknown> = createStore<unknown>(undefined);\n\nexport function useModuleState<K extends ModuleId, T>(\n id: K,\n selector: (state: ModuleStateOf<K>) => T,\n fallback: T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const runtime = useModule(id) as { store: ExternalStore<unknown> } | null;\n return useStore<unknown, T>(\n runtime?.store ?? NO_MODULE_STORE,\n (state) => (runtime ? selector(state as ModuleStateOf<K>) : fallback),\n isEqual,\n );\n}\n\nexport function ModuleBoundary({\n children,\n name,\n}: {\n children?: ReactNode;\n name?: string;\n}) {\n const Boundary = use(ModuleHostContext)?.Boundary ?? PassthroughBoundary;\n return createElement(Boundary, { name }, children);\n}\n\nexport function useIsModuleInstalled(id: ModuleId): boolean {\n return use(ModuleHostContext)?.byId.has(id) ?? false;\n}\n","\"use client\";\n\nimport { pickRegistryMetadata } from \"./schema\";\nimport { useRegistry } from \"./hooks\";\nimport { useInstalledModules } from \"./installed\";\nimport type { ModuleId, PageConfig, RegistryMetadata } from \"./types\";\n\nexport function useModuleRegistration(\n id: ModuleId,\n value: unknown,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n const coreModule = useInstalledModules().find(\n (candidate) => candidate.id === id,\n );\n const config =\n coreModule && options?.enabled !== false && value != null\n ? ({ [id]: value } as PageConfig)\n : null;\n useRegistry(config, pickRegistryMetadata(options));\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\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: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\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\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n","import { defineThemeSpec } from \"@/theme\";\nimport { type BackgroundThemeSlot } from \"./types\";\n\n\nexport const backgroundTheme =\n defineThemeSpec<BackgroundThemeSlot>(\"background\");\n\nexport const BACKGROUND_REGISTRY_KEY = \"page-background\";\nexport const BACKGROUND_MEDIA_ID = \"background\";\n","import { type CSSProperties } from \"react\";\nimport { type BackgroundMediaStyle, type FadeEdges, type VideoOptions } from \"./types\";\n\nconst objectFit = (value: string): CSSProperties => ({\n objectFit: value as CSSProperties[\"objectFit\"],\n});\n\nconst objectPosition = (value: string): CSSProperties => ({\n objectPosition: value,\n});\n\nexport const BG_TOKEN_TO_OBJECT_STYLE: Readonly<Record<string, CSSProperties>> = Object.freeze({\n \"bg-bottom\": objectPosition(\"bottom\"),\n \"bg-center\": objectPosition(\"center\"),\n \"bg-contain\": objectFit(\"contain\"),\n \"bg-cover\": objectFit(\"cover\"),\n \"bg-fill\": objectFit(\"fill\"),\n \"bg-left\": objectPosition(\"left\"),\n \"bg-left-bottom\": objectPosition(\"left bottom\"),\n \"bg-left-top\": objectPosition(\"left top\"),\n \"bg-none\": objectFit(\"none\"),\n \"bg-right\": objectPosition(\"right\"),\n \"bg-right-bottom\": objectPosition(\"right bottom\"),\n \"bg-right-top\": objectPosition(\"right top\"),\n \"bg-scale-down\": objectFit(\"scale-down\"),\n \"bg-top\": objectPosition(\"top\"),\n});\n\nexport const OBJECT_FITS = Object.freeze([\"contain\", \"cover\", \"fill\", \"none\", \"scale-down\"]);\n\nexport const DEFAULT_COLOR = \"var(--black, #000)\";\n\nconst WIDTH_CLASS = /^(w-|max-w-|min-w-)/;\n\nexport function resolveVideoClassNames(...inputs: (string | null | undefined)[]): {\n objectStyle: CSSProperties;\n other: string;\n width: string;\n} {\n const tokens = inputs\n .flatMap((input) => (typeof input === \"string\" ? input.replace(/,/g, \" \").split(/\\s+/) : []))\n .filter(Boolean);\n\n return {\n objectStyle: Object.assign({}, ...tokens.map((token) => BG_TOKEN_TO_OBJECT_STYLE[token])),\n other: tokens.filter((token) => !WIDTH_CLASS.test(token)).join(\" \"),\n width: tokens.filter((token) => WIDTH_CLASS.test(token)).join(\" \"),\n };\n}\n\nexport function resolveVideoOptions(options: VideoOptions = {}) {\n return {\n codec: options.codec || \"auto\",\n corp: options.corp ?? 0,\n forceIframe: Boolean(options.forceIframe),\n isLoop: options.loop ?? false,\n isMuted: options.muted ?? true,\n playbackRate: options.playbackRate ?? 1,\n quality: options.quality || \"1080p\",\n shouldAutoPlay: options.autoplay ?? true,\n showPoster: Boolean(options.showPoster),\n showSpinner: options.showSpinner !== false,\n };\n}\n\nexport const generateBaseGradient = (direction: \"left\" | \"right\", color: string): string => {\n const to = direction === \"left\" ? \"to right\" : \"to left\";\n return `linear-gradient(${to}, ${color} 0%, color-mix(in srgb, ${color} 85%, transparent) 15%, color-mix(in srgb, ${color} 50%, transparent) 45%, color-mix(in srgb, ${color} 18%, transparent) 75%, transparent 100%)`;\n};\n\nexport const generateEdgeGradient = (direction: \"left\" | \"right\", color: string): string => {\n const to = direction === \"left\" ? \"to right\" : \"to left\";\n return `linear-gradient(${to}, color-mix(in srgb, ${color} 95%, transparent) 0%, color-mix(in srgb, ${color} 70%, transparent) 25%, color-mix(in srgb, ${color} 35%, transparent) 55%, color-mix(in srgb, ${color} 10%, transparent) 80%, transparent 100%)`;\n};\n\nexport function getVisualStyle(currentStyle: BackgroundMediaStyle = {}) {\n const { className: _className, leftGradient = 0, rightGradient = 0, ...baseStyle } = currentStyle;\n return {\n baseStyle: baseStyle as CSSProperties,\n leftGradient: Number(leftGradient) || 0,\n rightGradient: Number(rightGradient) || 0,\n };\n}\n\nexport function resolveGradientSettings({\n fadeEdges = null,\n hasWidth = false,\n leftGradient = 0,\n rightGradient = 0,\n}: {\n fadeEdges?: FadeEdges | number | string | boolean | null;\n hasWidth?: boolean;\n leftGradient?: number;\n rightGradient?: number;\n}) {\n let leftPercent = 0;\n let rightPercent = 0;\n if (leftGradient > 0) leftPercent = Math.min(48, Math.max(12, leftGradient * 7.5));\n else if (hasWidth && fadeEdges !== false) leftPercent = 20;\n if (rightGradient > 0) rightPercent = Math.min(48, Math.max(12, rightGradient * 7.5));\n else if (hasWidth && fadeEdges !== false) rightPercent = 20;\n if (typeof fadeEdges === \"number\") {\n leftPercent = fadeEdges;\n rightPercent = fadeEdges;\n } else if (typeof fadeEdges === \"string\") {\n const parsed = parseFloat(fadeEdges);\n if (!Number.isNaN(parsed)) {\n leftPercent = parsed;\n rightPercent = parsed;\n }\n } else if (typeof fadeEdges === \"object\" && fadeEdges !== null) {\n const edgeObj = fadeEdges as { left?: unknown; right?: unknown };\n if (edgeObj.left !== undefined) leftPercent = parseFloat(String(edgeObj.left)) || 0;\n if (edgeObj.right !== undefined) rightPercent = parseFloat(String(edgeObj.right)) || 0;\n } else if (fadeEdges === false) {\n leftPercent = 0;\n rightPercent = 0;\n }\n const leftOpacity = leftGradient > 0 ? Math.min(1, leftGradient * 0.22) : 0;\n const rightOpacity = rightGradient > 0 ? Math.min(1, rightGradient * 0.22) : 0;\n return {\n enabled: leftPercent > 0 || rightPercent > 0,\n leftOpacity,\n leftPercent,\n rightOpacity,\n rightPercent,\n };\n}\n\nexport function generateSmoothstepStops(\n percent: number,\n direction: \"in\" | \"out\" = \"in\",\n color = \"var(--black, #000)\",\n): string[] {\n const steps = [\n { s: 0, t: 0 },\n { s: 0.06, t: 0.15 },\n { s: 0.22, t: 0.35 },\n { s: 0.47, t: 0.55 },\n { s: 0.76, t: 0.75 },\n { s: 0.93, t: 0.9 },\n { s: 1.0, t: 1.0 },\n ];\n if (direction === \"in\") {\n return steps.map(({ s, t }) =>\n s === 0\n ? `transparent ${(t * percent).toFixed(1)}%`\n : s === 1\n ? `${color} ${(t * percent).toFixed(1)}%`\n : `color-mix(in srgb, ${color} ${Math.round(s * 100)}%, transparent) ${(t * percent).toFixed(1)}%`,\n );\n }\n return steps.map(({ s, t }) => {\n const alpha = 1 - s;\n return alpha === 0\n ? `transparent ${(100 - percent + t * percent).toFixed(1)}%`\n : alpha === 1\n ? `${color} ${(100 - percent + t * percent).toFixed(1)}%`\n : `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent) ${(100 - percent + t * percent).toFixed(1)}%`;\n });\n}\n\nexport function getEdgeFadeMask({\n color = \"var(--black, #000)\",\n leftPercent = 0,\n rightPercent = 0,\n}: {\n color?: string;\n leftPercent?: number;\n rightPercent?: number;\n}): string | undefined {\n if (leftPercent <= 0 && rightPercent <= 0) return undefined;\n const leftStops =\n leftPercent > 0 ? generateSmoothstepStops(leftPercent, \"in\", color) : [`${color} 0%`];\n const rightStops =\n rightPercent > 0 ? generateSmoothstepStops(rightPercent, \"out\", color) : [`${color} 100%`];\n return `linear-gradient(to right, ${leftStops.join(\", \")}, ${rightStops.join(\", \")})`;\n}\n","export function applyVideoPlaybackState({\n isPlaying,\n playbackRate,\n setVideoPlaying,\n videoElement,\n}: {\n isPlaying?: boolean;\n playbackRate?: number;\n setVideoPlaying: (playing: boolean) => void;\n videoElement?: HTMLVideoElement | null;\n}): void {\n if (!videoElement) return;\n\n const numericPlaybackRate = Number(playbackRate);\n const resolvedPlaybackRate =\n Number.isFinite(numericPlaybackRate) && numericPlaybackRate > 0\n ? numericPlaybackRate\n : 1;\n\n try {\n if (videoElement.playbackRate !== resolvedPlaybackRate) {\n videoElement.playbackRate = resolvedPlaybackRate;\n }\n } catch {\n return;\n }\n\n if (!isPlaying) {\n if (!videoElement.paused) videoElement.pause();\n return;\n }\n\n if (videoElement.readyState === 0) {\n return;\n }\n\n const playPromise = videoElement.play();\n if (!playPromise || typeof playPromise.then !== \"function\") return;\n\n playPromise\n .then(() => setVideoPlaying(true))\n .catch((error: { name?: string } | undefined) => {\n if (error?.name === \"AbortError\" || videoElement.readyState < 2) {\n return;\n }\n if (error?.name === \"NotAllowedError\") {\n videoElement.muted = true;\n videoElement\n .play()\n .then(() => setVideoPlaying(true))\n .catch(() => {});\n return;\n }\n setVideoPlaying(false);\n });\n}\n\nexport function triggerVideoPlaybackDirect(\n videoElement: HTMLVideoElement | null | undefined,\n nextPlaying: boolean,\n configuredMuted: boolean,\n): void {\n if (!videoElement) return;\n if (nextPlaying) {\n videoElement.muted = configuredMuted;\n if (!configuredMuted && videoElement.volume === 0) {\n videoElement.volume = 0.8;\n }\n videoElement.play().catch((err: { name?: string } | undefined) => {\n if (err?.name === \"NotAllowedError\") {\n videoElement.muted = true;\n videoElement.play().catch(() => {});\n }\n });\n } else {\n videoElement.pause();\n }\n}\n\nexport function syncVideoMutedDirect(\n videoElement: HTMLVideoElement | null | undefined,\n nextMuted: boolean,\n): void {\n if (!videoElement) return;\n videoElement.muted = nextMuted;\n if (!nextMuted && videoElement.volume === 0) {\n videoElement.volume = 0.8;\n }\n}\n\nexport function syncVideoLoopDirect(\n videoElement: HTMLVideoElement | null | undefined,\n nextLoop: boolean,\n): void {\n if (!videoElement) return;\n videoElement.loop = nextLoop;\n}\n","import { type TargetAndTransition, type Transition } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES } from \"@/tokens\";\nimport { type BackgroundAnimationConfig } from \"./types\";\n\nconst DEFAULT_MOTION = Object.freeze({\n animate: Object.freeze({\n opacity: 1,\n }),\n exit: Object.freeze({\n opacity: 0,\n transition: Object.freeze({\n duration: DURATION_TOKENS.SLOW,\n ease: EASING_CURVES.IN_CUBIC,\n }),\n }),\n initial: Object.freeze({\n opacity: 0,\n }),\n transition: Object.freeze({\n delay: 0,\n duration: DURATION_TOKENS.SLOW,\n ease: EASING_CURVES.OUT_QUART,\n }),\n});\n\nexport function getBackgroundMotionConfig(\n animation?: BackgroundAnimationConfig | null,\n) {\n return {\n animate:\n animation?.animate ?? (DEFAULT_MOTION.animate as TargetAndTransition),\n exit: animation?.exit ?? (DEFAULT_MOTION.exit as TargetAndTransition),\n exitDurationFactor: Number(animation?.exitDurationFactor),\n initial:\n animation?.initial ?? (DEFAULT_MOTION.initial as TargetAndTransition),\n transition:\n animation?.transition ?? (DEFAULT_MOTION.transition as Transition),\n };\n}\n\nexport function toCssDuration(seconds: unknown): string {\n const value = Number(seconds);\n return `${Math.max(0, Number.isFinite(value) ? value : DURATION_TOKENS.SLOW) * 1000}ms`;\n}\n\nexport function toCssDelay(seconds: unknown): string {\n const value = Number(seconds);\n return `${Math.max(0, Number.isFinite(value) ? value : 0) * 1000}ms`;\n}\n\nexport function toCssEasing(easing: unknown): string {\n if (Array.isArray(easing)) {\n return `cubic-bezier(${easing.join(\", \")})`;\n }\n if (typeof easing === \"string\" && easing.trim()) {\n return easing;\n }\n return \"ease\";\n}\n","import { type MediaActions, type MediaState } from \"./types\";\n\nexport const DEFAULT_MEDIA_STATE: MediaState = Object.freeze({\n audibleElement: null,\n element: null,\n hasMedia: false,\n isPlaying: false,\n kind: null,\n loop: false,\n sourceId: null,\n});\n\nexport const INERT_MEDIA_ACTIONS: MediaActions = Object.freeze({\n removeSource: () => {},\n setMuted: () => {},\n toggle: () => {},\n toggleLoop: () => {},\n upsertSource: () => {},\n});\n\n\nexport const MEDIA_SYNC_DRIFT_SECONDS = 0.3;\n\nexport const MEDIA_REGISTRY_KEY = \"page-media\";\n\nexport const PAGE_MEDIA_ID = \"page\";\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport { DEFAULT_MEDIA_STATE } from \"./constants\";\nimport {\n bindFollowers,\n sameElements,\n toggleElement,\n} from \"./playback\";\nimport {\n createMediaState,\n findDisplacedAudio,\n mediaStatesEqual,\n mergeMediaSource,\n resolveMediaSession,\n} from \"./session\";\nimport {\n type MediaActions,\n type MediaContextValue,\n type MediaEntry,\n type MediaProviderProps,\n type MediaSession,\n type MediaState,\n} from \"./types\";\n\nexport const MediaContext = getOrCreateGlobalContext<MediaContextValue | null>(\n \"MediaContext\",\n null,\n);\n\nexport const NOOP_MEDIA_STORE = createStore<MediaState>(DEFAULT_MEDIA_STATE);\n\ninterface Binding {\n cleanup: () => void;\n followers: readonly (HTMLMediaElement | null)[];\n transport: HTMLMediaElement;\n}\n\nexport function MediaProvider({ children }: MediaProviderProps) {\n const [store] = useState(() =>\n createStore<MediaState>(DEFAULT_MEDIA_STATE, { freezeSnapshots: false }),\n );\n const sourcesRef = useRef(new Map<string, MediaEntry>());\n const sessionRef = useRef<MediaSession | null>(null);\n const orderRef = useRef(0);\n const bindingRef = useRef<Binding | null>(null);\n\n const actions = useMemo<MediaActions>(() => {\n const unbind = () => {\n bindingRef.current?.cleanup();\n bindingRef.current = null;\n };\n\n const rebind = (session: MediaSession | null) => {\n const transport = session?.transport.element ?? null;\n const followers = (session?.followers ?? []).map(\n (source) => source.element,\n );\n const current = bindingRef.current;\n if (\n current &&\n current.transport === transport &&\n sameElements(current.followers, followers)\n ) {\n return;\n }\n unbind();\n const live = followers.filter(\n (element): element is HTMLMediaElement => element !== null,\n );\n if (!transport || live.length === 0) return;\n bindingRef.current = {\n cleanup: bindFollowers(transport, live),\n followers,\n transport,\n };\n };\n\n const commit = () => {\n const session = resolveMediaSession([...sourcesRef.current.values()]);\n sessionRef.current = session;\n rebind(session);\n const next = createMediaState(session);\n store.publish((prev) => (mediaStatesEqual(prev, next) ? prev : next));\n };\n\n const patch = (id: string, changes: Partial<MediaEntry>) => {\n const current = sourcesRef.current.get(id);\n if (!current) return;\n sourcesRef.current.set(id, { ...current, ...changes });\n commit();\n };\n\n return {\n removeSource: (id) => {\n if (sourcesRef.current.delete(id)) commit();\n },\n setMuted: (muted) => {\n const audible = sessionRef.current?.audible;\n if (!audible) return;\n if (audible.controls?.setMuted) audible.controls.setMuted(muted);\n else if (audible.element) audible.element.muted = muted;\n },\n toggle: () => {\n const transport = sessionRef.current?.transport;\n if (!transport) return;\n if (transport.controls?.toggle) transport.controls.toggle();\n else toggleElement(transport.element);\n },\n toggleLoop: () => {\n const transport = sessionRef.current?.transport;\n if (!transport) return;\n if (transport.controls?.toggleLoop) {\n transport.controls.toggleLoop();\n return;\n }\n const loop = !transport.loop;\n if (transport.element) transport.element.loop = loop;\n patch(transport.id, { loop });\n },\n upsertSource: (input) => {\n const current = sourcesRef.current.get(input.id);\n if (!current) orderRef.current += 1;\n sourcesRef.current.set(\n input.id,\n mergeMediaSource(current, input, orderRef.current),\n );\n commit();\n if (!current) {\n findDisplacedAudio(\n [...sourcesRef.current.values()],\n sessionRef.current,\n input.id,\n ).forEach((entry) => entry.element?.pause());\n }\n },\n };\n }, [store]);\n\n useEffect(\n () => () => {\n bindingRef.current?.cleanup();\n bindingRef.current = null;\n },\n [],\n );\n\n const value = useMemo<MediaContextValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n return <MediaContext value={value}>{children}</MediaContext>;\n}\n","\"use client\";\n\nimport {\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { INERT_MEDIA_ACTIONS } from \"./constants\";\nimport { MediaContext, NOOP_MEDIA_STORE } from \"./context\";\nimport { toggleElement } from \"./playback\";\nimport {\n type MediaActions,\n type MediaHandle,\n type MediaOptions,\n type MediaState,\n} from \"./types\";\n\nexport function useMediaState(): MediaState {\n const { store } = useRequiredContext(\n MediaContext,\n \"useMediaState\",\n \"MediaProvider\",\n );\n return useStore(store);\n}\n\nexport function useMediaActions(): MediaActions {\n return useRequiredContext(MediaContext, \"useMediaActions\", \"MediaProvider\")\n .actions;\n}\n\nexport function useOptionalMediaState(): MediaState;\nexport function useOptionalMediaState<T>(\n selector: (state: MediaState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalMediaState<T = MediaState>(\n selector?: (state: MediaState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(MediaContext);\n return useStore(\n ctx?.store ?? NOOP_MEDIA_STORE,\n selector as (state: MediaState) => T,\n isEqual,\n );\n}\n\nexport function useOptionalMediaActions(): MediaActions {\n const ctx = useContext(MediaContext);\n return ctx?.actions ?? INERT_MEDIA_ACTIONS;\n}\n\nexport function useMedia(options: MediaOptions): MediaHandle {\n const generatedId = useId();\n const id = options.id ?? `media-${generatedId}`;\n const { removeSource, upsertSource } = useMediaActions();\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const optionsRef = useRef(options);\n const { src, enabled = true } = options;\n const isEnabled = enabled && Boolean(src);\n\n useEffect(() => {\n optionsRef.current = options;\n });\n\n useEffect(() => {\n if (!isEnabled || !src) return undefined;\n const audio = new Audio();\n audio.preload = \"auto\";\n audio.src = src;\n audioRef.current = audio;\n\n const initial = optionsRef.current;\n audio.loop = Boolean(initial.loop);\n audio.muted = Boolean(initial.muted);\n if (typeof initial.volume === \"number\") {\n audio.volume = Math.min(1, Math.max(0, initial.volume));\n }\n\n upsertSource({\n element: audio,\n follow: initial.follow ?? null,\n id,\n isPlaying: false,\n kind: \"audio\",\n loop: audio.loop,\n });\n\n const syncPlaying = () =>\n upsertSource({ id, isPlaying: !audio.paused && !audio.ended });\n const events = [\"play\", \"playing\", \"pause\", \"ended\"] as const;\n events.forEach((type) => audio.addEventListener(type, syncPlaying));\n\n if (!initial.follow && initial.autoplay !== false) {\n void Promise.resolve(audio.play()).catch(() => {});\n }\n\n return () => {\n events.forEach((type) => audio.removeEventListener(type, syncPlaying));\n audio.pause();\n audio.removeAttribute(\"src\");\n audio.load();\n audioRef.current = null;\n removeSource(id);\n };\n }, [id, isEnabled, removeSource, src, upsertSource]);\n\n const { follow = null, loop, muted, volume } = options;\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n if (loop !== undefined && !follow) audio.loop = loop;\n if (muted !== undefined) audio.muted = muted;\n if (volume !== undefined) audio.volume = Math.min(1, Math.max(0, volume));\n upsertSource({ follow, id, ...(follow ? {} : { loop: audio.loop }) });\n }, [follow, id, isEnabled, loop, muted, src, upsertSource, volume]);\n\n const play = useCallback(() => {\n const audio = audioRef.current;\n if (audio) void Promise.resolve(audio.play()).catch(() => {});\n }, []);\n const pause = useCallback(() => audioRef.current?.pause(), []);\n const toggle = useCallback(() => toggleElement(audioRef.current), []);\n\n return useMemo(\n () => ({ id, pause, play, toggle }),\n [id, pause, play, toggle],\n );\n}\n","import { YouTubeProxyController, YouTubeUrlConfig } from \"../types\";\n\nconst YOUTUBE_ID_PATTERN = /^[a-zA-Z0-9_-]{11}$/;\n\nfunction parseYouTubeTimeParam(value?: string | number | null): number {\n if (value === undefined || value === null || value === \"\") return 0;\n if (typeof value === \"number\") {\n return Number.isFinite(value) && value >= 0 ? value : 0;\n }\n\n const trimmed = String(value).trim().toLowerCase();\n if (!trimmed) return 0;\n\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n return Math.max(0, parseFloat(trimmed));\n }\n\n const hmsMatch = trimmed.match(\n /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+(?:\\.\\d+)?)s?)?$/,\n );\n if (hmsMatch && (hmsMatch[1] || hmsMatch[2] || hmsMatch[3])) {\n const hours = parseInt(hmsMatch[1] || \"0\", 10);\n const minutes = parseInt(hmsMatch[2] || \"0\", 10);\n const seconds = parseFloat(hmsMatch[3] || \"0\");\n return Math.max(0, hours * 3600 + minutes * 60 + seconds);\n }\n\n return 0;\n}\n\nconst YOUTUBE_HOST_PATH =\n /^(?:www\\.|m\\.|music\\.)?(?:youtube\\.com|youtu\\.be|youtube-nocookie\\.com)\\//i;\n\nfunction toUrl(input: string, { youtubeOnly = false } = {}): URL | null {\n let candidate: string | null = null;\n if (/^https?:\\/\\//.test(input)) candidate = input;\n else if (input.startsWith(\"//\")) candidate = `https:${input}`;\n else if (!youtubeOnly || YOUTUBE_HOST_PATH.test(input)) {\n candidate = `https://${input}`;\n }\n\n try {\n return candidate ? new URL(candidate) : null;\n } catch {\n return null;\n }\n}\n\nfunction getIdFromUrl(url: URL): string | null {\n const host = url.hostname.replace(/^(www\\.|m\\.|music\\.)/i, \"\").toLowerCase();\n const segments = url.pathname.split(\"/\").filter(Boolean);\n\n if (host === \"youtu.be\") {\n return YOUTUBE_ID_PATTERN.test(segments[0] ?? \"\") ? segments[0] : null;\n }\n if (\n host !== \"youtube.com\" &&\n host !== \"youtube-nocookie.com\" &&\n !host.endsWith(\".youtube.com\")\n ) {\n return null;\n }\n\n const fromQuery = url.searchParams.get(\"v\") || url.searchParams.get(\"vi\");\n if (fromQuery && YOUTUBE_ID_PATTERN.test(fromQuery)) return fromQuery;\n\n const isVideoPath =\n segments.length >= 2 &&\n [\"embed\", \"shorts\", \"live\", \"v\", \"e\", \"watch\"].includes(\n segments[0].toLowerCase(),\n );\n return isVideoPath && YOUTUBE_ID_PATTERN.test(segments[1])\n ? segments[1]\n : null;\n}\n\nexport function extractYouTubeVideoId(\n input?: string | null,\n options: { allowBareId?: boolean } = {},\n): string | null {\n const trimmed = typeof input === \"string\" ? input.trim() : \"\";\n if (!trimmed) return null;\n\n if (options.allowBareId && YOUTUBE_ID_PATTERN.test(trimmed)) return trimmed;\n\n const prefixed = trimmed.match(/^(?:youtube|yt):([a-zA-Z0-9_-]{11})$/i);\n if (prefixed) return prefixed[1];\n\n const url = toUrl(trimmed, { youtubeOnly: true });\n return url ? getIdFromUrl(url) : null;\n}\n\nexport function isYouTubeUrl(input?: string | null): boolean {\n return Boolean(extractYouTubeVideoId(input));\n}\n\nexport function isDirectVideoUrl(input?: string | null): boolean {\n if (!input || typeof input !== \"string\") return false;\n const trimmed = input.trim();\n if (!trimmed) return false;\n if (isYouTubeUrl(trimmed)) return true;\n if (\n trimmed.startsWith(\"/api/background/youtube\") ||\n trimmed.startsWith(\"blob:\")\n ) {\n return true;\n }\n const cleanPath = trimmed.split(\"?\")[0].split(\"#\")[0].toLowerCase();\n return /\\.(mp4|webm|mov|m4v|ogg|ogv|m3u8)$/i.test(cleanPath);\n}\n\nexport function parseYouTubeUrlConfig(\n input?: string | null,\n options: { allowBareId?: boolean } = {},\n): YouTubeUrlConfig | null {\n const videoId = extractYouTubeVideoId(input, options);\n if (!videoId || !input) return null;\n\n const params = toUrl(input.trim())?.searchParams;\n return {\n endTime: parseYouTubeTimeParam(params?.get(\"end\")),\n listId: params?.get(\"list\") || null,\n rawUrl: input,\n startTime: parseYouTubeTimeParam(params?.get(\"t\") || params?.get(\"start\")),\n videoId,\n };\n}\n\nexport function getYouTubeStreamUrl(\n videoId: string,\n options: {\n codec?: string;\n quality?: string;\n stream?: \"video\" | \"audio\" | \"muxed\" | \"thumbnail\" | \"meta\";\n } = {},\n): string {\n const params = new URLSearchParams();\n params.set(\"id\", videoId);\n params.set(\"stream\", options.stream || \"video\");\n if (options.quality) params.set(\"quality\", options.quality);\n if (options.codec) params.set(\"codec\", options.codec);\n return `/api/background/youtube?${params.toString()}`;\n}\n\nexport function getYouTubeThumbnailUrl(\n videoId: string,\n proxied = true,\n): string {\n if (proxied) {\n return `/api/background/youtube?id=${encodeURIComponent(videoId)}&stream=thumbnail`;\n }\n return `https://i.ytimg.com/vi/${encodeURIComponent(videoId)}/maxresdefault.jpg`;\n}\n\nexport function createYouTubeVideoElementProxy(\n controller: YouTubeProxyController,\n): HTMLVideoElement {\n const proxyVideo = document.createElement(\"video\");\n\n Object.defineProperties(proxyVideo, {\n currentTime: {\n configurable: true,\n get: () => controller.getCurrentTime(),\n set: (value: number) => {\n controller.seekTo(Number(value) || 0);\n proxyVideo.dispatchEvent(new Event(\"timeupdate\"));\n },\n },\n duration: {\n configurable: true,\n get: () => controller.getDuration(),\n },\n loop: {\n configurable: true,\n get: () => controller.getLoop(),\n set: (value: boolean) => {\n controller.setLoop(Boolean(value));\n },\n },\n muted: {\n configurable: true,\n get: () => controller.getMuted(),\n set: (value: boolean) => {\n controller.setMuted(Boolean(value));\n proxyVideo.dispatchEvent(new Event(\"volumechange\"));\n },\n },\n pause: {\n configurable: true,\n value: () => {\n controller.pause();\n proxyVideo.dispatchEvent(new Event(\"pause\"));\n },\n },\n paused: {\n configurable: true,\n get: () => controller.getPaused(),\n },\n play: {\n configurable: true,\n value: () =>\n controller.play().then(() => {\n proxyVideo.dispatchEvent(new Event(\"play\"));\n proxyVideo.dispatchEvent(new Event(\"playing\"));\n }),\n },\n playbackRate: {\n configurable: true,\n get: () => controller.getPlaybackRate(),\n set: (value: number) => {\n controller.setPlaybackRate(Number(value) || 1);\n proxyVideo.dispatchEvent(new Event(\"ratechange\"));\n },\n },\n volume: {\n configurable: true,\n get: () => controller.getVolume(),\n set: (value: number) => {\n const clamped = Math.max(0, Math.min(1, Number(value) || 0));\n controller.setVolume(clamped);\n proxyVideo.dispatchEvent(new Event(\"volumechange\"));\n },\n },\n });\n\n return proxyVideo;\n}\n","import {\n type BackgroundActions,\n type BackgroundState,\n type BackgroundStateComputed,\n type ScopedOverride,\n} from \"./types\";\nimport {\n extractYouTubeVideoId,\n getYouTubeThumbnailUrl,\n isDirectVideoUrl,\n isYouTubeUrl,\n} from \"./youtube/parse\";\n\nexport const DEFAULT_BACKGROUND: BackgroundState = Object.freeze({\n animation: null,\n className: \"\",\n fadeEdges: null,\n fit: null,\n image: null,\n imageStyle: {},\n isPlaying: false,\n noiseStyle: {},\n overlay: false,\n overlayColor: \"var(--black)\",\n overlayOpacity: 0,\n position: \"center\",\n video: null,\n videoClassName: \"\",\n videoElement: null,\n videoOptions: {\n autoplay: true,\n className: \"\",\n corp: 0,\n loop: false,\n muted: true,\n playbackRate: 1,\n width: null,\n },\n videoStyle: {},\n width: null,\n});\n\nexport const DEFAULT_BACKGROUND_COMPUTED: BackgroundStateComputed = Object.freeze({\n ...DEFAULT_BACKGROUND,\n hasBackground: false,\n isVideo: false,\n isYouTube: false,\n posterUrl: null,\n youtubeVideoId: null,\n});\n\nexport const INERT_BACKGROUND_ACTIONS: BackgroundActions = Object.freeze({\n resetBackground: () => {},\n setBackground: () => {},\n setVideoElement: () => {},\n setVideoMuted: () => {},\n setVideoPlaying: () => {},\n toggleLoop: () => {},\n toggleMute: () => {},\n toggleVideo: () => {},\n});\n\nexport function normalizeBackgroundInput(\n patch: Partial<BackgroundState> | string | null | undefined = {},\n): Partial<BackgroundState> {\n if (!patch) return {};\n\n if (typeof patch === \"string\") {\n const trimmed = patch.trim();\n if (isYouTubeUrl(trimmed) || isDirectVideoUrl(trimmed)) {\n return { image: null, video: trimmed };\n }\n return { image: trimmed };\n }\n\n const nextPatch: Partial<BackgroundState> = { ...patch };\n\n if (\n typeof nextPatch.image === \"string\" &&\n isYouTubeUrl(nextPatch.image) &&\n !nextPatch.video\n ) {\n nextPatch.video = nextPatch.image;\n nextPatch.image = null;\n }\n\n return nextPatch;\n}\n\nexport function mergeBackgroundState(\n baseState: BackgroundState,\n patch: Partial<BackgroundState> | string = {},\n): BackgroundState {\n const resolvedPatch = normalizeBackgroundInput(patch);\n\n const nextVideoOptions = {\n ...baseState.videoOptions,\n ...(resolvedPatch.videoOptions || {}),\n };\n\n const nextVideo =\n resolvedPatch.video !== undefined ? resolvedPatch.video : baseState.video;\n const shouldAutoPlay = nextVideoOptions.autoplay !== false;\n const resolvedIsPlaying =\n resolvedPatch.isPlaying !== undefined\n ? resolvedPatch.isPlaying\n : resolvedPatch.video !== undefined && Boolean(nextVideo)\n ? shouldAutoPlay\n : baseState.isPlaying;\n\n return {\n ...baseState,\n ...resolvedPatch,\n isPlaying: resolvedIsPlaying,\n animation:\n resolvedPatch.animation !== undefined\n ? resolvedPatch.animation\n ? {\n ...(baseState.animation || {}),\n ...resolvedPatch.animation,\n }\n : resolvedPatch.animation\n : baseState.animation,\n imageStyle: {\n ...baseState.imageStyle,\n ...(resolvedPatch.imageStyle || {}),\n },\n noiseStyle: {\n ...baseState.noiseStyle,\n ...(resolvedPatch.noiseStyle || {}),\n },\n videoOptions: nextVideoOptions,\n videoStyle: {\n ...baseState.videoStyle,\n ...(resolvedPatch.videoStyle || {}),\n },\n };\n}\n\nexport function resolveBackgroundState(\n registryBackground: Partial<BackgroundState> | null,\n override: ScopedOverride,\n pathname: string | null,\n): BackgroundState {\n const base = registryBackground\n ? mergeBackgroundState(DEFAULT_BACKGROUND, registryBackground)\n : DEFAULT_BACKGROUND;\n const patch = override.pathname === pathname ? override.patch : null;\n return patch ? mergeBackgroundState(base, patch) : base;\n}\n\nexport function computeBackgroundState(\n background: BackgroundState,\n): BackgroundStateComputed {\n const youtubeVideoId = extractYouTubeVideoId(background.video);\n const isYouTube = Boolean(youtubeVideoId);\n const isVideo = Boolean(background.video || isYouTube);\n\n return {\n ...background,\n hasBackground: Boolean(\n background.image ||\n isVideo ||\n background.color ||\n background.overlay ||\n (background.noiseStyle &&\n (background.noiseStyle.opacity === undefined ||\n (background.noiseStyle.opacity ?? 0) > 0)),\n ),\n isVideo,\n isYouTube,\n posterUrl: youtubeVideoId ? getYouTubeThumbnailUrl(youtubeVideoId) : null,\n youtubeVideoId,\n };\n}\n","\"use client\";\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport {\n useIsomorphicLayoutEffect,\n useStore,\n} from \"@/hooks\";\nimport {\n getOrCreateGlobalContext,\n useRegistryValue,\n} from \"@/kernel\";\nimport { useOptionalMediaActions } from \"../media\";\nimport { createStore } from \"@/utils\";\nimport {\n BACKGROUND_MEDIA_ID,\n BACKGROUND_REGISTRY_KEY,\n} from \"./constants\";\nimport {\n computeBackgroundState,\n normalizeBackgroundInput,\n resolveBackgroundState,\n} from \"./state\";\nimport {\n syncVideoLoopDirect,\n syncVideoMutedDirect,\n triggerVideoPlaybackDirect,\n} from \"./playback\";\nimport {\n type BackgroundActions,\n type BackgroundContextValue,\n type BackgroundProviderProps,\n type BackgroundState,\n type BackgroundStateComputed,\n type ScopedOverride,\n} from \"./types\";\n\nexport const BackgroundContext =\n getOrCreateGlobalContext<BackgroundContextValue | null>(\n \"BackgroundContext\",\n null,\n );\n\nfunction useSafePathname(): string | null {\n try {\n return usePathname();\n } catch {\n return null;\n }\n}\n\nexport function BackgroundProvider({ children }: BackgroundProviderProps) {\n const pathname = useSafePathname();\n const registryBackground =\n useRegistryValue<\"background\", Partial<BackgroundState>>(\n \"background\",\n BACKGROUND_REGISTRY_KEY,\n ) ?? null;\n\n const [overrideStore] = useState(() =>\n createStore<ScopedOverride>(\n { patch: null, pathname },\n { freezeSnapshots: false },\n ),\n );\n const scopedOverride = useStore(overrideStore);\n\n const inputsRef = useRef({ pathname, registryBackground });\n useIsomorphicLayoutEffect(() => {\n inputsRef.current = { pathname, registryBackground };\n }, [pathname, registryBackground]);\n\n const videoElementRef = useRef<HTMLVideoElement | null>(null);\n\n const state = useMemo(\n () =>\n computeBackgroundState(\n resolveBackgroundState(registryBackground, scopedOverride, pathname),\n ),\n [pathname, registryBackground, scopedOverride],\n );\n\n const [stateStore] = useState(() =>\n createStore<BackgroundStateComputed>(state, { freezeSnapshots: false }),\n );\n useIsomorphicLayoutEffect(() => {\n stateStore.publish(state);\n }, [state, stateStore]);\n\n const actions = useMemo<BackgroundActions>(() => {\n const readCurrent = (): BackgroundState => {\n const { pathname: currentPath, registryBackground: registry } =\n inputsRef.current;\n return resolveBackgroundState(\n registry,\n overrideStore.getSnapshot(),\n currentPath,\n );\n };\n\n const updatePatch = (\n updater: (current: BackgroundState) => Partial<BackgroundState>,\n ) => {\n overrideStore.publish((prev) => {\n const { pathname: currentPath, registryBackground: registry } =\n inputsRef.current;\n const currentPatch = prev.pathname === currentPath ? prev.patch : null;\n const rawNext = updater(\n resolveBackgroundState(registry, prev, currentPath),\n );\n if (!rawNext || Object.keys(rawNext).length === 0) {\n return prev;\n }\n const normalizedNext = normalizeBackgroundInput(rawNext);\n const mergedPatch: Partial<BackgroundState> = {\n ...(currentPatch || {}),\n ...normalizedNext,\n ...(currentPatch?.videoOptions || normalizedNext.videoOptions\n ? {\n videoOptions: {\n ...(currentPatch?.videoOptions || {}),\n ...(normalizedNext.videoOptions || {}),\n },\n }\n : {}),\n };\n return {\n patch: mergedPatch,\n pathname: currentPath,\n };\n });\n };\n\n const currentVideoElement = (current: BackgroundState) =>\n videoElementRef.current || current.videoElement;\n\n return {\n resetBackground: () => {\n overrideStore.publish({\n patch: null,\n pathname: inputsRef.current.pathname,\n });\n },\n setBackground: (nextBackground: Partial<BackgroundState> | string) => {\n updatePatch(() => normalizeBackgroundInput(nextBackground));\n },\n setVideoElement: (videoElement: HTMLVideoElement | null) => {\n videoElementRef.current = videoElement;\n updatePatch((cur) =>\n cur.videoElement === videoElement ? {} : { videoElement },\n );\n },\n setVideoMuted: (muted: boolean) => {\n const nextMuted = Boolean(muted);\n syncVideoMutedDirect(currentVideoElement(readCurrent()), nextMuted);\n updatePatch((cur) => {\n if (cur.videoOptions?.muted === nextMuted) return {};\n return {\n videoOptions: { ...cur.videoOptions, muted: nextMuted },\n };\n });\n },\n setVideoPlaying: (isPlaying: boolean) => {\n updatePatch((cur) =>\n cur.isPlaying === isPlaying ? {} : { isPlaying },\n );\n },\n toggleLoop: () => {\n const current = readCurrent();\n const nextLoop = !current.videoOptions?.loop;\n syncVideoLoopDirect(currentVideoElement(current), nextLoop);\n updatePatch((cur) => ({\n videoOptions: { ...cur.videoOptions, loop: nextLoop },\n }));\n },\n toggleMute: () => {\n const current = readCurrent();\n const nextMuted = !current.videoOptions?.muted;\n syncVideoMutedDirect(currentVideoElement(current), nextMuted);\n updatePatch((cur) => ({\n isPlaying: nextMuted ? cur.isPlaying : true,\n videoOptions: { ...cur.videoOptions, muted: nextMuted },\n }));\n },\n toggleVideo: () => {\n const current = readCurrent();\n const videoEl = currentVideoElement(current);\n const domIsActuallyPlaying = videoEl\n ? !videoEl.paused && !videoEl.ended\n : Boolean(current.isPlaying);\n const nextPlaying = !domIsActuallyPlaying;\n const configuredMuted = Boolean(current.videoOptions?.muted);\n\n triggerVideoPlaybackDirect(videoEl, nextPlaying, configuredMuted);\n\n updatePatch(() => ({ isPlaying: nextPlaying }));\n },\n };\n }, [overrideStore]);\n\n const media = useOptionalMediaActions();\n const { isPlaying, isVideo, videoElement } = state;\n const isLoop = Boolean(state.videoOptions?.loop);\n useEffect(() => {\n if (!isVideo) {\n media.removeSource(BACKGROUND_MEDIA_ID);\n return;\n }\n media.upsertSource({\n controls: {\n setMuted: actions.setVideoMuted,\n toggle: actions.toggleVideo,\n toggleLoop: actions.toggleLoop,\n },\n element: videoElement ?? null,\n id: BACKGROUND_MEDIA_ID,\n isPlaying,\n kind: \"video\",\n loop: isLoop,\n });\n }, [actions, isLoop, isPlaying, isVideo, media, videoElement]);\n useEffect(() => () => media.removeSource(BACKGROUND_MEDIA_ID), [media]);\n\n const value = useMemo<BackgroundContextValue>(\n () => ({ actions, store: stateStore }),\n [actions, stateStore],\n );\n\n return <BackgroundContext value={value}>{children}</BackgroundContext>;\n}\n","\"use client\";\n\nimport { useContext, useMemo } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport { BackgroundContext } from \"./context\";\nimport {\n DEFAULT_BACKGROUND_COMPUTED,\n INERT_BACKGROUND_ACTIONS,\n} from \"./state\";\nimport type {\n BackgroundActions,\n BackgroundPageConfig,\n BackgroundStateComputed,\n} from \"./types\";\n\nconst NOOP_BACKGROUND_STORE = createStore<BackgroundStateComputed>(\n DEFAULT_BACKGROUND_COMPUTED,\n);\n\nexport function useBackgroundRegistration(\n config: BackgroundPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"background\", config, options);\n}\n\nexport function useBackgroundState(): BackgroundStateComputed {\n const { store } = useRequiredContext(\n BackgroundContext,\n \"useBackgroundState\",\n \"BackgroundProvider\",\n );\n return useStore(store);\n}\n\nexport function useBackgroundActions(): BackgroundActions {\n return useRequiredContext(\n BackgroundContext,\n \"useBackgroundActions\",\n \"BackgroundProvider\",\n ).actions;\n}\n\nexport function useBackground(\n config?: BackgroundPageConfig | null,\n options?: RegistryMetadata & { enabled?: boolean },\n): BackgroundStateComputed & BackgroundActions {\n useBackgroundRegistration(config, options);\n\n const actions = useBackgroundActions();\n const state = useBackgroundState();\n\n return useMemo(() => ({ ...state, ...actions }), [actions, state]);\n}\n\nexport function useOptionalBackgroundState(): BackgroundStateComputed;\nexport function useOptionalBackgroundState<T>(\n selector: (state: BackgroundStateComputed) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalBackgroundState<T = BackgroundStateComputed>(\n selector?: (state: BackgroundStateComputed) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(BackgroundContext);\n return useStore(\n ctx?.store ?? NOOP_BACKGROUND_STORE,\n selector as (state: BackgroundStateComputed) => T,\n isEqual,\n );\n}\n\nexport function useOptionalBackgroundActions(): BackgroundActions {\n const ctx = useContext(BackgroundContext);\n return ctx?.actions ?? INERT_BACKGROUND_ACTIONS;\n}\n","\"use client\";\n\nimport { Icon as IconifyIcon } from \"@iconify-icon/react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\n\nexport interface IconProps\n extends Omit<ComponentProps<typeof IconifyIcon>, \"icon\" | \"size\"> {\n icon: string | ComponentProps<typeof IconifyIcon>[\"icon\"];\n size?: number | string;\n color?: string;\n className?: string;\n style?: CSSProperties;\n onClick?: () => void;\n}\n\nexport function Icon({\n className = \"center\",\n color,\n icon,\n onClick,\n size = 20,\n style,\n ...props\n}: IconProps) {\n return (\n <IconifyIcon\n className={className}\n height={size}\n icon={icon}\n onClick={onClick}\n style={{ color, ...style }}\n width={size}\n {...props}\n />\n );\n}\n\nIcon.displayName = \"Icon\";\n","\"use client\";\n\nimport { Icon } from \"./icon\";\n\nexport interface SpinnerProps {\n className?: string;\n size?: number;\n}\n\nexport function Spinner({ className = \"\", size = 15 }: SpinnerProps) {\n return (\n <div\n className={className}\n aria-label=\"Loading\"\n role=\"status\"\n >\n <Icon icon=\"mingcute:loading-3-fill\" size={size} />\n </div>\n );\n}\n\nSpinner.displayName = \"Spinner\";\n","\"use client\";\n\nimport {\n useEffect,\n useRef,\n type Dispatch,\n type MutableRefObject,\n type RefObject,\n type SetStateAction,\n} from \"react\";\nimport { createYouTubeVideoElementProxy } from \"./parse\";\nimport { type BackgroundActions } from \"../types\";\n\ninterface YouTubePlayer {\n destroy?(): void;\n getCurrentTime?(): number;\n getDuration?(): number;\n mute?(): void;\n pauseVideo?(): void;\n playVideo?(): void;\n seekTo?(seconds: number, allowSeekAhead?: boolean): void;\n setPlaybackQuality?(quality: string): void;\n setPlaybackQualityRange?(min: string, max: string): void;\n setPlaybackRate?(rate: number): void;\n setVolume?(volume: number): void;\n unMute?(): void;\n}\n\ninterface YouTubePlayerEvent {\n data?: number;\n target?: YouTubePlayer;\n}\n\ndeclare global {\n interface Window {\n YT?: {\n Player: new (\n element: HTMLElement | string,\n options: Record<string, unknown>,\n ) => YouTubePlayer;\n };\n onYouTubeIframeAPIReady?: () => void;\n }\n}\n\nconst PLAYER_STATE = { ENDED: 0, PLAYING: 1, PAUSED: 2, BUFFERING: 3 } as const;\n\nexport interface YouTubeLiveState {\n corp: number;\n endTime: number;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying: boolean;\n playbackRate: number;\n shouldAutoPlay: boolean;\n startTime: number;\n}\n\nlet apiPromise: Promise<Window[\"YT\"] | null> | null = null;\n\nfunction loadYouTubeIframeApi(): Promise<Window[\"YT\"] | null> {\n if (typeof window === \"undefined\") return Promise.resolve(null);\n if (window.YT?.Player) return Promise.resolve(window.YT);\n if (apiPromise) return apiPromise;\n\n apiPromise = new Promise((resolve) => {\n const previousCallback = window.onYouTubeIframeAPIReady;\n window.onYouTubeIframeAPIReady = () => {\n previousCallback?.();\n resolve(window.YT);\n };\n\n if (\n !document.querySelector(\n 'script[src=\"https://www.youtube.com/iframe_api\"]',\n )\n ) {\n const script = document.createElement(\"script\");\n script.src = \"https://www.youtube.com/iframe_api\";\n script.async = true;\n document.head.appendChild(script);\n }\n });\n return apiPromise;\n}\n\nfunction setHighQuality(player?: YouTubePlayer) {\n player?.setPlaybackQualityRange?.(\"hd1080\", \"hd1080\");\n player?.setPlaybackQuality?.(\"hd1080\");\n}\n\nexport function useYouTubeIframePlayer({\n enabled,\n hostRef,\n isLoop,\n isMuted,\n isPlaying,\n live,\n playbackRate,\n setIsBuffering,\n setIsFrameReady,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n startTime,\n videoId,\n}: {\n enabled: boolean;\n hostRef: RefObject<HTMLDivElement | null>;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying: boolean;\n live: MutableRefObject<YouTubeLiveState>;\n playbackRate: number;\n setIsBuffering: Dispatch<SetStateAction<boolean>>;\n setIsFrameReady: Dispatch<SetStateAction<boolean>>;\n setVideoElement: BackgroundActions[\"setVideoElement\"];\n setVideoPlaying: BackgroundActions[\"setVideoPlaying\"];\n shouldAutoPlay: boolean;\n startTime: number;\n videoId: string;\n}) {\n const playerRef = useRef<YouTubePlayer | null>(null);\n\n useEffect(() => {\n if (!enabled) return undefined;\n let isDisposed = false;\n let progressInterval: number | null = null;\n let proxyElement: HTMLVideoElement | null = null;\n\n const state = {\n currentTime: startTime || 0,\n duration: 0,\n loop: Boolean(isLoop),\n muted: Boolean(isMuted),\n paused: !shouldAutoPlay,\n playbackRate: Number(playbackRate) || 1,\n volume: isMuted ? 0 : 0.8,\n };\n const player = () => playerRef.current;\n const restart = (target?: YouTubePlayer | null) => {\n const restartAt = Math.max(0, live.current.startTime || 0);\n target?.seekTo?.(restartAt, true);\n target?.playVideo?.();\n return restartAt;\n };\n const emit = (type: string) => proxyElement?.dispatchEvent(new Event(type));\n\n const trackProgress = () => {\n const current = player();\n if (!current || typeof current.getCurrentTime !== \"function\") return;\n\n const time = Number(current.getCurrentTime()) || 0;\n const duration = Number(current.getDuration?.()) || state.duration;\n state.currentTime = time;\n if (duration > 0 && duration !== state.duration) {\n state.duration = duration;\n emit(\"durationchange\");\n }\n\n const { corp, endTime, isLoop: loops } = live.current;\n const safetyEnd =\n endTime > 0\n ? endTime\n : duration > 0\n ? duration - Math.max(corp, 0.4)\n : 0;\n\n if (safetyEnd > 0 && time >= safetyEnd) {\n if (state.loop || loops) {\n state.currentTime = restart(current);\n } else {\n current.pauseVideo?.();\n state.paused = true;\n setVideoPlaying(false);\n }\n }\n emit(\"timeupdate\");\n };\n\n const handleReady = (event: YouTubePlayerEvent) => {\n if (isDisposed) return;\n const target = event.target;\n playerRef.current = target ?? null;\n state.duration = Number(target?.getDuration?.()) || 0;\n\n const { isMuted: muted, isPlaying, playbackRate: rate } = live.current;\n if (rate !== 1) target?.setPlaybackRate?.(rate);\n if (muted) {\n target?.mute?.();\n } else {\n target?.unMute?.();\n target?.setVolume?.(80);\n }\n\n if (live.current.shouldAutoPlay && isPlaying) {\n setHighQuality(target);\n target?.playVideo?.();\n state.paused = false;\n setVideoPlaying(true);\n }\n\n if (proxyElement) {\n setVideoElement(proxyElement);\n emit(\"loadedmetadata\");\n emit(\"durationchange\");\n }\n progressInterval = window.setInterval(trackProgress, 200);\n };\n\n const handleStateChange = (event: YouTubePlayerEvent) => {\n if (isDisposed) return;\n switch (event.data) {\n case PLAYER_STATE.PLAYING:\n setHighQuality(event.target);\n state.paused = false;\n setIsFrameReady(true);\n setIsBuffering(false);\n setVideoPlaying(true);\n emit(\"play\");\n emit(\"playing\");\n break;\n case PLAYER_STATE.BUFFERING:\n setIsBuffering(true);\n break;\n case PLAYER_STATE.PAUSED:\n state.paused = true;\n setIsBuffering(false);\n setVideoPlaying(false);\n emit(\"pause\");\n break;\n case PLAYER_STATE.ENDED:\n if (state.loop || live.current.isLoop) {\n restart(player());\n } else {\n state.paused = true;\n setVideoPlaying(false);\n emit(\"ended\");\n }\n break;\n }\n };\n\n loadYouTubeIframeApi().then((YT) => {\n const host = hostRef.current;\n if (isDisposed || !YT?.Player || !host) return;\n\n host.innerHTML = \"\";\n const mountTarget = document.createElement(\"div\");\n host.appendChild(mountTarget);\n\n proxyElement = createYouTubeVideoElementProxy({\n getCurrentTime: () => state.currentTime,\n getDuration: () => state.duration,\n getLoop: () => state.loop,\n getMuted: () => state.muted,\n getPaused: () => state.paused,\n getPlaybackRate: () => state.playbackRate,\n getVolume: () => state.volume,\n pause: () => {\n state.paused = true;\n player()?.pauseVideo?.();\n setVideoPlaying(false);\n },\n play: async () => {\n state.paused = false;\n player()?.playVideo?.();\n setVideoPlaying(true);\n },\n seekTo: (seconds) => {\n state.currentTime = seconds;\n player()?.seekTo?.(seconds, true);\n if (!state.paused) player()?.playVideo?.();\n },\n setLoop: (loop) => {\n state.loop = loop;\n },\n setMuted: (muted) => {\n state.muted = muted;\n if (muted) {\n player()?.mute?.();\n return;\n }\n player()?.unMute?.();\n if (state.volume === 0) {\n state.volume = 0.7;\n player()?.setVolume?.(70);\n }\n },\n setPlaybackRate: (rate) => {\n state.playbackRate = rate;\n player()?.setPlaybackRate?.(rate);\n },\n setVolume: (volume) => {\n state.volume = volume;\n player()?.setVolume?.(Math.round(volume * 100));\n if (volume > 0 && state.muted) {\n state.muted = false;\n player()?.unMute?.();\n } else if (volume === 0 && !state.muted) {\n state.muted = true;\n player()?.mute?.();\n }\n },\n });\n\n const initial = live.current;\n playerRef.current = new YT.Player(mountTarget, {\n events: { onReady: handleReady, onStateChange: handleStateChange },\n host: \"https://www.youtube-nocookie.com\",\n playerVars: {\n autoplay: initial.shouldAutoPlay ? 1 : 0,\n controls: 0,\n disablekb: 1,\n enablejsapi: 1,\n fs: 0,\n iv_load_policy: 3,\n loop: initial.isLoop ? 1 : 0,\n modestbranding: 1,\n mute: initial.isMuted ? 1 : 0,\n origin: window.location.origin,\n playlist: videoId,\n playsinline: 1,\n rel: 0,\n start: Math.floor(initial.startTime || 0),\n },\n videoId,\n });\n });\n\n return () => {\n isDisposed = true;\n if (progressInterval !== null) window.clearInterval(progressInterval);\n try {\n playerRef.current?.destroy?.();\n } catch {}\n playerRef.current = null;\n setVideoElement(null);\n };\n }, [\n enabled,\n hostRef,\n isLoop,\n isMuted,\n live,\n playbackRate,\n setIsBuffering,\n setIsFrameReady,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n startTime,\n videoId,\n ]);\n\n useEffect(() => {\n const current = playerRef.current;\n if (!enabled || !current) return;\n try {\n if (isPlaying) current.playVideo?.();\n else current.pauseVideo?.();\n if (isMuted) current.mute?.();\n else current.unMute?.();\n if (playbackRate) current.setPlaybackRate?.(playbackRate);\n } catch {}\n }, [enabled, isMuted, isPlaying, playbackRate]);\n}\n","\"use client\";\n\nimport {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"@/utils\";\nimport { Spinner } from \"@/atoms\";\nimport { applyVideoPlaybackState } from \"../playback\";\nimport {\n getYouTubeStreamUrl,\n getYouTubeThumbnailUrl,\n} from \"./parse\";\nimport { useYouTubeIframePlayer } from \"./iframe\";\nimport { type YouTubeBackgroundPlayerProps } from \"../types\";\n\nconst AUDIO_SYNC_EVENTS = [\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"volumechange\",\n \"ratechange\",\n] as const;\n\nfunction setElementMuted(video: HTMLVideoElement, muted: boolean) {\n video.muted = muted;\n if (!muted && video.volume === 0) video.volume = 0.8;\n}\n\nfunction unlockAudioOnGesture(unlock: () => void) {\n const handler = () => {\n unlock();\n window.removeEventListener(\"pointerdown\", handler);\n window.removeEventListener(\"keydown\", handler);\n };\n window.addEventListener(\"pointerdown\", handler, { once: true });\n window.addEventListener(\"keydown\", handler, { once: true });\n}\n\nexport function useYouTubeBackgroundPlayerModel({\n codec = \"auto\",\n corp = 0,\n endTime = 0,\n forceIframe = false,\n isLoop = false,\n isMuted = true,\n isPlaying = true,\n playbackRate = 1,\n posterUrl = null,\n quality = \"1080p\",\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay = true,\n showPoster = false,\n showSpinner = true,\n startTime = 0,\n videoClasses: _videoClasses,\n videoId,\n videoStyle: _videoStyle,\n}: YouTubeBackgroundPlayerProps) {\n const [useIframeFallback, setUseIframeFallback] = useState(\n Boolean(forceIframe),\n );\n const [isFrameReady, setIsFrameReady] = useState(false);\n const [isBuffering, setIsBuffering] = useState(true);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const iframeHostRef = useRef<HTMLDivElement | null>(null);\n const hasLoadedVideoRef = useRef(false);\n const errorRetryCountRef = useRef(0);\n const audioErrorRetryCountRef = useRef(0);\n const retryTimerIdsRef = useRef(new Set<number>());\n const lastAudioSeekAtRef = useRef(0);\n const live = useRef({\n corp,\n endTime,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n shouldAutoPlay,\n startTime,\n });\n live.current = {\n corp,\n endTime,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n shouldAutoPlay,\n startTime,\n };\n useEffect(() => {\n setUseIframeFallback(Boolean(forceIframe));\n setIsFrameReady(false);\n setIsBuffering(true);\n hasLoadedVideoRef.current = false;\n errorRetryCountRef.current = 0;\n audioErrorRetryCountRef.current = 0;\n }, [forceIframe, videoId]);\n const videoStreamUrl = useMemo(\n () => getYouTubeStreamUrl(videoId, { codec, quality, stream: \"video\" }),\n [codec, quality, videoId],\n );\n const audioStreamUrl = useMemo(\n () => getYouTubeStreamUrl(videoId, { stream: \"audio\" }),\n [videoId],\n );\n const resolvedPoster = showPoster\n ? posterUrl || getYouTubeThumbnailUrl(videoId, true)\n : null;\n const syncCompanionAudio = useCallback((forceSeek = false) => {\n const video = videoRef.current;\n const audio = audioRef.current;\n if (!video || !audio) return;\n\n try {\n const targetRate = Number(video.playbackRate) || 1;\n if (audio.playbackRate !== targetRate) audio.playbackRate = targetRate;\n\n if (\n audio.readyState < 2 ||\n !Number.isFinite(audio.duration) ||\n audio.duration <= 0\n ) {\n return;\n }\n\n const volume = Math.max(0, Math.min(1, Number(video.volume) ?? 1));\n if (Math.abs(audio.volume - volume) > 0.005) audio.volume = volume;\n\n const isSilent = Boolean(video.muted) || volume === 0;\n if (audio.muted !== isSilent) audio.muted = isSilent;\n\n if (video.paused || video.ended || video.seeking) {\n if (!audio.paused) audio.pause();\n return;\n }\n\n const now = performance.now();\n const drift = Math.abs(audio.currentTime - video.currentTime);\n const maxDrift = isSilent ? 0.5 : 0.35;\n if (\n forceSeek ||\n (drift > maxDrift && now - lastAudioSeekAtRef.current > 1500)\n ) {\n lastAudioSeekAtRef.current = now;\n audio.currentTime = video.currentTime;\n }\n\n if (audio.paused) audio.play().catch(() => {});\n } catch {}\n }, []);\n const playWithFallback = useCallback(\n (video: HTMLVideoElement, forceSeek: boolean, unlockAudio: boolean) => {\n const onPlayed = () => {\n setVideoPlaying(true);\n syncCompanionAudio(forceSeek);\n };\n video\n .play()\n .then(onPlayed)\n .catch((error: { name?: string } | undefined) => {\n if (error?.name !== \"NotAllowedError\") return;\n video.muted = true;\n video\n .play()\n .then(() => {\n onPlayed();\n if (!unlockAudio) return;\n unlockAudioOnGesture(() => {\n const current = videoRef.current;\n if (!live.current.isMuted && current) {\n setElementMuted(current, false);\n }\n });\n })\n .catch(() => {});\n });\n },\n [setVideoPlaying, syncCompanionAudio],\n );\n const scheduleRetry = (callback: () => void, delay: number) => {\n const timerId = window.setTimeout(() => {\n retryTimerIdsRef.current.delete(timerId);\n try {\n callback();\n } catch {}\n }, delay);\n retryTimerIdsRef.current.add(timerId);\n };\n const handleEnded = useCallback(() => {\n const video = videoRef.current;\n const audio = audioRef.current;\n if (!video) return;\n\n if (video.loop || live.current.isLoop) {\n const resetTime = Math.max(0, live.current.startTime || 0);\n video.currentTime = resetTime;\n if (audio && audio.readyState >= 2) audio.currentTime = resetTime;\n video\n .play()\n .then(() => {\n setVideoPlaying(true);\n syncCompanionAudio(true);\n })\n .catch(() => {});\n return;\n }\n\n video.pause();\n if (audio && !audio.paused) audio.pause();\n setVideoPlaying(false);\n }, [setVideoPlaying, syncCompanionAudio]);\n const handleTimeUpdate = () => {\n const video = videoRef.current;\n if (!video) return;\n\n if (video.currentTime > 0 && video.readyState >= 2) {\n setIsFrameReady(true);\n setIsBuffering(false);\n }\n\n const duration = Number(video.duration) || 0;\n const { corp: activeCorp, endTime: activeEndTime } = live.current;\n const effectiveEnd =\n activeEndTime > 0\n ? activeEndTime\n : activeCorp > 0 && duration > 0\n ? duration - activeCorp\n : 0;\n\n if (effectiveEnd > 0 && video.currentTime >= effectiveEnd) handleEnded();\n };\n const handlePlay = () => {\n const video = videoRef.current;\n hasLoadedVideoRef.current = true;\n if (video && !live.current.isMuted && video.muted) {\n setElementMuted(video, false);\n }\n if (!video || video.readyState < 2) setIsBuffering(true);\n setVideoPlaying(true);\n syncCompanionAudio(false);\n };\n const handlePlaying = () => {\n hasLoadedVideoRef.current = true;\n setIsFrameReady(true);\n setIsBuffering(false);\n setVideoPlaying(true);\n syncCompanionAudio(false);\n };\n const handlePause = () => {\n const video = videoRef.current;\n syncCompanionAudio(false);\n setIsBuffering(false);\n if (video && !video.seeking && !video.ended && !live.current.isPlaying) {\n setVideoPlaying(false);\n }\n };\n const handleSeeked = () => {\n const video = videoRef.current;\n if (!video) return;\n setIsFrameReady(true);\n if (video.readyState >= 2 && (!live.current.isPlaying || !video.paused)) {\n setIsBuffering(false);\n }\n syncCompanionAudio(true);\n if (live.current.isPlaying && video.paused) {\n video\n .play()\n .then(() => {\n setVideoPlaying(true);\n syncCompanionAudio(true);\n })\n .catch(() => {});\n }\n };\n const handleCanPlay = () => {\n const video = videoRef.current;\n if (!video) return;\n hasLoadedVideoRef.current = true;\n if (!live.current.isPlaying) {\n setIsFrameReady(true);\n setIsBuffering(false);\n } else if (video.paused) {\n setElementMuted(video, Boolean(live.current.isMuted));\n playWithFallback(video, false, true);\n }\n };\n const handleLoadedMetadata = () => {\n const video = videoRef.current;\n if (!video) return;\n hasLoadedVideoRef.current = true;\n if (startTime > 0 && video.currentTime < startTime) {\n video.currentTime = startTime;\n if (audioRef.current) audioRef.current.currentTime = startTime;\n }\n };\n const handleLoadedData = () => {\n const video = videoRef.current;\n if (!video) return;\n hasLoadedVideoRef.current = true;\n video.playbackRate = playbackRate;\n setElementMuted(video, Boolean(live.current.isMuted));\n if (startTime > 0 && video.currentTime < startTime) {\n video.currentTime = startTime;\n }\n if (!live.current.isPlaying) {\n setIsFrameReady(true);\n setIsBuffering(false);\n } else if (video.paused) {\n playWithFallback(video, true, false);\n }\n };\n const handleError = () => {\n const video = videoRef.current;\n\n if (video && hasLoadedVideoRef.current) {\n const resumeTime = video.currentTime || 0;\n scheduleRetry(() => {\n video.load();\n video.currentTime = resumeTime;\n if (live.current.isPlaying) video.play().catch(() => {});\n }, 150);\n return;\n }\n\n errorRetryCountRef.current += 1;\n if (video && errorRetryCountRef.current <= 1) {\n scheduleRetry(() => video.load(), 200);\n return;\n }\n setUseIframeFallback(true);\n };\n const handleAudioError = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n audioErrorRetryCountRef.current += 1;\n if (audioErrorRetryCountRef.current <= 1) {\n scheduleRetry(() => {\n audio.load();\n if (videoRef.current) {\n audio.currentTime = videoRef.current.currentTime || 0;\n }\n }, 200);\n return;\n }\n\n if (!live.current.isMuted) {\n setUseIframeFallback(true);\n }\n }, []);\n useEffect(() => {\n if (useIframeFallback) return undefined;\n const video = videoRef.current;\n const audio = audioRef.current;\n const retryTimerIds = retryTimerIdsRef.current;\n if (!video) {\n setVideoElement(null);\n return undefined;\n }\n\n setVideoElement(video);\n\n const onSync = () => syncCompanionAudio(false);\n const onSeeked = () => syncCompanionAudio(true);\n for (const event of AUDIO_SYNC_EVENTS) {\n video.addEventListener(event, onSync);\n }\n video.addEventListener(\"seeked\", onSeeked);\n const syncTimer = window.setInterval(onSync, 1000);\n\n return () => {\n window.clearInterval(syncTimer);\n retryTimerIds.forEach((timerId) => window.clearTimeout(timerId));\n retryTimerIds.clear();\n for (const event of AUDIO_SYNC_EVENTS) {\n video.removeEventListener(event, onSync);\n }\n video.removeEventListener(\"seeked\", onSeeked);\n try {\n video.pause();\n audio?.pause();\n } catch {}\n };\n }, [setVideoElement, syncCompanionAudio, useIframeFallback, videoStreamUrl]);\n useEffect(() => {\n const video = videoRef.current;\n if (useIframeFallback || !video) return;\n applyVideoPlaybackState({\n isPlaying,\n playbackRate,\n setVideoPlaying,\n videoElement: video,\n });\n syncCompanionAudio();\n }, [\n isPlaying,\n playbackRate,\n setVideoPlaying,\n syncCompanionAudio,\n useIframeFallback,\n ]);\n useEffect(() => {\n const video = videoRef.current;\n if (useIframeFallback || !video) return;\n if (video.muted !== isMuted) setElementMuted(video, isMuted);\n syncCompanionAudio(true);\n }, [isMuted, syncCompanionAudio, useIframeFallback]);\n useYouTubeIframePlayer({\n enabled: useIframeFallback,\n hostRef: iframeHostRef,\n isLoop,\n isMuted,\n isPlaying,\n live,\n playbackRate,\n setIsBuffering,\n setIsFrameReady,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n startTime,\n videoId,\n });\n const isCovered = !isFrameReady || (useIframeFallback && !isPlaying);\n const showSpinnerOverlay = showSpinner && (!isFrameReady || isBuffering);\n\n return {\n useIframeFallback,\n isFrameReady,\n setIsBuffering,\n videoRef,\n audioRef,\n iframeHostRef,\n videoStreamUrl,\n audioStreamUrl,\n resolvedPoster,\n syncCompanionAudio,\n handleEnded,\n handleTimeUpdate,\n handlePlay,\n handlePlaying,\n handlePause,\n handleSeeked,\n handleCanPlay,\n handleLoadedMetadata,\n handleLoadedData,\n handleError,\n handleAudioError,\n isCovered,\n showSpinnerOverlay,\n };\n}\n\nexport const YouTubeBackgroundPlayer = memo(function YouTubeBackgroundPlayer({\n codec = \"auto\",\n corp = 0,\n endTime = 0,\n forceIframe = false,\n isLoop = false,\n isMuted = true,\n isPlaying = true,\n playbackRate = 1,\n posterUrl = null,\n quality = \"1080p\",\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay = true,\n showPoster = false,\n showSpinner = true,\n startTime = 0,\n theme,\n videoClasses,\n videoId,\n videoStyle,\n}: YouTubeBackgroundPlayerProps) {\n const {\n useIframeFallback,\n isFrameReady,\n setIsBuffering: _setIsBuffering,\n videoRef,\n audioRef,\n iframeHostRef,\n videoStreamUrl,\n audioStreamUrl,\n resolvedPoster,\n syncCompanionAudio: _syncCompanionAudio,\n handleEnded,\n handleTimeUpdate,\n handlePlay,\n handlePlaying,\n handlePause,\n handleSeeked,\n handleCanPlay,\n handleLoadedMetadata,\n handleLoadedData,\n handleError,\n handleAudioError,\n isCovered,\n showSpinnerOverlay,\n } = useYouTubeBackgroundPlayerModel({\n codec,\n corp,\n endTime,\n forceIframe,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n posterUrl,\n quality,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n showPoster,\n showSpinner,\n startTime,\n theme,\n videoClasses,\n videoId,\n videoStyle,\n });\n return (\n <div className={theme.slots.youtube}>\n <div data-visible={isCovered} className={theme.slots.youtubeCover} />\n\n <div\n data-visible={showSpinnerOverlay}\n className={theme.slots.youtubeSpinner}\n >\n {showSpinner ? (\n <Spinner size={30} className={theme.slots.youtubeSpinnerIcon} />\n ) : null}\n </div>\n\n {resolvedPoster ? (\n <div\n data-visible={isCovered}\n className={theme.slots.youtubePoster}\n style={{\n backgroundImage: `url(${resolvedPoster})`,\n ...videoStyle,\n }}\n />\n ) : null}\n\n {useIframeFallback && !isPlaying ? (\n <div className={theme.slots.youtubeBlackout} />\n ) : null}\n\n {useIframeFallback ? (\n <div\n data-visible={isFrameReady}\n className={theme.slots.youtubeFrame}\n style={videoStyle}\n >\n <div ref={iframeHostRef} className={theme.slots.youtubeHost} />\n </div>\n ) : (\n <>\n <video\n ref={videoRef}\n src={videoStreamUrl}\n data-visible={isFrameReady}\n className={cn(videoClasses, theme.slots.youtubeVideo)}\n preload=\"auto\"\n muted={isMuted}\n loop={isLoop}\n playsInline\n style={videoStyle}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onPlay={handlePlay}\n onWaiting={() => {\n _setIsBuffering(true);\n _syncCompanionAudio(false);\n }}\n onPlaying={handlePlaying}\n onPause={handlePause}\n onSeeking={() => _setIsBuffering(true)}\n onSeeked={handleSeeked}\n onCanPlay={handleCanPlay}\n onLoadedMetadata={handleLoadedMetadata}\n onLoadedData={handleLoadedData}\n onError={handleError}\n />\n <audio\n ref={audioRef}\n src={audioStreamUrl}\n preload=\"auto\"\n onCanPlay={() => _syncCompanionAudio(true)}\n onError={handleAudioError}\n />\n </>\n )}\n </div>\n );\n});\n","\"use client\";\n\nimport {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type CSSProperties,\n} from \"react\";\nimport { cn, report } from \"@/utils\";\nimport { AnimatePresence, motion, type Transition } from \"motion/react\";\nimport { EASING_CURVES } from \"@/tokens\";\nimport { useModuleTheme, type ResolvedTheme } from \"@/theme\";\nimport { backgroundTheme } from \"./constants\";\nimport {\n DEFAULT_COLOR,\n OBJECT_FITS,\n generateBaseGradient,\n generateEdgeGradient,\n getEdgeFadeMask,\n getVisualStyle,\n resolveGradientSettings,\n resolveVideoClassNames,\n resolveVideoOptions,\n} from \"./visual\";\nimport { applyVideoPlaybackState } from \"./playback\";\nimport {\n getBackgroundMotionConfig,\n toCssDelay,\n toCssDuration,\n toCssEasing,\n} from \"./motion\";\nimport { useBackgroundActions, useBackgroundState } from \"./hooks\";\nimport { parseYouTubeUrlConfig } from \"./youtube/parse\";\nimport { YouTubeBackgroundPlayer } from \"./youtube/player\";\nimport {\n type BackgroundActions,\n type BackgroundThemeSlot,\n} from \"./types\";\n\ntype Theme = ResolvedTheme<BackgroundThemeSlot>;\n\nexport function useNativeVideoModel({\n corp,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n src,\n style: _style,\n className: _className,\n}: {\n className: string;\n corp: number;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying?: boolean;\n playbackRate: number;\n setVideoElement: BackgroundActions[\"setVideoElement\"];\n setVideoPlaying: BackgroundActions[\"setVideoPlaying\"];\n shouldAutoPlay: boolean;\n src: string | undefined;\n style: CSSProperties;\n}) {\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const handleEnded = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n if (video.loop) {\n video.currentTime = 0;\n video\n .play()\n .catch((error) => report(\"Background loop play\", error, \"warn\"));\n return;\n }\n video.pause();\n setVideoPlaying(false);\n }, [setVideoPlaying]);\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current;\n if (\n video?.duration &&\n corp > 0 &&\n video.currentTime >= video.duration - corp\n ) {\n handleEnded();\n }\n }, [corp, handleEnded]);\n const handleLoadedData = () => {\n const video = videoRef.current;\n if (!video) return;\n video.playbackRate = playbackRate;\n if (!shouldAutoPlay) return;\n if (isMuted) video.muted = true;\n video\n .play()\n .then(() => setVideoPlaying(true))\n .catch((error) => {\n report(\"Background autoplay\", error, \"warn\");\n setVideoPlaying(false);\n });\n };\n useEffect(() => {\n const video = videoRef.current;\n setVideoElement(video);\n return () => {\n try {\n video?.pause();\n } catch {}\n };\n }, [src, setVideoElement]);\n useEffect(() => () => setVideoElement(null), [setVideoElement]);\n useEffect(() => {\n applyVideoPlaybackState({\n isPlaying,\n playbackRate,\n setVideoPlaying,\n videoElement: videoRef.current,\n });\n }, [isPlaying, playbackRate, setVideoPlaying]);\n\n return { videoRef, handleEnded, handleTimeUpdate, handleLoadedData };\n}\n\nexport function NativeVideo({\n corp,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n src,\n style,\n className,\n}: {\n className: string;\n corp: number;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying?: boolean;\n playbackRate: number;\n setVideoElement: BackgroundActions[\"setVideoElement\"];\n setVideoPlaying: BackgroundActions[\"setVideoPlaying\"];\n shouldAutoPlay: boolean;\n src: string | undefined;\n style: CSSProperties;\n}) {\n const { videoRef, handleEnded, handleTimeUpdate, handleLoadedData } =\n useNativeVideoModel({\n corp,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n src,\n style,\n className,\n });\n return (\n <video\n ref={videoRef}\n src={src}\n className={className}\n preload=\"auto\"\n muted={isMuted}\n loop={isLoop}\n playsInline\n style={style}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onLoadedData={handleLoadedData}\n />\n );\n}\n\nexport const BackgroundGradients = memo(function BackgroundGradients({\n count = 0,\n direction,\n color = DEFAULT_COLOR,\n theme,\n}: {\n theme: Theme;\n count?: number;\n direction: \"left\" | \"right\";\n color?: string;\n}) {\n if (!count || count <= 0) return null;\n const opacity = Math.min(1, Math.max(0.2, count * 0.25));\n return (\n <div\n data-side={direction}\n className={theme.slots.gradient}\n style={{\n ...theme.styles.gradient,\n opacity,\n background: generateBaseGradient(direction, color),\n }}\n />\n );\n});\n\nexport const EdgeGradient = memo(function EdgeGradient({\n direction,\n percent = 0,\n opacity = 0,\n color,\n theme,\n}: {\n theme: Theme;\n direction: \"left\" | \"right\";\n percent?: number;\n opacity?: number;\n color?: string;\n}) {\n if (opacity <= 0) return null;\n return (\n <div\n data-side={direction}\n className={theme.slots.edge}\n style={{\n width: `${Math.max(30, percent * 1.15)}%`,\n opacity,\n background: generateEdgeGradient(direction, color || DEFAULT_COLOR),\n }}\n />\n );\n});\n\nexport const NoiseOverlay = memo(function NoiseOverlay({\n opacity,\n blendMode,\n inlineStyle,\n maskImage,\n isFixed,\n theme,\n}: {\n theme: Theme;\n opacity?: number;\n blendMode?: string;\n inlineStyle?: CSSProperties;\n maskImage?: string;\n isFixed?: boolean;\n}) {\n return (\n <div\n data-position={isFixed ? \"fixed\" : \"absolute\"}\n className={theme.slots.noise}\n style={{\n ...theme.styles.noise,\n ...(typeof opacity === \"number\" ? { opacity } : {}),\n ...(typeof blendMode === \"string\" && blendMode.trim()\n ? { mixBlendMode: blendMode as CSSProperties[\"mixBlendMode\"] }\n : {}),\n ...(maskImage ? { maskImage, WebkitMaskImage: maskImage } : {}),\n ...inlineStyle,\n }}\n />\n );\n});\n\nexport const SolidOverlay = memo(function SolidOverlay({\n opacity = 0,\n color,\n transitionStyle,\n maskImage,\n theme,\n}: {\n theme: Theme;\n opacity?: number;\n color?: string;\n transitionStyle?: CSSProperties;\n maskImage?: string;\n}) {\n return (\n <div\n className={theme.slots.solid}\n style={{\n opacity,\n backgroundColor: color,\n ...(maskImage ? { maskImage, WebkitMaskImage: maskImage } : {}),\n ...transitionStyle,\n }}\n />\n );\n});\n\nexport function useBackgroundOverlayModel() {\n const {\n animation,\n className,\n fadeEdges,\n fit,\n hasBackground,\n image,\n imageStyle,\n isPlaying,\n isVideo,\n isYouTube,\n leftGradient: configuredLeftGradient,\n noiseStyle,\n overlay,\n overlayColor,\n overlayOpacity,\n position,\n rightGradient: configuredRightGradient,\n video,\n videoClassName,\n videoOptions,\n videoStyle,\n width,\n } = useBackgroundState();\n const { setVideoElement, setVideoPlaying } = useBackgroundActions();\n const options = resolveVideoOptions(videoOptions);\n const { corp, isMuted, playbackRate } = options;\n const youtubeConfig = useMemo(\n () => (isYouTube ? parseYouTubeUrlConfig(video) : null),\n [isYouTube, video],\n );\n const startTime = videoOptions?.startTime ?? youtubeConfig?.startTime ?? 0;\n const endTime = videoOptions?.endTime ?? youtubeConfig?.endTime ?? 0;\n const backgroundKey = isVideo\n ? youtubeConfig\n ? `youtube:${youtubeConfig.videoId}`\n : video\n : image;\n const motionConfig = useMemo(\n () => getBackgroundMotionConfig(animation),\n [animation],\n );\n const {\n baseStyle,\n leftGradient: styleLeft,\n rightGradient: styleRight,\n } = useMemo(\n () => getVisualStyle((isVideo ? videoStyle : imageStyle) || {}),\n [imageStyle, isVideo, videoStyle],\n );\n const leftGradient = configuredLeftGradient ?? styleLeft;\n const rightGradient = configuredRightGradient ?? styleRight;\n const {\n opacity: noiseOpacity,\n mixBlendMode: noiseBlendMode,\n ...noiseInlineStyle\n } = noiseStyle || {};\n const overlayTransitionStyle = useMemo<CSSProperties>(\n () => ({\n transitionDelay: toCssDelay(motionConfig.transition.delay),\n transitionDuration: toCssDuration(motionConfig.transition.duration),\n transitionProperty: \"opacity\",\n transitionTimingFunction: toCssEasing(motionConfig.transition.ease),\n }),\n [motionConfig.transition],\n );\n const rawWidth = width ?? videoOptions?.width ?? videoStyle?.width;\n const resolvedWidth =\n rawWidth === undefined || rawWidth === null || rawWidth === \"\"\n ? undefined\n : typeof rawWidth === \"number\"\n ? `${rawWidth}px`\n : String(rawWidth);\n const rawFit = fit ?? videoOptions?.fit ?? videoOptions?.objectFit;\n const theme = useModuleTheme(backgroundTheme);\n const fitStyle = useMemo<CSSProperties>(\n () =>\n rawFit && OBJECT_FITS.includes(rawFit)\n ? { objectFit: rawFit as CSSProperties[\"objectFit\"] }\n : {},\n [rawFit],\n );\n const classNames = resolveVideoClassNames(\n videoClassName,\n className,\n videoOptions?.videoClassName,\n videoOptions?.className,\n videoStyle?.className,\n );\n const hasCustomWidth = Boolean(resolvedWidth || classNames.width);\n const gradientSettings = useMemo(\n () =>\n resolveGradientSettings({\n fadeEdges,\n hasWidth: hasCustomWidth,\n leftGradient,\n rightGradient,\n }),\n [fadeEdges, hasCustomWidth, leftGradient, rightGradient],\n );\n const maskImage = useMemo(\n () =>\n gradientSettings.enabled\n ? getEdgeFadeMask({\n color: overlayColor || DEFAULT_COLOR,\n leftPercent: gradientSettings.leftPercent,\n rightPercent: gradientSettings.rightPercent,\n })\n : undefined,\n [gradientSettings, overlayColor],\n );\n const framePosition =\n position === \"left\" || position === \"right\" ? position : \"center\";\n const videoClasses = cn(theme.slots.video, classNames.other);\n const objectPosition = baseStyle.objectPosition || position || undefined;\n const sharedVideoStyle = useMemo<CSSProperties>(\n () => ({\n ...classNames.objectStyle,\n ...fitStyle,\n ...(objectPosition ? { objectPosition } : {}),\n ...(maskImage ? { WebkitMaskImage: maskImage, maskImage } : {}),\n ...baseStyle,\n }),\n [baseStyle, classNames.objectStyle, fitStyle, maskImage, objectPosition],\n );\n const exitDurationFactor = Number.isFinite(motionConfig.exitDurationFactor)\n ? Math.max(0, motionConfig.exitDurationFactor)\n : 0.6;\n const exitTransition = motionConfig.exit.transition as\n { duration?: number; ease?: unknown } | undefined;\n\n return {\n className,\n hasBackground,\n image,\n isPlaying,\n isVideo,\n overlay,\n overlayColor,\n overlayOpacity,\n position,\n video,\n videoStyle,\n width,\n setVideoElement,\n setVideoPlaying,\n options,\n corp,\n isMuted,\n playbackRate,\n youtubeConfig,\n startTime,\n endTime,\n backgroundKey,\n motionConfig,\n baseStyle,\n leftGradient,\n rightGradient,\n noiseOpacity,\n noiseBlendMode,\n noiseInlineStyle,\n overlayTransitionStyle,\n resolvedWidth,\n classNames,\n hasCustomWidth,\n gradientSettings,\n maskImage,\n framePosition,\n videoClasses,\n sharedVideoStyle,\n exitDurationFactor,\n exitTransition,\n theme,\n };\n}\n\nexport function BackgroundOverlay() {\n const {\n hasBackground,\n image,\n isPlaying,\n isVideo,\n overlay,\n overlayColor,\n overlayOpacity,\n position,\n video,\n setVideoElement,\n setVideoPlaying,\n options,\n corp,\n isMuted,\n playbackRate,\n youtubeConfig,\n startTime,\n endTime,\n backgroundKey,\n motionConfig,\n baseStyle,\n leftGradient,\n rightGradient,\n noiseOpacity,\n noiseBlendMode,\n noiseInlineStyle,\n overlayTransitionStyle,\n resolvedWidth,\n classNames,\n hasCustomWidth,\n gradientSettings,\n maskImage,\n framePosition,\n videoClasses,\n sharedVideoStyle,\n exitDurationFactor,\n exitTransition,\n theme,\n } = useBackgroundOverlayModel();\n\n return (\n <AnimatePresence mode=\"sync\">\n {hasBackground && (\n <motion.div\n key={backgroundKey}\n initial={motionConfig.initial}\n animate={motionConfig.animate}\n transition={motionConfig.transition}\n exit={{\n ...motionConfig.exit,\n transition: {\n ...motionConfig.transition,\n delay: 0,\n duration:\n exitTransition?.duration ??\n (motionConfig.transition.duration ?? 0.6) * exitDurationFactor,\n ease: exitTransition?.ease ?? EASING_CURVES.IN_CUBIC,\n } as Transition,\n }}\n className={theme.slots.root}\n style={{\n willChange: \"transform, opacity, filter\",\n ...theme.styles.root,\n }}\n >\n {isVideo ? (\n <div\n data-position={framePosition}\n data-width={\n classNames.width || resolvedWidth ? undefined : \"full\"\n }\n className={cn(theme.slots.videoFrame, classNames.width)}\n style={{\n ...theme.styles.videoFrame,\n ...(resolvedWidth ? { width: resolvedWidth } : {}),\n }}\n >\n {youtubeConfig ? (\n <YouTubeBackgroundPlayer\n videoId={youtubeConfig.videoId}\n startTime={startTime}\n endTime={endTime}\n corp={corp}\n isPlaying={isPlaying}\n isMuted={isMuted}\n isLoop={options.isLoop}\n shouldAutoPlay={options.shouldAutoPlay}\n showPoster={options.showPoster}\n showSpinner={options.showSpinner}\n playbackRate={playbackRate}\n quality={options.quality}\n codec={options.codec}\n forceIframe={options.forceIframe}\n posterUrl={options.showPoster ? image || null : null}\n theme={theme}\n videoClasses={videoClasses}\n videoStyle={sharedVideoStyle}\n setVideoElement={setVideoElement}\n setVideoPlaying={setVideoPlaying}\n />\n ) : (\n <NativeVideo\n src={video || undefined}\n className={videoClasses}\n style={sharedVideoStyle}\n corp={corp}\n isLoop={options.isLoop}\n isMuted={isMuted}\n isPlaying={isPlaying}\n playbackRate={playbackRate}\n shouldAutoPlay={options.shouldAutoPlay}\n setVideoElement={setVideoElement}\n setVideoPlaying={setVideoPlaying}\n />\n )}\n\n <EdgeGradient\n theme={theme}\n direction=\"left\"\n percent={gradientSettings.leftPercent}\n opacity={gradientSettings.leftOpacity}\n color={overlayColor}\n />\n <EdgeGradient\n theme={theme}\n direction=\"right\"\n percent={gradientSettings.rightPercent}\n opacity={gradientSettings.rightOpacity}\n color={overlayColor}\n />\n\n {hasCustomWidth && (\n <NoiseOverlay\n theme={theme}\n opacity={noiseOpacity}\n blendMode={noiseBlendMode}\n inlineStyle={noiseInlineStyle as CSSProperties}\n maskImage={maskImage}\n />\n )}\n\n {hasCustomWidth && overlay && (\n <SolidOverlay\n theme={theme}\n opacity={overlayOpacity}\n color={overlayColor}\n transitionStyle={overlayTransitionStyle}\n maskImage={maskImage}\n />\n )}\n </div>\n ) : (\n <div\n className={theme.slots.image}\n style={{\n backgroundImage: image ? `url(${image})` : undefined,\n backgroundPosition: position,\n ...baseStyle,\n }}\n />\n )}\n\n {(!isVideo || !hasCustomWidth) && (\n <>\n <BackgroundGradients\n theme={theme}\n count={leftGradient}\n direction=\"left\"\n color={overlayColor}\n />\n <BackgroundGradients\n theme={theme}\n count={rightGradient}\n direction=\"right\"\n color={overlayColor}\n />\n <NoiseOverlay\n theme={theme}\n isFixed\n opacity={noiseOpacity}\n blendMode={noiseBlendMode}\n inlineStyle={noiseInlineStyle as CSSProperties}\n />\n {overlay && (\n <SolidOverlay\n theme={theme}\n opacity={overlayOpacity}\n color={overlayColor}\n transitionStyle={overlayTransitionStyle}\n />\n )}\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { defineModule, type PageModuleApi } from \"@/kernel\";\nimport { BACKGROUND_REGISTRY_KEY } from \"./constants\";\nimport {\n BackgroundContext,\n BackgroundProvider,\n} from \"./context\";\nimport {\n useBackground,\n useBackgroundActions,\n} from \"./hooks\";\nimport { normalizeBackgroundInput } from \"./state\";\nimport { BackgroundOverlay } from \"./overlay\";\nimport {\n type BackgroundPageApi,\n type BackgroundPageConfig,\n type BackgroundState,\n type DefinedBackground,\n} from \"./types\";\n\nexport function selectPageBackground(\n background: BackgroundPageConfig | null | undefined,\n): Partial<BackgroundState> | null {\n return background ? normalizeBackgroundInput(background) : null;\n}\n\nfunction useBackgroundPage(\n _slice: Partial<BackgroundState> | null,\n page: PageModuleApi,\n): BackgroundPageApi {\n const actions = useBackgroundActions();\n return useMemo(\n () => ({\n ...actions,\n set: (background: BackgroundPageConfig) => page.set({ background }),\n }),\n [actions, page],\n );\n}\n\nexport const backgroundModule = defineModule({\n id: \"background\",\n context: BackgroundContext,\n Provider: BackgroundProvider,\n Backdrop: BackgroundOverlay,\n uses: [\"media\"],\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"singleton\",\n lifecycle: \"immediate\",\n singletonKey: BACKGROUND_REGISTRY_KEY,\n },\n page: {\n select: (config) => selectPageBackground(config.background),\n entries: (slice: Partial<BackgroundState>) => [\n { key: BACKGROUND_REGISTRY_KEY, value: slice },\n ],\n use: useBackgroundPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n background: typeof backgroundModule;\n }\n interface PageConfig {\n background?: BackgroundPageConfig;\n }\n}\n\nexport function defineBackground(\n definition: (Partial<BackgroundState> & { id?: string }) | string = {},\n): DefinedBackground {\n const { id = \"background\", ...config } =\n typeof definition === \"string\" ? { image: definition } : definition;\n\n return Object.freeze({\n config,\n id,\n use: function useDefinedBackground(overrides = {}, options = {}) {\n const patch =\n typeof overrides === \"string\" ? { image: overrides } : overrides;\n return useBackground({ ...config, ...patch }, options);\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|