{"version":3,"sources":["../src/core/history.ts","../src/errors.ts","../src/core/route.ts","../src/navigation/guards.ts","../src/navigation/errors.ts","../src/core/RouterConfig.ts","../src/core/context.ts","../src/core/router.ts","../src/utils/composables.ts","../src/components/RouterView.ts","../src/components/Link.ts","../src/types/index.ts","../src/utils/transitions.ts"],"names":["getServerRenderUrl","path","Data","parseRoutePattern","compileRoutePattern","compareRoutePatterns","matchRoutePattern","resolveRoutePattern","pipe","Arr","Option","Predicate","Effect","$is","$match","Config","createRuntimeContext","signal","runWithCoreRouterContext","SubscriptionRef","pathname","query","hash","setCoreGlobalRouter","markRaw","computed","watchEffect","isBlueprintComponent","CreateBlueprintNode","EFFUSE_NODE","CreateElementNode","define","inject","provide","rendered","content","Schema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nexport interface RouterHistory {\n\treadonly push: (path: string) => void;\n\treadonly replace: (path: string) => void;\n\treadonly go: (delta: number) => void;\n\treadonly back: () => void;\n\treadonly forward: () => void;\n\treadonly listen: (callback: () => void) => () => void;\n\treadonly getCurrentPath: () => string;\n}\n\nimport { getServerRenderUrl } from '@effuse/core';\n\nconst isBrowser = (): boolean => typeof window !== 'undefined';\n\n/**\n * The path a history should report when there is no `window`.\n *\n * During SSR this is the URL of the render in progress, so a web-history\n * router resolves the request that is actually being rendered. Returning a\n * bare `'/'` made every server-rendered request resolve the root route, which\n * a browser hid: hydration read the real location and swapped the correct one\n * in, so only crawlers and JS-disabled clients ever saw the wrong page.\n */\nconst serverPath = (): string => getServerRenderUrl() ?? '/';\n\nexport const createWebHistory = (base: string = ''): RouterHistory => {\n\tconst normalizeBase = base.replace(/\\/$/, '');\n\n\treturn {\n\t\tpush: (path: string) => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.pushState({}, '', normalizeBase + path);\n\t\t\twindow.dispatchEvent(new PopStateEvent('popstate'));\n\t\t},\n\t\treplace: (path: string) => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.replaceState({}, '', normalizeBase + path);\n\t\t\twindow.dispatchEvent(new PopStateEvent('popstate'));\n\t\t},\n\t\tgo: (delta: number) => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.go(delta);\n\t\t},\n\t\tback: () => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.back();\n\t\t},\n\t\tforward: () => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.forward();\n\t\t},\n\t\tlisten: (callback: () => void) => {\n\t\t\tif (!isBrowser()) return () => {};\n\t\t\twindow.addEventListener('popstate', callback);\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener('popstate', callback);\n\t\t\t};\n\t\t},\n\t\tgetCurrentPath: () => {\n\t\t\tif (!isBrowser()) {\n\t\t\t\tconst path = serverPath();\n\t\t\t\treturn normalizeBase ? path.replace(normalizeBase, '') || '/' : path;\n\t\t\t}\n\t\t\tconst path =\n\t\t\t\twindow.location.pathname +\n\t\t\t\twindow.location.search +\n\t\t\t\twindow.location.hash;\n\t\t\treturn normalizeBase ? path.replace(normalizeBase, '') || '/' : path;\n\t\t},\n\t};\n};\n\nexport const createHashHistory = (): RouterHistory => {\n\treturn {\n\t\tpush: (path: string) => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.location.hash = path;\n\t\t},\n\t\treplace: (path: string) => {\n\t\t\tif (!isBrowser()) return;\n\t\t\tconst url = new URL(window.location.href);\n\t\t\turl.hash = path;\n\t\t\twindow.history.replaceState({}, '', url.toString());\n\t\t\twindow.dispatchEvent(new HashChangeEvent('hashchange'));\n\t\t},\n\t\tgo: (delta: number) => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.go(delta);\n\t\t},\n\t\tback: () => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.back();\n\t\t},\n\t\tforward: () => {\n\t\t\tif (!isBrowser()) return;\n\t\t\twindow.history.forward();\n\t\t},\n\t\tlisten: (callback: () => void) => {\n\t\t\tif (!isBrowser()) return () => {};\n\t\t\twindow.addEventListener('hashchange', callback);\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener('hashchange', callback);\n\t\t\t};\n\t\t},\n\t\tgetCurrentPath: () => {\n\t\t\tif (!isBrowser()) return '/';\n\t\t\tconst hash = window.location.hash.slice(1) || '/';\n\t\t\treturn hash;\n\t\t},\n\t};\n};\n\n/** Memory history for testing and SSR environments. */\nexport const createMemoryHistory = (initialPath: string = '/'): RouterHistory => {\n\tlet currentPath = initialPath;\n\tconst listeners = new Set<() => void>();\n\n\tconst notify = () => {\n\t\tfor (const cb of listeners) cb();\n\t};\n\n\treturn {\n\t\tpush: (path: string) => {\n\t\t\tcurrentPath = path;\n\t\t\tnotify();\n\t\t},\n\t\treplace: (path: string) => {\n\t\t\tcurrentPath = path;\n\t\t\tnotify();\n\t\t},\n\t\tgo: () => {},\n\t\tback: () => {},\n\t\tforward: () => {},\n\t\tlisten: (callback: () => void) => {\n\t\t\tlisteners.add(callback);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t};\n\t\t},\n\t\tgetCurrentPath: () => currentPath,\n\t};\n};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Data } from 'effect';\n\nexport class RouteNotFoundError extends Data.TaggedError('RouteNotFoundError')<{\n\treadonly name: string;\n}> {}\n\nexport class RouterNotInstalledError extends Data.TaggedError(\n\t'RouterNotInstalledError'\n)<{\n\treadonly operation: string;\n}> {}\n\nexport class InvalidRouterStateError extends Data.TaggedError(\n\t'InvalidRouterStateError'\n)<{\n\treadonly message: string;\n}> {}\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Array as Arr, Option, pipe } from 'effect';\nimport {\n\tcompareRoutePatterns,\n\tcompileRoutePattern,\n\tmatchRoutePattern,\n\tparseRoutePattern,\n\tresolveRoutePattern,\n\ttype BlueprintDef,\n\ttype EffuseChild,\n\ttype RoutePattern,\n} from '@effuse/core';\nimport { RouteNotFoundError } from '../errors.js';\nimport type { NavigationGuard } from '../navigation/guards.js';\n\nexport type RouteComponent =\n\t| ((props?: Record<string, unknown>) => EffuseChild)\n\t| BlueprintDef;\n\nexport const EFFUSE_LAZY_ROUTE: unique symbol = Symbol.for(\n\t'effuse.router.lazy-route'\n) as never;\n\nexport interface LazyRouteComponent {\n\t(): Promise<{ default: RouteComponent }>;\n\treadonly [EFFUSE_LAZY_ROUTE]?: true;\n}\n\nexport interface LazyRouteComponentOptions {\n\treadonly export?: string;\n}\n\nconst isBlueprintComponent = (value: unknown): value is BlueprintDef =>\n\ttypeof value === 'object' &&\n\tvalue !== null &&\n\t'_tag' in value &&\n\t(value as { readonly _tag?: unknown })._tag === 'Blueprint';\n\nconst isRouteComponent = (value: unknown): value is RouteComponent =>\n\ttypeof value === 'function' || isBlueprintComponent(value);\n\nexport const isLazyRouteComponent = (\n\tvalue: unknown\n): value is LazyRouteComponent =>\n\ttypeof value === 'function' &&\n\t(value as { readonly [EFFUSE_LAZY_ROUTE]?: unknown })[EFFUSE_LAZY_ROUTE] ===\n\t\ttrue;\n\nexport const lazyRouteComponent = (\n\tloader: () => Promise<Readonly<Record<string, unknown>>>,\n\toptions: LazyRouteComponentOptions = {}\n): LazyRouteComponent => {\n\tlet cachedModule: Promise<{ default: RouteComponent }> | undefined;\n\tconst exportName = options.export ?? 'default';\n\n\tconst lazyComponent = (() => {\n\t\tcachedModule ??= loader().then((module) => {\n\t\t\tconst component = module[exportName];\n\t\t\tif (!isRouteComponent(component)) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Effuse lazy route expected \"${exportName}\" to export a route component.`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn { default: component };\n\t\t});\n\n\t\treturn cachedModule;\n\t}) as LazyRouteComponent;\n\n\tObject.defineProperty(lazyComponent, EFFUSE_LAZY_ROUTE, {\n\t\tvalue: true,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\n\treturn lazyComponent;\n};\n\nexport const lazyRoute = lazyRouteComponent;\n\nexport interface RouteRecord {\n\treadonly path: string;\n\treadonly component?: RouteComponent | LazyRouteComponent;\n\treadonly components?: Record<string, RouteComponent | LazyRouteComponent>;\n\treadonly name?: string;\n\treadonly children?: readonly RouteRecord[];\n\treadonly meta?: Record<string, unknown>;\n\treadonly redirect?: string | RouteLocation;\n\treadonly alias?: string | readonly string[];\n\t/**\n\t * Controls the props injected into the matched component. This option is the\n\t * single source of truth for prop injection — route params are never merged\n\t * on top of it:\n\t *\n\t * - absent or `true` — the route params are injected as props (default).\n\t * - `false` — nothing is injected; params remain available via `useRoute()`.\n\t * - object — exactly that object is injected; params are not auto-merged.\n\t * - function — exactly its return value is injected; it receives the current\n\t *   `route`, so it can spread `route.params` explicitly when desired.\n\t */\n\treadonly props?:\n\t\t| boolean\n\t\t| Record<string, unknown>\n\t\t| ((route: Route) => Record<string, unknown>);\n\treadonly beforeEnter?: NavigationGuard;\n}\n\nexport interface RouteGroupMetadata {\n\t/** Route groups declared by the canonical record and its canonical ancestors. */\n\treadonly canonicalRouteGroups: readonly string[];\n\t/** Additional route groups introduced by the alias path that matched the URL. */\n\treadonly aliasRouteGroups: readonly string[];\n\t/** Ordered, duplicate-free union of canonical and alias route groups. */\n\treadonly routeGroups: readonly string[];\n}\n\nexport interface NormalizedRouteRecord\n\textends RouteRecord,\n\t\tRouteGroupMetadata {\n\treadonly path: string;\n\treadonly regex: RegExp;\n\treadonly paramNames: readonly string[];\n\treadonly pattern: RoutePattern;\n\treadonly fullPath: string;\n\treadonly parent: NormalizedRouteRecord | undefined;\n\treadonly aliasOf?: NormalizedRouteRecord;\n}\n\nexport type RouteLocation =\n\t| string\n\t| { path: string; query?: Record<string, string>; hash?: string }\n\t| {\n\t\t\tname: string;\n\t\t\tparams?: Record<string, string>;\n\t\t\tquery?: Record<string, string>;\n\t\t\thash?: string;\n\t  };\n\nexport interface ResolvedRoute extends RouteGroupMetadata {\n\treadonly path: string;\n\treadonly fullPath: string;\n\treadonly params: Record<string, string>;\n\treadonly query: Record<string, string | string[]>;\n\treadonly hash: string;\n\treadonly matched: readonly NormalizedRouteRecord[];\n\treadonly name: string | undefined;\n\treadonly meta: Record<string, unknown>;\n\treadonly redirectedFrom?: ResolvedRoute;\n}\n\nexport interface Route extends RouteGroupMetadata {\n\treadonly path: string;\n\treadonly fullPath: string;\n\treadonly params: Record<string, string>;\n\treadonly query: Record<string, string | string[]>;\n\treadonly hash: string;\n\treadonly matched: readonly NormalizedRouteRecord[];\n\treadonly name: string | undefined;\n\treadonly meta: Record<string, unknown>;\n}\n\nexport type NavigationHookCleanup = () => void;\n\nexport const parseQuery = (\n\tsearch: string\n): Record<string, string | string[]> => {\n\tconst query: Record<string, string | string[]> = {};\n\tif (!search || search === '?') return query;\n\tconst searchString = search.startsWith('?') ? search.slice(1) : search;\n\tconst params = new URLSearchParams(searchString);\n\tfor (const [key, value] of params) {\n\t\tconst existing = query[key];\n\t\tif (existing === undefined) {\n\t\t\tquery[key] = value;\n\t\t} else if (Array.isArray(existing)) {\n\t\t\texisting.push(value);\n\t\t} else {\n\t\t\tquery[key] = [existing, value];\n\t\t}\n\t}\n\treturn query;\n};\n\nexport const stringifyQuery = (\n\tquery: Record<string, string | string[]>\n): string => {\n\tconst params = new URLSearchParams();\n\tfor (const [key, value] of Object.entries(query)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const v of value) {\n\t\t\t\tparams.append(key, v);\n\t\t\t}\n\t\t} else {\n\t\t\tparams.set(key, value);\n\t\t}\n\t}\n\tconst str = params.toString();\n\treturn str ? `?${str}` : '';\n};\n\nexport const parseUrl = (\n\turl: string\n): {\n\tpathname: string;\n\tquery: Record<string, string | string[]>;\n\thash: string;\n} => {\n\tconst hashIndex = url.indexOf('#');\n\tconst hash = hashIndex >= 0 ? url.slice(hashIndex) : '';\n\tconst urlWithoutHash = hashIndex >= 0 ? url.slice(0, hashIndex) : url;\n\n\tconst queryIndex = urlWithoutHash.indexOf('?');\n\tconst pathname =\n\t\tqueryIndex >= 0 ? urlWithoutHash.slice(0, queryIndex) : urlWithoutHash;\n\tconst queryString = queryIndex >= 0 ? urlWithoutHash.slice(queryIndex) : '';\n\n\tconst normalizedPathname = (pathname || '/').replace(/\\/+/g, '/');\n\n\treturn { pathname: normalizedPathname, query: parseQuery(queryString), hash };\n};\n\nconst isAncestorRoute = (\n\tancestor: NormalizedRouteRecord,\n\troute: NormalizedRouteRecord\n): boolean => {\n\tlet current = route.parent;\n\twhile (current) {\n\t\tif (current === ancestor) return true;\n\t\tcurrent = current.parent;\n\t}\n\treturn false;\n};\n\nconst assertNoRouteCollisions = (\n\troutes: readonly NormalizedRouteRecord[]\n): void => {\n\tconst signatures = new Map<string, NormalizedRouteRecord>();\n\tfor (const route of routes) {\n\t\tconst existing = signatures.get(route.pattern.signature);\n\t\tif (\n\t\t\texisting &&\n\t\t\t!isAncestorRoute(existing, route) &&\n\t\t\t!isAncestorRoute(route, existing)\n\t\t) {\n\t\t\tconst existingDescription = existing.aliasOf\n\t\t\t\t? `alias \"${existing.fullPath}\" for route \"${existing.aliasOf.fullPath}\"`\n\t\t\t\t: `route \"${existing.fullPath}\"`;\n\t\t\tconst routeDescription = route.aliasOf\n\t\t\t\t? `alias \"${route.fullPath}\" for route \"${route.aliasOf.fullPath}\"`\n\t\t\t\t: `route \"${route.fullPath}\"`;\n\t\t\tthrow new TypeError(\n\t\t\t\t`The ${existingDescription} and ${routeDescription} resolve to the same URL pattern \"${route.fullPath}\".`\n\t\t\t);\n\t\t}\n\t\tsignatures.set(route.pattern.signature, route);\n\t}\n};\n\nconst normalizeRouteRecord = (\n\troute: RouteRecord,\n\tparent?: NormalizedRouteRecord,\n\taliasOf?: NormalizedRouteRecord\n): NormalizedRouteRecord => {\n\tconst rawFullPath = parent\n\t\t? `${parent.fullPath.replace(/\\/$/, '')}/${route.path.replace(/^\\//, '')}`\n\t\t: route.path;\n\tconst parsed = parseRoutePattern(rawFullPath);\n\tconst fullPath = parsed.path;\n\tconst { regex, paramNames } = compileRoutePattern(parsed);\n\tconst canonicalRouteGroups = aliasOf\n\t\t? [...aliasOf.canonicalRouteGroups]\n\t\t: [...new Set([...(parent?.canonicalRouteGroups ?? []), ...parsed.groups])];\n\tconst aliasRouteGroups = aliasOf\n\t\t? [\n\t\t\t\t...new Set([\n\t\t\t\t\t...(parent?.aliasRouteGroups ?? []),\n\t\t\t\t\t...parsed.groups.filter(\n\t\t\t\t\t\t(group) => !canonicalRouteGroups.includes(group)\n\t\t\t\t\t),\n\t\t\t\t]),\n\t\t\t]\n\t\t: [];\n\tconst routeGroups = [\n\t\t...new Set([...canonicalRouteGroups, ...aliasRouteGroups]),\n\t];\n\n\treturn {\n\t\t...route,\n\t\tfullPath,\n\t\tregex,\n\t\tparamNames,\n\t\tpattern: parsed,\n\t\tcanonicalRouteGroups,\n\t\taliasRouteGroups,\n\t\trouteGroups,\n\t\tparent,\n\t\t...(aliasOf ? { aliasOf } : {}),\n\t};\n};\n\nconst normalizeRouteTree = (\n\troute: RouteRecord,\n\tcanonicalParent: NormalizedRouteRecord | undefined,\n\taliasParents: readonly NormalizedRouteRecord[]\n): NormalizedRouteRecord[] => {\n\tconst canonical = normalizeRouteRecord(route, canonicalParent);\n\tconst variants: NormalizedRouteRecord[] = [canonical];\n\tconst aliases: readonly string[] = route.alias\n\t\t? typeof route.alias === 'string'\n\t\t\t? [route.alias]\n\t\t\t: route.alias\n\t\t: [];\n\tconst { alias: _ignored, ...routeWithoutAlias } = route;\n\tvoid _ignored;\n\n\tfor (const alias of aliases) {\n\t\tvariants.push(\n\t\t\tnormalizeRouteRecord(\n\t\t\t\t{ ...routeWithoutAlias, path: alias },\n\t\t\t\tcanonicalParent,\n\t\t\t\tcanonical\n\t\t\t)\n\t\t);\n\t}\n\n\tfor (const aliasParent of aliasParents) {\n\t\tvariants.push(\n\t\t\tnormalizeRouteRecord(routeWithoutAlias, aliasParent, canonical)\n\t\t);\n\t\tfor (const alias of aliases) {\n\t\t\tvariants.push(\n\t\t\t\tnormalizeRouteRecord(\n\t\t\t\t\t{ ...routeWithoutAlias, path: alias },\n\t\t\t\t\taliasParent,\n\t\t\t\t\tcanonical\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tconst result = [...variants];\n\tfor (const child of route.children ?? []) {\n\t\tresult.push(...normalizeRouteTree(child, canonical, variants.slice(1)));\n\t}\n\treturn result;\n};\n\nexport const finalizeNormalizedRoutes = (\n\troutes: readonly NormalizedRouteRecord[]\n): NormalizedRouteRecord[] => {\n\tconst result = [...routes];\n\tassertNoRouteCollisions(result);\n\tresult.sort((left, right) => compareRoutePatterns(left.pattern, right.pattern));\n\treturn result;\n};\n\nexport const normalizeRoutes = (\n\troutes: readonly RouteRecord[],\n\tparent?: NormalizedRouteRecord,\n\taliasParents: readonly NormalizedRouteRecord[] = []\n): NormalizedRouteRecord[] => {\n\tconst result: NormalizedRouteRecord[] = [];\n\n\tfor (const route of routes) {\n\t\tresult.push(...normalizeRouteTree(route, parent, aliasParents));\n\t}\n\n\treturn finalizeNormalizedRoutes(result);\n};\n\nexport const matchRoute = (\n\tpathname: string,\n\tnormalizedRoutes: readonly NormalizedRouteRecord[]\n): { matched: NormalizedRouteRecord[]; params: Record<string, string> } => {\n\t// Try pathname as-is, and also without trailing slash (for matching /about/ against /about)\n\tconst pathVariants = [pathname];\n\tif (pathname !== '/' && pathname.endsWith('/')) {\n\t\tpathVariants.push(pathname.slice(0, -1));\n\t}\n\n\tfor (const path of pathVariants) {\n\t\tfor (const route of normalizedRoutes) {\n\t\t\tconst params = matchRoutePattern(\n\t\t\t\t{\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\tregex: route.regex,\n\t\t\t\t\tparamNames: route.paramNames,\n\t\t\t\t},\n\t\t\t\tpath\n\t\t\t);\n\t\t\tif (params) {\n\t\t\t\tconst matched: NormalizedRouteRecord[] = [];\n\t\t\t\tlet current: NormalizedRouteRecord | undefined = route;\n\t\t\t\twhile (current) {\n\t\t\t\t\tmatched.unshift(current);\n\t\t\t\t\tcurrent = current.parent;\n\t\t\t\t}\n\n\t\t\t\treturn { matched, params };\n\t\t\t}\n\t\t}\n\t}\n\treturn { matched: [], params: {} };\n};\n\nexport const resolveRoute = (\n\tlocation: RouteLocation,\n\tnormalizedRoutes: readonly NormalizedRouteRecord[],\n\t_currentRoute?: Route\n): ResolvedRoute => {\n\tlet pathname: string;\n\tlet query: Record<string, string | string[]> = {};\n\tlet hash = '';\n\tlet params: Record<string, string> = {};\n\n\tif (typeof location === 'string') {\n\t\tconst parsed = parseUrl(location);\n\t\tpathname = parsed.pathname;\n\t\tquery = parsed.query;\n\t\thash = parsed.hash;\n\t} else if ('path' in location) {\n\t\tpathname = location.path;\n\t\tquery = location.query ?? {};\n\t\thash = location.hash ?? '';\n\t} else {\n\t\tconst namedRoute = normalizedRoutes.find(\n\t\t\t(r) => r.name === location.name && r.aliasOf === undefined\n\t\t);\n\t\tif (!namedRoute) {\n\t\t\tthrow new RouteNotFoundError({ name: location.name });\n\t\t}\n\t\tparams = location.params ?? {};\n\t\tquery = location.query ?? {};\n\t\thash = location.hash ?? '';\n\t\tpathname = resolveRoutePattern(namedRoute.pattern, params);\n\t}\n\n\tconst { matched, params: matchedParams } = matchRoute(\n\t\tpathname,\n\t\tnormalizedRoutes\n\t);\n\tconst mergedParams = { ...matchedParams, ...params };\n\n\tconst meta: Record<string, unknown> = {};\n\tfor (const route of matched) {\n\t\tObject.assign(meta, route.meta);\n\t}\n\n\tconst fullPath = pathname + stringifyQuery(query) + hash;\n\tconst matchedRecord = matched.at(-1);\n\n\treturn {\n\t\tpath: pathname,\n\t\tfullPath,\n\t\tparams: mergedParams,\n\t\tquery,\n\t\thash,\n\t\tmatched,\n\t\tcanonicalRouteGroups: matchedRecord?.canonicalRouteGroups ?? [],\n\t\taliasRouteGroups: matchedRecord?.aliasRouteGroups ?? [],\n\t\trouteGroups: matchedRecord?.routeGroups ?? [],\n\t\tname: pipe(\n\t\t\tArr.last(matched),\n\t\t\tOption.flatMap((m) => Option.fromNullable(m.name)),\n\t\t\tOption.getOrUndefined\n\t\t),\n\t\tmeta,\n\t};\n};\n\nexport const createRoute = (resolved: ResolvedRoute): Route => ({\n\tpath: resolved.path,\n\tfullPath: resolved.fullPath,\n\tparams: resolved.params,\n\tquery: resolved.query,\n\thash: resolved.hash,\n\tmatched: resolved.matched,\n\tcanonicalRouteGroups: resolved.canonicalRouteGroups,\n\taliasRouteGroups: resolved.aliasRouteGroups,\n\trouteGroups: resolved.routeGroups,\n\tname: resolved.name,\n\tmeta: resolved.meta,\n});\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Data, Effect, Predicate } from 'effect';\nimport type { Route, ResolvedRoute, RouteLocation } from '../core/route.js';\n\nexport type NavigationResult = Data.TaggedEnum<{\n\t// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n\tNavigationAllowed: {};\n\tNavigationCancelled: { readonly reason: string | undefined };\n\tNavigationRedirected: { readonly to: RouteLocation };\n\tNavigationFailed: { readonly error: Error };\n}>;\n\nconst {\n\tNavigationAllowed,\n\tNavigationCancelled,\n\tNavigationRedirected,\n\tNavigationFailed,\n\t$is,\n\t$match,\n} = Data.taggedEnum<NavigationResult>();\n\nexport {\n\tNavigationAllowed,\n\tNavigationCancelled,\n\tNavigationRedirected,\n\tNavigationFailed,\n\t$is as NavigationResult$is,\n\t$match as NavigationResult$match,\n};\n\nexport const NavigationResult = {\n\tallowed: (): NavigationResult => NavigationAllowed(),\n\tcancelled: (reason?: string): NavigationResult =>\n\t\tNavigationCancelled({ reason }),\n\tredirected: (to: RouteLocation): NavigationResult =>\n\t\tNavigationRedirected({ to }),\n\tfailed: (error: Error): NavigationResult => NavigationFailed({ error }),\n\n\tisAllowed: $is('NavigationAllowed'),\n\tisCancelled: $is('NavigationCancelled'),\n\tisRedirected: $is('NavigationRedirected'),\n\tisFailed: $is('NavigationFailed'),\n\n\tmatch: $match,\n\n\tfromLegacy: (value: unknown): NavigationResult => {\n\t\tif (\n\t\t\t$is('NavigationAllowed')(value) ||\n\t\t\t$is('NavigationCancelled')(value) ||\n\t\t\t$is('NavigationRedirected')(value) ||\n\t\t\t$is('NavigationFailed')(value)\n\t\t) {\n\t\t\treturn value;\n\t\t}\n\t\tif (value === undefined || value === true)\n\t\t\treturn NavigationResult.allowed();\n\t\tif (value === false) return NavigationResult.cancelled();\n\t\tif (typeof value === 'string') return NavigationResult.redirected(value);\n\t\tif (value instanceof Error) return NavigationResult.failed(value);\n\t\tif (Predicate.isObject(value)) {\n\t\t\treturn NavigationResult.redirected(value as RouteLocation);\n\t\t}\n\t\treturn NavigationResult.allowed();\n\t},\n};\n\nexport type NavigationGuardReturn =\n\t| NavigationResult\n\t| boolean\n\t| string\n\t| RouteLocation\n\t| Error\n\t| undefined;\n\nexport type NavigationGuard = (\n\tto: ResolvedRoute,\n\tfrom: Route\n) =>\n\t| NavigationGuardReturn\n\t| Promise<NavigationGuardReturn>\n\t| Effect.Effect<NavigationGuardReturn, unknown>;\n\nexport type AfterEachHook = (to: Route, from: Route) => void;\n\nexport interface GuardRegistry {\n\treadonly beforeEach: NavigationGuard[];\n\treadonly beforeResolve: NavigationGuard[];\n\treadonly afterEach: AfterEachHook[];\n}\n\nexport const createGuardRegistry = (): GuardRegistry => ({\n\tbeforeEach: [],\n\tbeforeResolve: [],\n\tafterEach: [],\n});\n\nconst toError = (error: unknown): Error =>\n\terror instanceof Error ? error : new Error(String(error));\n\nconst executeGuard = async (\n\tguard: NavigationGuard,\n\tto: ResolvedRoute,\n\tfrom: Route\n): Promise<NavigationResult> => {\n\ttry {\n\t\tconst output = guard(to, from);\n\t\tconst value = Effect.isEffect(output)\n\t\t\t? await Effect.runPromise(\n\t\t\t\t\toutput.pipe(\n\t\t\t\t\t\tEffect.catchAll((error) =>\n\t\t\t\t\t\t\tEffect.succeed(NavigationResult.failed(toError(error)))\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t: await Promise.resolve(output);\n\t\treturn NavigationResult.fromLegacy(value);\n\t} catch (error) {\n\t\treturn NavigationResult.failed(toError(error));\n\t}\n};\n\nexport const runGuards = (\n\tguards: readonly NavigationGuard[],\n\tto: ResolvedRoute,\n\tfrom: Route\n): Effect.Effect<NavigationResult> =>\n\tEffect.promise(async () => {\n\t\tfor (const guard of guards) {\n\t\t\tconst result = await executeGuard(guard, to, from);\n\t\t\tif (!NavigationResult.isAllowed(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn NavigationResult.allowed();\n\t});\n\nexport const runAfterHooks = (\n\thooks: ReadonlyArray<AfterEachHook>,\n\tto: Route,\n\tfrom: Route\n): Effect.Effect<void> =>\n\tEffect.sync(() => {\n\t\tfor (const hook of hooks) {\n\t\t\thook(to, from);\n\t\t}\n\t});\n\nexport const combineGuards =\n\t(...guards: NavigationGuard[]): NavigationGuard =>\n\tasync (to, from) => {\n\t\tfor (const guard of guards) {\n\t\t\tconst result = await executeGuard(guard, to, from);\n\t\t\tif (!NavigationResult.isAllowed(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn NavigationResult.allowed();\n\t};\n\nexport const guardWhen =\n\t(\n\t\tcondition: (to: ResolvedRoute, from: Route) => boolean,\n\t\tguard: NavigationGuard\n\t): NavigationGuard =>\n\t(to, from) =>\n\t\tcondition(to, from) ? guard(to, from) : NavigationResult.allowed();\n\nexport const guardMeta =\n\t(\n\t\tkey: string,\n\t\thandler: (\n\t\t\tvalue: unknown,\n\t\t\tto: ResolvedRoute,\n\t\t\tfrom: Route\n\t\t) => NavigationResult | Promise<NavigationResult>\n\t): NavigationGuard =>\n\t(to, from) => {\n\t\tconst value = to.meta[key];\n\t\tif (value !== undefined) {\n\t\t\treturn handler(value, to, from);\n\t\t}\n\t\treturn NavigationResult.allowed();\n\t};\n\nexport const createAuthGuard = (\n\tisAuthenticated: () => boolean | Promise<boolean>,\n\tloginPath: string = '/login'\n): NavigationGuard =>\n\tguardMeta('requiresAuth', async (value: unknown, _to, _from) => {\n\t\tconst requiresAuth = Boolean(value);\n\t\tif (!requiresAuth) return NavigationResult.allowed();\n\t\tconst authed = await Promise.resolve(isAuthenticated());\n\t\treturn authed\n\t\t\t? NavigationResult.allowed()\n\t\t\t: NavigationResult.redirected(loginPath);\n\t});\n\nexport const createUnsavedChangesGuard =\n\t(\n\t\thasUnsavedChanges: () => boolean,\n\t\tconfirmMessage: string = 'You have unsaved changes. Leave anyway?',\n\t\tconfirmLeave: (message: string) => boolean = (message) =>\n\t\t\ttypeof window === 'undefined' ? true : window.confirm(message)\n\t): NavigationGuard =>\n\t(_to, _from) => {\n\t\tif (hasUnsavedChanges()) {\n\t\t\tconst confirmed = confirmLeave(confirmMessage);\n\t\t\treturn confirmed\n\t\t\t\t? NavigationResult.allowed()\n\t\t\t\t: NavigationResult.cancelled('User cancelled due to unsaved changes');\n\t\t}\n\t\treturn NavigationResult.allowed();\n\t};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Data, Predicate } from 'effect';\nimport type { RouteLocation, ResolvedRoute } from '../core/route.js';\n\ninterface NavigationFailureBase {\n\treadonly to: ResolvedRoute;\n\treadonly from: ResolvedRoute;\n}\n\nexport type NavigationFailure = Data.TaggedEnum<{\n\tNavigationAborted: NavigationFailureBase;\n\tNavigationGuardCancelled: NavigationFailureBase & {\n\t\treadonly reason: string | undefined;\n\t};\n\tNavigationGuardFailed: NavigationFailureBase & {\n\t\treadonly error: Error;\n\t};\n\tNavigationRedirect: NavigationFailureBase & {\n\t\treadonly redirectTo: RouteLocation;\n\t};\n\tNavigationRedirectLoop: NavigationFailureBase & {\n\t\treadonly paths: readonly string[];\n\t};\n\tNavigationDuplicated: NavigationFailureBase;\n}>;\n\nconst {\n\tNavigationAborted,\n\tNavigationGuardCancelled,\n\tNavigationGuardFailed,\n\tNavigationRedirect,\n\tNavigationRedirectLoop,\n\tNavigationDuplicated,\n\t$is,\n\t$match,\n} = Data.taggedEnum<NavigationFailure>();\n\nexport {\n\tNavigationAborted,\n\tNavigationGuardCancelled,\n\tNavigationGuardFailed,\n\tNavigationRedirect,\n\tNavigationRedirectLoop,\n\tNavigationDuplicated,\n\t$is as NavigationFailure$is,\n\t$match as NavigationFailure$match,\n};\n\nexport const NavigationFailure = {\n\taborted: (to: ResolvedRoute, from: ResolvedRoute): NavigationFailure =>\n\t\tNavigationAborted({ to, from }),\n\n\tguardCancelled: (\n\t\tto: ResolvedRoute,\n\t\tfrom: ResolvedRoute,\n\t\treason?: string\n\t): NavigationFailure => NavigationGuardCancelled({ to, from, reason }),\n\n\tguardFailed: (\n\t\tto: ResolvedRoute,\n\t\tfrom: ResolvedRoute,\n\t\terror: Error\n\t): NavigationFailure => NavigationGuardFailed({ to, from, error }),\n\n\tredirect: (\n\t\tto: ResolvedRoute,\n\t\tfrom: ResolvedRoute,\n\t\tredirectTo: RouteLocation\n\t): NavigationFailure => NavigationRedirect({ to, from, redirectTo }),\n\n\tredirectLoop: (\n\t\tto: ResolvedRoute,\n\t\tfrom: ResolvedRoute,\n\t\tpaths: readonly string[]\n\t): NavigationFailure => NavigationRedirectLoop({ to, from, paths }),\n\n\tduplicated: (to: ResolvedRoute, from: ResolvedRoute): NavigationFailure =>\n\t\tNavigationDuplicated({ to, from }),\n\n\tisNavigationFailure: (value: unknown): value is NavigationFailure =>\n\t\tPredicate.isObject(value) &&\n\t\tPredicate.hasProperty(value, '_tag') &&\n\t\tPredicate.isString(value._tag) &&\n\t\t[\n\t\t\t'NavigationAborted',\n\t\t\t'NavigationGuardCancelled',\n\t\t\t'NavigationGuardFailed',\n\t\t\t'NavigationRedirect',\n\t\t\t'NavigationRedirectLoop',\n\t\t\t'NavigationDuplicated',\n\t\t].includes(value._tag),\n\n\tisAborted: $is('NavigationAborted'),\n\tisCancelled: $is('NavigationGuardCancelled'),\n\tisFailed: $is('NavigationGuardFailed'),\n\tisRedirect: $is('NavigationRedirect'),\n\tisRedirectLoop: $is('NavigationRedirectLoop'),\n\tisDuplicated: $is('NavigationDuplicated'),\n\n\tmatch: $match,\n};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Config, Effect } from 'effect';\n\nexport const RouterConfig = {\n\tbase: Config.string('ROUTER_BASE').pipe(Config.withDefault('')),\n\thistoryMode: Config.literal(\n\t\t'web',\n\t\t'hash'\n\t)('ROUTER_HISTORY_MODE').pipe(Config.withDefault('web' as const)),\n\tscrollToTop: Config.boolean('ROUTER_SCROLL_TO_TOP').pipe(\n\t\tConfig.withDefault(true)\n\t),\n};\n\nexport type RouterConfigType = {\n\tbase: string;\n\thistoryMode: 'web' | 'hash';\n\tscrollToTop: boolean;\n};\n\nexport const loadRouterConfig = Effect.all({\n\tbase: RouterConfig.base,\n\thistoryMode: RouterConfig.historyMode,\n\tscrollToTop: RouterConfig.scrollToTop,\n});\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport {\n\tcreateRuntimeContext,\n\trunWithRouterContext as runWithCoreRouterContext,\n\tsignal,\n\ttype Signal,\n} from '@effuse/core';\nimport type { Route } from './route.js';\n\nexport const ROUTER_KEY = Symbol.for('effuse.router');\nexport const ROUTE_KEY = Symbol.for('effuse.route');\nexport const DEPTH_KEY = Symbol.for('effuse.router.depth');\n\ninterface RouterContextInstallation {\n\treadonly router: object;\n\treadonly route: Signal<Route>;\n}\ninterface RouterContextRuntimeState {\n\treadonly contextMap: Map<symbol, unknown>;\n\tglobalRouteSignal: Signal<Route> | null;\n\treadonly routerRouteSignals: WeakMap<object, Signal<Route>>;\n\treadonly installations: RouterContextInstallation[];\n\tbase: {\n\t\treadonly router: unknown;\n\t\treadonly route: unknown;\n\t\treadonly globalRouteSignal: Signal<Route> | null;\n\t} | null;\n}\n\nconst ROUTER_CONTEXT_RUNTIME_KEY = Symbol.for(\n\t'effuse.router.context-runtime.v1'\n);\nconst routerContextRuntime = (() => {\n\tconst shared = globalThis as Record<PropertyKey, unknown>;\n\tconst existing = shared[ROUTER_CONTEXT_RUNTIME_KEY] as\n\t\t| RouterContextRuntimeState\n\t\t| undefined;\n\tif (existing) return existing;\n\tconst created: RouterContextRuntimeState = {\n\t\tcontextMap: new Map(),\n\t\tglobalRouteSignal: null,\n\t\trouterRouteSignals: new WeakMap(),\n\t\tinstallations: [],\n\t\tbase: null,\n\t};\n\tObject.defineProperty(shared, ROUTER_CONTEXT_RUNTIME_KEY, { value: created });\n\treturn created;\n})();\nconst routerRequestContext = createRuntimeContext<RouterContextInstallation>();\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport const provide = <T>(key: symbol, value: T): void => {\n\trouterContextRuntime.contextMap.set(key, value);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport const inject = <T>(key: symbol): T | undefined => {\n\tconst requestContext = routerRequestContext.current();\n\tif (key === ROUTER_KEY && requestContext) {\n\t\treturn requestContext.router as T;\n\t}\n\tif (key === ROUTE_KEY && requestContext) {\n\t\treturn requestContext.route as T;\n\t}\n\treturn routerContextRuntime.contextMap.get(key) as T | undefined;\n};\n\nexport const injectWithDefault = <T>(key: symbol, defaultValue: T): T => {\n\tconst value = inject<T>(key);\n\treturn value !== undefined ? value : defaultValue;\n};\n\nexport const clearContext = (): void => {\n\trouterContextRuntime.contextMap.clear();\n\trouterContextRuntime.globalRouteSignal = null;\n\trouterContextRuntime.installations.length = 0;\n\trouterContextRuntime.base = null;\n};\n\nexport const injectRouter = (): unknown => inject(ROUTER_KEY);\n\nexport const injectRoute = (): Signal<Route> | undefined =>\n\tinject<Signal<Route>>(ROUTE_KEY);\n\nexport const provideRouter = (router: unknown): void => {\n\tprovide(ROUTER_KEY, router);\n};\n\nexport const provideRoute = (route: Signal<Route>): void => {\n\tprovide(ROUTE_KEY, route);\n};\n\nexport const createRouteSignal = (\n\trouter: object,\n\tinitialRoute: Route\n): Signal<Route> => {\n\tconst sig = signal<Route>(initialRoute);\n\trouterContextRuntime.routerRouteSignals.set(router, sig);\n\tprovideRoute(sig);\n\trouterContextRuntime.globalRouteSignal = sig;\n\treturn sig;\n};\n\nexport const getOrCreateRouteSignal = (\n\trouter: object,\n\tinitialRoute: Route\n): Signal<Route> => {\n\tconst existing = routerContextRuntime.routerRouteSignals.get(router);\n\tif (existing) return existing;\n\tconst route = signal<Route>(initialRoute);\n\trouterContextRuntime.routerRouteSignals.set(router, route);\n\treturn route;\n};\n\nexport const runWithRouterRouteContext = <T>(\n\trouter: object,\n\troute: Signal<Route>,\n\tfn: () => T\n): T =>\n\trouterRequestContext.run({ router, route }, () =>\n\t\trunWithCoreRouterContext(router, fn)\n\t);\n\nexport const installRouterContext = (\n\trouter: object,\n\tinitialRoute: Route\n): (() => void) => {\n\tif (routerContextRuntime.installations.length === 0) {\n\t\trouterContextRuntime.base = {\n\t\t\trouter: routerContextRuntime.contextMap.get(ROUTER_KEY),\n\t\t\troute: routerContextRuntime.contextMap.get(ROUTE_KEY),\n\t\t\tglobalRouteSignal: routerContextRuntime.globalRouteSignal,\n\t\t};\n\t}\n\tprovideRouter(router);\n\tconst route = createRouteSignal(router, initialRoute);\n\tconst installation = { router, route };\n\trouterContextRuntime.installations.push(installation);\n\n\tlet removed = false;\n\treturn () => {\n\t\tif (removed) return;\n\t\tremoved = true;\n\t\tconst index = routerContextRuntime.installations.indexOf(installation);\n\t\tif (index >= 0) routerContextRuntime.installations.splice(index, 1);\n\t\trouterContextRuntime.routerRouteSignals.delete(router);\n\t\tconst active = routerContextRuntime.installations.at(-1);\n\t\tif (active) {\n\t\t\trouterContextRuntime.routerRouteSignals.set(active.router, active.route);\n\t\t\trouterContextRuntime.contextMap.set(ROUTER_KEY, active.router);\n\t\t\trouterContextRuntime.contextMap.set(ROUTE_KEY, active.route);\n\t\t\trouterContextRuntime.globalRouteSignal = active.route;\n\t\t\treturn;\n\t\t}\n\t\tconst base = routerContextRuntime.base;\n\t\tif (base?.router === undefined)\n\t\t\trouterContextRuntime.contextMap.delete(ROUTER_KEY);\n\t\telse routerContextRuntime.contextMap.set(ROUTER_KEY, base.router);\n\t\tif (base?.route === undefined)\n\t\t\trouterContextRuntime.contextMap.delete(ROUTE_KEY);\n\t\telse routerContextRuntime.contextMap.set(ROUTE_KEY, base.route);\n\t\trouterContextRuntime.globalRouteSignal = base?.globalRouteSignal ?? null;\n\t\trouterContextRuntime.base = null;\n\t};\n};\n\nexport const getRouteSignal = (): Signal<Route> | null => {\n\tconst requestContext = routerRequestContext.current();\n\tif (requestContext) return requestContext.route;\n\tconst router = injectRouter();\n\tif (router && typeof router === 'object') {\n\t\tconst scoped = routerContextRuntime.routerRouteSignals.get(router);\n\t\tif (scoped) return scoped;\n\t}\n\treturn routerContextRuntime.globalRouteSignal;\n};\n\nexport const updateRouteSignal = (router: object, route: Route): void => {\n\tconst scoped = routerContextRuntime.routerRouteSignals.get(router);\n\tif (scoped) {\n\t\tscoped.value = route;\n\t} else if (routerContextRuntime.globalRouteSignal) {\n\t\trouterContextRuntime.globalRouteSignal.value = route;\n\t}\n};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Effect, SubscriptionRef, Predicate } from 'effect';\nimport { setGlobalRouter as setCoreGlobalRouter } from '@effuse/core';\nimport type { RouterHistory } from './history.js';\nimport { createWebHistory, createHashHistory } from './history.js';\nimport {\n\ttype Route,\n\ttype RouteRecord,\n\ttype RouteLocation,\n\ttype ResolvedRoute,\n\ttype NormalizedRouteRecord,\n\tnormalizeRoutes,\n\tfinalizeNormalizedRoutes,\n\tresolveRoute,\n\tcreateRoute,\n\tparseUrl,\n} from './route.js';\nimport {\n\ttype NavigationGuard,\n\ttype AfterEachHook,\n\tcreateGuardRegistry,\n\trunGuards,\n\trunAfterHooks,\n\tNavigationResult,\n} from '../navigation/guards.js';\nimport { NavigationFailure } from '../navigation/errors.js';\nimport { loadRouterConfig } from './RouterConfig.js';\nimport {\n\tgetOrCreateRouteSignal,\n\tinjectRouter,\n\tinstallRouterContext,\n\trunWithRouterRouteContext,\n\tupdateRouteSignal,\n} from './context.js';\n\nlet cachedConfig: {\n\tbase: string;\n\thistoryMode: 'web' | 'hash';\n\tscrollToTop: boolean;\n} | null = null;\n\nconst getConfig = () => {\n\tif (!cachedConfig) {\n\t\tcachedConfig = Effect.runSync(\n\t\t\tloadRouterConfig.pipe(\n\t\t\t\tEffect.orElseSucceed(() => ({\n\t\t\t\t\tbase: '',\n\t\t\t\t\thistoryMode: 'web' as const,\n\t\t\t\t\tscrollToTop: true,\n\t\t\t\t}))\n\t\t\t)\n\t\t);\n\t}\n\treturn cachedConfig;\n};\n\nexport type ScrollBehavior = (\n\tto: Route,\n\tfrom: Route,\n\tsavedPosition: { left: number; top: number } | null\n) =>\n\t| {\n\t\t\tleft?: number;\n\t\t\ttop?: number;\n\t\t\tel?: string;\n\t\t\tbehavior?: ScrollBehavior;\n\t  }\n\t| undefined;\n\nexport interface RouterOptions {\n\treadonly routes: readonly RouteRecord[];\n\treadonly history?: RouterHistory;\n\treadonly base?: string;\n\treadonly scrollBehavior?: ScrollBehavior;\n}\n\nexport interface NavigateOptions {\n\treadonly replace?: boolean;\n}\n\nexport interface RouterInstance {\n\treadonly currentRoute: SubscriptionRef.SubscriptionRef<Route>;\n\treadonly routes: readonly NormalizedRouteRecord[];\n\treadonly options: RouterOptions;\n\n\treadonly push: (to: RouteLocation) => Promise<Route | NavigationFailure>;\n\treadonly replace: (to: RouteLocation) => Promise<Route | NavigationFailure>;\n\treadonly back: () => void;\n\treadonly forward: () => void;\n\treadonly go: (delta: number) => void;\n\n\treadonly beforeEach: (guard: NavigationGuard) => () => void;\n\treadonly beforeResolve: (guard: NavigationGuard) => () => void;\n\treadonly afterEach: (hook: AfterEachHook) => () => void;\n\n\treadonly resolve: (to: RouteLocation) => ResolvedRoute;\n\treadonly hasRoute: (name: string) => boolean;\n\treadonly addRoute: (route: RouteRecord, parentName?: string) => void;\n\treadonly removeRoute: (name: string) => void;\n\treadonly getRoutes: () => readonly NormalizedRouteRecord[];\n\n\treadonly start: () => () => void;\n\treadonly isReady: boolean;\n}\n\nexport const createRouter = (options: RouterOptions): RouterInstance => {\n\tconst config = getConfig();\n\n\tconst history =\n\t\toptions.history ??\n\t\t(config.historyMode === 'hash'\n\t\t\t? createHashHistory()\n\t\t\t: createWebHistory(options.base ?? config.base));\n\n\tlet normalizedRoutes = normalizeRoutes(options.routes);\n\tconst guards = createGuardRegistry();\n\tlet isStarted = false;\n\n\tconst initialPath = history.getCurrentPath();\n\tconst { pathname, query, hash } = parseUrl(initialPath);\n\tconst initialResolved = resolveRoute(pathname, normalizedRoutes);\n\tconst initialRoute = createRoute({\n\t\t...initialResolved,\n\t\tquery,\n\t\thash,\n\t\tfullPath: initialPath,\n\t});\n\n\tconst routeRef = Effect.runSync(SubscriptionRef.make(initialRoute));\n\tlet navigationId = 0;\n\tconst navigate = (\n\t\tto: RouteLocation,\n\t\topts: NavigateOptions = {},\n\t\tredirectPaths: readonly string[] = []\n\t): Effect.Effect<Route | NavigationFailure> =>\n\t\tEffect.gen(function* () {\n\t\t\tconst currentNavId = ++navigationId;\n\t\t\tconst from = yield* SubscriptionRef.get(routeRef);\n\n\t\t\tlet resolved: ResolvedRoute;\n\t\t\ttry {\n\t\t\t\tresolved = resolveRoute(to, normalizedRoutes, from);\n\t\t\t} catch {\n\t\t\t\treturn NavigationFailure.aborted(\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: '',\n\t\t\t\t\t\tfullPath: '',\n\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\tquery: {},\n\t\t\t\t\t\thash: '',\n\t\t\t\t\t\tmatched: [],\n\t\t\t\t\t\tcanonicalRouteGroups: [],\n\t\t\t\t\t\taliasRouteGroups: [],\n\t\t\t\t\t\trouteGroups: [],\n\t\t\t\t\t\tname: undefined,\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t},\n\t\t\t\t\tfrom as ResolvedRoute\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (redirectPaths.includes(resolved.fullPath)) {\n\t\t\t\treturn NavigationFailure.redirectLoop(\n\t\t\t\t\tresolved,\n\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\t[...redirectPaths, resolved.fullPath]\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst nextRedirectPaths = [...redirectPaths, resolved.fullPath];\n\n\t\t\tif (resolved.fullPath === from.fullPath) {\n\t\t\t\treturn NavigationFailure.duplicated(resolved, from as ResolvedRoute);\n\t\t\t}\n\n\t\t\tconst lastMatched = resolved.matched[resolved.matched.length - 1];\n\t\t\tif (\n\t\t\t\tPredicate.isNotNullable(lastMatched) &&\n\t\t\t\tPredicate.isNotNullable(lastMatched.redirect)\n\t\t\t) {\n\t\t\t\treturn yield* navigate(lastMatched.redirect, opts, nextRedirectPaths);\n\t\t\t}\n\n\t\t\tconst beforeEachResult = yield* runGuards(\n\t\t\t\tguards.beforeEach,\n\t\t\t\tresolved,\n\t\t\t\tfrom\n\t\t\t);\n\t\t\tif (!NavigationResult.isAllowed(beforeEachResult)) {\n\t\t\t\tif (beforeEachResult._tag === 'NavigationRedirected') {\n\t\t\t\t\treturn yield* navigate(\n\t\t\t\t\t\tbeforeEachResult.to,\n\t\t\t\t\t\topts,\n\t\t\t\t\t\tnextRedirectPaths\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (beforeEachResult._tag === 'NavigationFailed') {\n\t\t\t\t\treturn NavigationFailure.guardFailed(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\t\tbeforeEachResult.error\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn NavigationFailure.guardCancelled(\n\t\t\t\t\tresolved,\n\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\tbeforeEachResult.reason\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Run per-route beforeEnter guards\n\t\t\tconst beforeEnterGuards = resolved.matched\n\t\t\t\t.map((r) => (r as unknown as { beforeEnter?: NavigationGuard }).beforeEnter)\n\t\t\t\t.filter((g): g is NavigationGuard => g !== undefined);\n\t\t\tconst beforeEnterResult = yield* runGuards(\n\t\t\t\tbeforeEnterGuards,\n\t\t\t\tresolved,\n\t\t\t\tfrom\n\t\t\t);\n\t\t\tif (!NavigationResult.isAllowed(beforeEnterResult)) {\n\t\t\t\tif (beforeEnterResult._tag === 'NavigationRedirected') {\n\t\t\t\t\treturn yield* navigate(\n\t\t\t\t\t\tbeforeEnterResult.to,\n\t\t\t\t\t\topts,\n\t\t\t\t\t\tnextRedirectPaths\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (beforeEnterResult._tag === 'NavigationFailed') {\n\t\t\t\t\treturn NavigationFailure.guardFailed(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\t\tbeforeEnterResult.error\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn NavigationFailure.guardCancelled(\n\t\t\t\t\tresolved,\n\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\tbeforeEnterResult.reason\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst beforeResolveResult = yield* runGuards(\n\t\t\t\tguards.beforeResolve,\n\t\t\t\tresolved,\n\t\t\t\tfrom\n\t\t\t);\n\t\t\tif (!NavigationResult.isAllowed(beforeResolveResult)) {\n\t\t\t\tif (beforeResolveResult._tag === 'NavigationRedirected') {\n\t\t\t\t\treturn yield* navigate(\n\t\t\t\t\t\tbeforeResolveResult.to,\n\t\t\t\t\t\topts,\n\t\t\t\t\t\tnextRedirectPaths\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (beforeResolveResult._tag === 'NavigationFailed') {\n\t\t\t\t\treturn NavigationFailure.guardFailed(\n\t\t\t\t\t\tresolved,\n\t\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\t\tbeforeResolveResult.error\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn NavigationFailure.guardCancelled(\n\t\t\t\t\tresolved,\n\t\t\t\t\tfrom as ResolvedRoute,\n\t\t\t\t\tbeforeResolveResult.reason\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (currentNavId !== navigationId) {\n\t\t\t\treturn NavigationFailure.aborted(resolved, from as ResolvedRoute);\n\t\t\t}\n\n\t\t\tconst newRoute = createRoute({\n\t\t\t\t...resolved,\n\t\t\t\tquery: resolved.query,\n\t\t\t\thash: resolved.hash,\n\t\t\t});\n\n\t\t\tif (opts.replace) {\n\t\t\t\thistory.replace(resolved.fullPath);\n\t\t\t} else {\n\t\t\t\thistory.push(resolved.fullPath);\n\t\t\t}\n\n\t\t\tyield* SubscriptionRef.set(routeRef, newRoute);\n\n\t\t\tupdateCurrentRouteSignal(newRoute);\n\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('effuse:route-change', { detail: newRoute })\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tEffect.runSync(runAfterHooks(guards.afterEach, newRoute, from));\n\n\t\t\tif (config.scrollToTop && !opts.replace && typeof window !== 'undefined') {\n\t\t\t\twindow.scrollTo(0, 0);\n\t\t\t}\n\n\t\t\treturn newRoute;\n\t\t});\n\n\tconst registerGuard = <T>(registry: T[], guard: T): (() => void) => {\n\t\tregistry.push(guard);\n\t\treturn () => {\n\t\t\tconst index = registry.indexOf(guard);\n\t\t\tif (index > -1) registry.splice(index, 1);\n\t\t};\n\t};\n\n\tconst updateCurrentRouteSignal = (route: Route): void => {\n\t\tupdateRouteSignal(router, route);\n\t};\n\n\tconst router: RouterInstance = {\n\t\tcurrentRoute: routeRef,\n\t\tget routes() {\n\t\t\treturn normalizedRoutes;\n\t\t},\n\t\toptions,\n\n\t\tpush: (to) => Effect.runPromise(navigate(to, { replace: false })),\n\t\treplace: (to) => Effect.runPromise(navigate(to, { replace: true })),\n\t\tback: () => {\n\t\t\thistory.back();\n\t\t},\n\t\tforward: () => {\n\t\t\thistory.forward();\n\t\t},\n\t\tgo: (delta) => {\n\t\t\thistory.go(delta);\n\t\t},\n\n\t\tbeforeEach: (guard) => registerGuard(guards.beforeEach, guard),\n\t\tbeforeResolve: (guard) => registerGuard(guards.beforeResolve, guard),\n\t\tafterEach: (hook) => registerGuard(guards.afterEach, hook),\n\n\t\tresolve: (to) => {\n\t\t\tconst from = Effect.runSync(SubscriptionRef.get(routeRef));\n\t\t\treturn resolveRoute(to, normalizedRoutes, from);\n\t\t},\n\n\t\thasRoute: (name) =>\n\t\t\tnormalizedRoutes.some(\n\t\t\t\t(r) => r.name === name && r.aliasOf === undefined\n\t\t\t),\n\n\t\taddRoute: (route, parentName) => {\n\t\t\tconst parent = parentName\n\t\t\t\t? normalizedRoutes.find(\n\t\t\t\t\t\t(r) => r.name === parentName && r.aliasOf === undefined\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\t\tconst parentAliases = parent\n\t\t\t\t? normalizedRoutes.filter((candidate) => candidate.aliasOf === parent)\n\t\t\t\t: [];\n\t\t\tconst newRoutes = normalizeRoutes([route], parent, parentAliases);\n\t\t\tnormalizedRoutes = finalizeNormalizedRoutes([\n\t\t\t\t...normalizedRoutes,\n\t\t\t\t...newRoutes,\n\t\t\t]);\n\t\t},\n\n\t\tremoveRoute: (name) => {\n\t\t\tconst target = normalizedRoutes.find(\n\t\t\t\t(r) => r.name === name && r.aliasOf === undefined\n\t\t\t);\n\t\t\tif (!target) return;\n\n\t\t\tconst removedCanonicalRoutes = new Set<NormalizedRouteRecord>([target]);\n\t\t\tfor (const route of normalizedRoutes) {\n\t\t\t\tif (route.aliasOf) continue;\n\t\t\t\tlet current = route.parent;\n\t\t\t\twhile (current) {\n\t\t\t\t\tif (current === target) {\n\t\t\t\t\t\tremovedCanonicalRoutes.add(route);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = current.parent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnormalizedRoutes = normalizedRoutes.filter(\n\t\t\t\t(route) =>\n\t\t\t\t\t!removedCanonicalRoutes.has(route.aliasOf ?? route)\n\t\t\t);\n\t\t},\n\n\t\tgetRoutes: () => normalizedRoutes,\n\n\t\tstart: () => {\n\t\t\tif (isStarted) return () => {};\n\t\t\tisStarted = true;\n\n\t\t\tconst syncRoute = () => {\n\t\t\t\tconst path = history.getCurrentPath();\n\t\t\t\tconst { pathname, query, hash } = parseUrl(path);\n\t\t\t\tconst resolved = resolveRoute(pathname, normalizedRoutes);\n\t\t\t\tconst newRoute = createRoute({\n\t\t\t\t\t...resolved,\n\t\t\t\t\tquery,\n\t\t\t\t\thash,\n\t\t\t\t\tfullPath: path,\n\t\t\t\t});\n\t\t\t\tEffect.runSync(SubscriptionRef.set(routeRef, newRoute));\n\t\t\t\tupdateCurrentRouteSignal(newRoute);\n\t\t\t};\n\n\t\t\tconst cleanupHistory = history.listen(syncRoute);\n\t\t\tsyncRoute();\n\n\t\t\tlet stopped = false;\n\t\t\treturn () => {\n\t\t\t\tif (stopped) return;\n\t\t\t\tstopped = true;\n\t\t\t\tcleanupHistory();\n\t\t\t\tisStarted = false;\n\t\t\t};\n\t\t},\n\n\t\tget isReady() {\n\t\t\treturn isStarted;\n\t\t},\n\t};\n\n\treturn router;\n};\n\ninterface RouterRuntimeState {\n\tcurrent: RouterInstance | null;\n\treadonly installations: Array<{ readonly router: RouterInstance }>;\n}\n\nconst ROUTER_RUNTIME_KEY = Symbol.for('effuse.router.runtime.v1');\nconst routerRuntime = (() => {\n\tconst shared = globalThis as Record<PropertyKey, unknown>;\n\tconst existing = shared[ROUTER_RUNTIME_KEY] as RouterRuntimeState | undefined;\n\tif (existing) return existing;\n\tconst created: RouterRuntimeState = { current: null, installations: [] };\n\tObject.defineProperty(shared, ROUTER_RUNTIME_KEY, { value: created });\n\treturn created;\n})();\n\nexport const setGlobalRouter = (router: RouterInstance): (() => void) => {\n\tconst installation = { router };\n\trouterRuntime.installations.push(installation);\n\trouterRuntime.current = router;\n\tlet removed = false;\n\treturn () => {\n\t\tif (removed) return;\n\t\tremoved = true;\n\t\tconst index = routerRuntime.installations.indexOf(installation);\n\t\tif (index >= 0) routerRuntime.installations.splice(index, 1);\n\t\trouterRuntime.current = routerRuntime.installations.at(-1)?.router ?? null;\n\t};\n};\n\nexport const getGlobalRouter = (): RouterInstance | null =>\n\t(injectRouter() as RouterInstance | undefined) ?? routerRuntime.current;\n\nexport const runWithRouter = <T>(\n\trouter: RouterInstance,\n\tfn: () => T\n): T => {\n\tconst currentRoute = Effect.runSync(\n\t\tSubscriptionRef.get(router.currentRoute)\n\t);\n\tconst route = getOrCreateRouteSignal(router, currentRoute);\n\treturn runWithRouterRouteContext(router, route, fn);\n};\n\nexport const installRouter = (\n\trouter: RouterInstance\n): RouterInstance & { cleanup: () => void } => {\n\tlet restoreGlobalRouter: (() => void) | undefined;\n\tlet restoreCoreRouter: (() => void) | undefined;\n\tlet restoreContext: (() => void) | undefined;\n\tlet stopRouter: (() => void) | undefined;\n\ttry {\n\t\trestoreGlobalRouter = setGlobalRouter(router);\n\t\trestoreCoreRouter = setCoreGlobalRouter(router);\n\t\tconst initialRoute = Effect.runSync(\n\t\t\tSubscriptionRef.get(router.currentRoute)\n\t\t);\n\t\trestoreContext = installRouterContext(router, initialRoute);\n\t\tstopRouter = router.start();\n\t} catch (error) {\n\t\trestoreContext?.();\n\t\trestoreCoreRouter?.();\n\t\trestoreGlobalRouter?.();\n\t\tthrow error;\n\t}\n\tlet cleanedUp = false;\n\tconst cleanup = (): void => {\n\t\tif (cleanedUp) return;\n\t\tcleanedUp = true;\n\t\tstopRouter();\n\t\trestoreContext();\n\t\trestoreCoreRouter();\n\t\trestoreGlobalRouter();\n\t};\n\treturn Object.assign(router, { cleanup });\n};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Predicate } from 'effect';\nimport { markRaw, watchEffect, computed } from '@effuse/core';\nimport { getGlobalRouter, type RouterInstance } from '../core/router.js';\nimport type { Route, RouteLocation } from '../core/route.js';\nimport type { NavigationFailure } from '../navigation/errors.js';\nimport { RouterNotInstalledError } from '../errors.js';\nimport { getRouteSignal } from '../core/context.js';\n\nexport const useRouter = (): RouterInstance => {\n\tconst router = getGlobalRouter();\n\tif (!router) {\n\t\tthrow new RouterNotInstalledError({ operation: 'useRouter' });\n\t}\n\treturn markRaw(router);\n};\n\nexport const useRoute = (): Route => {\n\tconst routeSignal = getRouteSignal();\n\tif (!routeSignal) {\n\t\tthrow new RouterNotInstalledError({ operation: 'useRoute' });\n\t}\n\n\t// Create stable reactive proxies so accessing .params only subscribes to param changes\n\tconst path = computed(() => routeSignal.value.path);\n\tconst fullPath = computed(() => routeSignal.value.fullPath);\n\tconst params = computed(() => routeSignal.value.params);\n\tconst query = computed(() => routeSignal.value.query);\n\tconst hash = computed(() => routeSignal.value.hash);\n\tconst matched = computed(() => routeSignal.value.matched);\n\tconst canonicalRouteGroups = computed(\n\t\t() => routeSignal.value.canonicalRouteGroups\n\t);\n\tconst aliasRouteGroups = computed(() => routeSignal.value.aliasRouteGroups);\n\tconst routeGroups = computed(() => routeSignal.value.routeGroups);\n\tconst name = computed(() => routeSignal.value.name);\n\tconst meta = computed(() => routeSignal.value.meta);\n\tconst routeKeys = [\n\t\t'path',\n\t\t'fullPath',\n\t\t'params',\n\t\t'query',\n\t\t'hash',\n\t\t'matched',\n\t\t'canonicalRouteGroups',\n\t\t'aliasRouteGroups',\n\t\t'routeGroups',\n\t\t'name',\n\t\t'meta',\n\t] as const satisfies readonly (keyof Route)[];\n\n\treturn new Proxy({} as Route, {\n\t\tget(_target, prop) {\n\t\t\tswitch (prop) {\n\t\t\t\tcase 'path':\n\t\t\t\t\treturn path.value;\n\t\t\t\tcase 'fullPath':\n\t\t\t\t\treturn fullPath.value;\n\t\t\t\tcase 'params':\n\t\t\t\t\treturn params.value;\n\t\t\t\tcase 'query':\n\t\t\t\t\treturn query.value;\n\t\t\t\tcase 'hash':\n\t\t\t\t\treturn hash.value;\n\t\t\t\tcase 'matched':\n\t\t\t\t\treturn matched.value;\n\t\t\t\tcase 'canonicalRouteGroups':\n\t\t\t\t\treturn canonicalRouteGroups.value;\n\t\t\t\tcase 'aliasRouteGroups':\n\t\t\t\t\treturn aliasRouteGroups.value;\n\t\t\t\tcase 'routeGroups':\n\t\t\t\t\treturn routeGroups.value;\n\t\t\t\tcase 'name':\n\t\t\t\t\treturn name.value;\n\t\t\t\tcase 'meta':\n\t\t\t\t\treturn meta.value;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\townKeys() {\n\t\t\treturn routeKeys;\n\t\t},\n\t\tgetOwnPropertyDescriptor(_target, prop) {\n\t\t\tif (routeKeys.includes(prop as (typeof routeKeys)[number])) {\n\t\t\t\treturn {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n};\n\nexport const onRouteChange = (\n\tcallback: (route: Route) => void\n): (() => void) => {\n\tconst routeSignal = getRouteSignal();\n\n\tif (!routeSignal) {\n\t\treturn () => {};\n\t}\n\n\tlet lastFullPath = routeSignal.value.fullPath;\n\n\tconst { stop } = watchEffect(() => {\n\t\tconst route = routeSignal.value;\n\t\tconst currentFullPath = route.fullPath;\n\n\t\tif (currentFullPath !== lastFullPath) {\n\t\t\tlastFullPath = currentFullPath;\n\t\t\tcallback(route);\n\t\t}\n\t});\n\n\treturn stop;\n};\n\nexport const navigateTo = (\n\tto: RouteLocation,\n\toptions?: { replace?: boolean }\n): Promise<Route | NavigationFailure> => {\n\tconst router = useRouter();\n\tconst shouldReplace =\n\t\tPredicate.isNotNullable(options) && options.replace === true;\n\treturn shouldReplace ? router.replace(to) : router.push(to);\n};\n\nexport const goBack = (): void => {\n\tconst router = useRouter();\n\trouter.back();\n};\n\nexport const goForward = (): void => {\n\tconst router = useRouter();\n\trouter.forward();\n};\n\nexport const isActiveRoute = (\n\tpath: string,\n\texact: boolean = false\n): boolean => {\n\tconst route = useRoute();\n\tif (exact) {\n\t\treturn route.path === path;\n\t}\n\treturn route.path.startsWith(path);\n};\n\nexport const getLinkClasses = (\n\tto: string,\n\toptions?: {\n\t\tactiveClass?: string;\n\t\texactActiveClass?: string;\n\t\tinactiveClass?: string;\n\t}\n): string => {\n\tconst route = useRoute();\n\tconst isExactActive = route.path === to;\n\tconst isActive = route.path.startsWith(to);\n\n\tconst classes: string[] = [];\n\n\tif (\n\t\tisExactActive &&\n\t\tPredicate.isNotNullable(options) &&\n\t\tPredicate.isNotNullable(options.exactActiveClass)\n\t) {\n\t\tclasses.push(options.exactActiveClass);\n\t} else if (\n\t\tisActive &&\n\t\tPredicate.isNotNullable(options) &&\n\t\tPredicate.isNotNullable(options.activeClass)\n\t) {\n\t\tclasses.push(options.activeClass);\n\t} else if (\n\t\t!isActive &&\n\t\tPredicate.isNotNullable(options) &&\n\t\tPredicate.isNotNullable(options.inactiveClass)\n\t) {\n\t\tclasses.push(options.inactiveClass);\n\t}\n\n\treturn classes.join(' ');\n};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Predicate } from 'effect';\nimport {\n\tdefine,\n\twatchEffect,\n\ttype EffuseChild,\n\ttype BlueprintDef,\n\ttype Signal,\n\tEFFUSE_NODE,\n\tCreateElementNode,\n\tCreateBlueprintNode,\n} from '@effuse/core';\nimport { getGlobalRouter } from '../core/router.js';\nimport { DEPTH_KEY, getRouteSignal } from '../core/context.js';\nimport {\n\tisLazyRouteComponent,\n\ttype Route,\n\ttype NormalizedRouteRecord,\n\ttype RouteComponent,\n\ttype LazyRouteComponent,\n} from '../core/route.js';\nimport { InvalidRouterStateError } from '../errors.js';\n\nconst getMatchedComponent = (\n\troute: Route,\n\tdepth: number,\n\tname: string\n): RouteComponent | LazyRouteComponent | null => {\n\tconst matched = route.matched[depth];\n\tif (!matched) return null;\n\n\tif (matched.components) {\n\t\treturn matched.components[name] ?? null;\n\t}\n\n\treturn name === 'default' ? (matched.component ?? null) : null;\n};\n\n/**\n * Resolves the props a matched route component receives.\n *\n * The route record's `props` option is the single source of truth for prop\n * injection; route params are never merged on top of it elsewhere:\n *\n * - absent or `true` — the route params are injected as props (default).\n * - `false` — nothing is injected; params remain available via `useRoute()`.\n * - object — exactly that object is injected; params are not auto-merged.\n * - function — exactly its return value is injected; the function receives\n *   `route`, so it can spread `route.params` explicitly when desired.\n */\nconst getComponentProps = (\n\troute: Route,\n\tmatched: NormalizedRouteRecord | undefined\n): Record<string, unknown> => {\n\tif (!Predicate.isNotNullable(matched)) return {};\n\n\tconst option = matched.props;\n\n\tif (option === undefined || option === true) {\n\t\treturn { ...route.params };\n\t}\n\n\tif (option === false) {\n\t\treturn {};\n\t}\n\n\tif (Predicate.isFunction(option)) {\n\t\treturn option(route);\n\t}\n\n\treturn option;\n};\n\nconst isBlueprintComponent = (component: unknown): component is BlueprintDef =>\n\tPredicate.isObject(component) &&\n\tPredicate.hasProperty(component, '_tag') &&\n\t(component as { readonly _tag?: unknown })._tag === 'Blueprint';\n\nconst isLazyRouteModule = (\n\tvalue: unknown\n): value is { readonly default: RouteComponent } =>\n\tPredicate.isObject(value) &&\n\tPredicate.hasProperty(value, 'default') &&\n\t(Predicate.isFunction(value.default) || isBlueprintComponent(value.default));\n\nconst renderComponent = (\n\tcomponent: RouteComponent,\n\tprops: Record<string, unknown>\n): EffuseChild => {\n\tif (isBlueprintComponent(component)) {\n\t\treturn CreateBlueprintNode({\n\t\t\t[EFFUSE_NODE]: true,\n\t\t\tblueprint: component,\n\t\t\tprops: { ...props },\n\t\t\tportals: null,\n\t\t});\n\t}\n\n\tif (Predicate.isFunction(component)) {\n\t\treturn component({ ...props });\n\t}\n\n\treturn component as EffuseChild;\n};\n\nconst renderRouteContent = (\n\tcomponent: RouteComponent,\n\troute: Route,\n\tprops: Record<string, unknown>,\n\tslot: RouterViewProps['slot'] | undefined\n): EffuseChild => {\n\tif (Predicate.isNotNullable(slot)) {\n\t\treturn slot(component, route, props);\n\t}\n\n\treturn renderComponent(component, props);\n};\n\nconst createRouteContentNode = (\n\tdepth: number,\n\tviewName: string,\n\troute: Route,\n\trendered: EffuseChild\n): EffuseChild =>\n\tCreateElementNode({\n\t\t[EFFUSE_NODE]: true,\n\t\ttag: 'div',\n\t\tkey: createViewIdentity(depth, viewName, route),\n\t\tprops: {\n\t\t\tclass: 'router-view-content',\n\t\t},\n\t\tchildren: [rendered],\n\t});\n\nconst createDefaultLoadingView = (): EffuseChild =>\n\tCreateElementNode({\n\t\t[EFFUSE_NODE]: true,\n\t\ttag: 'div',\n\t\tprops: { class: 'router-view-loading' },\n\t\tchildren: [],\n\t});\n\nconst createDefaultErrorView = (): EffuseChild =>\n\tCreateElementNode({\n\t\t[EFFUSE_NODE]: true,\n\t\ttag: 'div',\n\t\tprops: { class: 'router-view-error' },\n\t\tchildren: ['Failed to load component'],\n\t});\n\nconst renderFallback = (\n\tfallback: RouterViewFallback | undefined,\n\troute: Route\n): EffuseChild => {\n\tif (!Predicate.isNotNullable(fallback)) {\n\t\treturn createDefaultLoadingView();\n\t}\n\n\tif (Predicate.isFunction(fallback)) {\n\t\treturn (fallback as (route: Route) => EffuseChild)(route);\n\t}\n\n\treturn fallback;\n};\n\nconst renderErrorFallback = (\n\terrorFallback: RouterViewErrorFallback | undefined,\n\terror: unknown,\n\troute: Route\n): EffuseChild => {\n\tif (!Predicate.isNotNullable(errorFallback)) {\n\t\treturn createDefaultErrorView();\n\t}\n\n\tif (Predicate.isFunction(errorFallback)) {\n\t\treturn (errorFallback as (error: unknown, route: Route) => EffuseChild)(\n\t\t\terror,\n\t\t\troute\n\t\t);\n\t}\n\n\treturn errorFallback;\n};\n\nconst createViewIdentity = (\n\tdepth: number,\n\tviewName: string,\n\troute: Route\n): string =>\n\t`${String(depth)}:${viewName}:${route.matched[depth]?.fullPath ?? 'unmatched'}`;\n\nconst createViewUpdateKey = (\n\tdepth: number,\n\tviewName: string,\n\troute: Route\n): string => `${createViewIdentity(depth, viewName, route)}:${route.fullPath}`;\n\nexport type RouterViewFallback =\n\t| EffuseChild\n\t| ((route: Route) => EffuseChild);\n\nexport type RouterViewErrorFallback =\n\t| EffuseChild\n\t| ((error: unknown, route: Route) => EffuseChild);\n\nexport interface RouterViewProps {\n\treadonly name?: string;\n\treadonly route?: Route;\n\treadonly fallback?: RouterViewFallback;\n\treadonly errorFallback?: RouterViewErrorFallback;\n\treadonly slot?: (\n\t\tcomponent: RouteComponent,\n\t\troute: Route,\n\t\tprops: Record<string, unknown>\n\t) => EffuseChild;\n}\n\ninterface RouterViewState {\n\treadonly matchedView: Signal<EffuseChild>;\n}\n\nexport const RouterView = define<RouterViewProps, RouterViewState>({\n\tscript: ({\n\t\tprops: viewProps,\n\t\tsignal: createSignal,\n\t\tinject,\n\t\tprovide,\n\t}) => {\n\t\tconst router = getGlobalRouter();\n\t\tif (!router) {\n\t\t\tthrow new InvalidRouterStateError({\n\t\t\t\tmessage: 'RouterView requires a router. Call installRouter() first.',\n\t\t\t});\n\t\t}\n\n\t\tconst routeSignal = getRouteSignal();\n\t\tif (!routeSignal) {\n\t\t\tthrow new InvalidRouterStateError({\n\t\t\t\tmessage:\n\t\t\t\t\t'RouterView requires installRouter() to be called first. No route signal found.',\n\t\t\t});\n\t\t}\n\n\t\tconst depth = inject<number>(DEPTH_KEY, 0) ?? 0;\n\t\tprovide(DEPTH_KEY, depth + 1);\n\n\t\tconst matchedView = createSignal<EffuseChild>(null);\n\n\t\tlet lastViewKey: string | null = null;\n\n\t\tconst getActiveRoute = (): Route => viewProps.route ?? routeSignal.value;\n\t\tconst getActiveViewName = (): string => viewProps.name ?? 'default';\n\n\t\tconst renderLazyComponent = (\n\t\t\tresult: Promise<unknown>,\n\t\t\troute: Route,\n\t\t\tviewName: string,\n\t\t\tcurrentViewKey: string,\n\t\t\tcomponentProps: Record<string, unknown>\n\t\t): void => {\n\t\t\tlastViewKey = currentViewKey;\n\t\t\tmatchedView.value = renderFallback(viewProps.fallback, route);\n\n\t\t\tresult\n\t\t\t\t.then((mod) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcreateViewUpdateKey(depth, getActiveViewName(), getActiveRoute()) !==\n\t\t\t\t\t\tcurrentViewKey\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (!isLazyRouteModule(mod)) {\n\t\t\t\t\t\tmatchedView.value = renderErrorFallback(\n\t\t\t\t\t\t\tviewProps.errorFallback,\n\t\t\t\t\t\t\tnew TypeError(\n\t\t\t\t\t\t\t\t'Effuse lazy route expected a default route component.'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\troute\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst rendered = renderRouteContent(\n\t\t\t\t\t\tmod.default,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\tcomponentProps,\n\t\t\t\t\t\tviewProps.slot\n\t\t\t\t\t);\n\t\t\t\t\tmatchedView.value = createRouteContentNode(\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tviewName,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\trendered\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcreateViewUpdateKey(depth, getActiveViewName(), getActiveRoute()) !==\n\t\t\t\t\t\tcurrentViewKey\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tmatchedView.value = renderErrorFallback(\n\t\t\t\t\t\tviewProps.errorFallback,\n\t\t\t\t\t\terror,\n\t\t\t\t\t\troute\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t};\n\n\t\tconst updateView = () => {\n\t\t\tconst route = getActiveRoute();\n\t\t\tconst viewName = getActiveViewName();\n\t\t\tconst currentViewKey = createViewUpdateKey(depth, viewName, route);\n\n\t\t\tif (lastViewKey === currentViewKey) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst matched = route.matched[depth];\n\t\t\tconst component = getMatchedComponent(route, depth, viewName);\n\n\t\t\tif (!component) {\n\t\t\t\tlastViewKey = currentViewKey;\n\t\t\t\tmatchedView.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst componentProps = getComponentProps(route, matched);\n\n\t\t\tif (isLazyRouteComponent(component)) {\n\t\t\t\trenderLazyComponent(\n\t\t\t\t\tcomponent(),\n\t\t\t\t\troute,\n\t\t\t\t\tviewName,\n\t\t\t\t\tcurrentViewKey,\n\t\t\t\t\tcomponentProps\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (Predicate.isFunction(component)) {\n\t\t\t\tconst routeFunction = component as (\n\t\t\t\t\tprops?: Record<string, unknown>\n\t\t\t\t) => EffuseChild | Promise<unknown>;\n\n\t\t\t\tif (Predicate.isNotNullable(viewProps.slot)) {\n\t\t\t\t\tconst rendered = viewProps.slot(\n\t\t\t\t\t\trouteFunction as RouteComponent,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\tcomponentProps\n\t\t\t\t\t);\n\t\t\t\t\tconst content = createRouteContentNode(\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tviewName,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\trendered\n\t\t\t\t\t);\n\n\t\t\t\t\tlastViewKey = currentViewKey;\n\t\t\t\t\tmatchedView.value = content;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst result = routeFunction({ ...componentProps, ...route.params });\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\trenderLazyComponent(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\tviewName,\n\t\t\t\t\t\tcurrentViewKey,\n\t\t\t\t\t\tcomponentProps\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Sync function component\n\t\t\t\tconst content = createRouteContentNode(depth, viewName, route, result);\n\n\t\t\t\tlastViewKey = currentViewKey;\n\t\t\t\tmatchedView.value = content;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rendered = renderRouteContent(\n\t\t\t\tcomponent,\n\t\t\t\troute,\n\t\t\t\tcomponentProps,\n\t\t\t\tviewProps.slot\n\t\t\t);\n\n\t\t\tconst content = createRouteContentNode(depth, viewName, route, rendered);\n\n\t\t\tlastViewKey = currentViewKey;\n\t\t\tmatchedView.value = content;\n\t\t};\n\n\t\tupdateView();\n\n\t\tconst checkRouteChange = () => {\n\t\t\tconst route = getActiveRoute();\n\t\t\tconst viewName = getActiveViewName();\n\t\t\tconst currentViewKey = createViewUpdateKey(depth, viewName, route);\n\n\t\t\tif (lastViewKey !== currentViewKey) {\n\t\t\t\tqueueMicrotask(updateView);\n\t\t\t}\n\t\t};\n\n\t\twatchEffect(checkRouteChange);\n\n\t\treturn {\n\t\t\tmatchedView,\n\t\t};\n\t},\n\n\ttemplate: ({ matchedView }): EffuseChild => {\n\t\treturn CreateElementNode({\n\t\t\t[EFFUSE_NODE]: true,\n\t\t\ttag: 'div',\n\t\t\tprops: {\n\t\t\t\tclass: 'router-view',\n\t\t\t},\n\t\t\tchildren: [matchedView],\n\t\t});\n\t},\n});\n\nexport const createRouterViewSlot = (\n\trender: (\n\t\tcomponent: RouteComponent,\n\t\troute: Route,\n\t\tprops: Record<string, unknown>\n\t) => EffuseChild\n): typeof render => render;\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Effect, SubscriptionRef, Predicate } from 'effect';\nimport {\n\tdefine,\n\tEFFUSE_NODE,\n\tCreateElementNode,\n\ttype ElementNode,\n\ttype EffuseChild,\n\ttype Signal,\n\twatchEffect,\n\tcomputed,\n} from '@effuse/core';\nimport { getGlobalRouter } from '../core/router.js';\nimport { getRouteSignal } from '../core/context.js';\nimport type { Route } from '../core/route.js';\n\ninterface LinkProps {\n\t[key: string]: unknown;\n\tto: string | (() => string);\n\tactiveClass?: string;\n\texactActiveClass?: string;\n\tclass?: string;\n\tclassName?: string;\n\tchildren?: unknown;\n}\n\ninterface LinkState {\n\thref: () => string;\n\tisActive: Signal<boolean>;\n\tisExactActive: Signal<boolean>;\n\tresolvedActiveClass: string;\n\tresolvedExactActiveClass: string;\n\thandleClick: (event: MouseEvent) => void;\n}\n\nconst LINK_CONTROL_PROPS = new Set([\n\t'to',\n\t'activeClass',\n\t'exactActiveClass',\n\t'class',\n\t'className',\n\t'children',\n\t'onClick',\n\t'href',\n\t'aria-current',\n]);\n\nexport const Link = define<LinkProps, LinkState>({\n\tscript: ({ props, signal, onMount, onUnmount }): LinkState => {\n\t\tconst router = getGlobalRouter();\n\n\t\tconst resolveTo = (): string =>\n\t\t\ttypeof props.to === 'function' ? props.to() : props.to;\n\t\tconst activeClass = props.activeClass ?? 'router-link-active';\n\t\tconst exactActiveClass =\n\t\t\tprops.exactActiveClass ?? 'router-link-exact-active';\n\n\t\tconst isActive = signal(false);\n\t\tconst isExactActive = signal(false);\n\n\t\tlet stopWatch: (() => void) | null = null;\n\n\t\tconst updateActiveState = (route: Route): void => {\n\t\t\tconst to = resolveTo();\n\t\t\tisExactActive.value = route.path === to;\n\t\t\tisActive.value = route.path.startsWith(to) || isExactActive.value;\n\t\t};\n\n\t\tonMount(() => {\n\t\t\tif (!router) return undefined;\n\n\t\t\tconst currentRoute = Effect.runSync(\n\t\t\t\tSubscriptionRef.get(router.currentRoute)\n\t\t\t);\n\t\t\tupdateActiveState(currentRoute);\n\n\t\t\tconst routeSignal = getRouteSignal();\n\t\t\tif (routeSignal) {\n\t\t\t\tconst h = watchEffect(() => {\n\t\t\t\t\tupdateActiveState(routeSignal.value);\n\t\t\t\t});\n\t\t\t\tstopWatch = h.stop;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\n\t\tonUnmount(() => {\n\t\t\tif (Predicate.isNotNullable(stopWatch)) {\n\t\t\t\tstopWatch();\n\t\t\t}\n\t\t\tstopWatch = null;\n\t\t});\n\n\t\tconst handleClick = (event: MouseEvent): void => {\n\t\t\tif (typeof props.onClick === 'function') {\n\t\t\t\t(props.onClick as (event: MouseEvent) => void)(event);\n\t\t\t}\n\t\t\tif (event.defaultPrevented) return;\n\n\t\t\tif (event.metaKey || event.altKey || event.ctrlKey || event.shiftKey)\n\t\t\t\treturn;\n\n\t\t\tif (event.button !== 0) return;\n\n\t\t\tconst target = typeof props.target === 'string' ? props.target : '';\n\t\t\tif (target && target.toLowerCase() !== '_self') return;\n\t\t\tif (props.download !== undefined && props.download !== false) return;\n\t\t\tif (!router) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tvoid router.push(resolveTo());\n\t\t};\n\n\t\treturn {\n\t\t\thref: resolveTo,\n\t\t\tisActive,\n\t\t\tisExactActive,\n\t\t\tresolvedActiveClass: activeClass,\n\t\t\tresolvedExactActiveClass: exactActiveClass,\n\t\t\thandleClick,\n\t\t};\n\t},\n\n\ttemplate: (ctx): ElementNode => {\n\t\tconst anchorProps = Object.fromEntries(\n\t\t\tObject.entries(ctx.props).filter(([key]) => !LINK_CONTROL_PROPS.has(key))\n\t\t);\n\t\tconst userClass =\n\t\t\t(typeof ctx.props.class === 'string' && ctx.props.class) ||\n\t\t\t(typeof ctx.props.className === 'string' && ctx.props.className) ||\n\t\t\t'';\n\n\t\tconst classSig = computed<string | null>(() => {\n\t\t\tconst classes: string[] = [];\n\t\t\tif (userClass) classes.push(userClass);\n\t\t\tif (ctx.isExactActive.value) {\n\t\t\t\tclasses.push(ctx.resolvedExactActiveClass);\n\t\t\t} else if (ctx.isActive.value) {\n\t\t\t\tclasses.push(ctx.resolvedActiveClass);\n\t\t\t}\n\t\t\treturn classes.length > 0 ? classes.join(' ') : null;\n\t\t});\n\n\t\tconst ariaCurrentSig = computed<string | null>(() =>\n\t\t\tctx.isExactActive.value ? 'page' : null\n\t\t);\n\n\t\tconst childrenProp = ctx.children;\n\t\tconst childrenArr =\n\t\t\tchildrenProp == null\n\t\t\t\t? []\n\t\t\t\t: Array.isArray(childrenProp)\n\t\t\t\t\t? (childrenProp as EffuseChild[])\n\t\t\t\t\t: [childrenProp as EffuseChild];\n\n\t\treturn CreateElementNode({\n\t\t\t[EFFUSE_NODE]: true,\n\t\t\ttag: 'a',\n\t\t\tprops: {\n\t\t\t\t...anchorProps,\n\t\t\t\thref: ctx.href,\n\t\t\t\tclassName: classSig,\n\t\t\t\tonClick: ctx.handleClick,\n\t\t\t\t'aria-current': ariaCurrentSig,\n\t\t\t},\n\t\t\tchildren: childrenArr,\n\t\t});\n\t},\n});\n\nexport const RouterLink = Link;\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Schema } from 'effect';\nimport type { RouteParamInput } from '@effuse/core';\nimport type { RouteRecord, Route, RouteLocation } from '../core/route.js';\n\nexport interface TypedRouteRecord<\n\tParams extends Record<string, string> = Record<string, string>,\n\tQuery extends Record<string, string> = Record<string, string>,\n\tMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends RouteRecord {\n\treadonly paramsSchema?: Schema.Schema<Params>;\n\treadonly querySchema?: Schema.Schema<Query>;\n\treadonly meta?: Meta;\n}\n\nexport interface TypedRoute<\n\tParams extends Record<string, string> = Record<string, string>,\n\tQuery extends Record<string, string> = Record<string, string>,\n\tMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends Route {\n\treadonly params: Params;\n\treadonly query: Query;\n\treadonly meta: Meta;\n}\n\nexport type ExtractRouteParams<Path extends string> = RouteParamInput<Path>;\n\nexport type TypedRouteLocation<\n\tName extends string,\n\tParams extends Partial<Record<string, string>> = Record<string, never>,\n> = {\n\tname: Name;\n\tparams?: Params extends Record<string, never> ? undefined : Params;\n\tquery?: Record<string, string>;\n\thash?: string;\n};\n\nexport const defineRoutes = <const Routes extends readonly TypedRouteRecord[]>(\n\troutes: Routes\n): Routes => routes;\n\nexport const createTypedNavigator = <\n\tParams extends Record<string, string>,\n\tQuery extends Record<string, string> = Record<string, string>,\n>(\n\tname: string,\n\t_paramsSchema?: Schema.Schema<Params>,\n\t_querySchema?: Schema.Schema<Query>\n) => ({\n\tto: (params: Params, query?: Query): RouteLocation => ({\n\t\tname,\n\t\tparams: params as Record<string, string>,\n\t\tquery: query as Record<string, string>,\n\t}),\n\n\tmatches: (route: Route): route is TypedRoute<Params, Query> =>\n\t\troute.name === name,\n});\n\nexport const validateParams = <A>(\n\tparams: Record<string, string>,\n\tschema: Schema.Schema<A>\n): A | null => {\n\ttry {\n\t\treturn Schema.decodeUnknownSync(schema)(params);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nexport const createParamsGuard =\n\t<A>(\n\t\tschema: Schema.Schema<A>,\n\t\tonInvalid: (\n\t\t\tparams: Record<string, string>\n\t\t) => RouteLocation | string = () => '/'\n\t) =>\n\t(to: Route) => {\n\t\tconst result = validateParams(to.params, schema);\n\t\tif (result === null) {\n\t\t\treturn onInvalid(to.params);\n\t\t}\n\t\treturn true;\n\t};\n","/**\n * MIT License\n *\n * Copyright (c) 2025 Chris M. Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Effect } from 'effect';\nimport type { Route } from '../core/route.js';\n\nexport type TransitionMode = 'in-out' | 'out-in' | 'default';\n\nexport interface TransitionConfig {\n\treadonly name?: string;\n\treadonly mode?: TransitionMode;\n\treadonly duration?: number | { enter: number; leave: number };\n\treadonly enterClass?: string;\n\treadonly enterActiveClass?: string;\n\treadonly enterToClass?: string;\n\treadonly leaveClass?: string;\n\treadonly leaveActiveClass?: string;\n\treadonly leaveToClass?: string;\n}\n\nexport interface TransitionState {\n\treadonly phase: 'enter' | 'leave' | 'idle';\n\treadonly classes: string[];\n}\n\nexport interface TransitionHooks {\n\treadonly onBeforeEnter?: (el: Element) => void;\n\treadonly onEnter?: (el: Element, done: () => void) => void;\n\treadonly onAfterEnter?: (el: Element) => void;\n\treadonly onEnterCancelled?: (el: Element) => void;\n\treadonly onBeforeLeave?: (el: Element) => void;\n\treadonly onLeave?: (el: Element, done: () => void) => void;\n\treadonly onAfterLeave?: (el: Element) => void;\n\treadonly onLeaveCancelled?: (el: Element) => void;\n}\n\nexport const getTransitionClasses = (\n\tconfig: TransitionConfig,\n\tphase: 'enter' | 'leave'\n): { base: string; active: string; to: string } => {\n\tconst name = config.name ?? 'route';\n\n\tif (phase === 'enter') {\n\t\treturn {\n\t\t\tbase: config.enterClass ?? `${name}-enter-from`,\n\t\t\tactive: config.enterActiveClass ?? `${name}-enter-active`,\n\t\t\tto: config.enterToClass ?? `${name}-enter-to`,\n\t\t};\n\t}\n\n\treturn {\n\t\tbase: config.leaveClass ?? `${name}-leave-from`,\n\t\tactive: config.leaveActiveClass ?? `${name}-leave-active`,\n\t\tto: config.leaveToClass ?? `${name}-leave-to`,\n\t};\n};\n\nconst DEFAULT_DURATION = 300;\n\nexport const getTransitionDuration = (\n\tconfig: TransitionConfig,\n\tphase: 'enter' | 'leave'\n): number => {\n\tif (typeof config.duration === 'number') {\n\t\treturn config.duration;\n\t}\n\tif (config.duration) {\n\t\treturn phase === 'enter' ? config.duration.enter : config.duration.leave;\n\t}\n\treturn DEFAULT_DURATION;\n};\n\nexport const applyTransition = (\n\tel: Element,\n\tconfig: TransitionConfig,\n\tphase: 'enter' | 'leave'\n): Effect.Effect<void> =>\n\tEffect.async((resume) => {\n\t\tconst classes = getTransitionClasses(config, phase);\n\t\tconst duration = getTransitionDuration(config, phase);\n\n\t\tel.classList.add(classes.base, classes.active);\n\t\tvoid (el as HTMLElement).offsetHeight;\n\n\t\trequestAnimationFrame(() => {\n\t\t\tel.classList.remove(classes.base);\n\t\t\tel.classList.add(classes.to);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tel.classList.remove(classes.active, classes.to);\n\t\t\t\tresume(Effect.succeed(undefined));\n\t\t\t}, duration);\n\t\t});\n\t});\n\nexport const getRouteTransition = (\n\tto: Route,\n\tfrom: Route\n): TransitionConfig | undefined => {\n\tconst toTransition = to.meta.transition as\n\t\t| TransitionConfig\n\t\t| string\n\t\t| undefined;\n\n\tif (typeof toTransition === 'string') {\n\t\treturn { name: toTransition };\n\t}\n\n\tif (toTransition) {\n\t\treturn toTransition;\n\t}\n\n\tconst fromTransition = from.meta.leaveTransition as\n\t\t| TransitionConfig\n\t\t| string\n\t\t| undefined;\n\n\tif (typeof fromTransition === 'string') {\n\t\treturn { name: fromTransition };\n\t}\n\n\treturn fromTransition;\n};\n\nexport const transitions = {\n\tfade: { name: 'fade', duration: 200 } as TransitionConfig,\n\tslide: { name: 'slide', duration: DEFAULT_DURATION } as TransitionConfig,\n\tslideLeft: {\n\t\tname: 'slide-left',\n\t\tduration: DEFAULT_DURATION,\n\t} as TransitionConfig,\n\tslideRight: {\n\t\tname: 'slide-right',\n\t\tduration: DEFAULT_DURATION,\n\t} as TransitionConfig,\n\tscale: { name: 'scale', duration: 200 } as TransitionConfig,\n};\n"]}