@omerdlw/base-framework 1.0.0 → 1.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/LICENSE +1 -1
- package/README.md +121 -52
- package/dist/hooks/index.d.ts +1 -10
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -538
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/types.d.ts +0 -53
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/hooks/use-global-event.d.ts +0 -2
- package/dist/hooks/use-global-event.d.ts.map +1 -1
- package/dist/index.js +138 -742
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.js +3 -3
- package/dist/kernel/index.js.map +1 -1
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/background/index.js +5 -5
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/context-menu/index.js +4 -4
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/controls/index.js +3 -3
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/dock/cards.d.ts +1 -1
- package/dist/modules/dock/hooks.d.ts +1 -1
- package/dist/modules/dock/index.js +3 -3
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/index.js +34 -115
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/index.js +3 -3
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/modal/index.js +11 -95
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/notification/index.js +7 -5
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/provider.js.map +1 -1
- package/dist/utils/dom.d.ts +0 -2
- package/dist/utils/dom.d.ts.map +1 -1
- package/dist/utils/index.d.ts +5 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +19 -84
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/number.d.ts +0 -1
- package/dist/utils/number.d.ts.map +1 -1
- package/dist/utils/object.d.ts +0 -2
- package/dist/utils/object.d.ts.map +1 -1
- package/dist/utils/string.d.ts +0 -3
- package/dist/utils/string.d.ts.map +1 -1
- package/dist/utils/timing.d.ts +0 -1
- package/dist/utils/timing.d.ts.map +1 -1
- package/docs/README.md +124 -0
- package/docs/architecture-and-rules.md +129 -0
- package/docs/core-engine.md +196 -0
- package/docs/custom-modules.md +267 -0
- package/docs/getting-started.md +199 -0
- package/docs/modules/README.md +176 -0
- package/docs/modules/ambient.md +150 -0
- package/docs/modules/background.md +195 -0
- package/docs/modules/context-menu.md +248 -0
- package/docs/modules/controls.md +159 -0
- package/docs/modules/dock.md +734 -0
- package/docs/modules/error-boundary.md +160 -0
- package/docs/modules/kernel.md +266 -0
- package/docs/modules/loading.md +157 -0
- package/docs/modules/media.md +196 -0
- package/docs/modules/modal.md +229 -0
- package/docs/modules/notification.md +161 -0
- package/docs/modules/result.md +135 -0
- package/docs/testing.md +160 -0
- package/docs/theming.md +185 -0
- package/package.json +3 -1
- package/templates/AGENTS.md +165 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/atoms/icon.tsx","../../../src/atoms/spinner.tsx","../../../src/atoms/tooltip.tsx","../../../src/atoms/button.tsx","../../../src/hooks/use-fullscreen-state.ts","../../../src/atoms/index.ts","../../../src/tokens/tokens.ts","../../../src/tokens/motion.ts","../../../src/tokens/index.ts","../../../src/utils/cn.ts","../../../src/utils/string.ts","../../../src/utils/dom.ts","../../../src/utils/number.ts","../../../src/utils/object.ts","../../../src/utils/timing.ts","../../../src/utils/json.ts","../../../src/utils/report.ts","../../../src/utils/user-message.ts","../../../src/utils/store.ts","../../../src/utils/scheduler.ts","../../../src/utils/index.ts","../../../src/kernel/types.ts","../../../src/kernel/constants.ts","../../../src/kernel/utils.ts","../../../src/kernel/schema.ts","../../../src/kernel/operations.ts","../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/hooks/use-click-outside.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/hooks/use-debounce.ts","../../../src/hooks/use-mounted.ts","../../../src/hooks/use-media-query.ts","../../../src/hooks/use-controllable-state.ts","../../../src/hooks/use-hotkey.ts","../../../src/events.ts","../../../src/hooks/use-global-event.ts","../../../src/result.ts","../../../src/hooks/use-async-action.ts","../../../src/hooks/use-server-action.ts","../../../src/hooks/use-storage-state.ts","../../../src/hooks/use-intersection-observer.ts","../../../src/hooks/index.ts","../../../src/kernel/runtime.ts","../../../src/kernel/store.ts","../../../src/kernel/context-registry.ts","../../../src/kernel/provider.tsx","../../../src/kernel/installed.ts","../../../src/kernel/handlers.ts","../../../src/kernel/hooks.ts","../../../src/kernel/page-controller.tsx","../../../src/kernel/module.tsx","../../../src/kernel/adapters.tsx","../../../src/kernel/compose.ts","../../../src/kernel/index.ts","../../../src/theme.tsx","../../../src/modules/theme.ts","../../../src/modules/modal/constants.ts","../../../src/modules/modal/motion.ts","../../../src/modules/modal/utils.ts","../../../src/modules/modal/state.ts","../../../src/modules/modal/context.tsx","../../../src/modules/modal/hooks.ts","../../../src/modules/modal/overlay.tsx","../../../src/modules/modal/index.ts","../../../src/modules/modal/module.tsx"],"names":["IconifyIcon","jsx","init_tokens","init_utils","useSyncExternalStore","useEffect","init_store","useCallback","use","isValidElement","hasChanged","stabilizedValue","useRef","useState","useMemo","init_hooks","init_theme","init_constants","safeScale","roundedScale","init_motion","jsxs","useLayoutEffect","Fragment","createElement"],"mappings":"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","file":"index.js","sourcesContent":["\"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 * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport type { ReactNode } from \"react\";\n\nexport interface TooltipProps {\n children: ReactNode;\n text: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n delayMs?: number;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n collisionPadding?: number;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function Tooltip({\n children,\n className,\n collisionPadding = 8,\n defaultOpen,\n delayMs,\n onOpenChange,\n open,\n position = \"top\",\n sideOffset = 6,\n text,\n ...props\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Root\n defaultOpen={defaultOpen}\n delayDuration={delayMs}\n onOpenChange={onOpenChange}\n open={open}\n >\n <TooltipPrimitive.Trigger asChild>\n {children}\n </TooltipPrimitive.Trigger>\n\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={position}\n align=\"center\"\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={className}\n {...props}\n >\n {text}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n );\n}\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n children?: ReactNode;\n loading?: boolean;\n}\n\nexport function Button({\n ref,\n children,\n className,\n disabled = false,\n loading = false,\n type = \"button\",\n ...props\n}: ButtonProps) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading ? true : undefined}\n className={className}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nconst listeners = new Set<() => void>();\nconst activeFullscreenStateIds = new Set<string>();\n\nconst ACTIVE_FULLSCREEN_ROOT_SELECTOR =\n '[data-fullscreen-state-root=\"true\"][data-affect-global-state=\"true\"]';\n\nlet domObserver: MutationObserver | null = null;\nlet lastSnapshot = false;\n\nfunction getDomSnapshot(): boolean {\n if (typeof document === \"undefined\") {\n return activeFullscreenStateIds.size > 0;\n }\n\n return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;\n}\n\nfunction emitChange(): void {\n listeners.forEach((listener) => listener());\n}\n\nfunction emitIfSnapshotChanged(): void {\n const nextSnapshot = getDomSnapshot();\n\n if (nextSnapshot === lastSnapshot) {\n return;\n }\n\n lastSnapshot = nextSnapshot;\n emitChange();\n}\n\nfunction ensureDomObserver(): void {\n if (typeof document === \"undefined\" || domObserver || listeners.size === 0) {\n return;\n }\n\n domObserver = new MutationObserver(() => {\n emitIfSnapshotChanged();\n });\n\n domObserver.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n \"data-fullscreen-state\",\n \"data-fullscreen-state-root\",\n \"data-affect-global-state\",\n ],\n });\n}\n\nfunction releaseDomObserver(): void {\n if (listeners.size > 0 || !domObserver) {\n return;\n }\n\n domObserver.disconnect();\n domObserver = null;\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n ensureDomObserver();\n emitIfSnapshotChanged();\n\n return () => {\n listeners.delete(listener);\n releaseDomObserver();\n };\n}\n\nfunction getSnapshot(): boolean {\n return getDomSnapshot();\n}\n\nexport function registerFullscreenState(id: string): void {\n activeFullscreenStateIds.add(id);\n emitIfSnapshotChanged();\n}\n\nexport function unregisterFullscreenState(id: string): void {\n activeFullscreenStateIds.delete(id);\n emitIfSnapshotChanged();\n}\n\nexport function useIsFullscreenStateActive(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n","\"use client\";\n\nexport { Icon, type IconProps } from \"./icon\";\nexport { Spinner, type SpinnerProps } from \"./spinner\";\nexport { Tooltip, type TooltipProps } from \"./tooltip\";\nexport { Button, type ButtonProps } from \"./button\";\nexport { useIsFullscreenStateActive } from \"../hooks/use-fullscreen-state\";\n","export const Z_INDEX = Object.freeze({\n BACKGROUND: 0,\n DOCK_BACKDROP: 100,\n DOCK: 110,\n NOTIFICATION: 120,\n MODAL_BACKDROP: 130,\n MODAL: 140,\n SELECT: 150,\n LOADING: 160,\n ERROR_OVERLAY: 170,\n CONTEXT_MENU_BACKDROP: 180,\n CONTEXT_MENU: 190,\n TOOLTIP: 200,\n\n UI_ELEMENT: 10,\n DOCK_CARD_BACKGROUND: 0,\n DOCK_CARD_CONTENT: 10,\n DOCK_CARD_STACK_BASE: 10,\n DOCK_CARD_BADGE: 20,\n DOCK_CARD_MEDIA: 30,\n DOCK_BREADCRUMBS: 10,\n DOCK_SURFACE_CONTROL: 10,\n DOCK_SURFACE_POPOVER: 30,\n DOCK_SURFACE_CENTER: 0,\n MODAL_FRAME: 1,\n MODAL_STICKY_HEADER: 10,\n} as const);\n\nexport const SURFACE_CLASSES = Object.freeze({\n description: \"text-white/70\",\n icon: \"bg-white/10 text-white\",\n surface: \"bg-black/60 ring-1 ring-inset ring-white/10\",\n title: \"text-white\",\n} as const);\n\nexport const ACTION_TONE_CLASS =\n \"bg-primary/10 text-primary hover:bg-primary hover:text-black\";\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","export * from \"./tokens\";\nexport * from \"./motion\";\n","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\nexport function truncate(\n text: unknown,\n maxLength: number = 100,\n suffix: string = \"...\",\n): string {\n if (typeof text !== \"string\") return \"\";\n if (text.length <= maxLength) return text;\n return `${text.slice(0, maxLength).trimEnd()}${suffix}`;\n}\n\nexport function capitalize(str: unknown): string {\n if (typeof str !== \"string\" || !str) return \"\";\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function slugify(str: unknown): string {\n if (typeof str !== \"string\" || !str) return \"\";\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\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","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport function randomBetween(min: number, max: number): number {\n const lower = Math.ceil(min);\n const upper = Math.floor(max);\n return Math.floor(Math.random() * (upper - lower + 1)) + lower;\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 isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\" || Array.isArray(value))\n return value.length === 0;\n if (isObject(value)) return Object.keys(value).length === 0;\n return false;\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\nexport function dedupe<T>(\n array: T[],\n keyFn: ((item: T) => unknown) | null = null,\n): T[] {\n if (!Array.isArray(array)) return [];\n if (!keyFn) return [...new Set(array)];\n const seen = new Set();\n return array.filter((item) => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","export function sleep(ms: number = 0): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\n}\n","export function safeJsonParse<T = unknown>(\n text: unknown,\n fallback: T | null = null,\n): T | null {\n if (typeof text !== \"string\") return fallback;\n try {\n return JSON.parse(text) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function safeJsonStringify(\n value: unknown,\n fallback: string = \"\",\n): string {\n try {\n return JSON.stringify(value) ?? fallback;\n } catch {\n return fallback;\n }\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","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\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","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","export { cn } from \"./cn\";\nexport {\n isBrowser,\n acquireGlobalScrollLock,\n getSiteUrl,\n getCurrentPath,\n} from \"./dom\";\nexport {\n trimToNull,\n stripTrailingSlash,\n normalizePath,\n isImageIconSource,\n truncate,\n capitalize,\n slugify,\n} from \"./string\";\nexport { clamp, toFiniteNumber, randomBetween } from \"./number\";\nexport {\n isObject,\n isPlainObject,\n isEmpty,\n shallowEqual,\n toArray,\n dedupe,\n} from \"./object\";\nexport { sleep, debounce, throttle } from \"./timing\";\nexport { safeJsonParse, safeJsonStringify } from \"./json\";\nexport { report, setReportSink } from \"./report\";\nexport { USER_MESSAGES, UserError, toUserMessage } from \"./user-message\";\nexport type { UserMessageOptions } from \"./user-message\";\nexport type { ReportLevel, ReportSink } from \"./report\";\nexport { createStore } from \"./store\";\nexport type { CreateStoreOptions, ExternalStore } from \"./store\";\nexport { createScheduler } from \"./scheduler\";\nexport type {\n ScheduleHandle,\n ScheduledTaskSnapshot,\n SchedulerSnapshot,\n CoreSchedulerOptions,\n} from \"./scheduler\";\n","import type { ComponentType, Context, ReactNode } from \"react\";\nimport type { ExternalStore } from \"@/utils\";\n\nexport type AnyFunction = (...args: unknown[]) => unknown;\n\nexport interface AppRegistryEntry<T = unknown> {\n type: string;\n items: Record<string, T>;\n instanceId?: string;\n options?: RegistryMetadata;\n source?: string;\n}\n\nexport type RegistrySource = \"static\" | \"dynamic\" | \"user\" | (string & {});\n\nexport type RegistryLifecycle =\n \"immediate\" | \"graceful\" | \"persistent\" | \"route\";\n\nexport type RegistryValidationMode = \"warn\" | \"strict\";\n\nexport type RegistryScopeKind =\n \"app\" | \"session\" | \"route\" | \"instance\" | \"workspace\";\n\nexport interface RegistryMetadata {\n cleanup?: RegistryLifecycle;\n cleanupDelayMs?: number | null;\n instanceId?: string | null;\n lifecycle?: RegistryLifecycle;\n priority?: number;\n source?: string;\n scope?: string;\n validation?: RegistryValidationMode;\n}\n\ntype RegistryKeyPolicy = \"singleton\" | \"named\" | \"path\" | \"route\";\n\nexport interface RegistryDefinition<TValue = unknown> {\n keyPolicy: RegistryKeyPolicy;\n lifecycle: RegistryLifecycle;\n cleanupDelayMs?: number | null;\n singletonKey?: string;\n reservedKeys?: readonly string[];\n valueKind?: \"object\" | \"component\";\n merge?(valuesLowToHigh: TValue[]): TValue;\n validate?(value: unknown): ValidationResult;\n}\n\nexport interface RegistryDefinitions {\n get(type: string): RegistryDefinition | undefined;\n keys(): Iterable<string>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n issues: string[];\n reason?: string;\n}\n\nexport interface SourceRecord<T = unknown> {\n updatedAt: number;\n sequence: number;\n instanceId: string | null;\n priority: number;\n source: string;\n scope: string;\n value: T;\n}\n\nexport interface RegisterOperation<T = unknown> {\n kind: \"register\";\n validation?: RegistryValidationMode;\n source: string;\n scope: string;\n record: SourceRecord<T>;\n instanceId: string | null;\n type: string;\n key: string;\n}\n\nexport interface UnregisterOperation {\n kind: \"unregister\";\n instanceId: string | null;\n scope: string | null;\n source: string;\n type: string;\n key: string;\n}\n\nexport type RegistryOperation = RegisterOperation | UnregisterOperation;\n\nexport interface RegistrationHandle<T = unknown> {\n (reason?: string): boolean;\n active: boolean;\n dispose: (reason?: string) => boolean;\n instanceId: string | null;\n key: string;\n priority: number;\n reason?: string;\n source: string;\n status: \"active\" | \"disposed\" | \"superseded\" | \"rejected\" | \"ignored\";\n type: string;\n update: (value: T, options?: RegistryMetadata) => RegistrationHandle<T>;\n updatedAt: number;\n validation: string;\n}\n\nexport interface RegistrySchema {\n [key: string]: unknown;\n}\n\ntype RegistryTypeKey = keyof RegistrySchema & string;\n\nexport interface NormalizedRegistryMetadata {\n cleanupDelayMs: number | null;\n lifecycle: RegistryLifecycle | null;\n priority: number | null;\n registerOptions: RegistryMetadata;\n scope?: string;\n source: string;\n validation?: RegistryValidationMode;\n}\n\nexport type RegistryEntryRecords = Record<string, unknown>;\nexport type RegistryState = Record<\n string,\n Record<string, RegistryEntryRecords>\n>;\n\nexport type RegistrySourceOrOptions = string | RegistryMetadata;\n\ntype RegistryRegisterFn = <\n K extends RegistryTypeKey = RegistryTypeKey,\n T = RegistrySchema[K],\n>(\n type: K,\n key: string,\n item: T,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n) => RegistrationHandle<T>;\n\ntype RegistryUnregisterFn = <K extends RegistryTypeKey = RegistryTypeKey>(\n type: K,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n) => void;\n\nexport interface RegistryQueue {\n register: RegistryRegisterFn;\n unregister: RegistryUnregisterFn;\n}\n\nexport interface RegistryCleanupTimer {\n cancelled: boolean;\n timerId: ReturnType<typeof setTimeout> | null;\n}\n\nexport interface RegistryApplyContext extends RegistryQueue {\n batch: (executor: (queue: RegistryQueue) => void) => number;\n cleanupScope: Map<string, RegistryCleanupTimer>;\n instanceId: string;\n modules?: readonly AnyCoreModule[];\n pathname: string;\n}\n\nexport interface RegistryTransactionResult {\n applied?: number;\n queued?: number;\n status: \"open\" | \"committed\" | \"rolled-back\";\n traceId: string;\n}\n\nexport interface RegistryTransactionRef {\n index: number;\n status: \"open\" | \"committed\" | \"rolled-back\" | \"queued\";\n traceId: string;\n}\n\nexport interface RegistryTransactionQueue {\n register: (\n type: string,\n key: string,\n value: unknown,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n ) => RegistryTransactionRef;\n unregister: (\n type: string,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n ) => RegistryTransactionRef;\n}\n\nexport interface RegistryStore {\n batch: (executor: (queue: RegistryQueue) => void) => number;\n dispose: (operation: RegisterOperation, reason?: string) => boolean;\n getEntriesSnapshot: <\n K extends RegistryTypeKey = RegistryTypeKey,\n T = RegistrySchema[K],\n >(\n type: K,\n scope?: string | null,\n ) => Record<string, T>;\n getSnapshot: <\n K extends RegistryTypeKey = RegistryTypeKey,\n T = RegistrySchema[K],\n >(\n type: K,\n key: string,\n scope?: string | null,\n ) => T | undefined;\n isCurrent: (operation: RegisterOperation) => boolean;\n register: RegistryRegisterFn;\n subscribe: <K extends RegistryTypeKey = RegistryTypeKey>(\n type: K,\n key: string | null | undefined,\n listener: () => void,\n ) => () => void;\n transaction: (\n executor: (tx: RegistryTransactionQueue) => void,\n metadata?: RegistryMetadata,\n ) => RegistryTransactionResult;\n unregister: RegistryUnregisterFn;\n}\n\nexport interface PageOptions {\n instanceId?: string;\n lifecycle?: RegistryLifecycle;\n priority?: number;\n scope?: string;\n source?: string;\n [key: string]: unknown;\n}\n\nexport interface PageConfig {\n registry?: RegistryMetadata;\n title?: string;\n}\n\nexport interface PageController {\n Provider: ({ children }: { children?: ReactNode }) => ReactNode;\n config: PageConfig;\n modules: PageModules;\n reset: () => void;\n set: (partial: Partial<PageConfig>) => void;\n}\n\nexport interface RegistrationEntry {\n cleanupDelayMs: number | null;\n key: string;\n lifecycle: RegistryLifecycle | null;\n registerOptions: RegistryMetadata;\n scope: string | undefined;\n source: string;\n value: unknown;\n}\n\nexport interface StableFunctionEntry {\n current: AnyFunction;\n stable: AnyFunction;\n}\n\nexport interface PageControllerStore {\n getSnapshot: () => PageController | null;\n notify: () => void;\n register: (\n id: string,\n controllerRef: { current: PageController | null },\n ) => void;\n subscribe: (listener: () => void) => () => void;\n unregister: (id: string) => void;\n}\n\nexport interface CoreModules {}\n\nexport type ModuleId = keyof CoreModules & string;\n\nexport interface ModuleRuntime<TState = unknown, TActions = unknown> {\n readonly actions: TActions;\n readonly store: ExternalStore<TState>;\n}\n\nexport interface PageRegistration {\n key: string;\n value: unknown;\n}\n\nexport interface ModulePageContext {\n pathname: string;\n}\n\nexport interface PageModuleApi {\n set: (partial: Partial<PageConfig>) => void;\n}\n\ntype ModuleSliceItem<TSlice> = TSlice extends readonly (infer TItem)[]\n ? TItem\n : TSlice;\n\ninterface ModulePageSpec<TSlice, TController> {\n select?(config: PageConfig): TSlice | null | undefined;\n entries?(\n item: ModuleSliceItem<TSlice>,\n context: ModulePageContext,\n ): readonly PageRegistration[] | null | undefined;\n use?(slice: TSlice | null, page: PageModuleApi): TController;\n}\n\nexport interface CoreModule<\n TId extends string = string,\n TRuntime = unknown,\n TSlice = unknown,\n TController = unknown,\n> {\n readonly id: TId;\n readonly context?: Context<TRuntime | null>;\n readonly Provider?: ComponentType<{ children?: ReactNode }>;\n readonly Backdrop?: ComponentType;\n readonly Overlay?: ComponentType;\n readonly uses?: readonly string[];\n readonly registry?: RegistryDefinition;\n readonly page?: ModulePageSpec<TSlice, TController>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- invariant type parameters\nexport type AnyCoreModule = CoreModule<string, any, any, any>;\n\nexport type ModuleRuntimeOf<M> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- matches any slice and controller\n M extends CoreModule<string, infer TRuntime, any, any> ? TRuntime : never;\n\nexport type ModuleStateOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends ModuleRuntime<infer TState, unknown>\n ? TState\n : never;\n\ntype ModuleControllerOf<M> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- matches any runtime and slice\n M extends CoreModule<string, any, any, infer TController>\n ? TController\n : never;\n\nexport type PageModules = {\n [\n K in ModuleId as [ModuleControllerOf<CoreModules[K]>] extends [never]\n ? never\n : K\n ]?: ModuleControllerOf<CoreModules[K]>;\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 {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_RANK,\n} from \"./constants\";\nimport type { RegistryMetadata } from \"./types\";\nimport {\n isObject,\n isPlainObject,\n shallowEqual,\n trimToNull,\n} from \"@/utils\";\n\nexport { isObject, isPlainObject, shallowEqual };\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_SOURCES,\n REGISTRY_VALIDATION_MODES,\n} from \"./constants\";\nimport {\n getValidString,\n isObject,\n isPlainObject,\n parseFiniteNumber,\n} from \"./utils\";\nimport type {\n NormalizedRegistryMetadata,\n RegistryDefinitions,\n RegistryLifecycle,\n RegistryMetadata,\n RegistryValidationMode,\n ValidationResult,\n} from \"./types\";\n\nexport {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLES,\n REGISTRY_SOURCES,\n REGISTRY_VALIDATION_MODES,\n};\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","import {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_PRIORITY,\n} from \"./constants\";\nimport {\n getSourceRank,\n hasOwnProperty,\n isObject,\n resolveInstanceId,\n resolveRegisterInput,\n resolveScope,\n resolveUnregisterInput,\n shallowEqual,\n} from \"./utils\";\nimport { validateRegistryKey } from \"./schema\";\nimport type {\n RegisterOperation,\n RegistryDefinitions,\n RegistryEntryRecords,\n RegistryMetadata,\n RegistryOperation,\n RegistrySourceOrOptions,\n RegistryState,\n SourceRecord,\n UnregisterOperation,\n} from \"./types\";\n\ntype MaybeEntry = RegistryEntryRecords | null | undefined;\n\nfunction createInitialRegistriesFor(\n definitions: RegistryDefinitions,\n): RegistryState {\n return Object.fromEntries(\n Array.from(definitions.keys(), (type) => [type, {}]),\n );\n}\n\nfunction buildSourceRecord({\n source,\n value,\n instanceId = null,\n priority,\n timestamp,\n sequence,\n scope = DEFAULT_REGISTRY_SCOPE,\n}: {\n source: string;\n value: unknown;\n instanceId?: string | null;\n priority: number;\n timestamp: number;\n sequence?: number;\n scope?: string;\n}): SourceRecord {\n return {\n updatedAt: timestamp,\n sequence: Number.isFinite(sequence) ? (sequence as number) : timestamp,\n instanceId: typeof instanceId === \"string\" ? instanceId : null,\n priority,\n value,\n source,\n scope,\n };\n}\n\nexport function createRecordKey(\n source: string,\n instanceId: string | null = null,\n scope: string = DEFAULT_REGISTRY_SCOPE,\n): string {\n if (scope === DEFAULT_REGISTRY_SCOPE) {\n if (typeof instanceId === \"string\" && instanceId.length > 0) {\n return `instance:${JSON.stringify([source, instanceId])}`;\n }\n return `source:${JSON.stringify(source)}`;\n }\n if (typeof instanceId === \"string\" && instanceId.length > 0) {\n return `instance:${JSON.stringify([scope, source, instanceId])}`;\n }\n return `source:${JSON.stringify([scope, source])}`;\n}\n\nfunction getSourceRecords(\n entry: MaybeEntry,\n source: string,\n scope: string | null = null,\n): { recordKey: string; record: SourceRecord | null }[] {\n if (!entry) return [];\n return Object.entries(entry)\n .map(([recordKey, rawRecord]) => ({\n recordKey,\n record: toSourceRecord(rawRecord, recordKey),\n }))\n .filter(\n ({ record }) =>\n record?.source === source && (scope === null || record.scope === scope),\n );\n}\n\nfunction getSourceRecord(\n entry: MaybeEntry,\n source: string,\n instanceId: string | null = null,\n scope: string = DEFAULT_REGISTRY_SCOPE,\n): SourceRecord | null {\n const recordKey = createRecordKey(source, instanceId, scope);\n return toSourceRecord(entry?.[recordKey], source);\n}\n\nfunction resolveRecordPriority(options: unknown, source: string): number {\n if (isObject(options) && hasOwnProperty(options, \"priority\")) {\n const parsedPriority = Number(options.priority);\n if (Number.isFinite(parsedPriority)) return parsedPriority;\n }\n return REGISTRY_SOURCE_PRIORITY[source] ?? 0;\n}\n\nfunction toSourceRecord(\n rawValue: unknown,\n source: string = DEFAULT_SOURCE,\n): SourceRecord | null {\n if (rawValue === undefined) return null;\n const rawRecord = rawValue as Record<string, unknown>;\n\n const isWrappedRecord =\n isObject(rawValue) &&\n hasOwnProperty(rawRecord, \"value\") &&\n hasOwnProperty(rawRecord, \"updatedAt\") &&\n hasOwnProperty(rawRecord, \"priority\") &&\n hasOwnProperty(rawRecord, \"source\");\n\n if (isWrappedRecord) {\n const parsedPriority = Number(rawRecord.priority);\n return {\n updatedAt: Number(rawRecord.updatedAt) || 0,\n sequence: Number(rawRecord.sequence) || Number(rawRecord.updatedAt) || 0,\n instanceId:\n typeof rawRecord.instanceId === \"string\" ? rawRecord.instanceId : null,\n priority: Number.isFinite(parsedPriority)\n ? parsedPriority\n : (REGISTRY_SOURCE_PRIORITY[source] ?? 0),\n source: typeof rawRecord.source === \"string\" ? rawRecord.source : source,\n scope:\n typeof rawRecord.scope === \"string\"\n ? rawRecord.scope\n : DEFAULT_REGISTRY_SCOPE,\n value: rawRecord.value,\n };\n }\n\n return {\n updatedAt: 0,\n sequence: 0,\n instanceId: null,\n priority: REGISTRY_SOURCE_PRIORITY[source] ?? 0,\n source,\n scope: DEFAULT_REGISTRY_SCOPE,\n value: rawValue,\n };\n}\n\nfunction compareRecords(a: SourceRecord, b: SourceRecord): number {\n if (a.priority !== b.priority) return a.priority - b.priority;\n const rankDiff = getSourceRank(a.source) - getSourceRank(b.source);\n if (rankDiff !== 0) return rankDiff;\n return (a.sequence ?? a.updatedAt) - (b.sequence ?? b.updatedAt);\n}\n\nfunction recordsHaveSameValue(\n prevRecord: SourceRecord | null,\n nextRecord: SourceRecord,\n): boolean {\n if (Object.is(prevRecord?.value, nextRecord?.value)) return true;\n if (isObject(prevRecord?.value) && isObject(nextRecord?.value)) {\n return shallowEqual(prevRecord!.value, nextRecord.value);\n }\n return false;\n}\n\nfunction hasRecordChanged(\n prevRecord: SourceRecord | null,\n nextRecord: SourceRecord,\n): boolean {\n if (!prevRecord) return true;\n return (\n prevRecord.priority !== nextRecord.priority ||\n prevRecord.source !== nextRecord.source ||\n prevRecord.instanceId !== nextRecord.instanceId ||\n prevRecord.scope !== nextRecord.scope ||\n !recordsHaveSameValue(prevRecord, nextRecord)\n );\n}\n\nfunction hasAnySourceRecord(entry: MaybeEntry): boolean {\n return Object.values(entry || {}).some(\n (rawRecord) => rawRecord !== undefined,\n );\n}\n\nfunction setSourceRecord(\n state: RegistryState,\n type: string,\n key: string,\n source: string,\n record: SourceRecord,\n): RegistryState {\n const typeRegistry = state[type] || {};\n const currentEntry = typeRegistry[key] || {};\n const recordKey = createRecordKey(source, record.instanceId, record.scope);\n const prevRecord = toSourceRecord(currentEntry[recordKey], source);\n\n if (!hasRecordChanged(prevRecord, record)) {\n return state;\n }\n\n return {\n ...state,\n [type]: {\n ...typeRegistry,\n [key]: {\n ...currentEntry,\n [recordKey]: record,\n },\n },\n };\n}\n\nfunction removeSourceRecord(\n state: RegistryState,\n type: string,\n key: string,\n source: string,\n instanceId: string | null = null,\n scope: string | null = null,\n): RegistryState {\n const typeRegistry = state[type];\n const currentEntry = typeRegistry?.[key];\n if (!typeRegistry || !currentEntry) return state;\n\n let activeRecords: { recordKey: string; record: SourceRecord }[] = [];\n\n if (\n typeof instanceId === \"string\" &&\n instanceId.length > 0 &&\n scope !== null\n ) {\n const safeScope = scope || DEFAULT_REGISTRY_SCOPE;\n const recordKey = createRecordKey(source, instanceId, safeScope);\n const record = getSourceRecord(currentEntry, source, instanceId, safeScope);\n\n if (record) activeRecords.push({ recordKey, record });\n } else {\n activeRecords = getSourceRecords(currentEntry, source, scope)\n .filter(({ record }) => !instanceId || record?.instanceId === instanceId)\n .filter((entry): entry is { recordKey: string; record: SourceRecord } =>\n Boolean(entry.record),\n );\n }\n\n if (activeRecords.length === 0) return state;\n\n const nextEntry = { ...currentEntry };\n activeRecords.forEach(({ recordKey }) => {\n delete nextEntry[recordKey];\n });\n\n if (!hasAnySourceRecord(nextEntry)) {\n const nextTypeRegistry = { ...typeRegistry };\n delete nextTypeRegistry[key];\n return { ...state, [type]: nextTypeRegistry };\n }\n\n return {\n ...state,\n [type]: { ...typeRegistry, [key]: nextEntry },\n };\n}\n\nfunction resolveEntryValueFor(\n definitions: RegistryDefinitions,\n type: string,\n entry: MaybeEntry,\n scope: string | null = null,\n): unknown {\n if (!entry) return undefined;\n\n const activeRecords = Object.entries(entry)\n .map(([source, rawRecord]) => toSourceRecord(rawRecord, source))\n .filter(\n (record): record is SourceRecord =>\n record !== null && (scope === null || record.scope === scope),\n );\n\n if (activeRecords.length === 0) return undefined;\n\n const merge = definitions.get(type)?.merge;\n if (merge) {\n const sortedRecords = [...activeRecords].sort(compareRecords);\n const mergeCandidate = sortedRecords.every((record) =>\n isObject(record.value),\n );\n\n if (mergeCandidate) {\n const values = sortedRecords.map(\n (record) => record.value as Record<string, unknown>,\n );\n return merge(values);\n }\n return sortedRecords[sortedRecords.length - 1].value;\n }\n\n return activeRecords.reduce((winner, current) =>\n compareRecords(current, winner) > 0 ? current : winner,\n ).value;\n}\n\nfunction createResolverCacheFor(\n definitions: RegistryDefinitions,\n): (type: string, entry: MaybeEntry, scope?: string | null) => unknown {\n const entryCache = new WeakMap<object, Map<string, unknown>>();\n\n return (type: string, entry: MaybeEntry, scope: string | null = null) => {\n if (!entry || typeof entry !== \"object\") {\n return resolveEntryValueFor(definitions, type, entry, scope);\n }\n\n let typeCache = entryCache.get(entry);\n if (!typeCache) {\n typeCache = new Map();\n entryCache.set(entry, typeCache);\n }\n\n const cacheKey = scope || \"default\";\n\n if (typeCache.has(cacheKey)) return typeCache.get(cacheKey);\n\n const value = resolveEntryValueFor(definitions, type, entry, scope);\n typeCache.set(cacheKey, value);\n return value;\n };\n}\n\nexport function createRegisterOperation(\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg: RegistryMetadata | undefined,\n timestamp: number,\n sequence: number = timestamp,\n): RegisterOperation {\n const { source, options } = resolveRegisterInput(sourceOrOptions, optionsArg);\n const instanceId = resolveInstanceId(options);\n const scope = resolveScope(options);\n\n return {\n kind: \"register\",\n validation: options.validation,\n source,\n scope,\n record: buildSourceRecord({\n source,\n value: item,\n instanceId,\n priority: resolveRecordPriority(options, source),\n scope,\n timestamp,\n sequence,\n }),\n instanceId,\n type,\n key: typeof key === \"string\" ? key.trim() : key,\n };\n}\n\nexport function createUnregisterOperation(\n type: string,\n key: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n): UnregisterOperation {\n const { scope, source, instanceId } = resolveUnregisterInput(sourceOrOptions);\n return {\n kind: \"unregister\",\n instanceId,\n scope,\n source,\n type,\n key: typeof key === \"string\" ? key.trim() : key,\n };\n}\n\nfunction isValidRegistryTargetFor(\n definitions: RegistryDefinitions,\n type: string,\n key: unknown,\n): boolean {\n return validateRegistryKey(type, key, definitions).valid;\n}\n\nfunction applyOperationFor(\n definitions: RegistryDefinitions,\n state: RegistryState,\n operation: RegistryOperation,\n): RegistryState {\n if (!isValidRegistryTargetFor(definitions, operation?.type, operation?.key))\n return state;\n\n if (operation.kind === \"register\") {\n return setSourceRecord(\n state,\n operation.type,\n operation.key,\n operation.source,\n operation.record,\n );\n }\n if (operation.kind === \"unregister\") {\n return removeSourceRecord(\n state,\n operation.type,\n operation.key,\n operation.source,\n operation.instanceId,\n operation.scope,\n );\n }\n return state;\n}\n\nfunction hasOperationEffectFor(\n definitions: RegistryDefinitions,\n state: RegistryState,\n operation: RegistryOperation,\n): boolean {\n if (!isValidRegistryTargetFor(definitions, operation?.type, operation?.key))\n return false;\n\n if (operation.kind === \"register\") {\n const currentRecord = getSourceRecord(\n state[operation.type]?.[operation.key],\n operation.source,\n operation.instanceId,\n operation.scope,\n );\n return hasRecordChanged(currentRecord, operation.record);\n }\n\n if (operation.kind === \"unregister\") {\n const entry = state[operation.type]?.[operation.key];\n if (\n typeof operation.instanceId === \"string\" &&\n operation.instanceId.length > 0\n ) {\n return operation.scope === null\n ? getSourceRecords(entry, operation.source).some(\n ({ record }) => record?.instanceId === operation.instanceId,\n )\n : Boolean(\n getSourceRecord(\n entry,\n operation.source,\n operation.instanceId,\n operation.scope,\n ),\n );\n }\n return (\n getSourceRecords(entry, operation.source, operation.scope).length > 0\n );\n }\n return false;\n}\n\nfunction resolveEffectiveOperationsFor(\n definitions: RegistryDefinitions,\n state: RegistryState,\n operations: RegistryOperation[],\n): { effectiveOperations: RegistryOperation[]; nextState: RegistryState } {\n const effectiveOperations: RegistryOperation[] = [];\n let nextState = state;\n\n operations.forEach((operation) => {\n if (!hasOperationEffectFor(definitions, nextState, operation)) return;\n effectiveOperations.push(operation);\n nextState = applyOperationFor(definitions, nextState, operation);\n });\n\n return { effectiveOperations, nextState };\n}\n\nexport function createRegistryOperations(definitions: RegistryDefinitions) {\n return Object.freeze({\n applyOperation: (state: RegistryState, operation: RegistryOperation) =>\n applyOperationFor(definitions, state, operation),\n createInitialRegistries: () => createInitialRegistriesFor(definitions),\n createResolverCache: () => createResolverCacheFor(definitions),\n hasOperationEffect: (state: RegistryState, operation: RegistryOperation) =>\n hasOperationEffectFor(definitions, state, operation),\n isRegistryType: (type: string) => definitions.get(type) !== undefined,\n isValidRegistryTarget: (type: string, key: unknown) =>\n isValidRegistryTargetFor(definitions, type, key),\n resolveEffectiveOperations: (\n state: RegistryState,\n operations: RegistryOperation[],\n ) => resolveEffectiveOperationsFor(definitions, state, operations),\n resolveEntryValue: (\n type: string,\n entry: MaybeEntry,\n scope: string | null = null,\n ) => resolveEntryValueFor(definitions, type, entry, scope),\n });\n}\n\nexport type RegistryOperations = ReturnType<typeof createRegistryOperations>;\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 { useCallback, useEffect, type RefObject } from \"react\";\n\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n ref: RefObject<T | null> | null | undefined,\n callback?: (event: PointerEvent) => void,\n): void {\n const handlePointer = useCallback(\n (event: PointerEvent) => {\n if (ref?.current && !ref.current.contains(event.target as Node)) {\n callback?.(event);\n }\n },\n [callback, ref],\n );\n\n useEffect(() => {\n document.addEventListener(\"pointerdown\", handlePointer);\n return () => document.removeEventListener(\"pointerdown\", handlePointer);\n }, [handlePointer]);\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 { useEffect, useState } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nconst emptySubscribe = () => () => {};\n\nexport function useMounted(): boolean {\n return useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n}\n","\"use client\";\n\nimport { useCallback, useSyncExternalStore } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport function useMediaQuery(\n query: string,\n serverFallback: boolean = false,\n): boolean {\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (!isBrowser || !query || typeof window.matchMedia !== \"function\") {\n return () => {};\n }\n const mediaQueryList = window.matchMedia(query);\n mediaQueryList.addEventListener(\"change\", onStoreChange);\n return () => mediaQueryList.removeEventListener(\"change\", onStoreChange);\n },\n [query],\n );\n\n const getSnapshot = useCallback(() => {\n if (!isBrowser || !query || typeof window.matchMedia !== \"function\") {\n return serverFallback;\n }\n return window.matchMedia(query).matches;\n }, [query, serverFallback]);\n\n const getServerSnapshot = useCallback(() => serverFallback, [serverFallback]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseControllableStateOptions } from \"./types\";\n\nexport function useControllableState<T>({\n defaultValue,\n onChange,\n value,\n}: UseControllableStateOptions<T>): [T, (next: T | ((prev: T) => T)) => void] {\n const [uncontrolledValue, setUncontrolledValue] = useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? (value as T) : uncontrolledValue;\n const valueRef = useRef<T>(currentValue);\n const onChangeRef = useRef(onChange);\n\n useIsomorphicLayoutEffect(() => {\n valueRef.current = currentValue;\n onChangeRef.current = onChange;\n });\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolvedNext =\n typeof next === \"function\"\n ? (next as (prev: T) => T)(valueRef.current)\n : next;\n if (!Object.is(valueRef.current, resolvedNext)) {\n if (!isControlled) {\n setUncontrolledValue(resolvedNext);\n }\n onChangeRef.current?.(resolvedNext);\n }\n },\n [isControlled],\n );\n\n return [currentValue, setValue];\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { isBrowser } from \"../utils\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseHotkeyOptions } from \"./types\";\n\nfunction isEditableElement(target: EventTarget | null): boolean {\n if (!target || typeof (target as HTMLElement).tagName !== \"string\") {\n return false;\n }\n const element = target as HTMLElement;\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\") {\n return true;\n }\n return Boolean(element.isContentEditable);\n}\n\nfunction matchesKeyCombo(event: KeyboardEvent, combo: string): boolean {\n const parts = combo\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return false;\n\n const keyPart = parts[parts.length - 1];\n const modifiers = new Set(parts.slice(0, -1));\n\n const wantsMod =\n modifiers.has(\"mod\") || modifiers.has(\"cmd\") || modifiers.has(\"meta\");\n const wantsCtrl = modifiers.has(\"ctrl\") || modifiers.has(\"control\");\n const wantsAlt = modifiers.has(\"alt\") || modifiers.has(\"option\");\n const wantsShift = modifiers.has(\"shift\");\n\n const isModPressed = event.metaKey || event.ctrlKey;\n if (wantsMod && !isModPressed) return false;\n if (!wantsMod && !wantsCtrl && (event.metaKey || event.ctrlKey)) return false;\n if (wantsCtrl && !event.ctrlKey) return false;\n if (wantsAlt !== event.altKey) return false;\n if (wantsShift !== event.shiftKey) return false;\n\n const pressedKey = event.key.toLowerCase();\n if (keyPart === \"esc\" || keyPart === \"escape\") {\n return pressedKey === \"escape\" || pressedKey === \"esc\";\n }\n if (keyPart === \"space\") {\n return pressedKey === \" \" || pressedKey === \"spacebar\";\n }\n return pressedKey === keyPart;\n}\n\nexport function useHotkey(\n combo: string | string[] | null | undefined,\n callback: (event: KeyboardEvent) => void,\n options?: UseHotkeyOptions,\n): void {\n const callbackRef = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const enabled = options?.enabled ?? true;\n const enableOnFormTags = options?.enableOnFormTags ?? false;\n const preventDefault = options?.preventDefault ?? true;\n const stopPropagation = options?.stopPropagation ?? false;\n\n useEffect(() => {\n if (!isBrowser || !enabled || !combo) return;\n const combos = (Array.isArray(combo) ? combo : [combo]).filter(Boolean);\n if (combos.length === 0) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!enableOnFormTags && isEditableElement(event.target)) return;\n const matched = combos.some((c) => matchesKeyCombo(event, c));\n if (!matched) return;\n if (preventDefault) event.preventDefault();\n if (stopPropagation) event.stopPropagation();\n callbackRef.current?.(event);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [combo, enabled, enableOnFormTags, preventDefault, stopPropagation]);\n}\n\nexport function useEscapeKey(\n callback: (event: KeyboardEvent) => void,\n enabled: boolean = true,\n): void {\n useHotkey(\"escape\", callback, {\n enabled,\n enableOnFormTags: true,\n preventDefault: false,\n });\n}\n","import { report } from \"./utils/report\";\nexport type EventListener<T = unknown> = (payload: T) => void;\n\nexport const EVENT_TYPES = Object.freeze({\n API_UNAUTHORIZED: \"API_UNAUTHORIZED\",\n STATE_CHANGE: \"STATE_CHANGE\",\n API_ERROR: \"API_ERROR\",\n APP_ERROR: \"APP_ERROR\",\n} as const);\n\nexport interface FrameworkEventMap {\n [EVENT_TYPES.API_UNAUTHORIZED]: {\n error?: unknown;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.API_ERROR]: {\n error: unknown;\n isCritical?: boolean;\n message?: string;\n retry?: () => void;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.APP_ERROR]: {\n error?: unknown;\n message?: string;\n resetError?: () => void;\n source?: string;\n [key: string]: unknown;\n };\n [EVENT_TYPES.STATE_CHANGE]: {\n message?: string;\n status?: \"success\" | \"warning\" | \"info\" | \"error\" | string;\n [key: string]: unknown;\n };\n}\n\nexport class EventEmitter<TEvents extends object = FrameworkEventMap> {\n private events: Map<string, Set<EventListener<never>>> = new Map();\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n subscribe<K extends keyof TEvents>(\n event: K,\n callback: EventListener<TEvents[K]>,\n ): () => void;\n subscribe<T = unknown>(event: string, callback: EventListener<T>): () => void;\n subscribe(event: string, callback: EventListener<never>): () => void {\n if (typeof event !== \"string\" || !event || typeof callback !== \"function\") {\n return () => {};\n }\n const listeners = this.events.get(event) || new Set<EventListener<never>>();\n listeners.add(callback);\n this.events.set(event, listeners);\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) this.events.delete(event);\n };\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void | undefined\n ? [payload?: TEvents[K]]\n : [payload: TEvents[K]]\n ): void;\n emit<T = unknown>(event: string, payload?: T): void;\n emit(event: string, payload?: unknown): void {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) return;\n const snapshot = Array.from(listeners);\n for (const callback of snapshot) {\n try {\n (callback as EventListener<unknown>)(payload);\n } catch (error) {\n report(`Event listener (${String(event)})`, error);\n }\n }\n }\n\n emitDebounced<K extends keyof TEvents>(\n event: K,\n payload: TEvents[K],\n waitMs?: number,\n ): void;\n emitDebounced<T = unknown>(event: string, payload?: T, waitMs?: number): void;\n emitDebounced(event: string, payload?: unknown, waitMs: number = 100): void {\n const existing = this.debounceTimers.get(event);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(event);\n this.emit(event, payload);\n }, waitMs);\n\n this.debounceTimers.set(event, timer);\n }\n\n cancelDebounced(event?: string): void {\n if (event) {\n const timer = this.debounceTimers.get(event);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(event);\n }\n } else {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n }\n\n unsubscribeAll(event?: string): void {\n this.cancelDebounced(event);\n if (event) this.events.delete(event);\n else this.events.clear();\n }\n\n hasListeners(event: string): boolean {\n return Boolean(this.events.get(event)?.size);\n }\n\n getListenerCount(event: string): number {\n return this.events.get(event)?.size || 0;\n }\n\n getAllEvents(): string[] {\n return [...this.events.keys()];\n }\n}\n\nconst GLOBAL_EVENTS_KEY = Symbol.for(\"__base_framework_global_events__\");\ntype GlobalWithEvents = typeof globalThis & {\n [GLOBAL_EVENTS_KEY]?: EventEmitter<FrameworkEventMap>;\n};\n\nconst _global = globalThis as GlobalWithEvents;\nexport const globalEvents: EventEmitter<FrameworkEventMap> =\n _global[GLOBAL_EVENTS_KEY] ??\n (_global[GLOBAL_EVENTS_KEY] = new EventEmitter<FrameworkEventMap>());\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { globalEvents, type FrameworkEventMap } from \"@/events\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseGlobalEventOptions } from \"./types\";\n\nexport function useGlobalEvent<K extends keyof FrameworkEventMap>(\n event: K | K[] | null | undefined,\n callback: (payload: FrameworkEventMap[K]) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent<T = unknown>(\n event: string | string[] | null | undefined,\n callback: (payload: T) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent(\n event: string | string[] | null | undefined,\n callback: (payload: never) => void,\n options?: UseGlobalEventOptions,\n): void {\n const callbackRef = useRef(callback);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastThrottleTimeRef = useRef<number>(0);\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const debounceMs = options?.debounceMs;\n const throttleMs = options?.throttleMs;\n\n useEffect(() => {\n if (!event) return;\n const events = Array.isArray(event) ? event.filter(Boolean) : [event];\n if (events.length === 0) return;\n\n const handler = (payload: never) => {\n if (debounceMs != null && debounceMs > 0) {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n callbackRef.current?.(payload);\n }, debounceMs);\n return;\n }\n\n if (throttleMs != null && throttleMs > 0) {\n const now = Date.now();\n const remaining = throttleMs - (now - lastThrottleTimeRef.current);\n if (remaining <= 0) {\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n lastThrottleTimeRef.current = now;\n callbackRef.current?.(payload);\n } else if (throttleTimerRef.current === null) {\n throttleTimerRef.current = setTimeout(() => {\n lastThrottleTimeRef.current = Date.now();\n throttleTimerRef.current = null;\n callbackRef.current?.(payload);\n }, remaining);\n }\n return;\n }\n\n callbackRef.current?.(payload);\n };\n\n const unsubs = events.map((ev) => globalEvents.subscribe(ev, handler));\n\n return () => {\n unsubs.forEach((unsub) => unsub());\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n };\n }, [event, debounceMs, throttleMs]);\n}\n\nexport function useEventState<T, K extends keyof FrameworkEventMap>(\n event: K | null | undefined,\n initialValue: T,\n reducer: (prevState: T, payload: FrameworkEventMap[K]) => T,\n): T;\n\nexport function useEventState<T, P = unknown>(\n event: string | null | undefined,\n initialValue: T,\n reducer: (prevState: T, payload: P) => T,\n): T;\n\nexport function useEventState<T, P = unknown>(\n event: string | null | undefined,\n initialValue: T,\n reducer: (prevState: T, payload: P) => T,\n): T {\n const storeRef = useRef<{\n value: T;\n listeners: Set<() => void>;\n reducer: (prevState: T, payload: P) => T;\n } | null>(null);\n\n if (storeRef.current == null) {\n storeRef.current = {\n value: initialValue,\n listeners: new Set(),\n reducer,\n };\n }\n\n useIsomorphicLayoutEffect(() => {\n if (storeRef.current != null) {\n storeRef.current.reducer = reducer;\n }\n });\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (!event || !storeRef.current) return () => {};\n storeRef.current.listeners.add(onStoreChange);\n\n const unsub = globalEvents.subscribe<P>(event, (payload) => {\n if (!storeRef.current) return;\n const next = storeRef.current.reducer(storeRef.current.value, payload);\n if (!Object.is(storeRef.current.value, next)) {\n storeRef.current.value = next;\n storeRef.current.listeners.forEach((listener) => listener());\n }\n });\n\n return () => {\n storeRef.current?.listeners.delete(onStoreChange);\n unsub();\n };\n },\n [event],\n );\n\n const getSnapshot = useCallback(() => {\n return storeRef.current?.value ?? initialValue;\n }, [initialValue]);\n\n const getServerSnapshot = useCallback(() => {\n return initialValue;\n }, [initialValue]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","import { UserError, toUserMessage } from \"./utils/user-message\";\nimport { report } from \"./utils/report\";\n\nexport interface SuccessResult<T> {\n readonly code?: string;\n readonly data: T;\n readonly error?: never;\n readonly success: true;\n}\n\nexport interface ErrorResult<E = string> {\n readonly code?: string;\n readonly data?: never;\n readonly error: E;\n readonly success: false;\n}\n\nexport type Result<T, E = string> = SuccessResult<T> | ErrorResult<E>;\n\nexport function ok<T>(data: T, code?: string): SuccessResult<T> {\n return { data, success: true, ...(code ? { code } : {}) };\n}\n\nexport function err<E = string>(error: E, code?: string): ErrorResult<E> {\n return { error, success: false, ...(code ? { code } : {}) };\n}\n\nexport function isResult(value: unknown): value is Result<unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"success\" in value &&\n typeof (value as { success: unknown }).success === \"boolean\" &&\n ((\"data\" in value && (value as { success: boolean }).success === true) ||\n (\"error\" in value && (value as { success: boolean }).success === false))\n );\n}\n\nexport function isOk<T, E = string>(\n result: Result<T, E>,\n): result is SuccessResult<T> {\n return result.success === true;\n}\n\nexport function isErr<T, E = string>(\n result: Result<T, E>,\n): result is ErrorResult<E> {\n return result.success === false;\n}\n\nexport function unwrap<T, E = string>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n if (result.error instanceof Error) {\n throw result.error;\n }\n throw new Error(\n typeof result.error === \"string\" ? result.error : String(result.error),\n );\n}\n\nexport function unwrapOr<T, E = string>(result: Result<T, E>, fallback: T): T {\n return result.success ? result.data : fallback;\n}\n\nexport function map<T, U, E = string>(\n result: Result<T, E>,\n fn: (data: T) => U,\n): Result<U, E> {\n return result.success ? ok(fn(result.data), result.code) : result;\n}\n\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F,\n): Result<T, F> {\n return result.success ? result : err(fn(result.error), result.code);\n}\n\nexport function match<T, E, R>(\n result: Result<T, E>,\n branches: { ok: (data: T) => R; err: (error: E) => R },\n): R {\n return result.success ? branches.ok(result.data) : branches.err(result.error);\n}\n\nfunction mapCaught<E>(error: unknown, mapError?: (error: unknown) => E): E {\n if (!(error instanceof UserError)) report(\"Result\", error);\n return mapError ? mapError(error) : (toUserMessage(error) as unknown as E);\n}\n\nexport async function tryCatch<T, E = string>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n mapError?: (error: unknown) => E,\n): Promise<Result<T, E>> {\n try {\n const data =\n typeof promiseOrFn === \"function\"\n ? await promiseOrFn()\n : await promiseOrFn;\n return ok(data);\n } catch (error) {\n return err(mapCaught(error, mapError));\n }\n}\n\ninterface SafeActionSchema<TParsed> {\n safeParse: (input: unknown) =>\n | { data: TParsed; success: true }\n | {\n error?: {\n issues?: Array<{ message?: string }>;\n message?: string;\n };\n success: false;\n };\n}\n\nexport interface SafeActionOptions<TArgs extends unknown[], E = string> {\n errorCode?: string;\n mapError?: (error: unknown) => E;\n schema?: SafeActionSchema<TArgs[0]>;\n validate?: (\n ...args: TArgs\n ) => Result<unknown, E> | string | boolean | null | undefined;\n}\n\nexport function createSafeAction<TArgs extends unknown[], TOutput, E = string>(\n handler: (\n ...args: TArgs\n ) => Promise<Result<TOutput, E> | TOutput> | Result<TOutput, E> | TOutput,\n options: SafeActionOptions<TArgs, E> = {},\n): (...args: TArgs) => Promise<Result<TOutput, E>> {\n const { errorCode, mapError, schema, validate } = options;\n\n return async (...args: TArgs): Promise<Result<TOutput, E>> => {\n try {\n let effectiveArgs = args;\n\n if (schema) {\n const parsed = schema.safeParse(args[0]);\n if (!parsed.success) {\n const issueMessage =\n parsed.error?.issues?.[0]?.message ||\n parsed.error?.message ||\n \"Invalid input\";\n return err(\n mapError ? mapError(issueMessage) : (issueMessage as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n }\n effectiveArgs = [parsed.data, ...args.slice(1)] as TArgs;\n }\n\n if (validate) {\n const validationResult = validate(...effectiveArgs);\n if (isResult(validationResult)) {\n if (isErr(validationResult)) {\n return validationResult as ErrorResult<E>;\n }\n } else if (validationResult === false) {\n return err(\n mapError\n ? mapError(\"Validation failed\")\n : (\"Validation failed\" as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n } else if (\n typeof validationResult === \"string\" &&\n validationResult.length > 0\n ) {\n return err(\n mapError\n ? mapError(validationResult)\n : (validationResult as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n }\n }\n\n const output = await handler(...effectiveArgs);\n if (isResult(output)) {\n return output as Result<TOutput, E>;\n }\n return ok(output as TOutput);\n } catch (error) {\n return err(mapCaught(error, mapError), errorCode);\n }\n };\n}\n","\"use client\";\n\nimport { useCallback, useState } from \"react\";\nimport { EVENT_TYPES, globalEvents } from \"@/events\";\nimport { isErr, isResult } from \"@/result\";\nimport { toUserMessage } from \"@/utils\";\nimport { UseAsyncActionOptions, UseAsyncActionResult } from \"./types\";\n\nexport function useAsyncAction<\n TArgs extends unknown[] = unknown[],\n TResult = unknown,\n>(\n actionFn: (...args: TArgs) => Promise<TResult>,\n options: UseAsyncActionOptions<TResult> = {},\n): UseAsyncActionResult<TArgs, TResult> {\n const {\n errorMessage = null,\n onError = null,\n onSuccess = null,\n successMessage = null,\n toast = null,\n } = options;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<unknown>(null);\n\n const execute = useCallback(\n async (...args: TArgs): Promise<TResult> => {\n setIsPending(true);\n setError(null);\n try {\n const result = await actionFn(...args);\n\n if (isResult(result) && isErr(result)) {\n setError(result.error);\n const resolvedMessage = errorMessage || toUserMessage(result.error);\n if (typeof toast === \"function\") {\n toast(resolvedMessage);\n }\n globalEvents.emit(EVENT_TYPES.APP_ERROR, {\n error: result.error,\n message: resolvedMessage,\n notify: toast === true,\n });\n await onError?.(result.error);\n return result;\n }\n\n if (successMessage) {\n if (typeof toast === \"function\") {\n toast(successMessage);\n }\n globalEvents.emit(EVENT_TYPES.STATE_CHANGE, {\n message: successMessage,\n notify: toast === true,\n status: \"success\",\n });\n }\n await onSuccess?.(result);\n return result;\n } catch (err) {\n setError(err);\n const resolvedMessage = errorMessage || toUserMessage(err);\n if (typeof toast === \"function\") {\n toast(resolvedMessage);\n }\n globalEvents.emit(EVENT_TYPES.APP_ERROR, {\n error: err,\n message: resolvedMessage,\n notify: toast === true,\n });\n await onError?.(err);\n throw err;\n } finally {\n setIsPending(false);\n }\n },\n [actionFn, errorMessage, onError, onSuccess, successMessage, toast],\n );\n\n return { error, execute, isPending };\n}\n","\"use client\";\n\nimport { useCallback, useState, useTransition } from \"react\";\nimport { EVENT_TYPES, globalEvents } from \"@/events\";\nimport { err as resultErr, isErr, type Result } from \"@/result\";\nimport { toUserMessage } from \"@/utils\";\nimport { UseServerActionOptions, UseServerActionResult } from \"./types\";\n\nexport function useServerAction<\n TArgs extends unknown[] = unknown[],\n T = unknown,\n E = string,\n>(\n actionFn: (...args: TArgs) => Promise<Result<T, E>>,\n options: UseServerActionOptions<T, E> = {},\n): UseServerActionResult<TArgs, T, E> {\n const {\n errorMessage = null,\n onError = null,\n onSuccess = null,\n successMessage = null,\n toast = null,\n } = options;\n\n const [isPending, startTransition] = useTransition();\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<E | null>(null);\n\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n }, []);\n\n const execute = useCallback(\n (...args: TArgs): Promise<Result<T, E>> => {\n return new Promise((resolve) => {\n startTransition(async () => {\n setError(null);\n try {\n const result = await actionFn(...args);\n if (isErr(result)) {\n setError(result.error);\n const resolvedMessage =\n errorMessage || toUserMessage(result.error);\n if (typeof toast === \"function\") {\n toast(resolvedMessage);\n }\n globalEvents.emit(EVENT_TYPES.APP_ERROR, {\n error: result.error,\n message: resolvedMessage,\n notify: toast === true,\n });\n await onError?.(result.error);\n resolve(result);\n return;\n }\n\n setData(result.data);\n if (successMessage) {\n if (typeof toast === \"function\") {\n toast(successMessage);\n }\n globalEvents.emit(EVENT_TYPES.STATE_CHANGE, {\n message: successMessage,\n notify: toast === true,\n status: \"success\",\n });\n }\n await onSuccess?.(result.data);\n resolve(result);\n } catch (err) {\n const mappedError = toUserMessage(err) as unknown as E;\n setError(mappedError);\n const resolvedMessage = errorMessage || (mappedError as string);\n if (typeof toast === \"function\") {\n toast(resolvedMessage);\n }\n globalEvents.emit(EVENT_TYPES.APP_ERROR, {\n error: err,\n message: resolvedMessage,\n notify: toast === true,\n });\n await onError?.(mappedError);\n resolve(resultErr(mappedError));\n }\n });\n });\n },\n [actionFn, errorMessage, onError, onSuccess, successMessage, toast],\n );\n\n return { data, error, execute, isPending, reset };\n}\n","\"use client\";\n\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { isBrowser } from \"../utils\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseStorageStateOptions } from \"./types\";\n\nfunction getStorageInstance(type: \"local\" | \"session\"): Storage | null {\n if (!isBrowser) return null;\n try {\n return type === \"session\" ? window.sessionStorage : window.localStorage;\n } catch {\n return null;\n }\n}\n\nconst STORAGE_SYNC_EVENT = \"base-framework:storage-sync\";\n\nexport function useStorageState<T>(\n key: string,\n initialValue: T,\n options: UseStorageStateOptions<T> = {},\n): [T, (next: T | ((prev: T) => T)) => void, () => void] {\n const storageType = options.storage ?? \"local\";\n const serialize = options.serialize ?? JSON.stringify;\n const deserialize = options.deserialize ?? JSON.parse;\n\n const cacheRef = useRef<{ parsed: T; raw: string | null }>({\n parsed: initialValue,\n raw: null,\n });\n\n const getSnapshot = useCallback((): T => {\n const storage = getStorageInstance(storageType);\n if (!storage) return initialValue;\n try {\n const raw = storage.getItem(key);\n if (raw === null) {\n cacheRef.current = { parsed: initialValue, raw: null };\n return initialValue;\n }\n if (cacheRef.current.raw === raw) {\n return cacheRef.current.parsed;\n }\n const parsed = deserialize(raw);\n cacheRef.current = { parsed, raw };\n return parsed;\n } catch {\n return initialValue;\n }\n }, [deserialize, initialValue, key, storageType]);\n\n const getServerSnapshot = useCallback((): T => initialValue, [initialValue]);\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (!isBrowser) return () => {};\n\n const handleStorage = (event: StorageEvent) => {\n if (\n event.key === key &&\n event.storageArea === getStorageInstance(storageType)\n ) {\n onStoreChange();\n }\n };\n\n const handleCustomSync = (event: Event) => {\n const detail = (\n event as CustomEvent<{ key: string; storageType: string }>\n ).detail;\n if (detail?.key === key && detail?.storageType === storageType) {\n onStoreChange();\n }\n };\n\n window.addEventListener(\"storage\", handleStorage);\n window.addEventListener(STORAGE_SYNC_EVENT, handleCustomSync);\n return () => {\n window.removeEventListener(\"storage\", handleStorage);\n window.removeEventListener(STORAGE_SYNC_EVENT, handleCustomSync);\n };\n },\n [key, storageType],\n );\n\n const state = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n const stateRef = useRef<T>(state);\n\n useIsomorphicLayoutEffect(() => {\n stateRef.current = state;\n });\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolvedNext =\n typeof next === \"function\"\n ? (next as (prev: T) => T)(stateRef.current)\n : next;\n stateRef.current = resolvedNext;\n\n const storage = getStorageInstance(storageType);\n if (!storage) return;\n try {\n const raw = serialize(resolvedNext);\n cacheRef.current = { parsed: resolvedNext, raw };\n storage.setItem(key, raw);\n window.dispatchEvent(\n new CustomEvent(STORAGE_SYNC_EVENT, {\n detail: { key, storageType },\n }),\n );\n } catch {}\n },\n [key, serialize, storageType],\n );\n\n const removeValue = useCallback(() => {\n stateRef.current = initialValue;\n cacheRef.current = { parsed: initialValue, raw: null };\n\n const storage = getStorageInstance(storageType);\n if (!storage) return;\n try {\n storage.removeItem(key);\n window.dispatchEvent(\n new CustomEvent(STORAGE_SYNC_EVENT, {\n detail: { key, storageType },\n }),\n );\n } catch {}\n }, [initialValue, key, storageType]);\n\n return [state, setValue, removeValue];\n}\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T,\n options?: Omit<UseStorageStateOptions<T>, \"storage\">,\n): [T, (next: T | ((prev: T) => T)) => void, () => void] {\n return useStorageState(key, initialValue, { ...options, storage: \"local\" });\n}\n\nexport function useSessionStorage<T>(\n key: string,\n initialValue: T,\n options?: Omit<UseStorageStateOptions<T>, \"storage\">,\n): [T, (next: T | ((prev: T) => T)) => void, () => void] {\n return useStorageState(key, initialValue, { ...options, storage: \"session\" });\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { isBrowser } from \"../utils\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport {\n UseIntersectionObserverOptions,\n UseIntersectionObserverResult,\n} from \"./types\";\n\nexport function useIntersectionObserver<T extends Element = Element>(\n targetRef: RefObject<T | null> | null | undefined,\n options: UseIntersectionObserverOptions = {},\n): UseIntersectionObserverResult {\n const {\n enabled = true,\n freezeOnceVisible = false,\n onChange,\n root = null,\n rootMargin = \"0px\",\n threshold = 0,\n } = options;\n\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const onChangeRef = useRef(onChange);\n\n useIsomorphicLayoutEffect(() => {\n onChangeRef.current = onChange;\n });\n\n const frozen = Boolean(entry?.isIntersecting && freezeOnceVisible);\n\n useEffect(() => {\n if (\n !isBrowser ||\n !enabled ||\n frozen ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const node = targetRef?.current;\n if (!node) return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n onChangeRef.current?.(nextEntry);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(node);\n return () => observer.disconnect();\n }, [enabled, frozen, root, rootMargin, targetRef, threshold]);\n\n return {\n entry,\n isIntersecting: Boolean(entry?.isIntersecting),\n };\n}\n","\"use client\";\n\nexport { useRequiredContext } from \"./use-required-context\";\nexport { useStore } from \"./use-store\";\nexport { useClickOutside } from \"./use-click-outside\";\nexport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nexport { useDebounce } from \"./use-debounce\";\nexport { useMounted } from \"./use-mounted\";\nexport { useMediaQuery } from \"./use-media-query\";\nexport { useControllableState } from \"./use-controllable-state\";\nexport { useHotkey, useEscapeKey } from \"./use-hotkey\";\nexport { useGlobalEvent, useEventState } from \"./use-global-event\";\nexport { useAsyncAction } from \"./use-async-action\";\nexport { useServerAction } from \"./use-server-action\";\nexport {\n useStorageState,\n useLocalStorage,\n useSessionStorage,\n} from \"./use-storage-state\";\nexport { useIntersectionObserver } from \"./use-intersection-observer\";\nexport { useIsFullscreenStateActive } from \"./use-fullscreen-state\";\n\nexport type * from \"./types\";\n","\"use client\";\n\nimport type {\n RegistrationHandle,\n RegistryMetadata,\n RegistryTransactionQueue,\n RegistryTransactionRef,\n RegistryTransactionResult,\n} from \"./types\";\n\ninterface QueuedOperation {\n key: string;\n options: RegistryMetadata;\n type: string;\n item?: unknown;\n unregister?: true;\n}\n\ntype TransactionStatus = \"open\" | \"committed\" | \"rolled-back\";\n\nexport interface RegistryTransaction extends RegistryTransactionQueue {\n commit: () => RegistryTransactionResult;\n readonly operations: readonly QueuedOperation[];\n rollback: (reason?: string) => RegistryTransactionRef;\n run: (\n executor: (queue: RegistryTransactionQueue) => void,\n ) => RegistryTransactionResult;\n readonly status: TransactionStatus;\n traceId: string;\n}\n\ninterface TransactionBatchQueue {\n register: (\n type: string,\n key: string,\n value: unknown,\n options?: RegistryMetadata,\n ) => RegistrationHandle;\n unregister: (type: string, key: string, options?: RegistryMetadata) => void;\n}\n\ninterface TransactionStore {\n batch: (executor: (queue: TransactionBatchQueue) => void) => unknown;\n}\n\nexport function createRegistryTransaction(\n store: TransactionStore,\n metadata: RegistryMetadata & { source?: string; traceId?: string } = {},\n): RegistryTransaction {\n const operations: QueuedOperation[] = [];\n let status: TransactionStatus = \"open\";\n const traceId =\n metadata.traceId ||\n `tx-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\n const ensureOpen = () => status === \"open\";\n\n const mergeOptions = (\n options: RegistryMetadata | undefined,\n ): RegistryMetadata => {\n const baseOpts = options && typeof options === \"object\" ? options : {};\n const needsSource = metadata.source && !baseOpts.source;\n const needsScope = metadata.scope && !baseOpts.scope;\n\n if (!needsSource && !needsScope) return baseOpts;\n\n return {\n ...baseOpts,\n ...(needsSource ? { source: metadata.source } : {}),\n ...(needsScope ? { scope: metadata.scope } : {}),\n };\n };\n\n const register: RegistryTransactionQueue[\"register\"] = (\n type,\n key,\n value,\n sourceOrOptions,\n optionsArg,\n ) => {\n if (!ensureOpen()) return { index: -1, status, traceId };\n\n const options =\n typeof sourceOrOptions === \"string\"\n ? mergeOptions({ ...(optionsArg || {}), source: sourceOrOptions })\n : mergeOptions(sourceOrOptions as RegistryMetadata | undefined);\n\n operations.push({ key, item: value, options, type });\n return { index: operations.length - 1, status: \"queued\", traceId };\n };\n\n const unregister: RegistryTransactionQueue[\"unregister\"] = (\n type,\n key,\n sourceOrOptions,\n ) => {\n if (!ensureOpen()) return { index: -1, status, traceId };\n\n const options = mergeOptions(\n typeof sourceOrOptions === \"string\"\n ? { source: sourceOrOptions }\n : (sourceOrOptions as RegistryMetadata | undefined),\n );\n\n operations.push({ key, options, type, unregister: true });\n return { index: operations.length - 1, status: \"queued\", traceId };\n };\n\n const rollback = (_reason = \"manual\"): RegistryTransactionRef => {\n if (!ensureOpen()) return { index: -1, status, traceId };\n\n status = \"rolled-back\";\n operations.length = 0;\n return { index: -1, status, traceId };\n };\n\n const commit = (): RegistryTransactionResult => {\n if (!ensureOpen()) return { status, traceId };\n\n status = \"committed\";\n const result = store.batch((queue) => {\n operations.forEach((op) => {\n if (op.unregister) queue.unregister(op.type, op.key, op.options);\n else queue.register(op.type, op.key, op.item, op.options);\n });\n });\n\n const applied =\n typeof result === \"number\" && Number.isFinite(result) ? result : 0;\n return { applied, queued: operations.length, status, traceId };\n };\n\n const run = (\n executor: (queue: RegistryTransactionQueue) => void,\n ): RegistryTransactionResult => {\n if (typeof executor !== \"function\") {\n rollback(\"invalid-executor\");\n return { status, traceId };\n }\n try {\n executor({ register, unregister });\n return commit();\n } catch (error) {\n rollback(error instanceof Error ? error.message : String(error));\n throw error;\n }\n };\n\n return {\n commit,\n get operations() {\n return operations.slice();\n },\n register,\n rollback,\n run,\n get status() {\n return status;\n },\n traceId,\n unregister,\n };\n}\n","import { isValidElement } from \"react\";\nimport {\n createRecordKey,\n createRegisterOperation,\n createRegistryOperations,\n createUnregisterOperation,\n type RegistryOperations,\n} from \"./operations\";\nimport {\n DEFAULT_SOURCE,\n REGISTRY_SOURCES,\n REGISTRY_VALIDATION_MODES,\n validateRegistryMetadata,\n validateRegistryValue,\n} from \"./schema\";\nimport { createRegistryTransaction } from \"./runtime\";\nimport type {\n AppRegistryEntry,\n RegisterOperation,\n RegistrationHandle,\n RegistryDefinitions,\n RegistryMetadata,\n RegistryOperation,\n RegistryQueue,\n RegistrySourceOrOptions,\n RegistryState,\n RegistryStore,\n RegistryTransactionQueue,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport type InitialRegistryEntries = readonly AppRegistryEntry[];\n\nconst NO_DEFINITIONS: RegistryDefinitions = new Map();\n\nfunction createNoopHandle(\n status: RegistrationHandle[\"status\"] = \"rejected\",\n reason = \"unknown\",\n): RegistrationHandle {\n const handle: RegistrationHandle = Object.assign(() => false, {\n active: false,\n dispose: () => false,\n instanceId: null,\n key: \"\",\n priority: 0,\n reason,\n source: \"\",\n status,\n type: \"\",\n update: (): RegistrationHandle => handle,\n updatedAt: 0,\n validation: \"warn\",\n });\n return handle;\n}\n\nconst NOOP_HANDLE: RegistrationHandle = createNoopHandle();\n\nfunction isNoopHandle(handle: RegistrationHandle | null | undefined): boolean {\n return (\n handle === NOOP_HANDLE ||\n handle?.status === \"rejected\" ||\n handle?.status === \"ignored\"\n );\n}\n\nfunction cloneRegistryValue<T>(\n value: T,\n seen = new WeakMap<object, unknown>(),\n): T {\n if (value === null || typeof value !== \"object\" || isValidElement(value)) {\n return value;\n }\n\n const prototype = Object.getPrototypeOf(value);\n const isPlainObject =\n !Array.isArray(value) &&\n (prototype === Object.prototype || prototype === null);\n\n if (!Array.isArray(value) && !isPlainObject) return value;\n if (seen.has(value)) return seen.get(value) as T;\n\n const source = value as Record<string, unknown>;\n const clone = (Array.isArray(value) ? [] : {}) as Record<string, unknown>;\n seen.set(value, clone);\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n clone[key] = cloneRegistryValue(source[key], seen);\n }\n }\n\n return clone as T;\n}\n\nfunction normalizeInitialEntries(entries: unknown): AppRegistryEntry[] {\n return (Array.isArray(entries) ? entries : []).filter(\n (entry): entry is AppRegistryEntry =>\n entry?.type && entry?.items && typeof entry.items === \"object\",\n );\n}\n\nfunction createInitialState(\n ops: RegistryOperations,\n definitions: RegistryDefinitions,\n entries: unknown,\n): RegistryState {\n const normalizedEntries = normalizeInitialEntries(entries);\n if (normalizedEntries.length === 0) return ops.createInitialRegistries();\n\n const timestamp = Date.now();\n let sequence = 0;\n let state = ops.createInitialRegistries();\n\n normalizedEntries.forEach((entry) => {\n const source = entry.source || REGISTRY_SOURCES.STATIC;\n const options: RegistryMetadata = {\n ...(entry.options || {}),\n instanceId:\n entry.instanceId || entry.options?.instanceId || \"registry-initial\",\n };\n\n Object.entries(entry.items).forEach(([key, value]) => {\n const validation = validateRegistration(\n definitions,\n entry.type,\n key,\n value,\n source,\n options,\n );\n if (!validation.valid) return;\n\n const operation = createRegisterOperation(\n entry.type,\n key,\n cloneRegistryValue(value),\n source,\n options,\n timestamp,\n ++sequence,\n );\n if (ops.hasOperationEffect(state, operation)) {\n state = ops.applyOperation(state, operation);\n }\n });\n });\n return state;\n}\n\nfunction notifyListeners(listeners: Set<() => void> | undefined): void {\n if (!listeners) return;\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Registry listener\", error);\n }\n }\n}\n\nfunction getOrCreateKeyListeners(\n listenersByType: Map<string, Map<string | null, Set<() => void>>>,\n type: string,\n key: string | null,\n): Set<() => void> {\n let listeners = listenersByType.get(type);\n if (!listeners) {\n listeners = new Map();\n listenersByType.set(type, listeners);\n }\n let keyListeners = listeners.get(key);\n if (!keyListeners) {\n keyListeners = new Set();\n listeners.set(key, keyListeners);\n }\n return keyListeners;\n}\n\nfunction resolveRegistrationOptions(\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): RegistryMetadata {\n if (sourceOrOptions && typeof sourceOrOptions === \"object\")\n return sourceOrOptions;\n return optionsArg && typeof optionsArg === \"object\" ? optionsArg : {};\n}\n\nfunction validateRegistration(\n definitions: RegistryDefinitions,\n type: string,\n key: string,\n value: unknown,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): { issues?: string[]; reason?: string; valid: boolean } {\n const options = resolveRegistrationOptions(sourceOrOptions, optionsArg);\n const metadataValidation = validateRegistryMetadata(options);\n const isStrict = options.validation === REGISTRY_VALIDATION_MODES.STRICT;\n\n if (!metadataValidation.valid && isStrict) {\n return {\n issues: metadataValidation.issues,\n reason: \"invalid-metadata\",\n valid: false,\n };\n }\n\n const validation = validateRegistryValue(type, key, value, definitions);\n if (validation.valid) return { valid: true };\n\n if (!isStrict) {\n report(`Registry ${type} \"${key}\" is invalid`, validation.issues, \"warn\");\n }\n\n return {\n issues: validation.issues,\n reason: \"invalid-value\",\n valid: !isStrict,\n };\n}\n\nfunction createRegistrationHandle(\n store: RegistryStore,\n operation: RegisterOperation,\n): RegistrationHandle {\n let disposed = false;\n const dispose = (reason = \"manual\") => {\n if (disposed) return false;\n disposed = true;\n return store.dispose(operation, reason);\n };\n\n const handle = ((reason?: string) => dispose(reason)) as RegistrationHandle;\n handle.dispose = dispose;\n\n handle.update = (value: unknown, options: RegistryMetadata = {}) => {\n if (disposed || !store.isCurrent(operation)) return NOOP_HANDLE;\n const nextHandle = store.register(\n operation.type,\n operation.key,\n value,\n operation.source,\n {\n ...(typeof options === \"object\" ? options : {}),\n instanceId: operation.instanceId,\n priority: operation.record.priority,\n ...(operation.scope ? { scope: operation.scope } : {}),\n ...(operation.validation ? { validation: operation.validation } : {}),\n },\n );\n if (isNoopHandle(nextHandle)) return handle;\n disposed = true;\n return nextHandle;\n };\n\n Object.defineProperties(handle, {\n active: {\n enumerable: true,\n get: () => !disposed && store.isCurrent(operation),\n },\n instanceId: { enumerable: true, value: operation.instanceId },\n key: { enumerable: true, value: operation.key },\n priority: { enumerable: true, value: operation.record.priority },\n source: { enumerable: true, value: operation.source },\n status: {\n enumerable: true,\n get: () =>\n disposed\n ? \"disposed\"\n : store.isCurrent(operation)\n ? \"active\"\n : \"superseded\",\n },\n type: { enumerable: true, value: operation.type },\n updatedAt: { enumerable: true, value: operation.record.updatedAt },\n validation: { enumerable: true, value: operation.validation || \"warn\" },\n });\n\n return handle as RegistrationHandle;\n}\n\nfunction prepareRegisterOperation(\n ops: RegistryOperations,\n definitions: RegistryDefinitions,\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions,\n optionsArg: RegistryMetadata,\n timestamp: number,\n sequence: number,\n): { operation: RegisterOperation } | { rejected: RegistrationHandle } {\n if (!ops.isValidRegistryTarget(type, key)) {\n return { rejected: createNoopHandle(\"rejected\", \"invalid-target\") };\n }\n\n const validation = validateRegistration(\n definitions,\n type,\n key,\n item,\n sourceOrOptions,\n optionsArg,\n );\n if (!validation.valid) {\n return { rejected: createNoopHandle(\"rejected\", validation.reason) };\n }\n\n return {\n operation: createRegisterOperation(\n type,\n key,\n cloneRegistryValue(item),\n sourceOrOptions,\n optionsArg,\n timestamp,\n sequence,\n ),\n };\n}\n\nexport function createRegistryStore(\n initialEntries: InitialRegistryEntries = [],\n definitions: RegistryDefinitions = NO_DEFINITIONS,\n): RegistryStore {\n const ops = createRegistryOperations(definitions);\n let registries = createInitialState(ops, definitions, initialEntries);\n let sequence = normalizeInitialEntries(initialEntries).reduce(\n (count, entry) => count + Object.keys(entry.items).length,\n 0,\n );\n\n const listenersByType = new Map<\n string,\n Map<string | null, Set<() => void>>\n >();\n const entrySnapshots = new Map<\n string,\n {\n typeRegistry: RegistryState[string];\n value: Readonly<Record<string, unknown>>;\n }\n >();\n const valueSnapshots = new Map<\n string,\n Map<\n string,\n { entry: RegistryState[string][string] | undefined; value: unknown }\n >\n >();\n const resolveCachedValue = ops.createResolverCache();\n\n const subscribe = (\n type: string,\n key: string | null | undefined,\n listener: () => void,\n ) => {\n const keyListeners = getOrCreateKeyListeners(\n listenersByType,\n type,\n key ?? null,\n );\n keyListeners.add(listener);\n\n return () => {\n keyListeners.delete(listener);\n if (keyListeners.size > 0) return;\n\n const listeners = listenersByType.get(type);\n if (listeners) {\n listeners.delete(key ?? null);\n if (listeners.size === 0) listenersByType.delete(type);\n }\n };\n };\n\n const commit = (\n nextState: RegistryState,\n operations: RegistryOperation[] = [],\n ) => {\n if (registries === nextState) return;\n const previousState = registries;\n registries = nextState;\n\n const changedKeysByType = new Map<string, Set<string>>();\n for (const operation of operations) {\n if (!ops.isValidRegistryTarget(operation?.type, operation?.key)) continue;\n let keys = changedKeysByType.get(operation.type);\n if (!keys) {\n keys = new Set();\n changedKeysByType.set(operation.type, keys);\n }\n keys.add(operation.key);\n }\n\n for (const [type, changedKeys] of changedKeysByType) {\n const previousRegistry = previousState[type] || {};\n const nextRegistry = nextState[type] || {};\n const typeListeners = listenersByType.get(type);\n let typeChanged = false;\n\n if (!typeListeners) continue;\n\n for (const key of changedKeys) {\n if (previousRegistry[key] === nextRegistry[key]) continue;\n typeChanged = true;\n notifyListeners(typeListeners.get(key));\n }\n\n if (typeChanged) {\n notifyListeners(typeListeners.get(null));\n }\n }\n };\n\n const isCurrent = (operation: RegisterOperation) => {\n const entry = registries[operation.type]?.[operation.key];\n const recordKey = createRecordKey(\n operation.source,\n operation.instanceId,\n operation.scope,\n );\n return entry?.[recordKey] === operation.record;\n };\n\n const dispose = (\n operation: RegisterOperation,\n _reason = \"manual\",\n ): boolean => {\n if (!isCurrent(operation)) return false;\n const unregisterOperation = createUnregisterOperation(\n operation.type,\n operation.key,\n {\n source: operation.source,\n instanceId: operation.instanceId,\n scope: operation.scope,\n },\n );\n\n if (!ops.hasOperationEffect(registries, unregisterOperation)) return false;\n commit(ops.applyOperation(registries, unregisterOperation), [\n unregisterOperation,\n ]);\n return true;\n };\n\n const register = (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n optionsArg: RegistryMetadata = {},\n ): RegistrationHandle => {\n const prepared = prepareRegisterOperation(\n ops,\n definitions,\n type,\n key,\n item,\n sourceOrOptions,\n optionsArg,\n Date.now(),\n ++sequence,\n );\n if (\"rejected\" in prepared) return prepared.rejected;\n\n const { operation } = prepared;\n if (!ops.hasOperationEffect(registries, operation)) {\n return createNoopHandle(\"ignored\", \"unchanged\");\n }\n\n commit(ops.applyOperation(registries, operation), [operation]);\n return createRegistrationHandle(store, operation);\n };\n\n const unregister = (\n type: string,\n key: string,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n ): void => {\n if (!ops.isValidRegistryTarget(type, key)) return;\n const operation = createUnregisterOperation(type, key, sourceOrOptions);\n if (!ops.hasOperationEffect(registries, operation)) return;\n\n commit(ops.applyOperation(registries, operation), [operation]);\n };\n\n const batch = (executor: (queue: RegistryQueue) => void): number => {\n if (typeof executor !== \"function\") return 0;\n const timestamp = Date.now();\n const operations: RegistryOperation[] = [];\n\n const queue: RegistryQueue = {\n register: (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n optionsArg: RegistryMetadata = {},\n ): RegistrationHandle => {\n const prepared = prepareRegisterOperation(\n ops,\n definitions,\n type,\n key,\n item,\n sourceOrOptions,\n optionsArg,\n timestamp,\n ++sequence,\n );\n if (\"rejected\" in prepared) return prepared.rejected;\n\n operations.push(prepared.operation);\n return createRegistrationHandle(store, prepared.operation);\n },\n unregister: (\n type: string,\n key: string,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n ): void => {\n if (!ops.isValidRegistryTarget(type, key)) return;\n operations.push(createUnregisterOperation(type, key, sourceOrOptions));\n },\n };\n\n executor(queue);\n if (operations.length === 0) return 0;\n\n const { effectiveOperations, nextState } = ops.resolveEffectiveOperations(\n registries,\n operations,\n );\n if (effectiveOperations.length === 0) return 0;\n\n commit(nextState, effectiveOperations);\n return effectiveOperations.length;\n };\n\n const getSnapshot = (\n type: string,\n key: string,\n scope: string | null = null,\n ): unknown => {\n const entry = registries[type]?.[key];\n let snapshots = valueSnapshots.get(type);\n if (!snapshots) {\n snapshots = new Map();\n valueSnapshots.set(type, snapshots);\n }\n\n const cacheKey = scope === null ? key : `${scope}\\u0000${key}`;\n\n if (entry === undefined) {\n snapshots.delete(cacheKey);\n return undefined;\n }\n\n const cached = snapshots.get(cacheKey);\n if (cached && cached.entry === entry) return cached.value;\n\n const value = resolveCachedValue(type, entry, scope);\n snapshots.set(cacheKey, { entry, value });\n return value;\n };\n\n const getEntriesSnapshot = (\n type: string,\n scope: string | null = null,\n ): Readonly<Record<string, unknown>> => {\n const typeRegistry = registries[type] || {};\n\n const cacheKey = `${type}::${scope ?? \"null\"}`;\n const cached = entrySnapshots.get(cacheKey);\n\n if (cached?.typeRegistry === typeRegistry) return cached.value;\n\n const resolved: Record<string, unknown> = {};\n for (const key in typeRegistry) {\n if (Object.prototype.hasOwnProperty.call(typeRegistry, key)) {\n const value = resolveCachedValue(type, typeRegistry[key], scope);\n if (value !== undefined) resolved[key] = value;\n }\n }\n\n const finalValue = Object.freeze(resolved);\n entrySnapshots.set(cacheKey, { typeRegistry, value: finalValue });\n return finalValue;\n };\n\n const store = {\n batch,\n dispose,\n getEntriesSnapshot,\n getSnapshot,\n isCurrent,\n register,\n subscribe,\n transaction: (\n executor: (tx: RegistryTransactionQueue) => void,\n metadata: RegistryMetadata = {},\n ) => createRegistryTransaction(store, metadata).run(executor),\n unregister,\n } as RegistryStore;\n return store;\n}\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","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useRequiredContext } from \"@/hooks\";\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}\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nconst RegistryContext = getOrCreateGlobalContext<RegistryContextValue | null>(\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 { createContext, use, type ComponentType, type ReactNode } from \"react\";\nimport { isObject } from \"@/utils\";\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;\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nexport const ModuleHostContext =\n getOrCreateGlobalContext<ModuleHostValue | null>(\"ModuleHostContext\", null);\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 {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLES,\n normalizeRegistryMetadata,\n validateRegistryMetadata,\n} from \"./schema\";\nimport { isObject } from \"./utils\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistrationEntry,\n RegistryApplyContext,\n RegistryCleanupTimer,\n RegistryMetadata,\n RegistryQueue,\n} from \"./types\";\nimport { report } from \"@/utils\";\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\n/* eslint-disable react-hooks/refs */\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/* eslint-enable react-hooks/refs */\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 {\n createContext,\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport { useRegistry, useShallowStable } from \"./hooks\";\nimport { selectModuleSlice, useInstalledModules } from \"./installed\";\nimport { pickRegistryMetadata } from \"./schema\";\nimport { mergeModuleConfigs } from \"./utils\";\nimport type {\n PageConfig,\n PageController,\n PageControllerStore,\n PageModuleApi,\n PageModules,\n PageOptions,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nconst EMPTY_OBJECT: PageConfig = Object.freeze({});\n\nfunction createPageControllerStore(): PageControllerStore {\n const listeners = new Set<() => void>();\n let stack: {\n controllerRef: { current: PageController | null };\n id: string;\n }[] = [];\n\n const notify = (): void => {\n listeners.forEach((listener) => {\n try {\n listener();\n } catch (error) {\n report(\"Page controller listener\", error);\n }\n });\n };\n\n return {\n getSnapshot(): PageController | null {\n const top = stack[stack.length - 1];\n return top?.controllerRef?.current || null;\n },\n notify,\n register(\n id: string,\n controllerRef: { current: PageController | null },\n ): void {\n stack = stack.filter((item) => item.id !== id);\n stack.push({ controllerRef, id });\n notify();\n },\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n unregister(id: string): void {\n stack = stack.filter((item) => item.id !== id);\n notify();\n },\n };\n}\n\nfunction createControllerScope(): {\n Provider: PageController[\"Provider\"];\n publish: (controller: PageController) => void;\n} {\n const listeners = new Set<() => void>();\n let current: PageController | null = null;\n\n const subscribe = (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n const getSnapshot = () => current;\n\n function PageProvider({ children }: { children?: ReactNode }) {\n const controller = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n return (\n <PageControllerContext value={controller}>\n {children}\n </PageControllerContext>\n );\n }\n\n return {\n Provider: PageProvider,\n publish(controller) {\n if (current === controller) return;\n current = controller;\n listeners.forEach((listener) => listener());\n },\n };\n}\n\nconst fallbackStandaloneStore = createPageControllerStore();\n\nconst noopHook = () => {};\nconst PassthroughProvider = ({ children }: { children?: ReactNode }) =>\n children;\n\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nconst PageControllerContext = getOrCreateGlobalContext<PageController | null>(\n \"PageControllerContext\",\n null,\n);\n\nconst PageControllerStoreContext =\n getOrCreateGlobalContext<PageControllerStore>(\n \"PageControllerStoreContext\",\n fallbackStandaloneStore,\n );\n\nexport function PageControllerProvider({ children }: { children?: ReactNode }) {\n const [store] = useState<PageControllerStore>(() =>\n createPageControllerStore(),\n );\n return (\n <PageControllerStoreContext value={store}>\n {children}\n </PageControllerStoreContext>\n );\n}\n\nconst emptySubscribe = () => () => {};\nconst getNullSnapshot = () => null;\n\nconst FALLBACK_PAGE_CONTROLLER: PageController = Object.freeze({\n Provider: PassthroughProvider,\n config: EMPTY_OBJECT,\n modules: Object.freeze({}),\n reset: noopHook,\n set: noopHook,\n});\n\nexport function usePageController(): PageController {\n const scopedContext = use(PageControllerContext);\n const controllerStore = use(PageControllerStoreContext);\n\n const storeSubscribe = scopedContext\n ? emptySubscribe\n : controllerStore.subscribe;\n const storeSnapshot = scopedContext\n ? getNullSnapshot\n : controllerStore.getSnapshot;\n\n const storeController = useSyncExternalStore(\n storeSubscribe,\n storeSnapshot,\n getNullSnapshot,\n );\n\n return scopedContext ?? storeController ?? FALLBACK_PAGE_CONTROLLER;\n}\n\nexport function usePage(\n pageConfig: PageConfig = EMPTY_OBJECT,\n options?: PageOptions,\n): PageController {\n const instanceId = useId();\n const controllerStore = use(PageControllerStoreContext);\n const modules = useInstalledModules();\n\n const [overrides, setOverrides] = useState<Partial<PageConfig>>(EMPTY_OBJECT);\n\n const set = useCallback((partial: Partial<PageConfig>) => {\n if (!partial || typeof partial !== \"object\") return;\n setOverrides((prev) => mergeModuleConfigs(prev, partial));\n }, []);\n\n const reset = useCallback(() => {\n setOverrides(EMPTY_OBJECT);\n }, []);\n\n const effectiveConfig = useMemo<PageConfig>(() => {\n const base = pageConfig || EMPTY_OBJECT;\n if (Object.keys(overrides).length === 0) return base;\n return mergeModuleConfigs(base, overrides);\n }, [pageConfig, overrides]);\n\n const moduleSlices = useMemo(\n () =>\n modules.map((coreModule) =>\n selectModuleSlice(coreModule, effectiveConfig),\n ),\n [effectiveConfig, modules],\n );\n\n const registryMetadata = useMemo(\n () => pickRegistryMetadata(options),\n [options],\n );\n useRegistry(effectiveConfig, registryMetadata);\n\n const pageApi = useMemo<PageModuleApi>(() => ({ set }), [set]);\n const moduleControllers: Record<string, unknown> = {};\n for (let index = 0; index < modules.length; index += 1) {\n const coreModule = modules[index];\n if (coreModule.page?.use) {\n moduleControllers[coreModule.id] = coreModule.page.use(\n moduleSlices[index],\n pageApi,\n );\n }\n }\n const pageModules = useShallowStable(moduleControllers) as PageModules;\n\n const [scope] = useState(createControllerScope);\n\n const controller = useMemo<PageController>(\n () => ({\n Provider: scope.Provider,\n config: effectiveConfig,\n modules: pageModules,\n reset,\n set,\n }),\n [effectiveConfig, pageModules, reset, scope, set],\n );\n\n const controllerRef = useRef<PageController | null>(controller);\n\n useIsomorphicLayoutEffect(() => {\n controllerRef.current = controller;\n scope.publish(controller);\n controllerStore.notify();\n }, [controller, controllerStore, scope]);\n\n useEffect(() => {\n controllerStore.register(instanceId, controllerRef);\n return () => {\n controllerStore.unregister(instanceId);\n };\n }, [controllerStore, instanceId]);\n\n return controller;\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","import {\n createElement,\n Fragment,\n type ComponentType,\n type JSX,\n type ReactNode,\n} from \"react\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- heterogeneous provider list\nexport type ProviderComponent<P = any> = ComponentType<\n P & { children?: ReactNode }\n>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- heterogeneous provider list\nexport type ProviderEntry<P = any> =\n ProviderComponent<P> | readonly [ProviderComponent<P>, P];\n\nexport interface ComposeProps {\n children?: ReactNode;\n providers: readonly ProviderEntry[];\n}\n\nexport function createProviderEntry<P extends object>(\n component: ProviderComponent<P>,\n props: P,\n): readonly [ProviderComponent<P>, P] {\n return [component, props] as const;\n}\n\nexport function Compose({ providers, children }: ComposeProps): JSX.Element {\n return providers.reduceRight<JSX.Element>(\n (acc, entry) => {\n if (Array.isArray(entry)) {\n const [Component, props] = entry;\n return createElement(Component, props, acc);\n }\n const Component = entry as ProviderComponent;\n return createElement(Component, null, acc);\n },\n createElement(Fragment, null, children),\n );\n}\n\nexport function composeProviders(\n providers: readonly ProviderEntry[],\n): (props: { children?: ReactNode }) => JSX.Element {\n function ComposedProviders({\n children,\n }: {\n children?: ReactNode;\n }): JSX.Element {\n return Compose({ providers, children });\n }\n ComposedProviders.displayName = \"ComposedProviders\";\n return ComposedProviders;\n}\n","\"use client\";\n\nexport * from \"./types\";\n\nexport { REGISTRY_SOURCES } from \"./constants\";\n\nexport { hasOwnProperty } from \"./utils\";\n\nexport { createRegistryOperations } from \"./operations\";\n\nexport {\n RegistryProvider,\n useRegistryEntries,\n useRegistryValue,\n} from \"./provider\";\n\nexport { createRegistryStore } from \"./store\";\nexport { createModuleRegistryDefinitions, sortModules } from \"./installed\";\n\nexport {\n ModuleHost,\n defineModule,\n definePeer,\n useModule,\n useIsModuleInstalled,\n ModuleBoundary,\n useModuleState,\n} from \"./module\";\n\nexport { applyRegistryConfig } from \"./handlers\";\n\nexport { createRegistryApplyContext } from \"./hooks\";\n\nexport { useModuleRegistration } from \"./adapters\";\n\nexport {\n PageControllerProvider,\n usePage,\n usePageController,\n} from \"./page-controller\";\n\nexport { Compose, type ProviderEntry } from \"./compose\";\n","\"use client\";\n\nimport {\n createContext,\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\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\nimport { getOrCreateGlobalContext } from \"@/kernel/context-registry\";\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\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. Add its theme file to src/config/ and list it in src/config/index.ts.`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n","export {\n ThemeProvider,\n defineTheme,\n defineThemeSpec,\n useTheme as useModuleTheme,\n} from \"@/theme\";\nexport type {\n ResolvedTheme,\n ThemeConfig,\n ThemeEntry,\n ThemeSpec,\n} from \"@/theme\";\n","import { defineThemeSpec } from \"../theme\";\nimport { type ModalThemeSlot } from \"./types\";\n\nexport const MODAL_POSITIONS = Object.freeze({\n BOTTOM: \"bottom\",\n CENTER: \"center\",\n LEFT: \"left\",\n RIGHT: \"right\",\n TOP: \"top\",\n} as const);\n\nexport const MODAL_CHROME = Object.freeze({\n BARE: \"bare\",\n PANEL: \"panel\",\n} as const);\n\nexport const MODAL_BREAKPOINTS = Object.freeze({\n MOBILE_MAX_WIDTH: 639,\n} as const);\n\nexport const SMOOTH_SCROLL_LOCK_EVENT = \"modal:smooth-scroll-lock\";\n\nexport const FOCUSABLE_SELECTOR =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])';\n\nexport const HEIGHT_CONSTRAINT_PATTERN = /(\\s|^)(?:[\\w-]+:)*(?:h|max-h)-/;\n\nexport const modalTheme = defineThemeSpec<ModalThemeSlot>(\"modal\");\n","import { type Transition, type Variants } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES, MOTION_TIERS } from \"@/tokens\";\nimport { MODAL_POSITIONS } from \"./constants\";\nimport { type ModalPosition } from \"./types\";\n\nconst MODAL_EASINGS = Object.freeze({\n CINEMATIC: EASING_CURVES.OUT_EXPO,\n EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n FLUID: EASING_CURVES.OUT_QUART,\n FLUID_RESIZE: EASING_CURVES.OUT_QUART,\n PROGRESSIVE_EXIT: EASING_CURVES.IN_CUBIC,\n SOFT: EASING_CURVES.OUT_QUART,\n SOFT_EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nconst MODAL_TIERS = MOTION_TIERS;\n\nconst MODAL_DURATIONS = Object.freeze({\n BACKDROP_EXIT: DURATION_TOKENS.FAST,\n BODY: DURATION_TOKENS.BASE,\n BODY_EXIT: DURATION_TOKENS.FAST,\n EDGE_EXIT: DURATION_TOKENS.FAST,\n FAST: DURATION_TOKENS.FAST,\n MODERATE: DURATION_TOKENS.MODERATE,\n SLOT: DURATION_TOKENS.BASE,\n SLOT_EXIT: DURATION_TOKENS.MICRO,\n SLOW: DURATION_TOKENS.SLOW,\n} as const);\n\nconst MODAL_SPRINGS = Object.freeze({\n DECK: Object.freeze({\n damping: 28,\n mass: 0.85,\n stiffness: 240,\n type: \"spring\" as const,\n }),\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.3,\n stiffness: 480,\n type: \"spring\" as const,\n }),\n PANEL: Object.freeze({\n damping: 28,\n mass: 0.85,\n stiffness: 240,\n type: \"spring\" as const,\n }),\n} as const);\n\nexport const MODAL_COMPOSITOR_STYLE = Object.freeze({\n WebkitBackfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n backfaceVisibility: \"hidden\",\n transform: \"translateZ(0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nfunction toCssDistance(value: number | string = 0) {\n return typeof value === \"number\" ? `${Math.round(value)}px` : value;\n}\n\nfunction toGpuTransform(\n yOrConfig?:\n | number\n | string\n | { scale?: number; x?: number | string; y?: number | string },\n scaleValue: number = 1,\n): string {\n if (typeof yOrConfig === \"object\" && yOrConfig !== null) {\n const xVal = yOrConfig.x ?? 0;\n const yVal = yOrConfig.y ?? 0;\n const sVal = yOrConfig.scale ?? 1;\n const safeScale = Number.parseFloat(String(sVal));\n const roundedScale = Number.isFinite(safeScale)\n ? Math.round(safeScale * 1000) / 1000\n : 1;\n return `translate3d(${toCssDistance(xVal)}, ${toCssDistance(yVal)}, 0) scale(${roundedScale})`;\n }\n const safeY = Number.parseFloat(String(yOrConfig));\n const safeScale = Number.parseFloat(String(scaleValue));\n const roundedY = Number.isFinite(safeY) ? Math.round(safeY) : 0;\n const roundedScale = Number.isFinite(safeScale)\n ? Math.round(safeScale * 1000) / 1000\n : 1;\n return `translate3d(0, ${roundedY}px, 0) scale(${roundedScale})`;\n}\n\nconst MODAL_PANEL_SPRING = MODAL_SPRINGS.PANEL;\n\nconst MODAL_BACKDROP_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.SLOW,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_BACKDROP_EXIT_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.BACKDROP_EXIT,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_SURFACE_ENTER_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.SLOW,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_SURFACE_EXIT_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.EDGE_EXIT,\n ease: MODAL_EASINGS.EXIT,\n type: \"tween\" as const,\n});\n\nconst MODAL_BODY_ENTER_TRANSITION = Object.freeze({\n delay: 0.04,\n duration: MODAL_DURATIONS.BODY,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_BODY_EXIT_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.BODY_EXIT,\n ease: MODAL_EASINGS.EXIT,\n type: \"tween\" as const,\n});\n\nexport const MODAL_CONTENT_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.98,\n y: 12,\n }),\n transition: MODAL_BODY_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.98,\n y: 12,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: MODAL_BODY_ENTER_TRANSITION,\n },\n});\n\nexport const MODAL_HEADER_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: -6,\n }),\n transition: {\n duration: MODAL_DURATIONS.SLOT_EXIT,\n ease: MODAL_EASINGS.EXIT,\n },\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: -6,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n delay: 0.02,\n duration: MODAL_DURATIONS.SLOT,\n ease: MODAL_EASINGS.FLUID,\n },\n },\n});\n\nexport const MODAL_FOOTER_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: 6,\n }),\n transition: {\n duration: MODAL_DURATIONS.SLOT_EXIT,\n ease: MODAL_EASINGS.EXIT,\n },\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: 6,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n delay: 0.06,\n duration: MODAL_DURATIONS.SLOT,\n ease: MODAL_EASINGS.FLUID,\n },\n },\n});\n\nfunction buildVariants(\n tierName: keyof typeof MODAL_TIERS,\n {\n axis,\n direction = 1,\n fullSlide = false,\n }: { axis: \"x\" | \"y\"; direction?: number; fullSlide?: boolean },\n): Variants {\n const tier = MODAL_TIERS[tierName];\n const distance = fullSlide ? \"100%\" : tier.distance;\n const signedDistance =\n direction < 0 ? (fullSlide ? \"-100%\" : -Number(distance)) : distance;\n const transform =\n axis === \"x\"\n ? {\n x: signedDistance,\n }\n : {\n y: signedDistance,\n };\n return Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform(transform),\n transition: MODAL_SURFACE_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform(transform),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: MODAL_SURFACE_ENTER_TRANSITION,\n },\n });\n}\n\nexport const modalBackdropVariants: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transition: MODAL_BACKDROP_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n },\n visible: {\n opacity: 1,\n transition: MODAL_BACKDROP_TRANSITION,\n },\n});\n\nconst CENTER_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.96,\n y: 8,\n }),\n transition: {\n duration: MODAL_DURATIONS.FAST,\n ease: MODAL_EASINGS.EXIT,\n },\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.95,\n y: 12,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n duration: MODAL_TIERS.STANDARD.duration,\n ease: MODAL_EASINGS.FLUID,\n },\n },\n});\n\nconst BOTTOM_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"y\",\n fullSlide: true,\n});\nconst RIGHT_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"x\",\n fullSlide: true,\n});\nconst LEFT_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"x\",\n direction: -1,\n fullSlide: true,\n});\nconst TOP_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"y\",\n direction: -1,\n fullSlide: true,\n});\n\nexport function getModalPositionVariants(position: ModalPosition): Variants {\n switch (position) {\n case MODAL_POSITIONS.BOTTOM:\n return BOTTOM_VARIANTS;\n case MODAL_POSITIONS.RIGHT:\n return RIGHT_VARIANTS;\n case MODAL_POSITIONS.LEFT:\n return LEFT_VARIANTS;\n case MODAL_POSITIONS.TOP:\n return TOP_VARIANTS;\n case MODAL_POSITIONS.CENTER:\n default:\n return CENTER_VARIANTS;\n }\n}\n\nexport function getModalTransition(\n position: ModalPosition,\n): Transition | undefined {\n return position === MODAL_POSITIONS.CENTER ? MODAL_PANEL_SPRING : undefined;\n}\n","import { isValidElement, type ReactNode } from \"react\";\nimport { isPlainObject } from \"@/utils\";\nimport {\n FOCUSABLE_SELECTOR,\n HEIGHT_CONSTRAINT_PATTERN,\n MODAL_BREAKPOINTS,\n MODAL_CHROME,\n MODAL_POSITIONS,\n SMOOTH_SCROLL_LOCK_EVENT,\n} from \"./constants\";\nimport {\n type DefineModalOptions,\n type ModalComponent,\n type ModalEntry,\n type ModalInput,\n type ModalPosition,\n type ModalState,\n type ModalLayout,\n type ResponsiveModalPosition,\n} from \"./types\";\n\nexport function getModalIdentity(input: ModalInput | DefineModalOptions): {\n component: ModalComponent | null;\n type: string;\n} {\n if (typeof input === \"string\") return { component: null, type: input };\n const options = typeof input === \"function\" ? { component: input } : input;\n const component = options.component ?? null;\n return {\n component,\n type:\n (\"type\" in options && options.type) ||\n (\"id\" in options && options.id) ||\n component?.displayName ||\n component?.name ||\n \"modal\",\n };\n}\n\nexport function hasHeightConstraint(className?: string): boolean {\n return (\n typeof className === \"string\" && HEIGHT_CONSTRAINT_PATTERN.test(className)\n );\n}\n\nexport function isSidePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.LEFT || position === MODAL_POSITIONS.RIGHT\n );\n}\n\nexport function isVerticalEdgePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.TOP || position === MODAL_POSITIONS.BOTTOM\n );\n}\n\nexport function hasSlotContent(value: unknown): boolean {\n return (\n value !== null && value !== undefined && value !== false && value !== \"\"\n );\n}\n\nexport function isHeaderConfig(value: unknown): boolean {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !isValidElement(value),\n );\n}\n\nexport function resolveHeaderActions(\n actions:\n | ReactNode\n | ((props: { close?: (result?: unknown) => void }) => ReactNode)\n | undefined,\n close?: (result?: unknown) => void,\n): ReactNode {\n return typeof actions === \"function\" ? actions({ close }) : actions || null;\n}\n\nexport function getModalPosition(position: ModalPosition): ModalPosition {\n return position === MODAL_POSITIONS.TOP ||\n position === MODAL_POSITIONS.BOTTOM ||\n position === MODAL_POSITIONS.LEFT ||\n position === MODAL_POSITIONS.RIGHT\n ? position\n : MODAL_POSITIONS.CENTER;\n}\n\n/**\n * The fully resolved layout of a modal. Themes style it through\n * `data-layout`, so every position/viewport combination is one selector.\n */\nexport function getModalLayout(\n position: ModalPosition,\n isMobile: boolean,\n): ModalLayout {\n const resolved = getModalPosition(position);\n if (!isMobile) return resolved;\n if (resolved === MODAL_POSITIONS.TOP || resolved === MODAL_POSITIONS.BOTTOM)\n return `${resolved}-mobile`;\n if (resolved === MODAL_POSITIONS.LEFT || resolved === MODAL_POSITIONS.RIGHT)\n return \"side-mobile\";\n return resolved;\n}\n\nexport function dispatchSmoothScrollLock(locked: boolean): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SMOOTH_SCROLL_LOCK_EVENT, {\n detail: { locked, source: \"modal\" },\n }),\n );\n}\n\nexport function getViewportIsMobile(): boolean {\n if (\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return false;\n }\n return window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n ).matches;\n}\n\nexport function resolveActivePosition(\n position: ModalPosition,\n responsivePosition: ResponsiveModalPosition | null | undefined,\n isMobileViewport: boolean,\n): ModalPosition {\n if (!isPlainObject(responsivePosition)) return position;\n const responsive = isMobileViewport\n ? responsivePosition.mobile\n : responsivePosition.desktop;\n return (responsive || position) as ModalPosition;\n}\n\nexport function normalizePosition(\n input: ModalPosition | ResponsiveModalPosition | undefined,\n): {\n position: ModalPosition;\n responsivePosition: ResponsiveModalPosition | null;\n} {\n if (typeof input === \"string\") {\n return { position: input, responsivePosition: null };\n }\n if (!isPlainObject(input)) {\n return { position: MODAL_POSITIONS.CENTER, responsivePosition: null };\n }\n return {\n position: resolveActivePosition(\n MODAL_POSITIONS.CENTER,\n input,\n getViewportIsMobile(),\n ),\n responsivePosition: input,\n };\n}\n\nexport function getFocusableElements(\n container: HTMLElement | null,\n): HTMLElement[] {\n if (!container || typeof container.querySelectorAll !== \"function\") return [];\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter(\n (element) =>\n !element.hasAttribute(\"disabled\") &&\n element.getAttribute(\"aria-hidden\") !== \"true\",\n );\n}\n\nexport function trapFocus(\n event: KeyboardEvent,\n container: HTMLElement | null,\n): void {\n if (event.key !== \"Tab\" || !container) return;\n const elements = getFocusableElements(container);\n if (elements.length === 0) return;\n\n const firstElement = elements[0];\n const lastElement = elements[elements.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n}\n\nexport function getModalLabel(modalType?: string | null): string {\n if (typeof modalType !== \"string\" || !modalType.trim()) return \"Modal\";\n return modalType\n .trim()\n .toLowerCase()\n .split(/[_-]+/)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n","import { MODAL_CHROME, MODAL_POSITIONS } from \"./constants\";\nimport { type ModalEntry, type ModalState } from \"./types\";\n\nexport function createModalState(modalStack: ModalEntry[] = []): ModalState {\n const activeModal = modalStack[modalStack.length - 1] || null;\n return {\n activeModalId: activeModal?.id || null,\n chrome: activeModal?.chrome || MODAL_CHROME.PANEL,\n headerActions: activeModal?.headerActions || null,\n isOpen: modalStack.length > 0,\n modalStack,\n modalType: activeModal?.modalType || null,\n position: activeModal?.position || MODAL_POSITIONS.CENTER,\n props: activeModal?.props || {},\n responsivePosition: activeModal?.responsivePosition || null,\n showClose: activeModal?.showClose ?? true,\n title: activeModal?.title || null,\n };\n}\n\nexport const INITIAL_MODAL_STATE = createModalState([]);\n","\"use client\";\n\nimport { createContext, useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n useRegistryEntries,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport { MODAL_CHROME } from \"./constants\";\nimport {\n type ModalActions,\n type ModalComponent,\n type ModalEntry,\n type ModalHookBinding,\n type ModalHookControls,\n type ModalInput,\n type ModalOpenFn,\n type ModalOptions,\n type ModalPageConfig,\n type ModalProviderProps,\n type ModalState,\n} from \"./types\";\nimport { INITIAL_MODAL_STATE, createModalState } from \"./state\";\nimport { getModalIdentity, normalizePosition } from \"./utils\";\nimport { report } from \"@/utils\";\n\nexport interface ModalContextValue {\n actions: ModalActions;\n store: ExternalStore<ModalState>;\n}\nimport { getOrCreateGlobalContext } from \"@/kernel/context-registry\";\n\nexport const ModalContext = getOrCreateGlobalContext<ModalContextValue | null>(\n \"ModalContext\",\n null,\n);\n\nexport function useModalRegistration(\n config: ModalPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"modal\", config, options);\n}\n\nexport function useModalRegistryEntries(): {\n get: (type: string) => ModalComponent | undefined;\n} {\n const entries = useRegistryEntries<\"modal\", ModalComponent>(\"modal\");\n return useMemo(() => ({ get: (type: string) => entries[type] }), [entries]);\n}\n\ninterface PendingModal {\n onClose?: ModalOptions[\"onClose\"];\n resolve: (result?: unknown) => void;\n}\n\nexport function ModalProvider({\n children,\n modalRenderer: ModalRenderer = null,\n}: ModalProviderProps) {\n const [store] = useState(() =>\n createStore<ModalState>(INITIAL_MODAL_STATE, { freezeSnapshots: false }),\n );\n\n const modalStackRef = useRef<ModalEntry[]>([]);\n const pendingRef = useRef<Map<number, PendingModal>>(new Map());\n const modalIdRef = useRef(0);\n\n const syncModalStack = useCallback(\n (nextStack: ModalEntry[]) => {\n modalStackRef.current = nextStack;\n store.publish(createModalState(nextStack));\n },\n [store],\n );\n\n const settleModal = useCallback((modalId: number, result: unknown) => {\n const pending = pendingRef.current.get(modalId);\n if (!pending) return;\n pendingRef.current.delete(modalId);\n\n try {\n const outcome = pending.onClose?.(result);\n if (outcome instanceof Promise) {\n outcome.catch((error) => report(\"Modal onClose\", error));\n }\n } catch (error) {\n report(\"Modal onClose\", error);\n }\n pending.resolve(result);\n }, []);\n\n const openModal = useCallback<ModalActions[\"openModal\"]>(\n (modalInput, options = {}) => {\n if (!modalInput) return Promise.resolve(null);\n\n const stack = modalStackRef.current;\n const { component, type } = getModalIdentity(modalInput);\n const topEntry = stack[stack.length - 1];\n if (\n topEntry &&\n (topEntry.modalType === type ||\n (component && topEntry.component === component))\n ) {\n return Promise.resolve(null);\n }\n\n const definition =\n typeof modalInput === \"object\" ? modalInput : undefined;\n const merged: ModalOptions & { defaultData?: Record<string, unknown> } = {\n ...definition,\n ...options,\n };\n const data = { ...definition?.defaultData, ...options.data };\n const modalId = ++modalIdRef.current;\n\n const entry: ModalEntry = {\n chrome: merged.chrome || MODAL_CHROME.PANEL,\n component,\n headerActions: merged.actions || null,\n id: modalId,\n modalType: type,\n props: data,\n showClose: merged.showClose ?? true,\n title:\n typeof merged.title === \"function\"\n ? merged.title(data)\n : (merged.title ?? null),\n ...normalizePosition(merged.position),\n };\n\n return new Promise((resolve) => {\n pendingRef.current.set(modalId, { onClose: merged.onClose, resolve });\n syncModalStack([...stack, entry]);\n });\n },\n [syncModalStack],\n );\n\n const closeModal = useCallback<ModalActions[\"closeModal\"]>(\n (result = null, targetModalId = null) => {\n const stack = modalStackRef.current;\n const modalId = targetModalId || stack[stack.length - 1]?.id;\n if (!modalId || !stack.some((entry) => entry.id === modalId)) return;\n\n syncModalStack(stack.filter((entry) => entry.id !== modalId));\n settleModal(modalId, result);\n },\n [settleModal, syncModalStack],\n );\n\n const closeAllModals = useCallback<ModalActions[\"closeAllModals\"]>(\n (result = null) => {\n const stack = modalStackRef.current;\n if (stack.length === 0) return;\n\n syncModalStack([]);\n stack.forEach((entry) => settleModal(entry.id, result));\n },\n [settleModal, syncModalStack],\n );\n\n const actionsValue = useMemo<ModalActions>(\n () => ({ closeAllModals, closeModal, openModal }),\n [openModal, closeModal, closeAllModals],\n );\n\n const contextValue = useMemo<ModalContextValue>(\n () => ({ actions: actionsValue, store }),\n [actionsValue, store],\n );\n\n return (\n <ModalContext value={contextValue}>\n {ModalRenderer && <ModalRenderer />}\n {children}\n </ModalContext>\n );\n}\n\nexport function useModalActions(): ModalActions {\n return useRequiredContext(ModalContext, \"useModalActions\", \"ModalProvider\")\n .actions;\n}\n\nexport function useModalState(): ModalState {\n const { store } = useRequiredContext(\n ModalContext,\n \"useModalState\",\n \"ModalProvider\",\n );\n return useStore(store);\n}\n\nexport function useModal(): ModalState & ModalActions;\nexport function useModal(modalInput: ModalInput): ModalHookBinding;\nexport function useModal(\n modalInput?: ModalInput | null,\n): (ModalState & ModalActions) | ModalHookBinding {\n const actions = useModalActions();\n const state = useModalState();\n\n return useMemo(() => {\n if (!modalInput) return { ...actions, ...state };\n\n const { component, type } = getModalIdentity(modalInput);\n const isOpen = state.modalStack.some(\n (entry) =>\n entry.modalType === type ||\n (component && entry.component === component),\n );\n const open: ModalOpenFn = (data, overrides) =>\n actions.openModal(modalInput, { ...overrides, data });\n const controls: ModalHookControls = {\n close: actions.closeModal,\n closeAll: actions.closeAllModals,\n isOpen,\n state,\n };\n\n return Object.assign([open, controls], controls, { open });\n }, [actions, modalInput, state]) as\n (ModalState & ModalActions) | ModalHookBinding;\n}\n","\"use client\";\n\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { acquireGlobalScrollLock } from \"@/utils\";\nimport { useModuleTheme } from \"../theme\";\nimport {\n MODAL_BREAKPOINTS,\n MODAL_CHROME,\n MODAL_POSITIONS,\n modalTheme,\n} from \"./constants\";\nimport { type ModalComponent, type ModalEntry } from \"./types\";\nimport {\n dispatchSmoothScrollLock,\n getFocusableElements,\n getViewportIsMobile,\n isSidePosition,\n isVerticalEdgePosition,\n resolveActivePosition,\n trapFocus,\n} from \"./utils\";\nimport { useModal, useModalRegistryEntries } from \"./context\";\n\nconst emptySubscribe = () => () => {};\n\nexport function useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n}) {\n const modalRef = useRef<HTMLDivElement | null>(null);\n const activePosition = useMemo(\n () =>\n resolveActivePosition(\n entry.position,\n entry.responsivePosition,\n isMobileViewport,\n ),\n [entry.position, entry.responsivePosition, isMobileViewport],\n );\n const ActiveModalComponent = entry.component || registry.get(entry.modalType);\n const isPanelChrome = entry.chrome !== MODAL_CHROME.BARE;\n const isLeftModal = activePosition === MODAL_POSITIONS.LEFT;\n const isSide = isSidePosition(activePosition);\n const isVerticalEdge = isVerticalEdgePosition(activePosition);\n const previousEntry = modalStack[stackIndex - 1] || null;\n const baseZIndex = Z_INDEX.MODAL;\n useEffect(() => {\n if (!isTopModal || !modalRef.current) return;\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n const initialElements = getFocusableElements(modalRef.current);\n if (initialElements.length > 0) initialElements[0].focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") closeModal(null, entry.id);\n else trapFocus(event, modalRef.current);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n if (previouslyFocusedElement?.isConnected)\n previouslyFocusedElement.focus();\n };\n }, [closeModal, entry.id, isTopModal]);\n\n return {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n isLeftModal,\n isSide,\n isVerticalEdge,\n previousEntry,\n baseZIndex,\n };\n}\n\nexport function useModalContainerModel() {\n return { theme: useModuleTheme(modalTheme) };\n}\n\nexport function useModalModel() {\n const { modalStack = [], isOpen, closeModal } = useModal();\n const registry = useModalRegistryEntries();\n const visibleModalStack = useMemo(\n () =>\n modalStack.filter((entry: ModalEntry) =>\n Boolean(entry.component || registry.get(entry.modalType)),\n ),\n [modalStack, registry],\n );\n const topModalEntry = visibleModalStack[visibleModalStack.length - 1] || null;\n const isModalVisible = Boolean(isOpen && topModalEntry);\n const mounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n const [isMobileViewport, setIsMobileViewport] = useState(getViewportIsMobile);\n const [isTopExitSettling, setIsTopExitSettling] = useState(false);\n const previousTopModalIdRef = useRef<number | null>(null);\n const releaseScrollLockRef = useRef<(() => void) | null>(null);\n useLayoutEffect(() => {\n const currentTopModalId = topModalEntry?.id || null;\n const previousTopModalId = previousTopModalIdRef.current;\n const previousTopStillMounted = visibleModalStack.some(\n (entry: ModalEntry) => entry.id === previousTopModalId,\n );\n\n if (\n previousTopModalId &&\n previousTopModalId !== currentTopModalId &&\n !previousTopStillMounted\n ) {\n setIsTopExitSettling(true);\n }\n previousTopModalIdRef.current = currentTopModalId;\n }, [topModalEntry?.id, visibleModalStack]);\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n );\n const handleViewportChange = (e: MediaQueryListEvent) =>\n setIsMobileViewport(e.matches);\n\n mediaQuery.addEventListener(\"change\", handleViewportChange);\n return () => mediaQuery.removeEventListener(\"change\", handleViewportChange);\n }, []);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n if (isModalVisible) {\n releaseScrollLockRef.current ??= acquireGlobalScrollLock();\n } else if (releaseScrollLockRef.current) {\n releaseScrollLockRef.current();\n releaseScrollLockRef.current = null;\n }\n dispatchSmoothScrollLock(isModalVisible);\n }, [isModalVisible]);\n useEffect(() => {\n return () => {\n releaseScrollLockRef.current?.();\n releaseScrollLockRef.current = null;\n dispatchSmoothScrollLock(false);\n };\n }, []);\n\n return {\n modalStack,\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme: useModuleTheme(modalTheme),\n };\n}\n","\"use client\";\n\nimport { createElement, type ReactNode } from \"react\";\nimport { motion, AnimatePresence, type Variants } from \"motion/react\";\nimport { Button, Icon } from \"@/atoms\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { cn } from \"@/utils\";\nimport { createPortal } from \"react-dom\";\nimport { ModuleBoundary } from \"@/kernel\";\nimport { MODAL_POSITIONS } from \"./constants\";\nimport {\n MODAL_CONTENT_VARIANTS,\n MODAL_FOOTER_VARIANTS,\n MODAL_HEADER_VARIANTS,\n MODAL_COMPOSITOR_STYLE,\n getModalPositionVariants,\n getModalTransition,\n modalBackdropVariants,\n} from \"./motion\";\nimport {\n type ModalContainerFooterConfig,\n type ModalContainerHeaderConfig,\n type ModalContainerProps,\n type ModalThemeSlot,\n type ModalComponent,\n type ModalEntry,\n} from \"./types\";\nimport {\n hasHeightConstraint,\n hasSlotContent,\n isHeaderConfig,\n isSidePosition,\n resolveHeaderActions,\n getModalLabel,\n getModalLayout,\n getModalPosition,\n} from \"./utils\";\nimport {\n useModalContainerModel,\n useModalLayerModel,\n useModalModel,\n} from \"./hooks\";\nimport { type ResolvedTheme } from \"../theme\";\n\ntype Theme = ResolvedTheme<ModalThemeSlot>;\n\nfunction CloseButton({\n close,\n theme,\n}: {\n close?: (result?: unknown) => void;\n theme: Theme;\n}) {\n if (typeof close !== \"function\") return null;\n return (\n <Button\n type=\"button\"\n aria-label=\"Close modal\"\n onClick={close}\n className={theme.slots.closeButton}\n >\n <Icon icon=\"solar:close-bold\" size={16} />\n </Button>\n );\n}\n\nfunction SlotRow({\n center,\n left,\n right,\n sticky,\n theme,\n variants,\n}: {\n center: ReactNode;\n left: ReactNode;\n right: ReactNode;\n sticky?: \"top\" | \"bottom\";\n theme: Theme;\n variants: Variants;\n}) {\n const hasCenter = hasSlotContent(center);\n return (\n <motion.div\n variants={variants}\n initial=\"hidden\"\n animate=\"visible\"\n data-columns={hasCenter ? 3 : 2}\n data-sticky={sticky}\n className={theme.slots.row}\n style={sticky ? theme.styles.row : undefined}\n >\n <div className={theme.slots.rowStart}>{left}</div>\n {hasCenter && <div className={theme.slots.rowCenter}>{center}</div>}\n <div className={theme.slots.rowEnd}>{right}</div>\n </motion.div>\n );\n}\n\nfunction resolveHeader(\n header: ModalContainerProps[\"header\"],\n close: ModalContainerProps[\"close\"],\n theme: Theme,\n) {\n const config: ModalContainerHeaderConfig = isHeaderConfig(header)\n ? (header as ModalContainerHeaderConfig)\n : {};\n const customNode =\n typeof header !== \"boolean\" &&\n !isHeaderConfig(header) &&\n hasSlotContent(header)\n ? (header as ReactNode)\n : null;\n const actions = resolveHeaderActions(config.actions, close);\n const showClose = config.showClose === true;\n\n const left =\n customNode !== null\n ? null\n : (config.left ??\n (config.title ? (\n <h2 id={config.titleId} className={theme.slots.title}>\n {config.title}\n </h2>\n ) : null));\n const right =\n customNode !== null\n ? null\n : (config.right ??\n (hasSlotContent(actions) || showClose ? (\n <>\n {actions}\n {showClose && <CloseButton close={close} theme={theme} />}\n </>\n ) : null));\n\n return { center: customNode ?? config.center ?? null, config, left, right };\n}\n\nexport function ModalContainer({\n bodyClassName,\n children,\n className,\n close,\n footer,\n header = {},\n position = null,\n}: ModalContainerProps) {\n const { theme } = useModalContainerModel();\n const headerRow =\n header === false ? null : resolveHeader(header, close, theme);\n const shouldRenderHeader =\n headerRow &&\n [headerRow.left, headerRow.center, headerRow.right].some(hasSlotContent);\n\n const footerConfig: ModalContainerFooterConfig =\n footer && typeof footer === \"object\"\n ? (footer as ModalContainerFooterConfig)\n : {};\n const {\n center: footerCenter = null,\n left: footerLeft = null,\n right: footerRight = null,\n } = footerConfig;\n const shouldRenderFooter =\n footer !== false &&\n [footerLeft, footerCenter, footerRight].some(hasSlotContent);\n\n const resolvedPosition = position || headerRow?.config.position || null;\n\n return (\n <div\n data-height={\n isSidePosition(resolvedPosition)\n ? \"full\"\n : hasHeightConstraint(className)\n ? undefined\n : \"capped\"\n }\n className={cn(theme.slots.content, className)}\n >\n {shouldRenderHeader && (\n <SlotRow\n variants={MODAL_HEADER_VARIANTS}\n left={headerRow.left}\n center={headerRow.center}\n right={headerRow.right}\n theme={theme}\n sticky={headerRow.config.sticky ? \"top\" : undefined}\n />\n )}\n\n <motion.div\n variants={MODAL_CONTENT_VARIANTS}\n initial=\"hidden\"\n animate=\"visible\"\n data-lenis-prevent\n data-lenis-prevent-wheel\n className={cn(theme.slots.body, bodyClassName)}\n >\n {children}\n </motion.div>\n\n {shouldRenderFooter && (\n <SlotRow\n variants={MODAL_FOOTER_VARIANTS}\n left={footerLeft}\n center={footerCenter}\n right={footerRight}\n theme={theme}\n sticky={footerConfig.sticky ? \"bottom\" : undefined}\n />\n )}\n </div>\n );\n}\n\nfunction ModalLayerSwitcher({\n currentEntry,\n onSwitchToPrevious,\n previousEntry,\n theme,\n}: {\n currentEntry: ModalEntry;\n onSwitchToPrevious: () => void;\n previousEntry: ModalEntry;\n theme: Theme;\n}) {\n return (\n <div className={theme.slots.switcher}>\n <Button\n type=\"button\"\n onClick={onSwitchToPrevious}\n className={theme.slots.switcherButton}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {getModalLabel(previousEntry.modalType)}\n </Button>\n <span className={theme.slots.switcherDivider}>/</span>\n <span className={theme.slots.switcherCurrent}>\n {getModalLabel(currentEntry.modalType)}\n </span>\n </div>\n );\n}\n\nfunction ModalLayer({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n theme,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n theme: Theme;\n}) {\n const {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n previousEntry,\n baseZIndex,\n } = useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n });\n if (!ActiveModalComponent) return null;\n const layout = getModalLayout(activePosition, isMobileViewport);\n return (\n <div\n role=\"dialog\"\n aria-modal={isTopModal}\n aria-labelledby={entry.title ? `modal-title-${entry.id}` : undefined}\n style={{ zIndex: baseZIndex }}\n data-position={getModalPosition(activePosition)}\n data-inset={\n activePosition === MODAL_POSITIONS.CENTER && !isMobileViewport\n ? true\n : undefined\n }\n className={theme.slots.layer}\n >\n <motion.div\n ref={modalRef}\n variants={getModalPositionVariants(activePosition)}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n transition={getModalTransition(activePosition)}\n data-active={isTopModal}\n data-layout={layout}\n className={theme.slots.frame}\n style={{ zIndex: Z_INDEX.MODAL_FRAME, ...MODAL_COMPOSITOR_STYLE }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n data-layout={layout}\n className={cn(\n theme.slots.panel,\n isPanelChrome ? theme.slots.panelChrome : theme.slots.panelBare,\n )}\n >\n <ModuleBoundary name={entry.modalType}>\n {createElement(ActiveModalComponent, {\n close: (result: unknown) => closeModal(result, entry.id),\n data: entry.props,\n header: {\n actions: entry.headerActions,\n position: activePosition,\n showClose: entry.showClose,\n title: entry.title,\n titleId: `modal-title-${entry.id}`,\n },\n })}\n </ModuleBoundary>\n\n {!isTopModal && (\n <div\n onClick={(e) => {\n e.stopPropagation();\n const topModal = modalStack[modalStack.length - 1];\n if (topModal) closeModal(null, topModal.id);\n }}\n className={theme.slots.dim}\n style={theme.styles.dim}\n aria-label=\"Close active top modal\"\n />\n )}\n\n {isTopModal && stackIndex > 0 && previousEntry && (\n <ModalLayerSwitcher\n currentEntry={entry}\n previousEntry={previousEntry}\n theme={theme}\n onSwitchToPrevious={() => closeModal(null, entry.id)}\n />\n )}\n </div>\n </motion.div>\n </div>\n );\n}\n\nexport function Modal() {\n const {\n modalStack,\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme,\n } = useModalModel();\n if (!mounted) return null;\n return createPortal(\n <>\n <AnimatePresence>\n {isModalVisible && (\n <motion.div\n key=\"global-modal-backdrop\"\n variants={modalBackdropVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n className={theme.slots.backdrop}\n style={theme.styles.backdrop}\n onClick={() => {\n if (!isTopExitSettling) closeModal(null, topModalEntry.id);\n }}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence onExitComplete={() => setIsTopExitSettling(false)}>\n {visibleModalStack.map((entry: ModalEntry, index: number) => (\n <ModalLayer\n key={entry.id}\n entry={entry}\n stackIndex={index}\n isTopModal={\n index === visibleModalStack.length - 1 && !isTopExitSettling\n }\n isMobileViewport={isMobileViewport}\n closeModal={closeModal}\n registry={registry}\n modalStack={visibleModalStack}\n theme={theme}\n />\n ))}\n </AnimatePresence>\n </>,\n document.body,\n );\n}\n","\"use client\";\n\nexport { Modal } from \"./overlay\";\nexport { ModalContainer } from \"./overlay\";\nexport {\n ModalContext,\n ModalProvider,\n useModal,\n useModalActions,\n useModalRegistration,\n useModalState,\n type ModalContextValue,\n} from \"./context\";\nexport { defineModal, modalModule } from \"./module\";\nexport { MODAL_CHROME, MODAL_POSITIONS, modalTheme } from \"./constants\";\nexport type * from \"./types\";\n","\"use client\";\n\nimport { useInsertionEffect, useMemo, useRef } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport dynamic from \"next/dynamic\";\nimport {\n ModalContext,\n ModalProvider,\n useModal,\n useModalActions,\n} from \"./context\";\nimport {\n type DefineModalOptions,\n type ModalDefinition,\n type ModalInput,\n type ModalPageApi,\n type ModalPageConfig,\n} from \"./types\";\nimport { getModalIdentity } from \"./utils\";\n\nconst LazyModal = dynamic(\n () => import(\"./overlay\").then((view) => view.Modal),\n {\n ssr: false,\n },\n);\n\nfunction selectPageModals(config: PageConfig): ModalPageConfig | null {\n return config.modal ?? null;\n}\n\nfunction useModalPage(\n slice: ModalPageConfig | null,\n page: PageModuleApi,\n): ModalPageApi {\n const actions = useModalActions();\n const sliceRef = useRef(slice);\n useInsertionEffect(() => {\n sliceRef.current = slice;\n }, [slice]);\n\n return useMemo(\n () => ({\n ...actions,\n open: (modal: ModalInput, data: Record<string, unknown> = {}) => {\n const own =\n typeof modal === \"string\" && modal !== \"registry\"\n ? sliceRef.current?.[modal]\n : undefined;\n return actions.openModal((own as ModalInput) ?? modal, { data });\n },\n set: (modal: ModalPageConfig) => page.set({ modal }),\n }),\n [actions, page],\n );\n}\n\nexport const modalModule = defineModule({\n id: \"modal\",\n context: ModalContext,\n Provider: ModalProvider,\n Overlay: LazyModal,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"named\",\n lifecycle: \"immediate\",\n valueKind: \"component\",\n },\n page: {\n select: selectPageModals,\n entries: (slice: ModalPageConfig) =>\n Object.entries(slice).map(([key, value]) => ({ key, value })),\n use: useModalPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n modal: typeof modalModule;\n }\n interface PageConfig {\n modal?: ModalPageConfig;\n }\n}\n\nexport function defineModal(\n definition: DefineModalOptions = {},\n): ModalDefinition {\n const { type } = getModalIdentity(definition);\n\n const modalDefinition: ModalDefinition = Object.freeze({\n ...definition,\n id: definition.id || type,\n isModalDefinition: true,\n type,\n use: function useDefinedModal() {\n return useModal(modalDefinition);\n },\n });\n return modalDefinition;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/atoms/icon.tsx","../../../src/atoms/spinner.tsx","../../../src/atoms/tooltip.tsx","../../../src/atoms/button.tsx","../../../src/hooks/use-fullscreen-state.ts","../../../src/atoms/index.ts","../../../src/tokens/tokens.ts","../../../src/tokens/motion.ts","../../../src/tokens/index.ts","../../../src/utils/cn.ts","../../../src/utils/dom.ts","../../../src/utils/string.ts","../../../src/utils/number.ts","../../../src/utils/object.ts","../../../src/utils/timing.ts","../../../src/utils/report.ts","../../../src/utils/user-message.ts","../../../src/utils/store.ts","../../../src/utils/scheduler.ts","../../../src/utils/index.ts","../../../src/kernel/types.ts","../../../src/kernel/constants.ts","../../../src/kernel/utils.ts","../../../src/kernel/schema.ts","../../../src/kernel/operations.ts","../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/hooks/use-click-outside.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/events.ts","../../../src/hooks/use-global-event.ts","../../../src/hooks/index.ts","../../../src/kernel/runtime.ts","../../../src/kernel/store.ts","../../../src/kernel/context-registry.ts","../../../src/kernel/provider.tsx","../../../src/kernel/installed.ts","../../../src/kernel/handlers.ts","../../../src/kernel/hooks.ts","../../../src/kernel/page-controller.tsx","../../../src/kernel/module.tsx","../../../src/kernel/adapters.tsx","../../../src/kernel/compose.ts","../../../src/kernel/index.ts","../../../src/theme.tsx","../../../src/modules/theme.ts","../../../src/modules/modal/constants.ts","../../../src/modules/modal/motion.ts","../../../src/modules/modal/utils.ts","../../../src/modules/modal/state.ts","../../../src/modules/modal/context.tsx","../../../src/modules/modal/hooks.ts","../../../src/modules/modal/overlay.tsx","../../../src/modules/modal/index.ts","../../../src/modules/modal/module.tsx"],"names":["IconifyIcon","jsx","init_tokens","init_utils","useSyncExternalStore","useEffect","init_store","useCallback","use","isValidElement","hasChanged","stabilizedValue","useRef","useState","useMemo","init_hooks","init_theme","init_constants","safeScale","roundedScale","init_motion","jsxs","useLayoutEffect","Fragment","createElement"],"mappings":"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","file":"index.js","sourcesContent":["\"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 * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport type { ReactNode } from \"react\";\n\nexport interface TooltipProps {\n children: ReactNode;\n text: ReactNode;\n className?: string;\n open?: boolean;\n defaultOpen?: boolean;\n delayMs?: number;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n collisionPadding?: number;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function Tooltip({\n children,\n className,\n collisionPadding = 8,\n defaultOpen,\n delayMs,\n onOpenChange,\n open,\n position = \"top\",\n sideOffset = 6,\n text,\n ...props\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Root\n defaultOpen={defaultOpen}\n delayDuration={delayMs}\n onOpenChange={onOpenChange}\n open={open}\n >\n <TooltipPrimitive.Trigger asChild>\n {children}\n </TooltipPrimitive.Trigger>\n\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={position}\n align=\"center\"\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={className}\n {...props}\n >\n {text}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n );\n}\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n children?: ReactNode;\n loading?: boolean;\n}\n\nexport function Button({\n ref,\n children,\n className,\n disabled = false,\n loading = false,\n type = \"button\",\n ...props\n}: ButtonProps) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading ? true : undefined}\n className={className}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nconst listeners = new Set<() => void>();\nconst activeFullscreenStateIds = new Set<string>();\n\nconst ACTIVE_FULLSCREEN_ROOT_SELECTOR =\n '[data-fullscreen-state-root=\"true\"][data-affect-global-state=\"true\"]';\n\nlet domObserver: MutationObserver | null = null;\nlet lastSnapshot = false;\n\nfunction getDomSnapshot(): boolean {\n if (typeof document === \"undefined\") {\n return activeFullscreenStateIds.size > 0;\n }\n\n return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;\n}\n\nfunction emitChange(): void {\n listeners.forEach((listener) => listener());\n}\n\nfunction emitIfSnapshotChanged(): void {\n const nextSnapshot = getDomSnapshot();\n\n if (nextSnapshot === lastSnapshot) {\n return;\n }\n\n lastSnapshot = nextSnapshot;\n emitChange();\n}\n\nfunction ensureDomObserver(): void {\n if (typeof document === \"undefined\" || domObserver || listeners.size === 0) {\n return;\n }\n\n domObserver = new MutationObserver(() => {\n emitIfSnapshotChanged();\n });\n\n domObserver.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n \"data-fullscreen-state\",\n \"data-fullscreen-state-root\",\n \"data-affect-global-state\",\n ],\n });\n}\n\nfunction releaseDomObserver(): void {\n if (listeners.size > 0 || !domObserver) {\n return;\n }\n\n domObserver.disconnect();\n domObserver = null;\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n ensureDomObserver();\n emitIfSnapshotChanged();\n\n return () => {\n listeners.delete(listener);\n releaseDomObserver();\n };\n}\n\nfunction getSnapshot(): boolean {\n return getDomSnapshot();\n}\n\nexport function registerFullscreenState(id: string): void {\n activeFullscreenStateIds.add(id);\n emitIfSnapshotChanged();\n}\n\nexport function unregisterFullscreenState(id: string): void {\n activeFullscreenStateIds.delete(id);\n emitIfSnapshotChanged();\n}\n\nexport function useIsFullscreenStateActive(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n","\"use client\";\n\nexport { Icon, type IconProps } from \"./icon\";\nexport { Spinner, type SpinnerProps } from \"./spinner\";\nexport { Tooltip, type TooltipProps } from \"./tooltip\";\nexport { Button, type ButtonProps } from \"./button\";\nexport { useIsFullscreenStateActive } from \"../hooks/use-fullscreen-state\";\n","export const Z_INDEX = Object.freeze({\n BACKGROUND: 0,\n DOCK_BACKDROP: 100,\n DOCK: 110,\n NOTIFICATION: 120,\n MODAL_BACKDROP: 130,\n MODAL: 140,\n SELECT: 150,\n LOADING: 160,\n ERROR_OVERLAY: 170,\n CONTEXT_MENU_BACKDROP: 180,\n CONTEXT_MENU: 190,\n TOOLTIP: 200,\n\n UI_ELEMENT: 10,\n DOCK_CARD_BACKGROUND: 0,\n DOCK_CARD_CONTENT: 10,\n DOCK_CARD_STACK_BASE: 10,\n DOCK_CARD_BADGE: 20,\n DOCK_CARD_MEDIA: 30,\n DOCK_BREADCRUMBS: 10,\n DOCK_SURFACE_CONTROL: 10,\n DOCK_SURFACE_POPOVER: 30,\n DOCK_SURFACE_CENTER: 0,\n MODAL_FRAME: 1,\n MODAL_STICKY_HEADER: 10,\n} as const);\n\nexport const SURFACE_CLASSES = Object.freeze({\n description: \"text-white/70\",\n icon: \"bg-white/10 text-white\",\n surface: \"bg-black/60 ring-1 ring-inset ring-white/10\",\n title: \"text-white\",\n} as const);\n\nexport const ACTION_TONE_CLASS =\n \"bg-primary/10 text-primary hover:bg-primary hover:text-black\";\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","export * from \"./tokens\";\nexport * from \"./motion\";\n","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 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","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","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\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 function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\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","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\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","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","export { cn } from \"./cn\";\nexport { isBrowser, acquireGlobalScrollLock } from \"./dom\";\nexport {\n trimToNull,\n stripTrailingSlash,\n normalizePath,\n isImageIconSource,\n} from \"./string\";\nexport { clamp, toFiniteNumber } from \"./number\";\nexport { isObject, isPlainObject, shallowEqual, toArray } from \"./object\";\nexport { debounce, throttle } from \"./timing\";\nexport { report, setReportSink } from \"./report\";\nexport { USER_MESSAGES, UserError, toUserMessage } from \"./user-message\";\nexport type { UserMessageOptions } from \"./user-message\";\nexport type { ReportLevel, ReportSink } from \"./report\";\nexport { createStore } from \"./store\";\nexport type { CreateStoreOptions, ExternalStore } from \"./store\";\nexport { createScheduler } from \"./scheduler\";\nexport type {\n ScheduleHandle,\n ScheduledTaskSnapshot,\n SchedulerSnapshot,\n CoreSchedulerOptions,\n} from \"./scheduler\";\n","import type { ComponentType, Context, ReactNode } from \"react\";\nimport type { ExternalStore } from \"@/utils\";\n\nexport type AnyFunction = (...args: unknown[]) => unknown;\n\nexport interface AppRegistryEntry<T = unknown> {\n type: string;\n items: Record<string, T>;\n instanceId?: string;\n options?: RegistryMetadata;\n source?: string;\n}\n\nexport type RegistrySource = \"static\" | \"dynamic\" | \"user\" | (string & {});\n\nexport type RegistryLifecycle =\n \"immediate\" | \"graceful\" | \"persistent\" | \"route\";\n\nexport type RegistryValidationMode = \"warn\" | \"strict\";\n\nexport type RegistryScopeKind =\n \"app\" | \"session\" | \"route\" | \"instance\" | \"workspace\";\n\nexport interface RegistryMetadata {\n cleanup?: RegistryLifecycle;\n cleanupDelayMs?: number | null;\n instanceId?: string | null;\n lifecycle?: RegistryLifecycle;\n priority?: number;\n source?: string;\n scope?: string;\n validation?: RegistryValidationMode;\n}\n\ntype RegistryKeyPolicy = \"singleton\" | \"named\" | \"path\" | \"route\";\n\nexport interface RegistryDefinition<TValue = unknown> {\n keyPolicy: RegistryKeyPolicy;\n lifecycle: RegistryLifecycle;\n cleanupDelayMs?: number | null;\n singletonKey?: string;\n reservedKeys?: readonly string[];\n valueKind?: \"object\" | \"component\";\n merge?(valuesLowToHigh: TValue[]): TValue;\n validate?(value: unknown): ValidationResult;\n}\n\nexport interface RegistryDefinitions {\n get(type: string): RegistryDefinition | undefined;\n keys(): Iterable<string>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n issues: string[];\n reason?: string;\n}\n\nexport interface SourceRecord<T = unknown> {\n updatedAt: number;\n sequence: number;\n instanceId: string | null;\n priority: number;\n source: string;\n scope: string;\n value: T;\n}\n\nexport interface RegisterOperation<T = unknown> {\n kind: \"register\";\n validation?: RegistryValidationMode;\n source: string;\n scope: string;\n record: SourceRecord<T>;\n instanceId: string | null;\n type: string;\n key: string;\n}\n\nexport interface UnregisterOperation {\n kind: \"unregister\";\n instanceId: string | null;\n scope: string | null;\n source: string;\n type: string;\n key: string;\n}\n\nexport type RegistryOperation = RegisterOperation | UnregisterOperation;\n\nexport interface RegistrationHandle<T = unknown> {\n (reason?: string): boolean;\n active: boolean;\n dispose: (reason?: string) => boolean;\n instanceId: string | null;\n key: string;\n priority: number;\n reason?: string;\n source: string;\n status: \"active\" | \"disposed\" | \"superseded\" | \"rejected\" | \"ignored\";\n type: string;\n update: (value: T, options?: RegistryMetadata) => RegistrationHandle<T>;\n updatedAt: number;\n validation: string;\n}\n\nexport interface RegistrySchema {\n [key: string]: unknown;\n}\n\ntype RegistryTypeKey = keyof RegistrySchema & string;\n\nexport interface NormalizedRegistryMetadata {\n cleanupDelayMs: number | null;\n lifecycle: RegistryLifecycle | null;\n priority: number | null;\n registerOptions: RegistryMetadata;\n scope?: string;\n source: string;\n validation?: RegistryValidationMode;\n}\n\nexport type RegistryEntryRecords = Record<string, unknown>;\nexport type RegistryState = Record<\n string,\n Record<string, RegistryEntryRecords>\n>;\n\nexport type RegistrySourceOrOptions = string | RegistryMetadata;\n\ntype RegistryRegisterFn = <\n K extends RegistryTypeKey = RegistryTypeKey,\n T = RegistrySchema[K],\n>(\n type: K,\n key: string,\n item: T,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n) => RegistrationHandle<T>;\n\ntype RegistryUnregisterFn = <K extends RegistryTypeKey = RegistryTypeKey>(\n type: K,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n) => void;\n\nexport interface RegistryQueue {\n register: RegistryRegisterFn;\n unregister: RegistryUnregisterFn;\n}\n\nexport interface RegistryCleanupTimer {\n cancelled: boolean;\n timerId: ReturnType<typeof setTimeout> | null;\n}\n\nexport interface RegistryApplyContext extends RegistryQueue {\n batch: (executor: (queue: RegistryQueue) => void) => number;\n cleanupScope: Map<string, RegistryCleanupTimer>;\n instanceId: string;\n modules?: readonly AnyCoreModule[];\n pathname: string;\n}\n\nexport interface RegistryTransactionResult {\n applied?: number;\n queued?: number;\n status: \"open\" | \"committed\" | \"rolled-back\";\n traceId: string;\n}\n\nexport interface RegistryTransactionRef {\n index: number;\n status: \"open\" | \"committed\" | \"rolled-back\" | \"queued\";\n traceId: string;\n}\n\nexport interface RegistryTransactionQueue {\n register: (\n type: string,\n key: string,\n value: unknown,\n sourceOrOptions?: RegistrySourceOrOptions,\n optionsArg?: RegistryMetadata,\n ) => RegistryTransactionRef;\n unregister: (\n type: string,\n key: string,\n sourceOrOptions?: RegistrySourceOrOptions,\n ) => RegistryTransactionRef;\n}\n\nexport interface RegistryStore {\n batch: (executor: (queue: RegistryQueue) => void) => number;\n dispose: (operation: RegisterOperation, reason?: string) => boolean;\n getEntriesSnapshot: <\n K extends RegistryTypeKey = RegistryTypeKey,\n T = RegistrySchema[K],\n >(\n type: K,\n scope?: string | null,\n ) => Record<string, T>;\n getSnapshot: <\n K extends RegistryTypeKey = RegistryTypeKey,\n T = RegistrySchema[K],\n >(\n type: K,\n key: string,\n scope?: string | null,\n ) => T | undefined;\n isCurrent: (operation: RegisterOperation) => boolean;\n register: RegistryRegisterFn;\n subscribe: <K extends RegistryTypeKey = RegistryTypeKey>(\n type: K,\n key: string | null | undefined,\n listener: () => void,\n ) => () => void;\n transaction: (\n executor: (tx: RegistryTransactionQueue) => void,\n metadata?: RegistryMetadata,\n ) => RegistryTransactionResult;\n unregister: RegistryUnregisterFn;\n}\n\nexport interface PageOptions {\n instanceId?: string;\n lifecycle?: RegistryLifecycle;\n priority?: number;\n scope?: string;\n source?: string;\n [key: string]: unknown;\n}\n\nexport interface PageConfig {\n registry?: RegistryMetadata;\n title?: string;\n}\n\nexport interface PageController {\n Provider: ({ children }: { children?: ReactNode }) => ReactNode;\n config: PageConfig;\n modules: PageModules;\n reset: () => void;\n set: (partial: Partial<PageConfig>) => void;\n}\n\nexport interface RegistrationEntry {\n cleanupDelayMs: number | null;\n key: string;\n lifecycle: RegistryLifecycle | null;\n registerOptions: RegistryMetadata;\n scope: string | undefined;\n source: string;\n value: unknown;\n}\n\nexport interface StableFunctionEntry {\n current: AnyFunction;\n stable: AnyFunction;\n}\n\nexport interface PageControllerStore {\n getSnapshot: () => PageController | null;\n notify: () => void;\n register: (\n id: string,\n controllerRef: { current: PageController | null },\n ) => void;\n subscribe: (listener: () => void) => () => void;\n unregister: (id: string) => void;\n}\n\nexport interface CoreModules {}\n\nexport type ModuleId = keyof CoreModules & string;\n\nexport interface ModuleRuntime<TState = unknown, TActions = unknown> {\n readonly actions: TActions;\n readonly store: ExternalStore<TState>;\n}\n\nexport interface PageRegistration {\n key: string;\n value: unknown;\n}\n\nexport interface ModulePageContext {\n pathname: string;\n}\n\nexport interface PageModuleApi {\n set: (partial: Partial<PageConfig>) => void;\n}\n\ntype ModuleSliceItem<TSlice> = TSlice extends readonly (infer TItem)[]\n ? TItem\n : TSlice;\n\ninterface ModulePageSpec<TSlice, TController> {\n select?(config: PageConfig): TSlice | null | undefined;\n entries?(\n item: ModuleSliceItem<TSlice>,\n context: ModulePageContext,\n ): readonly PageRegistration[] | null | undefined;\n use?(slice: TSlice | null, page: PageModuleApi): TController;\n}\n\nexport interface CoreModule<\n TId extends string = string,\n TRuntime = unknown,\n TSlice = unknown,\n TController = unknown,\n> {\n readonly id: TId;\n readonly context?: Context<TRuntime | null>;\n readonly Provider?: ComponentType<{ children?: ReactNode }>;\n readonly Backdrop?: ComponentType;\n readonly Overlay?: ComponentType;\n readonly uses?: readonly string[];\n readonly registry?: RegistryDefinition;\n readonly page?: ModulePageSpec<TSlice, TController>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- invariant type parameters\nexport type AnyCoreModule = CoreModule<string, any, any, any>;\n\nexport type ModuleRuntimeOf<M> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- matches any slice and controller\n M extends CoreModule<string, infer TRuntime, any, any> ? TRuntime : never;\n\nexport type ModuleStateOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends ModuleRuntime<infer TState, unknown>\n ? TState\n : never;\n\ntype ModuleControllerOf<M> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- matches any runtime and slice\n M extends CoreModule<string, any, any, infer TController>\n ? TController\n : never;\n\nexport type PageModules = {\n [\n K in ModuleId as [ModuleControllerOf<CoreModules[K]>] extends [never]\n ? never\n : K\n ]?: ModuleControllerOf<CoreModules[K]>;\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 {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_RANK,\n} from \"./constants\";\nimport type { RegistryMetadata } from \"./types\";\nimport {\n isObject,\n isPlainObject,\n shallowEqual,\n trimToNull,\n} from \"@/utils\";\n\nexport { isObject, isPlainObject, shallowEqual };\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_SOURCES,\n REGISTRY_VALIDATION_MODES,\n} from \"./constants\";\nimport {\n getValidString,\n isObject,\n isPlainObject,\n parseFiniteNumber,\n} from \"./utils\";\nimport type {\n NormalizedRegistryMetadata,\n RegistryDefinitions,\n RegistryLifecycle,\n RegistryMetadata,\n RegistryValidationMode,\n ValidationResult,\n} from \"./types\";\n\nexport {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLES,\n REGISTRY_SOURCES,\n REGISTRY_VALIDATION_MODES,\n};\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","import {\n DEFAULT_REGISTRY_SCOPE,\n DEFAULT_SOURCE,\n REGISTRY_SOURCE_PRIORITY,\n} from \"./constants\";\nimport {\n getSourceRank,\n hasOwnProperty,\n isObject,\n resolveInstanceId,\n resolveRegisterInput,\n resolveScope,\n resolveUnregisterInput,\n shallowEqual,\n} from \"./utils\";\nimport { validateRegistryKey } from \"./schema\";\nimport type {\n RegisterOperation,\n RegistryDefinitions,\n RegistryEntryRecords,\n RegistryMetadata,\n RegistryOperation,\n RegistrySourceOrOptions,\n RegistryState,\n SourceRecord,\n UnregisterOperation,\n} from \"./types\";\n\ntype MaybeEntry = RegistryEntryRecords | null | undefined;\n\nfunction createInitialRegistriesFor(\n definitions: RegistryDefinitions,\n): RegistryState {\n return Object.fromEntries(\n Array.from(definitions.keys(), (type) => [type, {}]),\n );\n}\n\nfunction buildSourceRecord({\n source,\n value,\n instanceId = null,\n priority,\n timestamp,\n sequence,\n scope = DEFAULT_REGISTRY_SCOPE,\n}: {\n source: string;\n value: unknown;\n instanceId?: string | null;\n priority: number;\n timestamp: number;\n sequence?: number;\n scope?: string;\n}): SourceRecord {\n return {\n updatedAt: timestamp,\n sequence: Number.isFinite(sequence) ? (sequence as number) : timestamp,\n instanceId: typeof instanceId === \"string\" ? instanceId : null,\n priority,\n value,\n source,\n scope,\n };\n}\n\nexport function createRecordKey(\n source: string,\n instanceId: string | null = null,\n scope: string = DEFAULT_REGISTRY_SCOPE,\n): string {\n if (scope === DEFAULT_REGISTRY_SCOPE) {\n if (typeof instanceId === \"string\" && instanceId.length > 0) {\n return `instance:${JSON.stringify([source, instanceId])}`;\n }\n return `source:${JSON.stringify(source)}`;\n }\n if (typeof instanceId === \"string\" && instanceId.length > 0) {\n return `instance:${JSON.stringify([scope, source, instanceId])}`;\n }\n return `source:${JSON.stringify([scope, source])}`;\n}\n\nfunction getSourceRecords(\n entry: MaybeEntry,\n source: string,\n scope: string | null = null,\n): { recordKey: string; record: SourceRecord | null }[] {\n if (!entry) return [];\n return Object.entries(entry)\n .map(([recordKey, rawRecord]) => ({\n recordKey,\n record: toSourceRecord(rawRecord, recordKey),\n }))\n .filter(\n ({ record }) =>\n record?.source === source && (scope === null || record.scope === scope),\n );\n}\n\nfunction getSourceRecord(\n entry: MaybeEntry,\n source: string,\n instanceId: string | null = null,\n scope: string = DEFAULT_REGISTRY_SCOPE,\n): SourceRecord | null {\n const recordKey = createRecordKey(source, instanceId, scope);\n return toSourceRecord(entry?.[recordKey], source);\n}\n\nfunction resolveRecordPriority(options: unknown, source: string): number {\n if (isObject(options) && hasOwnProperty(options, \"priority\")) {\n const parsedPriority = Number(options.priority);\n if (Number.isFinite(parsedPriority)) return parsedPriority;\n }\n return REGISTRY_SOURCE_PRIORITY[source] ?? 0;\n}\n\nfunction toSourceRecord(\n rawValue: unknown,\n source: string = DEFAULT_SOURCE,\n): SourceRecord | null {\n if (rawValue === undefined) return null;\n const rawRecord = rawValue as Record<string, unknown>;\n\n const isWrappedRecord =\n isObject(rawValue) &&\n hasOwnProperty(rawRecord, \"value\") &&\n hasOwnProperty(rawRecord, \"updatedAt\") &&\n hasOwnProperty(rawRecord, \"priority\") &&\n hasOwnProperty(rawRecord, \"source\");\n\n if (isWrappedRecord) {\n const parsedPriority = Number(rawRecord.priority);\n return {\n updatedAt: Number(rawRecord.updatedAt) || 0,\n sequence: Number(rawRecord.sequence) || Number(rawRecord.updatedAt) || 0,\n instanceId:\n typeof rawRecord.instanceId === \"string\" ? rawRecord.instanceId : null,\n priority: Number.isFinite(parsedPriority)\n ? parsedPriority\n : (REGISTRY_SOURCE_PRIORITY[source] ?? 0),\n source: typeof rawRecord.source === \"string\" ? rawRecord.source : source,\n scope:\n typeof rawRecord.scope === \"string\"\n ? rawRecord.scope\n : DEFAULT_REGISTRY_SCOPE,\n value: rawRecord.value,\n };\n }\n\n return {\n updatedAt: 0,\n sequence: 0,\n instanceId: null,\n priority: REGISTRY_SOURCE_PRIORITY[source] ?? 0,\n source,\n scope: DEFAULT_REGISTRY_SCOPE,\n value: rawValue,\n };\n}\n\nfunction compareRecords(a: SourceRecord, b: SourceRecord): number {\n if (a.priority !== b.priority) return a.priority - b.priority;\n const rankDiff = getSourceRank(a.source) - getSourceRank(b.source);\n if (rankDiff !== 0) return rankDiff;\n return (a.sequence ?? a.updatedAt) - (b.sequence ?? b.updatedAt);\n}\n\nfunction recordsHaveSameValue(\n prevRecord: SourceRecord | null,\n nextRecord: SourceRecord,\n): boolean {\n if (Object.is(prevRecord?.value, nextRecord?.value)) return true;\n if (isObject(prevRecord?.value) && isObject(nextRecord?.value)) {\n return shallowEqual(prevRecord!.value, nextRecord.value);\n }\n return false;\n}\n\nfunction hasRecordChanged(\n prevRecord: SourceRecord | null,\n nextRecord: SourceRecord,\n): boolean {\n if (!prevRecord) return true;\n return (\n prevRecord.priority !== nextRecord.priority ||\n prevRecord.source !== nextRecord.source ||\n prevRecord.instanceId !== nextRecord.instanceId ||\n prevRecord.scope !== nextRecord.scope ||\n !recordsHaveSameValue(prevRecord, nextRecord)\n );\n}\n\nfunction hasAnySourceRecord(entry: MaybeEntry): boolean {\n return Object.values(entry || {}).some(\n (rawRecord) => rawRecord !== undefined,\n );\n}\n\nfunction setSourceRecord(\n state: RegistryState,\n type: string,\n key: string,\n source: string,\n record: SourceRecord,\n): RegistryState {\n const typeRegistry = state[type] || {};\n const currentEntry = typeRegistry[key] || {};\n const recordKey = createRecordKey(source, record.instanceId, record.scope);\n const prevRecord = toSourceRecord(currentEntry[recordKey], source);\n\n if (!hasRecordChanged(prevRecord, record)) {\n return state;\n }\n\n return {\n ...state,\n [type]: {\n ...typeRegistry,\n [key]: {\n ...currentEntry,\n [recordKey]: record,\n },\n },\n };\n}\n\nfunction removeSourceRecord(\n state: RegistryState,\n type: string,\n key: string,\n source: string,\n instanceId: string | null = null,\n scope: string | null = null,\n): RegistryState {\n const typeRegistry = state[type];\n const currentEntry = typeRegistry?.[key];\n if (!typeRegistry || !currentEntry) return state;\n\n let activeRecords: { recordKey: string; record: SourceRecord }[] = [];\n\n if (\n typeof instanceId === \"string\" &&\n instanceId.length > 0 &&\n scope !== null\n ) {\n const safeScope = scope || DEFAULT_REGISTRY_SCOPE;\n const recordKey = createRecordKey(source, instanceId, safeScope);\n const record = getSourceRecord(currentEntry, source, instanceId, safeScope);\n\n if (record) activeRecords.push({ recordKey, record });\n } else {\n activeRecords = getSourceRecords(currentEntry, source, scope)\n .filter(({ record }) => !instanceId || record?.instanceId === instanceId)\n .filter((entry): entry is { recordKey: string; record: SourceRecord } =>\n Boolean(entry.record),\n );\n }\n\n if (activeRecords.length === 0) return state;\n\n const nextEntry = { ...currentEntry };\n activeRecords.forEach(({ recordKey }) => {\n delete nextEntry[recordKey];\n });\n\n if (!hasAnySourceRecord(nextEntry)) {\n const nextTypeRegistry = { ...typeRegistry };\n delete nextTypeRegistry[key];\n return { ...state, [type]: nextTypeRegistry };\n }\n\n return {\n ...state,\n [type]: { ...typeRegistry, [key]: nextEntry },\n };\n}\n\nfunction resolveEntryValueFor(\n definitions: RegistryDefinitions,\n type: string,\n entry: MaybeEntry,\n scope: string | null = null,\n): unknown {\n if (!entry) return undefined;\n\n const activeRecords = Object.entries(entry)\n .map(([source, rawRecord]) => toSourceRecord(rawRecord, source))\n .filter(\n (record): record is SourceRecord =>\n record !== null && (scope === null || record.scope === scope),\n );\n\n if (activeRecords.length === 0) return undefined;\n\n const merge = definitions.get(type)?.merge;\n if (merge) {\n const sortedRecords = [...activeRecords].sort(compareRecords);\n const mergeCandidate = sortedRecords.every((record) =>\n isObject(record.value),\n );\n\n if (mergeCandidate) {\n const values = sortedRecords.map(\n (record) => record.value as Record<string, unknown>,\n );\n return merge(values);\n }\n return sortedRecords[sortedRecords.length - 1].value;\n }\n\n return activeRecords.reduce((winner, current) =>\n compareRecords(current, winner) > 0 ? current : winner,\n ).value;\n}\n\nfunction createResolverCacheFor(\n definitions: RegistryDefinitions,\n): (type: string, entry: MaybeEntry, scope?: string | null) => unknown {\n const entryCache = new WeakMap<object, Map<string, unknown>>();\n\n return (type: string, entry: MaybeEntry, scope: string | null = null) => {\n if (!entry || typeof entry !== \"object\") {\n return resolveEntryValueFor(definitions, type, entry, scope);\n }\n\n let typeCache = entryCache.get(entry);\n if (!typeCache) {\n typeCache = new Map();\n entryCache.set(entry, typeCache);\n }\n\n const cacheKey = scope || \"default\";\n\n if (typeCache.has(cacheKey)) return typeCache.get(cacheKey);\n\n const value = resolveEntryValueFor(definitions, type, entry, scope);\n typeCache.set(cacheKey, value);\n return value;\n };\n}\n\nexport function createRegisterOperation(\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg: RegistryMetadata | undefined,\n timestamp: number,\n sequence: number = timestamp,\n): RegisterOperation {\n const { source, options } = resolveRegisterInput(sourceOrOptions, optionsArg);\n const instanceId = resolveInstanceId(options);\n const scope = resolveScope(options);\n\n return {\n kind: \"register\",\n validation: options.validation,\n source,\n scope,\n record: buildSourceRecord({\n source,\n value: item,\n instanceId,\n priority: resolveRecordPriority(options, source),\n scope,\n timestamp,\n sequence,\n }),\n instanceId,\n type,\n key: typeof key === \"string\" ? key.trim() : key,\n };\n}\n\nexport function createUnregisterOperation(\n type: string,\n key: string,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n): UnregisterOperation {\n const { scope, source, instanceId } = resolveUnregisterInput(sourceOrOptions);\n return {\n kind: \"unregister\",\n instanceId,\n scope,\n source,\n type,\n key: typeof key === \"string\" ? key.trim() : key,\n };\n}\n\nfunction isValidRegistryTargetFor(\n definitions: RegistryDefinitions,\n type: string,\n key: unknown,\n): boolean {\n return validateRegistryKey(type, key, definitions).valid;\n}\n\nfunction applyOperationFor(\n definitions: RegistryDefinitions,\n state: RegistryState,\n operation: RegistryOperation,\n): RegistryState {\n if (!isValidRegistryTargetFor(definitions, operation?.type, operation?.key))\n return state;\n\n if (operation.kind === \"register\") {\n return setSourceRecord(\n state,\n operation.type,\n operation.key,\n operation.source,\n operation.record,\n );\n }\n if (operation.kind === \"unregister\") {\n return removeSourceRecord(\n state,\n operation.type,\n operation.key,\n operation.source,\n operation.instanceId,\n operation.scope,\n );\n }\n return state;\n}\n\nfunction hasOperationEffectFor(\n definitions: RegistryDefinitions,\n state: RegistryState,\n operation: RegistryOperation,\n): boolean {\n if (!isValidRegistryTargetFor(definitions, operation?.type, operation?.key))\n return false;\n\n if (operation.kind === \"register\") {\n const currentRecord = getSourceRecord(\n state[operation.type]?.[operation.key],\n operation.source,\n operation.instanceId,\n operation.scope,\n );\n return hasRecordChanged(currentRecord, operation.record);\n }\n\n if (operation.kind === \"unregister\") {\n const entry = state[operation.type]?.[operation.key];\n if (\n typeof operation.instanceId === \"string\" &&\n operation.instanceId.length > 0\n ) {\n return operation.scope === null\n ? getSourceRecords(entry, operation.source).some(\n ({ record }) => record?.instanceId === operation.instanceId,\n )\n : Boolean(\n getSourceRecord(\n entry,\n operation.source,\n operation.instanceId,\n operation.scope,\n ),\n );\n }\n return (\n getSourceRecords(entry, operation.source, operation.scope).length > 0\n );\n }\n return false;\n}\n\nfunction resolveEffectiveOperationsFor(\n definitions: RegistryDefinitions,\n state: RegistryState,\n operations: RegistryOperation[],\n): { effectiveOperations: RegistryOperation[]; nextState: RegistryState } {\n const effectiveOperations: RegistryOperation[] = [];\n let nextState = state;\n\n operations.forEach((operation) => {\n if (!hasOperationEffectFor(definitions, nextState, operation)) return;\n effectiveOperations.push(operation);\n nextState = applyOperationFor(definitions, nextState, operation);\n });\n\n return { effectiveOperations, nextState };\n}\n\nexport function createRegistryOperations(definitions: RegistryDefinitions) {\n return Object.freeze({\n applyOperation: (state: RegistryState, operation: RegistryOperation) =>\n applyOperationFor(definitions, state, operation),\n createInitialRegistries: () => createInitialRegistriesFor(definitions),\n createResolverCache: () => createResolverCacheFor(definitions),\n hasOperationEffect: (state: RegistryState, operation: RegistryOperation) =>\n hasOperationEffectFor(definitions, state, operation),\n isRegistryType: (type: string) => definitions.get(type) !== undefined,\n isValidRegistryTarget: (type: string, key: unknown) =>\n isValidRegistryTargetFor(definitions, type, key),\n resolveEffectiveOperations: (\n state: RegistryState,\n operations: RegistryOperation[],\n ) => resolveEffectiveOperationsFor(definitions, state, operations),\n resolveEntryValue: (\n type: string,\n entry: MaybeEntry,\n scope: string | null = null,\n ) => resolveEntryValueFor(definitions, type, entry, scope),\n });\n}\n\nexport type RegistryOperations = ReturnType<typeof createRegistryOperations>;\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 { useCallback, useEffect, type RefObject } from \"react\";\n\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n ref: RefObject<T | null> | null | undefined,\n callback?: (event: PointerEvent) => void,\n): void {\n const handlePointer = useCallback(\n (event: PointerEvent) => {\n if (ref?.current && !ref.current.contains(event.target as Node)) {\n callback?.(event);\n }\n },\n [callback, ref],\n );\n\n useEffect(() => {\n document.addEventListener(\"pointerdown\", handlePointer);\n return () => document.removeEventListener(\"pointerdown\", handlePointer);\n }, [handlePointer]);\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n","import { report } from \"./utils/report\";\nexport type EventListener<T = unknown> = (payload: T) => void;\n\nexport const EVENT_TYPES = Object.freeze({\n API_UNAUTHORIZED: \"API_UNAUTHORIZED\",\n STATE_CHANGE: \"STATE_CHANGE\",\n API_ERROR: \"API_ERROR\",\n APP_ERROR: \"APP_ERROR\",\n} as const);\n\nexport interface FrameworkEventMap {\n [EVENT_TYPES.API_UNAUTHORIZED]: {\n error?: unknown;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.API_ERROR]: {\n error: unknown;\n isCritical?: boolean;\n message?: string;\n retry?: () => void;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.APP_ERROR]: {\n error?: unknown;\n message?: string;\n resetError?: () => void;\n source?: string;\n [key: string]: unknown;\n };\n [EVENT_TYPES.STATE_CHANGE]: {\n message?: string;\n status?: \"success\" | \"warning\" | \"info\" | \"error\" | string;\n [key: string]: unknown;\n };\n}\n\nexport class EventEmitter<TEvents extends object = FrameworkEventMap> {\n private events: Map<string, Set<EventListener<never>>> = new Map();\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n subscribe<K extends keyof TEvents>(\n event: K,\n callback: EventListener<TEvents[K]>,\n ): () => void;\n subscribe<T = unknown>(event: string, callback: EventListener<T>): () => void;\n subscribe(event: string, callback: EventListener<never>): () => void {\n if (typeof event !== \"string\" || !event || typeof callback !== \"function\") {\n return () => {};\n }\n const listeners = this.events.get(event) || new Set<EventListener<never>>();\n listeners.add(callback);\n this.events.set(event, listeners);\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) this.events.delete(event);\n };\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void | undefined\n ? [payload?: TEvents[K]]\n : [payload: TEvents[K]]\n ): void;\n emit<T = unknown>(event: string, payload?: T): void;\n emit(event: string, payload?: unknown): void {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) return;\n const snapshot = Array.from(listeners);\n for (const callback of snapshot) {\n try {\n (callback as EventListener<unknown>)(payload);\n } catch (error) {\n report(`Event listener (${String(event)})`, error);\n }\n }\n }\n\n emitDebounced<K extends keyof TEvents>(\n event: K,\n payload: TEvents[K],\n waitMs?: number,\n ): void;\n emitDebounced<T = unknown>(event: string, payload?: T, waitMs?: number): void;\n emitDebounced(event: string, payload?: unknown, waitMs: number = 100): void {\n const existing = this.debounceTimers.get(event);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(event);\n this.emit(event, payload);\n }, waitMs);\n\n this.debounceTimers.set(event, timer);\n }\n\n cancelDebounced(event?: string): void {\n if (event) {\n const timer = this.debounceTimers.get(event);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(event);\n }\n } else {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n }\n\n unsubscribeAll(event?: string): void {\n this.cancelDebounced(event);\n if (event) this.events.delete(event);\n else this.events.clear();\n }\n\n hasListeners(event: string): boolean {\n return Boolean(this.events.get(event)?.size);\n }\n\n getListenerCount(event: string): number {\n return this.events.get(event)?.size || 0;\n }\n\n getAllEvents(): string[] {\n return [...this.events.keys()];\n }\n}\n\nconst GLOBAL_EVENTS_KEY = Symbol.for(\"__base_framework_global_events__\");\ntype GlobalWithEvents = typeof globalThis & {\n [GLOBAL_EVENTS_KEY]?: EventEmitter<FrameworkEventMap>;\n};\n\nconst _global = globalThis as GlobalWithEvents;\nexport const globalEvents: EventEmitter<FrameworkEventMap> =\n _global[GLOBAL_EVENTS_KEY] ??\n (_global[GLOBAL_EVENTS_KEY] = new EventEmitter<FrameworkEventMap>());\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { globalEvents, type FrameworkEventMap } from \"@/events\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseGlobalEventOptions } from \"./types\";\n\nexport function useGlobalEvent<K extends keyof FrameworkEventMap>(\n event: K | K[] | null | undefined,\n callback: (payload: FrameworkEventMap[K]) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent<T = unknown>(\n event: string | string[] | null | undefined,\n callback: (payload: T) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent(\n event: string | string[] | null | undefined,\n callback: (payload: never) => void,\n options?: UseGlobalEventOptions,\n): void {\n const callbackRef = useRef(callback);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastThrottleTimeRef = useRef<number>(0);\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const debounceMs = options?.debounceMs;\n const throttleMs = options?.throttleMs;\n\n useEffect(() => {\n if (!event) return;\n const events = Array.isArray(event) ? event.filter(Boolean) : [event];\n if (events.length === 0) return;\n\n const handler = (payload: never) => {\n if (debounceMs != null && debounceMs > 0) {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n callbackRef.current?.(payload);\n }, debounceMs);\n return;\n }\n\n if (throttleMs != null && throttleMs > 0) {\n const now = Date.now();\n const remaining = throttleMs - (now - lastThrottleTimeRef.current);\n if (remaining <= 0) {\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n lastThrottleTimeRef.current = now;\n callbackRef.current?.(payload);\n } else if (throttleTimerRef.current === null) {\n throttleTimerRef.current = setTimeout(() => {\n lastThrottleTimeRef.current = Date.now();\n throttleTimerRef.current = null;\n callbackRef.current?.(payload);\n }, remaining);\n }\n return;\n }\n\n callbackRef.current?.(payload);\n };\n\n const unsubs = events.map((ev) => globalEvents.subscribe(ev, handler));\n\n return () => {\n unsubs.forEach((unsub) => unsub());\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n };\n }, [event, debounceMs, throttleMs]);\n}\n","\"use client\";\n\nexport { useRequiredContext } from \"./use-required-context\";\nexport { useStore } from \"./use-store\";\nexport { useClickOutside } from \"./use-click-outside\";\nexport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nexport { useGlobalEvent } from \"./use-global-event\";\nexport { useIsFullscreenStateActive } from \"./use-fullscreen-state\";\n\nexport type * from \"./types\";\n","\"use client\";\n\nimport type {\n RegistrationHandle,\n RegistryMetadata,\n RegistryTransactionQueue,\n RegistryTransactionRef,\n RegistryTransactionResult,\n} from \"./types\";\n\ninterface QueuedOperation {\n key: string;\n options: RegistryMetadata;\n type: string;\n item?: unknown;\n unregister?: true;\n}\n\ntype TransactionStatus = \"open\" | \"committed\" | \"rolled-back\";\n\nexport interface RegistryTransaction extends RegistryTransactionQueue {\n commit: () => RegistryTransactionResult;\n readonly operations: readonly QueuedOperation[];\n rollback: (reason?: string) => RegistryTransactionRef;\n run: (\n executor: (queue: RegistryTransactionQueue) => void,\n ) => RegistryTransactionResult;\n readonly status: TransactionStatus;\n traceId: string;\n}\n\ninterface TransactionBatchQueue {\n register: (\n type: string,\n key: string,\n value: unknown,\n options?: RegistryMetadata,\n ) => RegistrationHandle;\n unregister: (type: string, key: string, options?: RegistryMetadata) => void;\n}\n\ninterface TransactionStore {\n batch: (executor: (queue: TransactionBatchQueue) => void) => unknown;\n}\n\nexport function createRegistryTransaction(\n store: TransactionStore,\n metadata: RegistryMetadata & { source?: string; traceId?: string } = {},\n): RegistryTransaction {\n const operations: QueuedOperation[] = [];\n let status: TransactionStatus = \"open\";\n const traceId =\n metadata.traceId ||\n `tx-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n\n const ensureOpen = () => status === \"open\";\n\n const mergeOptions = (\n options: RegistryMetadata | undefined,\n ): RegistryMetadata => {\n const baseOpts = options && typeof options === \"object\" ? options : {};\n const needsSource = metadata.source && !baseOpts.source;\n const needsScope = metadata.scope && !baseOpts.scope;\n\n if (!needsSource && !needsScope) return baseOpts;\n\n return {\n ...baseOpts,\n ...(needsSource ? { source: metadata.source } : {}),\n ...(needsScope ? { scope: metadata.scope } : {}),\n };\n };\n\n const register: RegistryTransactionQueue[\"register\"] = (\n type,\n key,\n value,\n sourceOrOptions,\n optionsArg,\n ) => {\n if (!ensureOpen()) return { index: -1, status, traceId };\n\n const options =\n typeof sourceOrOptions === \"string\"\n ? mergeOptions({ ...(optionsArg || {}), source: sourceOrOptions })\n : mergeOptions(sourceOrOptions as RegistryMetadata | undefined);\n\n operations.push({ key, item: value, options, type });\n return { index: operations.length - 1, status: \"queued\", traceId };\n };\n\n const unregister: RegistryTransactionQueue[\"unregister\"] = (\n type,\n key,\n sourceOrOptions,\n ) => {\n if (!ensureOpen()) return { index: -1, status, traceId };\n\n const options = mergeOptions(\n typeof sourceOrOptions === \"string\"\n ? { source: sourceOrOptions }\n : (sourceOrOptions as RegistryMetadata | undefined),\n );\n\n operations.push({ key, options, type, unregister: true });\n return { index: operations.length - 1, status: \"queued\", traceId };\n };\n\n const rollback = (_reason = \"manual\"): RegistryTransactionRef => {\n if (!ensureOpen()) return { index: -1, status, traceId };\n\n status = \"rolled-back\";\n operations.length = 0;\n return { index: -1, status, traceId };\n };\n\n const commit = (): RegistryTransactionResult => {\n if (!ensureOpen()) return { status, traceId };\n\n status = \"committed\";\n const result = store.batch((queue) => {\n operations.forEach((op) => {\n if (op.unregister) queue.unregister(op.type, op.key, op.options);\n else queue.register(op.type, op.key, op.item, op.options);\n });\n });\n\n const applied =\n typeof result === \"number\" && Number.isFinite(result) ? result : 0;\n return { applied, queued: operations.length, status, traceId };\n };\n\n const run = (\n executor: (queue: RegistryTransactionQueue) => void,\n ): RegistryTransactionResult => {\n if (typeof executor !== \"function\") {\n rollback(\"invalid-executor\");\n return { status, traceId };\n }\n try {\n executor({ register, unregister });\n return commit();\n } catch (error) {\n rollback(error instanceof Error ? error.message : String(error));\n throw error;\n }\n };\n\n return {\n commit,\n get operations() {\n return operations.slice();\n },\n register,\n rollback,\n run,\n get status() {\n return status;\n },\n traceId,\n unregister,\n };\n}\n","import { isValidElement } from \"react\";\nimport {\n createRecordKey,\n createRegisterOperation,\n createRegistryOperations,\n createUnregisterOperation,\n type RegistryOperations,\n} from \"./operations\";\nimport {\n DEFAULT_SOURCE,\n REGISTRY_SOURCES,\n REGISTRY_VALIDATION_MODES,\n validateRegistryMetadata,\n validateRegistryValue,\n} from \"./schema\";\nimport { createRegistryTransaction } from \"./runtime\";\nimport type {\n AppRegistryEntry,\n RegisterOperation,\n RegistrationHandle,\n RegistryDefinitions,\n RegistryMetadata,\n RegistryOperation,\n RegistryQueue,\n RegistrySourceOrOptions,\n RegistryState,\n RegistryStore,\n RegistryTransactionQueue,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport type InitialRegistryEntries = readonly AppRegistryEntry[];\n\nconst NO_DEFINITIONS: RegistryDefinitions = new Map();\n\nfunction createNoopHandle(\n status: RegistrationHandle[\"status\"] = \"rejected\",\n reason = \"unknown\",\n): RegistrationHandle {\n const handle: RegistrationHandle = Object.assign(() => false, {\n active: false,\n dispose: () => false,\n instanceId: null,\n key: \"\",\n priority: 0,\n reason,\n source: \"\",\n status,\n type: \"\",\n update: (): RegistrationHandle => handle,\n updatedAt: 0,\n validation: \"warn\",\n });\n return handle;\n}\n\nconst NOOP_HANDLE: RegistrationHandle = createNoopHandle();\n\nfunction isNoopHandle(handle: RegistrationHandle | null | undefined): boolean {\n return (\n handle === NOOP_HANDLE ||\n handle?.status === \"rejected\" ||\n handle?.status === \"ignored\"\n );\n}\n\nfunction cloneRegistryValue<T>(\n value: T,\n seen = new WeakMap<object, unknown>(),\n): T {\n if (value === null || typeof value !== \"object\" || isValidElement(value)) {\n return value;\n }\n\n const prototype = Object.getPrototypeOf(value);\n const isPlainObject =\n !Array.isArray(value) &&\n (prototype === Object.prototype || prototype === null);\n\n if (!Array.isArray(value) && !isPlainObject) return value;\n if (seen.has(value)) return seen.get(value) as T;\n\n const source = value as Record<string, unknown>;\n const clone = (Array.isArray(value) ? [] : {}) as Record<string, unknown>;\n seen.set(value, clone);\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n clone[key] = cloneRegistryValue(source[key], seen);\n }\n }\n\n return clone as T;\n}\n\nfunction normalizeInitialEntries(entries: unknown): AppRegistryEntry[] {\n return (Array.isArray(entries) ? entries : []).filter(\n (entry): entry is AppRegistryEntry =>\n entry?.type && entry?.items && typeof entry.items === \"object\",\n );\n}\n\nfunction createInitialState(\n ops: RegistryOperations,\n definitions: RegistryDefinitions,\n entries: unknown,\n): RegistryState {\n const normalizedEntries = normalizeInitialEntries(entries);\n if (normalizedEntries.length === 0) return ops.createInitialRegistries();\n\n const timestamp = Date.now();\n let sequence = 0;\n let state = ops.createInitialRegistries();\n\n normalizedEntries.forEach((entry) => {\n const source = entry.source || REGISTRY_SOURCES.STATIC;\n const options: RegistryMetadata = {\n ...(entry.options || {}),\n instanceId:\n entry.instanceId || entry.options?.instanceId || \"registry-initial\",\n };\n\n Object.entries(entry.items).forEach(([key, value]) => {\n const validation = validateRegistration(\n definitions,\n entry.type,\n key,\n value,\n source,\n options,\n );\n if (!validation.valid) return;\n\n const operation = createRegisterOperation(\n entry.type,\n key,\n cloneRegistryValue(value),\n source,\n options,\n timestamp,\n ++sequence,\n );\n if (ops.hasOperationEffect(state, operation)) {\n state = ops.applyOperation(state, operation);\n }\n });\n });\n return state;\n}\n\nfunction notifyListeners(listeners: Set<() => void> | undefined): void {\n if (!listeners) return;\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Registry listener\", error);\n }\n }\n}\n\nfunction getOrCreateKeyListeners(\n listenersByType: Map<string, Map<string | null, Set<() => void>>>,\n type: string,\n key: string | null,\n): Set<() => void> {\n let listeners = listenersByType.get(type);\n if (!listeners) {\n listeners = new Map();\n listenersByType.set(type, listeners);\n }\n let keyListeners = listeners.get(key);\n if (!keyListeners) {\n keyListeners = new Set();\n listeners.set(key, keyListeners);\n }\n return keyListeners;\n}\n\nfunction resolveRegistrationOptions(\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): RegistryMetadata {\n if (sourceOrOptions && typeof sourceOrOptions === \"object\")\n return sourceOrOptions;\n return optionsArg && typeof optionsArg === \"object\" ? optionsArg : {};\n}\n\nfunction validateRegistration(\n definitions: RegistryDefinitions,\n type: string,\n key: string,\n value: unknown,\n sourceOrOptions: RegistrySourceOrOptions | undefined,\n optionsArg?: RegistryMetadata,\n): { issues?: string[]; reason?: string; valid: boolean } {\n const options = resolveRegistrationOptions(sourceOrOptions, optionsArg);\n const metadataValidation = validateRegistryMetadata(options);\n const isStrict = options.validation === REGISTRY_VALIDATION_MODES.STRICT;\n\n if (!metadataValidation.valid && isStrict) {\n return {\n issues: metadataValidation.issues,\n reason: \"invalid-metadata\",\n valid: false,\n };\n }\n\n const validation = validateRegistryValue(type, key, value, definitions);\n if (validation.valid) return { valid: true };\n\n if (!isStrict) {\n report(`Registry ${type} \"${key}\" is invalid`, validation.issues, \"warn\");\n }\n\n return {\n issues: validation.issues,\n reason: \"invalid-value\",\n valid: !isStrict,\n };\n}\n\nfunction createRegistrationHandle(\n store: RegistryStore,\n operation: RegisterOperation,\n): RegistrationHandle {\n let disposed = false;\n const dispose = (reason = \"manual\") => {\n if (disposed) return false;\n disposed = true;\n return store.dispose(operation, reason);\n };\n\n const handle = ((reason?: string) => dispose(reason)) as RegistrationHandle;\n handle.dispose = dispose;\n\n handle.update = (value: unknown, options: RegistryMetadata = {}) => {\n if (disposed || !store.isCurrent(operation)) return NOOP_HANDLE;\n const nextHandle = store.register(\n operation.type,\n operation.key,\n value,\n operation.source,\n {\n ...(typeof options === \"object\" ? options : {}),\n instanceId: operation.instanceId,\n priority: operation.record.priority,\n ...(operation.scope ? { scope: operation.scope } : {}),\n ...(operation.validation ? { validation: operation.validation } : {}),\n },\n );\n if (isNoopHandle(nextHandle)) return handle;\n disposed = true;\n return nextHandle;\n };\n\n Object.defineProperties(handle, {\n active: {\n enumerable: true,\n get: () => !disposed && store.isCurrent(operation),\n },\n instanceId: { enumerable: true, value: operation.instanceId },\n key: { enumerable: true, value: operation.key },\n priority: { enumerable: true, value: operation.record.priority },\n source: { enumerable: true, value: operation.source },\n status: {\n enumerable: true,\n get: () =>\n disposed\n ? \"disposed\"\n : store.isCurrent(operation)\n ? \"active\"\n : \"superseded\",\n },\n type: { enumerable: true, value: operation.type },\n updatedAt: { enumerable: true, value: operation.record.updatedAt },\n validation: { enumerable: true, value: operation.validation || \"warn\" },\n });\n\n return handle as RegistrationHandle;\n}\n\nfunction prepareRegisterOperation(\n ops: RegistryOperations,\n definitions: RegistryDefinitions,\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions,\n optionsArg: RegistryMetadata,\n timestamp: number,\n sequence: number,\n): { operation: RegisterOperation } | { rejected: RegistrationHandle } {\n if (!ops.isValidRegistryTarget(type, key)) {\n return { rejected: createNoopHandle(\"rejected\", \"invalid-target\") };\n }\n\n const validation = validateRegistration(\n definitions,\n type,\n key,\n item,\n sourceOrOptions,\n optionsArg,\n );\n if (!validation.valid) {\n return { rejected: createNoopHandle(\"rejected\", validation.reason) };\n }\n\n return {\n operation: createRegisterOperation(\n type,\n key,\n cloneRegistryValue(item),\n sourceOrOptions,\n optionsArg,\n timestamp,\n sequence,\n ),\n };\n}\n\nexport function createRegistryStore(\n initialEntries: InitialRegistryEntries = [],\n definitions: RegistryDefinitions = NO_DEFINITIONS,\n): RegistryStore {\n const ops = createRegistryOperations(definitions);\n let registries = createInitialState(ops, definitions, initialEntries);\n let sequence = normalizeInitialEntries(initialEntries).reduce(\n (count, entry) => count + Object.keys(entry.items).length,\n 0,\n );\n\n const listenersByType = new Map<\n string,\n Map<string | null, Set<() => void>>\n >();\n const entrySnapshots = new Map<\n string,\n {\n typeRegistry: RegistryState[string];\n value: Readonly<Record<string, unknown>>;\n }\n >();\n const valueSnapshots = new Map<\n string,\n Map<\n string,\n { entry: RegistryState[string][string] | undefined; value: unknown }\n >\n >();\n const resolveCachedValue = ops.createResolverCache();\n\n const subscribe = (\n type: string,\n key: string | null | undefined,\n listener: () => void,\n ) => {\n const keyListeners = getOrCreateKeyListeners(\n listenersByType,\n type,\n key ?? null,\n );\n keyListeners.add(listener);\n\n return () => {\n keyListeners.delete(listener);\n if (keyListeners.size > 0) return;\n\n const listeners = listenersByType.get(type);\n if (listeners) {\n listeners.delete(key ?? null);\n if (listeners.size === 0) listenersByType.delete(type);\n }\n };\n };\n\n const commit = (\n nextState: RegistryState,\n operations: RegistryOperation[] = [],\n ) => {\n if (registries === nextState) return;\n const previousState = registries;\n registries = nextState;\n\n const changedKeysByType = new Map<string, Set<string>>();\n for (const operation of operations) {\n if (!ops.isValidRegistryTarget(operation?.type, operation?.key)) continue;\n let keys = changedKeysByType.get(operation.type);\n if (!keys) {\n keys = new Set();\n changedKeysByType.set(operation.type, keys);\n }\n keys.add(operation.key);\n }\n\n for (const [type, changedKeys] of changedKeysByType) {\n const previousRegistry = previousState[type] || {};\n const nextRegistry = nextState[type] || {};\n const typeListeners = listenersByType.get(type);\n let typeChanged = false;\n\n if (!typeListeners) continue;\n\n for (const key of changedKeys) {\n if (previousRegistry[key] === nextRegistry[key]) continue;\n typeChanged = true;\n notifyListeners(typeListeners.get(key));\n }\n\n if (typeChanged) {\n notifyListeners(typeListeners.get(null));\n }\n }\n };\n\n const isCurrent = (operation: RegisterOperation) => {\n const entry = registries[operation.type]?.[operation.key];\n const recordKey = createRecordKey(\n operation.source,\n operation.instanceId,\n operation.scope,\n );\n return entry?.[recordKey] === operation.record;\n };\n\n const dispose = (\n operation: RegisterOperation,\n _reason = \"manual\",\n ): boolean => {\n if (!isCurrent(operation)) return false;\n const unregisterOperation = createUnregisterOperation(\n operation.type,\n operation.key,\n {\n source: operation.source,\n instanceId: operation.instanceId,\n scope: operation.scope,\n },\n );\n\n if (!ops.hasOperationEffect(registries, unregisterOperation)) return false;\n commit(ops.applyOperation(registries, unregisterOperation), [\n unregisterOperation,\n ]);\n return true;\n };\n\n const register = (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n optionsArg: RegistryMetadata = {},\n ): RegistrationHandle => {\n const prepared = prepareRegisterOperation(\n ops,\n definitions,\n type,\n key,\n item,\n sourceOrOptions,\n optionsArg,\n Date.now(),\n ++sequence,\n );\n if (\"rejected\" in prepared) return prepared.rejected;\n\n const { operation } = prepared;\n if (!ops.hasOperationEffect(registries, operation)) {\n return createNoopHandle(\"ignored\", \"unchanged\");\n }\n\n commit(ops.applyOperation(registries, operation), [operation]);\n return createRegistrationHandle(store, operation);\n };\n\n const unregister = (\n type: string,\n key: string,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n ): void => {\n if (!ops.isValidRegistryTarget(type, key)) return;\n const operation = createUnregisterOperation(type, key, sourceOrOptions);\n if (!ops.hasOperationEffect(registries, operation)) return;\n\n commit(ops.applyOperation(registries, operation), [operation]);\n };\n\n const batch = (executor: (queue: RegistryQueue) => void): number => {\n if (typeof executor !== \"function\") return 0;\n const timestamp = Date.now();\n const operations: RegistryOperation[] = [];\n\n const queue: RegistryQueue = {\n register: (\n type: string,\n key: string,\n item: unknown,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n optionsArg: RegistryMetadata = {},\n ): RegistrationHandle => {\n const prepared = prepareRegisterOperation(\n ops,\n definitions,\n type,\n key,\n item,\n sourceOrOptions,\n optionsArg,\n timestamp,\n ++sequence,\n );\n if (\"rejected\" in prepared) return prepared.rejected;\n\n operations.push(prepared.operation);\n return createRegistrationHandle(store, prepared.operation);\n },\n unregister: (\n type: string,\n key: string,\n sourceOrOptions: RegistrySourceOrOptions = DEFAULT_SOURCE,\n ): void => {\n if (!ops.isValidRegistryTarget(type, key)) return;\n operations.push(createUnregisterOperation(type, key, sourceOrOptions));\n },\n };\n\n executor(queue);\n if (operations.length === 0) return 0;\n\n const { effectiveOperations, nextState } = ops.resolveEffectiveOperations(\n registries,\n operations,\n );\n if (effectiveOperations.length === 0) return 0;\n\n commit(nextState, effectiveOperations);\n return effectiveOperations.length;\n };\n\n const getSnapshot = (\n type: string,\n key: string,\n scope: string | null = null,\n ): unknown => {\n const entry = registries[type]?.[key];\n let snapshots = valueSnapshots.get(type);\n if (!snapshots) {\n snapshots = new Map();\n valueSnapshots.set(type, snapshots);\n }\n\n const cacheKey = scope === null ? key : `${scope}\\u0000${key}`;\n\n if (entry === undefined) {\n snapshots.delete(cacheKey);\n return undefined;\n }\n\n const cached = snapshots.get(cacheKey);\n if (cached && cached.entry === entry) return cached.value;\n\n const value = resolveCachedValue(type, entry, scope);\n snapshots.set(cacheKey, { entry, value });\n return value;\n };\n\n const getEntriesSnapshot = (\n type: string,\n scope: string | null = null,\n ): Readonly<Record<string, unknown>> => {\n const typeRegistry = registries[type] || {};\n\n const cacheKey = `${type}::${scope ?? \"null\"}`;\n const cached = entrySnapshots.get(cacheKey);\n\n if (cached?.typeRegistry === typeRegistry) return cached.value;\n\n const resolved: Record<string, unknown> = {};\n for (const key in typeRegistry) {\n if (Object.prototype.hasOwnProperty.call(typeRegistry, key)) {\n const value = resolveCachedValue(type, typeRegistry[key], scope);\n if (value !== undefined) resolved[key] = value;\n }\n }\n\n const finalValue = Object.freeze(resolved);\n entrySnapshots.set(cacheKey, { typeRegistry, value: finalValue });\n return finalValue;\n };\n\n const store = {\n batch,\n dispose,\n getEntriesSnapshot,\n getSnapshot,\n isCurrent,\n register,\n subscribe,\n transaction: (\n executor: (tx: RegistryTransactionQueue) => void,\n metadata: RegistryMetadata = {},\n ) => createRegistryTransaction(store, metadata).run(executor),\n unregister,\n } as RegistryStore;\n return store;\n}\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","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useRequiredContext } from \"@/hooks\";\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}\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nconst RegistryContext = getOrCreateGlobalContext<RegistryContextValue | null>(\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 { createContext, use, type ComponentType, type ReactNode } from \"react\";\nimport { isObject } from \"@/utils\";\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;\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nexport const ModuleHostContext =\n getOrCreateGlobalContext<ModuleHostValue | null>(\"ModuleHostContext\", null);\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 {\n DEFAULT_SOURCE,\n REGISTRY_LIFECYCLES,\n normalizeRegistryMetadata,\n validateRegistryMetadata,\n} from \"./schema\";\nimport { isObject } from \"./utils\";\nimport type {\n AnyCoreModule,\n PageConfig,\n RegistrationEntry,\n RegistryApplyContext,\n RegistryCleanupTimer,\n RegistryMetadata,\n RegistryQueue,\n} from \"./types\";\nimport { report } from \"@/utils\";\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\n/* eslint-disable react-hooks/refs */\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/* eslint-enable react-hooks/refs */\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 {\n createContext,\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport { useRegistry, useShallowStable } from \"./hooks\";\nimport { selectModuleSlice, useInstalledModules } from \"./installed\";\nimport { pickRegistryMetadata } from \"./schema\";\nimport { mergeModuleConfigs } from \"./utils\";\nimport type {\n PageConfig,\n PageController,\n PageControllerStore,\n PageModuleApi,\n PageModules,\n PageOptions,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nconst EMPTY_OBJECT: PageConfig = Object.freeze({});\n\nfunction createPageControllerStore(): PageControllerStore {\n const listeners = new Set<() => void>();\n let stack: {\n controllerRef: { current: PageController | null };\n id: string;\n }[] = [];\n\n const notify = (): void => {\n listeners.forEach((listener) => {\n try {\n listener();\n } catch (error) {\n report(\"Page controller listener\", error);\n }\n });\n };\n\n return {\n getSnapshot(): PageController | null {\n const top = stack[stack.length - 1];\n return top?.controllerRef?.current || null;\n },\n notify,\n register(\n id: string,\n controllerRef: { current: PageController | null },\n ): void {\n stack = stack.filter((item) => item.id !== id);\n stack.push({ controllerRef, id });\n notify();\n },\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n unregister(id: string): void {\n stack = stack.filter((item) => item.id !== id);\n notify();\n },\n };\n}\n\nfunction createControllerScope(): {\n Provider: PageController[\"Provider\"];\n publish: (controller: PageController) => void;\n} {\n const listeners = new Set<() => void>();\n let current: PageController | null = null;\n\n const subscribe = (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n const getSnapshot = () => current;\n\n function PageProvider({ children }: { children?: ReactNode }) {\n const controller = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n return (\n <PageControllerContext value={controller}>\n {children}\n </PageControllerContext>\n );\n }\n\n return {\n Provider: PageProvider,\n publish(controller) {\n if (current === controller) return;\n current = controller;\n listeners.forEach((listener) => listener());\n },\n };\n}\n\nconst fallbackStandaloneStore = createPageControllerStore();\n\nconst noopHook = () => {};\nconst PassthroughProvider = ({ children }: { children?: ReactNode }) =>\n children;\n\nimport { getOrCreateGlobalContext } from \"./context-registry\";\n\nconst PageControllerContext = getOrCreateGlobalContext<PageController | null>(\n \"PageControllerContext\",\n null,\n);\n\nconst PageControllerStoreContext =\n getOrCreateGlobalContext<PageControllerStore>(\n \"PageControllerStoreContext\",\n fallbackStandaloneStore,\n );\n\nexport function PageControllerProvider({ children }: { children?: ReactNode }) {\n const [store] = useState<PageControllerStore>(() =>\n createPageControllerStore(),\n );\n return (\n <PageControllerStoreContext value={store}>\n {children}\n </PageControllerStoreContext>\n );\n}\n\nconst emptySubscribe = () => () => {};\nconst getNullSnapshot = () => null;\n\nconst FALLBACK_PAGE_CONTROLLER: PageController = Object.freeze({\n Provider: PassthroughProvider,\n config: EMPTY_OBJECT,\n modules: Object.freeze({}),\n reset: noopHook,\n set: noopHook,\n});\n\nexport function usePageController(): PageController {\n const scopedContext = use(PageControllerContext);\n const controllerStore = use(PageControllerStoreContext);\n\n const storeSubscribe = scopedContext\n ? emptySubscribe\n : controllerStore.subscribe;\n const storeSnapshot = scopedContext\n ? getNullSnapshot\n : controllerStore.getSnapshot;\n\n const storeController = useSyncExternalStore(\n storeSubscribe,\n storeSnapshot,\n getNullSnapshot,\n );\n\n return scopedContext ?? storeController ?? FALLBACK_PAGE_CONTROLLER;\n}\n\nexport function usePage(\n pageConfig: PageConfig = EMPTY_OBJECT,\n options?: PageOptions,\n): PageController {\n const instanceId = useId();\n const controllerStore = use(PageControllerStoreContext);\n const modules = useInstalledModules();\n\n const [overrides, setOverrides] = useState<Partial<PageConfig>>(EMPTY_OBJECT);\n\n const set = useCallback((partial: Partial<PageConfig>) => {\n if (!partial || typeof partial !== \"object\") return;\n setOverrides((prev) => mergeModuleConfigs(prev, partial));\n }, []);\n\n const reset = useCallback(() => {\n setOverrides(EMPTY_OBJECT);\n }, []);\n\n const effectiveConfig = useMemo<PageConfig>(() => {\n const base = pageConfig || EMPTY_OBJECT;\n if (Object.keys(overrides).length === 0) return base;\n return mergeModuleConfigs(base, overrides);\n }, [pageConfig, overrides]);\n\n const moduleSlices = useMemo(\n () =>\n modules.map((coreModule) =>\n selectModuleSlice(coreModule, effectiveConfig),\n ),\n [effectiveConfig, modules],\n );\n\n const registryMetadata = useMemo(\n () => pickRegistryMetadata(options),\n [options],\n );\n useRegistry(effectiveConfig, registryMetadata);\n\n const pageApi = useMemo<PageModuleApi>(() => ({ set }), [set]);\n const moduleControllers: Record<string, unknown> = {};\n for (let index = 0; index < modules.length; index += 1) {\n const coreModule = modules[index];\n if (coreModule.page?.use) {\n moduleControllers[coreModule.id] = coreModule.page.use(\n moduleSlices[index],\n pageApi,\n );\n }\n }\n const pageModules = useShallowStable(moduleControllers) as PageModules;\n\n const [scope] = useState(createControllerScope);\n\n const controller = useMemo<PageController>(\n () => ({\n Provider: scope.Provider,\n config: effectiveConfig,\n modules: pageModules,\n reset,\n set,\n }),\n [effectiveConfig, pageModules, reset, scope, set],\n );\n\n const controllerRef = useRef<PageController | null>(controller);\n\n useIsomorphicLayoutEffect(() => {\n controllerRef.current = controller;\n scope.publish(controller);\n controllerStore.notify();\n }, [controller, controllerStore, scope]);\n\n useEffect(() => {\n controllerStore.register(instanceId, controllerRef);\n return () => {\n controllerStore.unregister(instanceId);\n };\n }, [controllerStore, instanceId]);\n\n return controller;\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","import {\n createElement,\n Fragment,\n type ComponentType,\n type JSX,\n type ReactNode,\n} from \"react\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- heterogeneous provider list\nexport type ProviderComponent<P = any> = ComponentType<\n P & { children?: ReactNode }\n>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- heterogeneous provider list\nexport type ProviderEntry<P = any> =\n ProviderComponent<P> | readonly [ProviderComponent<P>, P];\n\nexport interface ComposeProps {\n children?: ReactNode;\n providers: readonly ProviderEntry[];\n}\n\nexport function createProviderEntry<P extends object>(\n component: ProviderComponent<P>,\n props: P,\n): readonly [ProviderComponent<P>, P] {\n return [component, props] as const;\n}\n\nexport function Compose({ providers, children }: ComposeProps): JSX.Element {\n return providers.reduceRight<JSX.Element>(\n (acc, entry) => {\n if (Array.isArray(entry)) {\n const [Component, props] = entry;\n return createElement(Component, props, acc);\n }\n const Component = entry as ProviderComponent;\n return createElement(Component, null, acc);\n },\n createElement(Fragment, null, children),\n );\n}\n\nexport function composeProviders(\n providers: readonly ProviderEntry[],\n): (props: { children?: ReactNode }) => JSX.Element {\n function ComposedProviders({\n children,\n }: {\n children?: ReactNode;\n }): JSX.Element {\n return Compose({ providers, children });\n }\n ComposedProviders.displayName = \"ComposedProviders\";\n return ComposedProviders;\n}\n","\"use client\";\n\nexport * from \"./types\";\n\nexport { REGISTRY_SOURCES } from \"./constants\";\n\nexport { hasOwnProperty } from \"./utils\";\n\nexport { createRegistryOperations } from \"./operations\";\n\nexport {\n RegistryProvider,\n useRegistryEntries,\n useRegistryValue,\n} from \"./provider\";\n\nexport { createRegistryStore } from \"./store\";\nexport { createModuleRegistryDefinitions, sortModules } from \"./installed\";\n\nexport {\n ModuleHost,\n defineModule,\n definePeer,\n useModule,\n useIsModuleInstalled,\n ModuleBoundary,\n useModuleState,\n} from \"./module\";\n\nexport { applyRegistryConfig } from \"./handlers\";\n\nexport { createRegistryApplyContext } from \"./hooks\";\n\nexport { useModuleRegistration } from \"./adapters\";\n\nexport {\n PageControllerProvider,\n usePage,\n usePageController,\n} from \"./page-controller\";\n\nexport { Compose, type ProviderEntry } from \"./compose\";\n","\"use client\";\n\nimport {\n createContext,\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\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\nimport { getOrCreateGlobalContext } from \"@/kernel/context-registry\";\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\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. Add its theme file to src/config/ and list it in src/config/index.ts.`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n","export {\n ThemeProvider,\n defineTheme,\n defineThemeSpec,\n useTheme as useModuleTheme,\n} from \"@/theme\";\nexport type {\n ResolvedTheme,\n ThemeConfig,\n ThemeEntry,\n ThemeSpec,\n} from \"@/theme\";\n","import { defineThemeSpec } from \"../theme\";\nimport { type ModalThemeSlot } from \"./types\";\n\nexport const MODAL_POSITIONS = Object.freeze({\n BOTTOM: \"bottom\",\n CENTER: \"center\",\n LEFT: \"left\",\n RIGHT: \"right\",\n TOP: \"top\",\n} as const);\n\nexport const MODAL_CHROME = Object.freeze({\n BARE: \"bare\",\n PANEL: \"panel\",\n} as const);\n\nexport const MODAL_BREAKPOINTS = Object.freeze({\n MOBILE_MAX_WIDTH: 639,\n} as const);\n\nexport const SMOOTH_SCROLL_LOCK_EVENT = \"modal:smooth-scroll-lock\";\n\nexport const FOCUSABLE_SELECTOR =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])';\n\nexport const HEIGHT_CONSTRAINT_PATTERN = /(\\s|^)(?:[\\w-]+:)*(?:h|max-h)-/;\n\nexport const modalTheme = defineThemeSpec<ModalThemeSlot>(\"modal\");\n","import { type Transition, type Variants } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES, MOTION_TIERS } from \"@/tokens\";\nimport { MODAL_POSITIONS } from \"./constants\";\nimport { type ModalPosition } from \"./types\";\n\nconst MODAL_EASINGS = Object.freeze({\n CINEMATIC: EASING_CURVES.OUT_EXPO,\n EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n FLUID: EASING_CURVES.OUT_QUART,\n FLUID_RESIZE: EASING_CURVES.OUT_QUART,\n PROGRESSIVE_EXIT: EASING_CURVES.IN_CUBIC,\n SOFT: EASING_CURVES.OUT_QUART,\n SOFT_EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nconst MODAL_TIERS = MOTION_TIERS;\n\nconst MODAL_DURATIONS = Object.freeze({\n BACKDROP_EXIT: DURATION_TOKENS.FAST,\n BODY: DURATION_TOKENS.BASE,\n BODY_EXIT: DURATION_TOKENS.FAST,\n EDGE_EXIT: DURATION_TOKENS.FAST,\n FAST: DURATION_TOKENS.FAST,\n MODERATE: DURATION_TOKENS.MODERATE,\n SLOT: DURATION_TOKENS.BASE,\n SLOT_EXIT: DURATION_TOKENS.MICRO,\n SLOW: DURATION_TOKENS.SLOW,\n} as const);\n\nconst MODAL_SPRINGS = Object.freeze({\n DECK: Object.freeze({\n damping: 28,\n mass: 0.85,\n stiffness: 240,\n type: \"spring\" as const,\n }),\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.3,\n stiffness: 480,\n type: \"spring\" as const,\n }),\n PANEL: Object.freeze({\n damping: 28,\n mass: 0.85,\n stiffness: 240,\n type: \"spring\" as const,\n }),\n} as const);\n\nexport const MODAL_COMPOSITOR_STYLE = Object.freeze({\n WebkitBackfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n backfaceVisibility: \"hidden\",\n transform: \"translateZ(0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nfunction toCssDistance(value: number | string = 0) {\n return typeof value === \"number\" ? `${Math.round(value)}px` : value;\n}\n\nfunction toGpuTransform(\n yOrConfig?:\n | number\n | string\n | { scale?: number; x?: number | string; y?: number | string },\n scaleValue: number = 1,\n): string {\n if (typeof yOrConfig === \"object\" && yOrConfig !== null) {\n const xVal = yOrConfig.x ?? 0;\n const yVal = yOrConfig.y ?? 0;\n const sVal = yOrConfig.scale ?? 1;\n const safeScale = Number.parseFloat(String(sVal));\n const roundedScale = Number.isFinite(safeScale)\n ? Math.round(safeScale * 1000) / 1000\n : 1;\n return `translate3d(${toCssDistance(xVal)}, ${toCssDistance(yVal)}, 0) scale(${roundedScale})`;\n }\n const safeY = Number.parseFloat(String(yOrConfig));\n const safeScale = Number.parseFloat(String(scaleValue));\n const roundedY = Number.isFinite(safeY) ? Math.round(safeY) : 0;\n const roundedScale = Number.isFinite(safeScale)\n ? Math.round(safeScale * 1000) / 1000\n : 1;\n return `translate3d(0, ${roundedY}px, 0) scale(${roundedScale})`;\n}\n\nconst MODAL_PANEL_SPRING = MODAL_SPRINGS.PANEL;\n\nconst MODAL_BACKDROP_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.SLOW,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_BACKDROP_EXIT_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.BACKDROP_EXIT,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_SURFACE_ENTER_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.SLOW,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_SURFACE_EXIT_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.EDGE_EXIT,\n ease: MODAL_EASINGS.EXIT,\n type: \"tween\" as const,\n});\n\nconst MODAL_BODY_ENTER_TRANSITION = Object.freeze({\n delay: 0.04,\n duration: MODAL_DURATIONS.BODY,\n ease: MODAL_EASINGS.FLUID,\n type: \"tween\" as const,\n});\n\nconst MODAL_BODY_EXIT_TRANSITION = Object.freeze({\n duration: MODAL_DURATIONS.BODY_EXIT,\n ease: MODAL_EASINGS.EXIT,\n type: \"tween\" as const,\n});\n\nexport const MODAL_CONTENT_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.98,\n y: 12,\n }),\n transition: MODAL_BODY_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.98,\n y: 12,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: MODAL_BODY_ENTER_TRANSITION,\n },\n});\n\nexport const MODAL_HEADER_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: -6,\n }),\n transition: {\n duration: MODAL_DURATIONS.SLOT_EXIT,\n ease: MODAL_EASINGS.EXIT,\n },\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: -6,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n delay: 0.02,\n duration: MODAL_DURATIONS.SLOT,\n ease: MODAL_EASINGS.FLUID,\n },\n },\n});\n\nexport const MODAL_FOOTER_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: 6,\n }),\n transition: {\n duration: MODAL_DURATIONS.SLOT_EXIT,\n ease: MODAL_EASINGS.EXIT,\n },\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.99,\n y: 6,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n delay: 0.06,\n duration: MODAL_DURATIONS.SLOT,\n ease: MODAL_EASINGS.FLUID,\n },\n },\n});\n\nfunction buildVariants(\n tierName: keyof typeof MODAL_TIERS,\n {\n axis,\n direction = 1,\n fullSlide = false,\n }: { axis: \"x\" | \"y\"; direction?: number; fullSlide?: boolean },\n): Variants {\n const tier = MODAL_TIERS[tierName];\n const distance = fullSlide ? \"100%\" : tier.distance;\n const signedDistance =\n direction < 0 ? (fullSlide ? \"-100%\" : -Number(distance)) : distance;\n const transform =\n axis === \"x\"\n ? {\n x: signedDistance,\n }\n : {\n y: signedDistance,\n };\n return Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform(transform),\n transition: MODAL_SURFACE_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform(transform),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: MODAL_SURFACE_ENTER_TRANSITION,\n },\n });\n}\n\nexport const modalBackdropVariants: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transition: MODAL_BACKDROP_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n },\n visible: {\n opacity: 1,\n transition: MODAL_BACKDROP_TRANSITION,\n },\n});\n\nconst CENTER_VARIANTS: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.96,\n y: 8,\n }),\n transition: {\n duration: MODAL_DURATIONS.FAST,\n ease: MODAL_EASINGS.EXIT,\n },\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform({\n scale: 0.95,\n y: 12,\n }),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(),\n transition: {\n duration: MODAL_TIERS.STANDARD.duration,\n ease: MODAL_EASINGS.FLUID,\n },\n },\n});\n\nconst BOTTOM_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"y\",\n fullSlide: true,\n});\nconst RIGHT_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"x\",\n fullSlide: true,\n});\nconst LEFT_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"x\",\n direction: -1,\n fullSlide: true,\n});\nconst TOP_VARIANTS = buildVariants(\"SURFACE\", {\n axis: \"y\",\n direction: -1,\n fullSlide: true,\n});\n\nexport function getModalPositionVariants(position: ModalPosition): Variants {\n switch (position) {\n case MODAL_POSITIONS.BOTTOM:\n return BOTTOM_VARIANTS;\n case MODAL_POSITIONS.RIGHT:\n return RIGHT_VARIANTS;\n case MODAL_POSITIONS.LEFT:\n return LEFT_VARIANTS;\n case MODAL_POSITIONS.TOP:\n return TOP_VARIANTS;\n case MODAL_POSITIONS.CENTER:\n default:\n return CENTER_VARIANTS;\n }\n}\n\nexport function getModalTransition(\n position: ModalPosition,\n): Transition | undefined {\n return position === MODAL_POSITIONS.CENTER ? MODAL_PANEL_SPRING : undefined;\n}\n","import { isValidElement, type ReactNode } from \"react\";\nimport { isPlainObject } from \"@/utils\";\nimport {\n FOCUSABLE_SELECTOR,\n HEIGHT_CONSTRAINT_PATTERN,\n MODAL_BREAKPOINTS,\n MODAL_CHROME,\n MODAL_POSITIONS,\n SMOOTH_SCROLL_LOCK_EVENT,\n} from \"./constants\";\nimport {\n type DefineModalOptions,\n type ModalComponent,\n type ModalEntry,\n type ModalInput,\n type ModalPosition,\n type ModalState,\n type ModalLayout,\n type ResponsiveModalPosition,\n} from \"./types\";\n\nexport function getModalIdentity(input: ModalInput | DefineModalOptions): {\n component: ModalComponent | null;\n type: string;\n} {\n if (typeof input === \"string\") return { component: null, type: input };\n const options = typeof input === \"function\" ? { component: input } : input;\n const component = options.component ?? null;\n return {\n component,\n type:\n (\"type\" in options && options.type) ||\n (\"id\" in options && options.id) ||\n component?.displayName ||\n component?.name ||\n \"modal\",\n };\n}\n\nexport function hasHeightConstraint(className?: string): boolean {\n return (\n typeof className === \"string\" && HEIGHT_CONSTRAINT_PATTERN.test(className)\n );\n}\n\nexport function isSidePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.LEFT || position === MODAL_POSITIONS.RIGHT\n );\n}\n\nexport function isVerticalEdgePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.TOP || position === MODAL_POSITIONS.BOTTOM\n );\n}\n\nexport function hasSlotContent(value: unknown): boolean {\n return (\n value !== null && value !== undefined && value !== false && value !== \"\"\n );\n}\n\nexport function isHeaderConfig(value: unknown): boolean {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !isValidElement(value),\n );\n}\n\nexport function resolveHeaderActions(\n actions:\n | ReactNode\n | ((props: { close?: (result?: unknown) => void }) => ReactNode)\n | undefined,\n close?: (result?: unknown) => void,\n): ReactNode {\n return typeof actions === \"function\" ? actions({ close }) : actions || null;\n}\n\nexport function getModalPosition(position: ModalPosition): ModalPosition {\n return position === MODAL_POSITIONS.TOP ||\n position === MODAL_POSITIONS.BOTTOM ||\n position === MODAL_POSITIONS.LEFT ||\n position === MODAL_POSITIONS.RIGHT\n ? position\n : MODAL_POSITIONS.CENTER;\n}\n\n/**\n * The fully resolved layout of a modal. Themes style it through\n * `data-layout`, so every position/viewport combination is one selector.\n */\nexport function getModalLayout(\n position: ModalPosition,\n isMobile: boolean,\n): ModalLayout {\n const resolved = getModalPosition(position);\n if (!isMobile) return resolved;\n if (resolved === MODAL_POSITIONS.TOP || resolved === MODAL_POSITIONS.BOTTOM)\n return `${resolved}-mobile`;\n if (resolved === MODAL_POSITIONS.LEFT || resolved === MODAL_POSITIONS.RIGHT)\n return \"side-mobile\";\n return resolved;\n}\n\nexport function dispatchSmoothScrollLock(locked: boolean): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SMOOTH_SCROLL_LOCK_EVENT, {\n detail: { locked, source: \"modal\" },\n }),\n );\n}\n\nexport function getViewportIsMobile(): boolean {\n if (\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return false;\n }\n return window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n ).matches;\n}\n\nexport function resolveActivePosition(\n position: ModalPosition,\n responsivePosition: ResponsiveModalPosition | null | undefined,\n isMobileViewport: boolean,\n): ModalPosition {\n if (!isPlainObject(responsivePosition)) return position;\n const responsive = isMobileViewport\n ? responsivePosition.mobile\n : responsivePosition.desktop;\n return (responsive || position) as ModalPosition;\n}\n\nexport function normalizePosition(\n input: ModalPosition | ResponsiveModalPosition | undefined,\n): {\n position: ModalPosition;\n responsivePosition: ResponsiveModalPosition | null;\n} {\n if (typeof input === \"string\") {\n return { position: input, responsivePosition: null };\n }\n if (!isPlainObject(input)) {\n return { position: MODAL_POSITIONS.CENTER, responsivePosition: null };\n }\n return {\n position: resolveActivePosition(\n MODAL_POSITIONS.CENTER,\n input,\n getViewportIsMobile(),\n ),\n responsivePosition: input,\n };\n}\n\nexport function getFocusableElements(\n container: HTMLElement | null,\n): HTMLElement[] {\n if (!container || typeof container.querySelectorAll !== \"function\") return [];\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter(\n (element) =>\n !element.hasAttribute(\"disabled\") &&\n element.getAttribute(\"aria-hidden\") !== \"true\",\n );\n}\n\nexport function trapFocus(\n event: KeyboardEvent,\n container: HTMLElement | null,\n): void {\n if (event.key !== \"Tab\" || !container) return;\n const elements = getFocusableElements(container);\n if (elements.length === 0) return;\n\n const firstElement = elements[0];\n const lastElement = elements[elements.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n}\n\nexport function getModalLabel(modalType?: string | null): string {\n if (typeof modalType !== \"string\" || !modalType.trim()) return \"Modal\";\n return modalType\n .trim()\n .toLowerCase()\n .split(/[_-]+/)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n","import { MODAL_CHROME, MODAL_POSITIONS } from \"./constants\";\nimport { type ModalEntry, type ModalState } from \"./types\";\n\nexport function createModalState(modalStack: ModalEntry[] = []): ModalState {\n const activeModal = modalStack[modalStack.length - 1] || null;\n return {\n activeModalId: activeModal?.id || null,\n chrome: activeModal?.chrome || MODAL_CHROME.PANEL,\n headerActions: activeModal?.headerActions || null,\n isOpen: modalStack.length > 0,\n modalStack,\n modalType: activeModal?.modalType || null,\n position: activeModal?.position || MODAL_POSITIONS.CENTER,\n props: activeModal?.props || {},\n responsivePosition: activeModal?.responsivePosition || null,\n showClose: activeModal?.showClose ?? true,\n title: activeModal?.title || null,\n };\n}\n\nexport const INITIAL_MODAL_STATE = createModalState([]);\n","\"use client\";\n\nimport { createContext, useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n useRegistryEntries,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport { MODAL_CHROME } from \"./constants\";\nimport {\n type ModalActions,\n type ModalComponent,\n type ModalEntry,\n type ModalHookBinding,\n type ModalHookControls,\n type ModalInput,\n type ModalOpenFn,\n type ModalOptions,\n type ModalPageConfig,\n type ModalProviderProps,\n type ModalState,\n} from \"./types\";\nimport { INITIAL_MODAL_STATE, createModalState } from \"./state\";\nimport { getModalIdentity, normalizePosition } from \"./utils\";\nimport { report } from \"@/utils\";\n\nexport interface ModalContextValue {\n actions: ModalActions;\n store: ExternalStore<ModalState>;\n}\nimport { getOrCreateGlobalContext } from \"@/kernel/context-registry\";\n\nexport const ModalContext = getOrCreateGlobalContext<ModalContextValue | null>(\n \"ModalContext\",\n null,\n);\n\nexport function useModalRegistration(\n config: ModalPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"modal\", config, options);\n}\n\nexport function useModalRegistryEntries(): {\n get: (type: string) => ModalComponent | undefined;\n} {\n const entries = useRegistryEntries<\"modal\", ModalComponent>(\"modal\");\n return useMemo(() => ({ get: (type: string) => entries[type] }), [entries]);\n}\n\ninterface PendingModal {\n onClose?: ModalOptions[\"onClose\"];\n resolve: (result?: unknown) => void;\n}\n\nexport function ModalProvider({\n children,\n modalRenderer: ModalRenderer = null,\n}: ModalProviderProps) {\n const [store] = useState(() =>\n createStore<ModalState>(INITIAL_MODAL_STATE, { freezeSnapshots: false }),\n );\n\n const modalStackRef = useRef<ModalEntry[]>([]);\n const pendingRef = useRef<Map<number, PendingModal>>(new Map());\n const modalIdRef = useRef(0);\n\n const syncModalStack = useCallback(\n (nextStack: ModalEntry[]) => {\n modalStackRef.current = nextStack;\n store.publish(createModalState(nextStack));\n },\n [store],\n );\n\n const settleModal = useCallback((modalId: number, result: unknown) => {\n const pending = pendingRef.current.get(modalId);\n if (!pending) return;\n pendingRef.current.delete(modalId);\n\n try {\n const outcome = pending.onClose?.(result);\n if (outcome instanceof Promise) {\n outcome.catch((error) => report(\"Modal onClose\", error));\n }\n } catch (error) {\n report(\"Modal onClose\", error);\n }\n pending.resolve(result);\n }, []);\n\n const openModal = useCallback<ModalActions[\"openModal\"]>(\n (modalInput, options = {}) => {\n if (!modalInput) return Promise.resolve(null);\n\n const stack = modalStackRef.current;\n const { component, type } = getModalIdentity(modalInput);\n const topEntry = stack[stack.length - 1];\n if (\n topEntry &&\n (topEntry.modalType === type ||\n (component && topEntry.component === component))\n ) {\n return Promise.resolve(null);\n }\n\n const definition =\n typeof modalInput === \"object\" ? modalInput : undefined;\n const merged: ModalOptions & { defaultData?: Record<string, unknown> } = {\n ...definition,\n ...options,\n };\n const data = { ...definition?.defaultData, ...options.data };\n const modalId = ++modalIdRef.current;\n\n const entry: ModalEntry = {\n chrome: merged.chrome || MODAL_CHROME.PANEL,\n component,\n headerActions: merged.actions || null,\n id: modalId,\n modalType: type,\n props: data,\n showClose: merged.showClose ?? true,\n title:\n typeof merged.title === \"function\"\n ? merged.title(data)\n : (merged.title ?? null),\n ...normalizePosition(merged.position),\n };\n\n return new Promise((resolve) => {\n pendingRef.current.set(modalId, { onClose: merged.onClose, resolve });\n syncModalStack([...stack, entry]);\n });\n },\n [syncModalStack],\n );\n\n const closeModal = useCallback<ModalActions[\"closeModal\"]>(\n (result = null, targetModalId = null) => {\n const stack = modalStackRef.current;\n const modalId = targetModalId || stack[stack.length - 1]?.id;\n if (!modalId || !stack.some((entry) => entry.id === modalId)) return;\n\n syncModalStack(stack.filter((entry) => entry.id !== modalId));\n settleModal(modalId, result);\n },\n [settleModal, syncModalStack],\n );\n\n const closeAllModals = useCallback<ModalActions[\"closeAllModals\"]>(\n (result = null) => {\n const stack = modalStackRef.current;\n if (stack.length === 0) return;\n\n syncModalStack([]);\n stack.forEach((entry) => settleModal(entry.id, result));\n },\n [settleModal, syncModalStack],\n );\n\n const actionsValue = useMemo<ModalActions>(\n () => ({ closeAllModals, closeModal, openModal }),\n [openModal, closeModal, closeAllModals],\n );\n\n const contextValue = useMemo<ModalContextValue>(\n () => ({ actions: actionsValue, store }),\n [actionsValue, store],\n );\n\n return (\n <ModalContext value={contextValue}>\n {ModalRenderer && <ModalRenderer />}\n {children}\n </ModalContext>\n );\n}\n\nexport function useModalActions(): ModalActions {\n return useRequiredContext(ModalContext, \"useModalActions\", \"ModalProvider\")\n .actions;\n}\n\nexport function useModalState(): ModalState {\n const { store } = useRequiredContext(\n ModalContext,\n \"useModalState\",\n \"ModalProvider\",\n );\n return useStore(store);\n}\n\nexport function useModal(): ModalState & ModalActions;\nexport function useModal(modalInput: ModalInput): ModalHookBinding;\nexport function useModal(\n modalInput?: ModalInput | null,\n): (ModalState & ModalActions) | ModalHookBinding {\n const actions = useModalActions();\n const state = useModalState();\n\n return useMemo(() => {\n if (!modalInput) return { ...actions, ...state };\n\n const { component, type } = getModalIdentity(modalInput);\n const isOpen = state.modalStack.some(\n (entry) =>\n entry.modalType === type ||\n (component && entry.component === component),\n );\n const open: ModalOpenFn = (data, overrides) =>\n actions.openModal(modalInput, { ...overrides, data });\n const controls: ModalHookControls = {\n close: actions.closeModal,\n closeAll: actions.closeAllModals,\n isOpen,\n state,\n };\n\n return Object.assign([open, controls], controls, { open });\n }, [actions, modalInput, state]) as\n (ModalState & ModalActions) | ModalHookBinding;\n}\n","\"use client\";\n\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { acquireGlobalScrollLock } from \"@/utils\";\nimport { useModuleTheme } from \"../theme\";\nimport {\n MODAL_BREAKPOINTS,\n MODAL_CHROME,\n MODAL_POSITIONS,\n modalTheme,\n} from \"./constants\";\nimport { type ModalComponent, type ModalEntry } from \"./types\";\nimport {\n dispatchSmoothScrollLock,\n getFocusableElements,\n getViewportIsMobile,\n isSidePosition,\n isVerticalEdgePosition,\n resolveActivePosition,\n trapFocus,\n} from \"./utils\";\nimport { useModal, useModalRegistryEntries } from \"./context\";\n\nconst emptySubscribe = () => () => {};\n\nexport function useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n}) {\n const modalRef = useRef<HTMLDivElement | null>(null);\n const activePosition = useMemo(\n () =>\n resolveActivePosition(\n entry.position,\n entry.responsivePosition,\n isMobileViewport,\n ),\n [entry.position, entry.responsivePosition, isMobileViewport],\n );\n const ActiveModalComponent = entry.component || registry.get(entry.modalType);\n const isPanelChrome = entry.chrome !== MODAL_CHROME.BARE;\n const isLeftModal = activePosition === MODAL_POSITIONS.LEFT;\n const isSide = isSidePosition(activePosition);\n const isVerticalEdge = isVerticalEdgePosition(activePosition);\n const previousEntry = modalStack[stackIndex - 1] || null;\n const baseZIndex = Z_INDEX.MODAL;\n useEffect(() => {\n if (!isTopModal || !modalRef.current) return;\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n const initialElements = getFocusableElements(modalRef.current);\n if (initialElements.length > 0) initialElements[0].focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") closeModal(null, entry.id);\n else trapFocus(event, modalRef.current);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n if (previouslyFocusedElement?.isConnected)\n previouslyFocusedElement.focus();\n };\n }, [closeModal, entry.id, isTopModal]);\n\n return {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n isLeftModal,\n isSide,\n isVerticalEdge,\n previousEntry,\n baseZIndex,\n };\n}\n\nexport function useModalContainerModel() {\n return { theme: useModuleTheme(modalTheme) };\n}\n\nexport function useModalModel() {\n const { modalStack = [], isOpen, closeModal } = useModal();\n const registry = useModalRegistryEntries();\n const visibleModalStack = useMemo(\n () =>\n modalStack.filter((entry: ModalEntry) =>\n Boolean(entry.component || registry.get(entry.modalType)),\n ),\n [modalStack, registry],\n );\n const topModalEntry = visibleModalStack[visibleModalStack.length - 1] || null;\n const isModalVisible = Boolean(isOpen && topModalEntry);\n const mounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n const [isMobileViewport, setIsMobileViewport] = useState(getViewportIsMobile);\n const [isTopExitSettling, setIsTopExitSettling] = useState(false);\n const previousTopModalIdRef = useRef<number | null>(null);\n const releaseScrollLockRef = useRef<(() => void) | null>(null);\n useLayoutEffect(() => {\n const currentTopModalId = topModalEntry?.id || null;\n const previousTopModalId = previousTopModalIdRef.current;\n const previousTopStillMounted = visibleModalStack.some(\n (entry: ModalEntry) => entry.id === previousTopModalId,\n );\n\n if (\n previousTopModalId &&\n previousTopModalId !== currentTopModalId &&\n !previousTopStillMounted\n ) {\n setIsTopExitSettling(true);\n }\n previousTopModalIdRef.current = currentTopModalId;\n }, [topModalEntry?.id, visibleModalStack]);\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n );\n const handleViewportChange = (e: MediaQueryListEvent) =>\n setIsMobileViewport(e.matches);\n\n mediaQuery.addEventListener(\"change\", handleViewportChange);\n return () => mediaQuery.removeEventListener(\"change\", handleViewportChange);\n }, []);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n if (isModalVisible) {\n releaseScrollLockRef.current ??= acquireGlobalScrollLock();\n } else if (releaseScrollLockRef.current) {\n releaseScrollLockRef.current();\n releaseScrollLockRef.current = null;\n }\n dispatchSmoothScrollLock(isModalVisible);\n }, [isModalVisible]);\n useEffect(() => {\n return () => {\n releaseScrollLockRef.current?.();\n releaseScrollLockRef.current = null;\n dispatchSmoothScrollLock(false);\n };\n }, []);\n\n return {\n modalStack,\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme: useModuleTheme(modalTheme),\n };\n}\n","\"use client\";\n\nimport { createElement, type ReactNode } from \"react\";\nimport { motion, AnimatePresence, type Variants } from \"motion/react\";\nimport { Button, Icon } from \"@/atoms\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { cn } from \"@/utils\";\nimport { createPortal } from \"react-dom\";\nimport { ModuleBoundary } from \"@/kernel\";\nimport { MODAL_POSITIONS } from \"./constants\";\nimport {\n MODAL_CONTENT_VARIANTS,\n MODAL_FOOTER_VARIANTS,\n MODAL_HEADER_VARIANTS,\n MODAL_COMPOSITOR_STYLE,\n getModalPositionVariants,\n getModalTransition,\n modalBackdropVariants,\n} from \"./motion\";\nimport {\n type ModalContainerFooterConfig,\n type ModalContainerHeaderConfig,\n type ModalContainerProps,\n type ModalThemeSlot,\n type ModalComponent,\n type ModalEntry,\n} from \"./types\";\nimport {\n hasHeightConstraint,\n hasSlotContent,\n isHeaderConfig,\n isSidePosition,\n resolveHeaderActions,\n getModalLabel,\n getModalLayout,\n getModalPosition,\n} from \"./utils\";\nimport {\n useModalContainerModel,\n useModalLayerModel,\n useModalModel,\n} from \"./hooks\";\nimport { type ResolvedTheme } from \"../theme\";\n\ntype Theme = ResolvedTheme<ModalThemeSlot>;\n\nfunction CloseButton({\n close,\n theme,\n}: {\n close?: (result?: unknown) => void;\n theme: Theme;\n}) {\n if (typeof close !== \"function\") return null;\n return (\n <Button\n type=\"button\"\n aria-label=\"Close modal\"\n onClick={close}\n className={theme.slots.closeButton}\n >\n <Icon icon=\"solar:close-bold\" size={16} />\n </Button>\n );\n}\n\nfunction SlotRow({\n center,\n left,\n right,\n sticky,\n theme,\n variants,\n}: {\n center: ReactNode;\n left: ReactNode;\n right: ReactNode;\n sticky?: \"top\" | \"bottom\";\n theme: Theme;\n variants: Variants;\n}) {\n const hasCenter = hasSlotContent(center);\n return (\n <motion.div\n variants={variants}\n initial=\"hidden\"\n animate=\"visible\"\n data-columns={hasCenter ? 3 : 2}\n data-sticky={sticky}\n className={theme.slots.row}\n style={sticky ? theme.styles.row : undefined}\n >\n <div className={theme.slots.rowStart}>{left}</div>\n {hasCenter && <div className={theme.slots.rowCenter}>{center}</div>}\n <div className={theme.slots.rowEnd}>{right}</div>\n </motion.div>\n );\n}\n\nfunction resolveHeader(\n header: ModalContainerProps[\"header\"],\n close: ModalContainerProps[\"close\"],\n theme: Theme,\n) {\n const config: ModalContainerHeaderConfig = isHeaderConfig(header)\n ? (header as ModalContainerHeaderConfig)\n : {};\n const customNode =\n typeof header !== \"boolean\" &&\n !isHeaderConfig(header) &&\n hasSlotContent(header)\n ? (header as ReactNode)\n : null;\n const actions = resolveHeaderActions(config.actions, close);\n const showClose = config.showClose === true;\n\n const left =\n customNode !== null\n ? null\n : (config.left ??\n (config.title ? (\n <h2 id={config.titleId} className={theme.slots.title}>\n {config.title}\n </h2>\n ) : null));\n const right =\n customNode !== null\n ? null\n : (config.right ??\n (hasSlotContent(actions) || showClose ? (\n <>\n {actions}\n {showClose && <CloseButton close={close} theme={theme} />}\n </>\n ) : null));\n\n return { center: customNode ?? config.center ?? null, config, left, right };\n}\n\nexport function ModalContainer({\n bodyClassName,\n children,\n className,\n close,\n footer,\n header = {},\n position = null,\n}: ModalContainerProps) {\n const { theme } = useModalContainerModel();\n const headerRow =\n header === false ? null : resolveHeader(header, close, theme);\n const shouldRenderHeader =\n headerRow &&\n [headerRow.left, headerRow.center, headerRow.right].some(hasSlotContent);\n\n const footerConfig: ModalContainerFooterConfig =\n footer && typeof footer === \"object\"\n ? (footer as ModalContainerFooterConfig)\n : {};\n const {\n center: footerCenter = null,\n left: footerLeft = null,\n right: footerRight = null,\n } = footerConfig;\n const shouldRenderFooter =\n footer !== false &&\n [footerLeft, footerCenter, footerRight].some(hasSlotContent);\n\n const resolvedPosition = position || headerRow?.config.position || null;\n\n return (\n <div\n data-height={\n isSidePosition(resolvedPosition)\n ? \"full\"\n : hasHeightConstraint(className)\n ? undefined\n : \"capped\"\n }\n className={cn(theme.slots.content, className)}\n >\n {shouldRenderHeader && (\n <SlotRow\n variants={MODAL_HEADER_VARIANTS}\n left={headerRow.left}\n center={headerRow.center}\n right={headerRow.right}\n theme={theme}\n sticky={headerRow.config.sticky ? \"top\" : undefined}\n />\n )}\n\n <motion.div\n variants={MODAL_CONTENT_VARIANTS}\n initial=\"hidden\"\n animate=\"visible\"\n data-lenis-prevent\n data-lenis-prevent-wheel\n className={cn(theme.slots.body, bodyClassName)}\n >\n {children}\n </motion.div>\n\n {shouldRenderFooter && (\n <SlotRow\n variants={MODAL_FOOTER_VARIANTS}\n left={footerLeft}\n center={footerCenter}\n right={footerRight}\n theme={theme}\n sticky={footerConfig.sticky ? \"bottom\" : undefined}\n />\n )}\n </div>\n );\n}\n\nfunction ModalLayerSwitcher({\n currentEntry,\n onSwitchToPrevious,\n previousEntry,\n theme,\n}: {\n currentEntry: ModalEntry;\n onSwitchToPrevious: () => void;\n previousEntry: ModalEntry;\n theme: Theme;\n}) {\n return (\n <div className={theme.slots.switcher}>\n <Button\n type=\"button\"\n onClick={onSwitchToPrevious}\n className={theme.slots.switcherButton}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {getModalLabel(previousEntry.modalType)}\n </Button>\n <span className={theme.slots.switcherDivider}>/</span>\n <span className={theme.slots.switcherCurrent}>\n {getModalLabel(currentEntry.modalType)}\n </span>\n </div>\n );\n}\n\nfunction ModalLayer({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n theme,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n theme: Theme;\n}) {\n const {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n previousEntry,\n baseZIndex,\n } = useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n });\n if (!ActiveModalComponent) return null;\n const layout = getModalLayout(activePosition, isMobileViewport);\n return (\n <div\n role=\"dialog\"\n aria-modal={isTopModal}\n aria-labelledby={entry.title ? `modal-title-${entry.id}` : undefined}\n style={{ zIndex: baseZIndex }}\n data-position={getModalPosition(activePosition)}\n data-inset={\n activePosition === MODAL_POSITIONS.CENTER && !isMobileViewport\n ? true\n : undefined\n }\n className={theme.slots.layer}\n >\n <motion.div\n ref={modalRef}\n variants={getModalPositionVariants(activePosition)}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n transition={getModalTransition(activePosition)}\n data-active={isTopModal}\n data-layout={layout}\n className={theme.slots.frame}\n style={{ zIndex: Z_INDEX.MODAL_FRAME, ...MODAL_COMPOSITOR_STYLE }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n data-layout={layout}\n className={cn(\n theme.slots.panel,\n isPanelChrome ? theme.slots.panelChrome : theme.slots.panelBare,\n )}\n >\n <ModuleBoundary name={entry.modalType}>\n {createElement(ActiveModalComponent, {\n close: (result: unknown) => closeModal(result, entry.id),\n data: entry.props,\n header: {\n actions: entry.headerActions,\n position: activePosition,\n showClose: entry.showClose,\n title: entry.title,\n titleId: `modal-title-${entry.id}`,\n },\n })}\n </ModuleBoundary>\n\n {!isTopModal && (\n <div\n onClick={(e) => {\n e.stopPropagation();\n const topModal = modalStack[modalStack.length - 1];\n if (topModal) closeModal(null, topModal.id);\n }}\n className={theme.slots.dim}\n style={theme.styles.dim}\n aria-label=\"Close active top modal\"\n />\n )}\n\n {isTopModal && stackIndex > 0 && previousEntry && (\n <ModalLayerSwitcher\n currentEntry={entry}\n previousEntry={previousEntry}\n theme={theme}\n onSwitchToPrevious={() => closeModal(null, entry.id)}\n />\n )}\n </div>\n </motion.div>\n </div>\n );\n}\n\nexport function Modal() {\n const {\n modalStack,\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme,\n } = useModalModel();\n if (!mounted) return null;\n return createPortal(\n <>\n <AnimatePresence>\n {isModalVisible && (\n <motion.div\n key=\"global-modal-backdrop\"\n variants={modalBackdropVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n className={theme.slots.backdrop}\n style={theme.styles.backdrop}\n onClick={() => {\n if (!isTopExitSettling) closeModal(null, topModalEntry.id);\n }}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence onExitComplete={() => setIsTopExitSettling(false)}>\n {visibleModalStack.map((entry: ModalEntry, index: number) => (\n <ModalLayer\n key={entry.id}\n entry={entry}\n stackIndex={index}\n isTopModal={\n index === visibleModalStack.length - 1 && !isTopExitSettling\n }\n isMobileViewport={isMobileViewport}\n closeModal={closeModal}\n registry={registry}\n modalStack={visibleModalStack}\n theme={theme}\n />\n ))}\n </AnimatePresence>\n </>,\n document.body,\n );\n}\n","\"use client\";\n\nexport { Modal } from \"./overlay\";\nexport { ModalContainer } from \"./overlay\";\nexport {\n ModalContext,\n ModalProvider,\n useModal,\n useModalActions,\n useModalRegistration,\n useModalState,\n type ModalContextValue,\n} from \"./context\";\nexport { defineModal, modalModule } from \"./module\";\nexport { MODAL_CHROME, MODAL_POSITIONS, modalTheme } from \"./constants\";\nexport type * from \"./types\";\n","\"use client\";\n\nimport { useInsertionEffect, useMemo, useRef } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport dynamic from \"next/dynamic\";\nimport {\n ModalContext,\n ModalProvider,\n useModal,\n useModalActions,\n} from \"./context\";\nimport {\n type DefineModalOptions,\n type ModalDefinition,\n type ModalInput,\n type ModalPageApi,\n type ModalPageConfig,\n} from \"./types\";\nimport { getModalIdentity } from \"./utils\";\n\nconst LazyModal = dynamic(\n () => import(\"./overlay\").then((view) => view.Modal),\n {\n ssr: false,\n },\n);\n\nfunction selectPageModals(config: PageConfig): ModalPageConfig | null {\n return config.modal ?? null;\n}\n\nfunction useModalPage(\n slice: ModalPageConfig | null,\n page: PageModuleApi,\n): ModalPageApi {\n const actions = useModalActions();\n const sliceRef = useRef(slice);\n useInsertionEffect(() => {\n sliceRef.current = slice;\n }, [slice]);\n\n return useMemo(\n () => ({\n ...actions,\n open: (modal: ModalInput, data: Record<string, unknown> = {}) => {\n const own =\n typeof modal === \"string\" && modal !== \"registry\"\n ? sliceRef.current?.[modal]\n : undefined;\n return actions.openModal((own as ModalInput) ?? modal, { data });\n },\n set: (modal: ModalPageConfig) => page.set({ modal }),\n }),\n [actions, page],\n );\n}\n\nexport const modalModule = defineModule({\n id: \"modal\",\n context: ModalContext,\n Provider: ModalProvider,\n Overlay: LazyModal,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"named\",\n lifecycle: \"immediate\",\n valueKind: \"component\",\n },\n page: {\n select: selectPageModals,\n entries: (slice: ModalPageConfig) =>\n Object.entries(slice).map(([key, value]) => ({ key, value })),\n use: useModalPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n modal: typeof modalModule;\n }\n interface PageConfig {\n modal?: ModalPageConfig;\n }\n}\n\nexport function defineModal(\n definition: DefineModalOptions = {},\n): ModalDefinition {\n const { type } = getModalIdentity(definition);\n\n const modalDefinition: ModalDefinition = Object.freeze({\n ...definition,\n id: definition.id || type,\n isModalDefinition: true,\n type,\n use: function useDefinedModal() {\n return useModal(modalDefinition);\n },\n });\n return modalDefinition;\n}\n"]}
|