vorma 0.86.0-pre.2 → 0.86.0-pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dist/core/_index.d.ts +1 -0
- package/.dist/core/_index.d.ts.map +1 -1
- package/.dist/core/_index.js +6 -0
- package/.dist/core/_index.js.map +1 -1
- package/.dist/core/vorma_client_wasm_bg.wasm +0 -0
- package/.dist/ui/solid/solid.js +29 -39
- package/.dist/ui/solid/solid.js.map +1 -1
- package/core/client_wasm/vorma_client_wasm_bg.wasm +0 -0
- package/core/create_client_core.ts +9 -1
- package/package.json +1 -16
- package/ui/solid/solid.tsx +29 -10
- package/.dist/kit/lab/design/components/remix/remix.d.ts +0 -2309
- package/.dist/kit/lab/design/components/remix/remix.d.ts.map +0 -1
- package/.dist/kit/lab/design/components/remix/remix.js +0 -7022
- package/.dist/kit/lab/design/components/remix/remix.js.map +0 -1
- package/.dist/kit/lab/design/core/core.d.ts +0 -527
- package/.dist/kit/lab/design/core/core.d.ts.map +0 -1
- package/.dist/kit/lab/design/core/core.js +0 -668
- package/.dist/kit/lab/design/core/core.js.map +0 -1
- package/.dist/kit/matcher/matcher.d.ts +0 -78
- package/.dist/kit/matcher/matcher.d.ts.map +0 -1
- package/.dist/kit/matcher/matcher.js +0 -517
- package/.dist/kit/matcher/matcher.js.map +0 -1
- package/.dist/ui/remix/remix.d.ts +0 -73
- package/.dist/ui/remix/remix.d.ts.map +0 -1
- package/.dist/ui/remix/remix.js +0 -409
- package/.dist/ui/remix/remix.js.map +0 -1
- package/kit/lab/design/components/remix/accordion.ts +0 -474
- package/kit/lab/design/components/remix/alert-dialog.ts +0 -512
- package/kit/lab/design/components/remix/alert.ts +0 -213
- package/kit/lab/design/components/remix/aspect-ratio.ts +0 -111
- package/kit/lab/design/components/remix/badge.ts +0 -59
- package/kit/lab/design/components/remix/box.ts +0 -49
- package/kit/lab/design/components/remix/button.ts +0 -314
- package/kit/lab/design/components/remix/callout.ts +0 -127
- package/kit/lab/design/components/remix/checkable-state.ts +0 -187
- package/kit/lab/design/components/remix/checkbox-group.ts +0 -443
- package/kit/lab/design/components/remix/checkbox.ts +0 -215
- package/kit/lab/design/components/remix/chip.ts +0 -165
- package/kit/lab/design/components/remix/code-block.ts +0 -181
- package/kit/lab/design/components/remix/collapsible.ts +0 -325
- package/kit/lab/design/components/remix/component-state.ts +0 -55
- package/kit/lab/design/components/remix/component-style.ts +0 -364
- package/kit/lab/design/components/remix/composite-navigation.ts +0 -71
- package/kit/lab/design/components/remix/conditions.ts +0 -25
- package/kit/lab/design/components/remix/controllable-state.ts +0 -58
- package/kit/lab/design/components/remix/description-list.ts +0 -275
- package/kit/lab/design/components/remix/dialog.ts +0 -653
- package/kit/lab/design/components/remix/empty-state.ts +0 -146
- package/kit/lab/design/components/remix/field.ts +0 -418
- package/kit/lab/design/components/remix/fieldset.ts +0 -153
- package/kit/lab/design/components/remix/form-mirror.ts +0 -94
- package/kit/lab/design/components/remix/form-reset.ts +0 -85
- package/kit/lab/design/components/remix/form.ts +0 -109
- package/kit/lab/design/components/remix/grid.ts +0 -187
- package/kit/lab/design/components/remix/group-label.ts +0 -47
- package/kit/lab/design/components/remix/icon.ts +0 -176
- package/kit/lab/design/components/remix/input.ts +0 -163
- package/kit/lab/design/components/remix/kbd.ts +0 -58
- package/kit/lab/design/components/remix/list.ts +0 -120
- package/kit/lab/design/components/remix/listbox.ts +0 -1116
- package/kit/lab/design/components/remix/menu.ts +0 -1477
- package/kit/lab/design/components/remix/ordered-collection.ts +0 -95
- package/kit/lab/design/components/remix/popover-scroll-lock.ts +0 -89
- package/kit/lab/design/components/remix/popover.ts +0 -576
- package/kit/lab/design/components/remix/popup-behavior.ts +0 -96
- package/kit/lab/design/components/remix/progress.ts +0 -185
- package/kit/lab/design/components/remix/radio-group.ts +0 -420
- package/kit/lab/design/components/remix/recipe.ts +0 -70
- package/kit/lab/design/components/remix/remix.ts +0 -683
- package/kit/lab/design/components/remix/responsive.ts +0 -106
- package/kit/lab/design/components/remix/root.ts +0 -137
- package/kit/lab/design/components/remix/select.ts +0 -1546
- package/kit/lab/design/components/remix/separator.ts +0 -108
- package/kit/lab/design/components/remix/slider.ts +0 -308
- package/kit/lab/design/components/remix/spinner.ts +0 -114
- package/kit/lab/design/components/remix/stack.ts +0 -205
- package/kit/lab/design/components/remix/stat.ts +0 -127
- package/kit/lab/design/components/remix/surface.ts +0 -71
- package/kit/lab/design/components/remix/switch.ts +0 -219
- package/kit/lab/design/components/remix/table.ts +0 -395
- package/kit/lab/design/components/remix/tabs.ts +0 -404
- package/kit/lab/design/components/remix/text.ts +0 -169
- package/kit/lab/design/components/remix/textarea.ts +0 -164
- package/kit/lab/design/components/remix/toast.ts +0 -299
- package/kit/lab/design/components/remix/tooltip.ts +0 -330
- package/kit/lab/design/components/remix/typeahead.ts +0 -81
- package/kit/lab/design/components/remix/types.ts +0 -19
- package/kit/lab/design/components/remix/visually-hidden.ts +0 -100
- package/kit/lab/design/core/color.ts +0 -46
- package/kit/lab/design/core/core.ts +0 -111
- package/kit/lab/design/core/create_primitive.ts +0 -455
- package/kit/lab/design/core/create_system.ts +0 -303
- package/kit/lab/design/core/css.ts +0 -127
- package/kit/lab/design/core/define_system.ts +0 -508
- package/kit/lab/design/core/math.ts +0 -12
- package/kit/lab/design/core/object.ts +0 -31
- package/kit/lab/design/core/recipe/create_recipe.ts +0 -185
- package/kit/lab/design/core/recipe/recipe.ts +0 -26
- package/kit/lab/design/core/recipe/style.ts +0 -62
- package/kit/lab/design/core/recipe/types.ts +0 -160
- package/kit/lab/design/core/resolve_token.ts +0 -118
- package/kit/lab/design/core/types.ts +0 -636
- package/ui/remix/remix.tsx +0 -901
package/.dist/core/_index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_index.js","names":[],"sources":["../../core/constants.ts","../../core/url.ts","../../core/api_client.ts","../../core/client_wasm/load.ts","../../core/client_wasm/matcher.ts","../../core/css.ts","../../core/head.ts","../../core/modules.ts","../../core/create_client_core.ts","../../core/make_link_props.ts","../../core/resolve_outlet_slot.ts","../../core/ui_adapter_core.ts"],"sourcesContent":["export const VORMA_JSON_KEY = \"vorma-json\";\nexport const DATA_SCRIPT_ID = \"vorma-data-json\";\nexport const BUILD_ID_HEADER = \"X-Vorma-Client-Build-Id\";\nexport const X_VORMA_BUILD_SKEW = \"X-Vorma-Build-Skew\";\nexport const X_CLIENT_REDIRECT = \"X-Client-Redirect\";\nexport const X_ACCEPTS_CLIENT_REDIRECT = \"X-Accepts-Client-Redirect\";\n\nexport const VERCEL_X_DEPLOYMENT_ID = \"x-deployment-id\";\nexport const VERCEL_DPL_QUERY_PARAM_KEY = \"dpl\";\n\nexport const SCROLL_STORAGE_KEY = \"vorma-scroll-state\";\nexport const SCROLL_STORAGE_RELOAD_KEY = \"vorma-scroll-state-reload\";\nexport const VORMA_ROOT_EL_ID = \"vorma-root\";\n\nexport const HISTORY_KEY_FIELD = \"vorma-history-key\";\nexport const HISTORY_USER_STATE_FIELD = \"vorma-user-state\";\n\nexport const API_IDENTITY_ARRAY_PREFIX = \"vorma-api\";\n\nexport const LINK_ACTIVE_EXACT_ATTR = \"data-vorma-active-exact\";\nexport const LINK_ACTIVE_ANCESTOR_ATTR = \"data-vorma-active-ancestor\";\nexport const LINK_PENDING_EXACT_ATTR = \"data-vorma-pending-exact\";\nexport const LINK_PENDING_ANCESTOR_ATTR = \"data-vorma-pending-ancestor\";\n\nexport const CSS_BUNDLE_ATTR = \"data-vorma-css-bundle\";\nexport const CSS_PRELOAD_ATTR = \"data-vorma-css-preload\";\nexport const CSS_PRELOAD_SETTLED_ATTR = \"data-vorma-css-settled\";\n","import { serializeToSearchParams } from \"vorma/kit/json\";\nimport type {\n\tAppConfig,\n\tToNavigateArgs,\n\tToNavigationTarget,\n\tToRouteDestination,\n\tToViewPattern,\n} from \"./types.ts\";\n\nconst DYNAMIC_RUNE = \":\";\nconst SPLAT_RUNE = \"*\";\nconst INDEX_SEGMENT = \"_index\";\n\nfunction strip_trailing_slash(path: string): string {\n\tif (path === \"/\") {\n\t\treturn path;\n\t}\n\treturn path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction resolve_pattern_path(\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n): string {\n\tconst p = params ?? {};\n\tconst segments = pattern.split(\"/\").filter((s) => {\n\t\treturn s.length > 0;\n\t});\n\tconst splat_encoded = (splat_values ?? [])\n\t\t.map((v) => {\n\t\t\treturn encodeURIComponent(v);\n\t\t})\n\t\t.join(\"/\");\n\n\tconst path_segments = segments.flatMap((seg) => {\n\t\tif (seg === SPLAT_RUNE) {\n\t\t\treturn splat_encoded.split(\"/\").filter((s) => {\n\t\t\t\treturn s.length > 0;\n\t\t\t});\n\t\t}\n\t\tif (seg.startsWith(DYNAMIC_RUNE)) {\n\t\t\treturn [encodeURIComponent(p[seg.slice(DYNAMIC_RUNE.length)] as string)];\n\t\t}\n\t\treturn [seg];\n\t});\n\n\tconst result = \"/\" + path_segments.join(\"/\");\n\treturn strip_trailing_slash(result.length === 0 ? \"/\" : result);\n}\n\nexport function resolve_path(\n\ttype: \"view\" | \"resource\",\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n): string {\n\tlet path = resolve_pattern_path(pattern, params, splat_values);\n\n\tif (type === \"view\") {\n\t\tconst suffix = `/${INDEX_SEGMENT}`;\n\t\tif (path.endsWith(suffix)) {\n\t\t\tpath = path.slice(0, -suffix.length) || \"/\";\n\t\t}\n\t}\n\n\treturn path;\n}\n\nexport function to_typed_href(\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n\tsearch?: unknown,\n\thash?: string,\n): string {\n\tconst base = resolve_path(\"view\", pattern, params, splat_values);\n\tconst url = new URL(base, window.location.origin);\n\tif (search !== undefined) {\n\t\turl.search = serializeToSearchParams(search).toString();\n\t}\n\tif (hash !== undefined) {\n\t\turl.hash = hash;\n\t}\n\treturn url.href;\n}\n\nexport function build_resource_url(\n\tapi_mount_root: string,\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n\tinput?: unknown,\n): URL {\n\tconst pathname = resolve_path(\"resource\", pattern, params, splat_values);\n\tconst full =\n\t\tstrip_trailing_slash(api_mount_root) + (pathname === \"/\" ? \"\" : pathname);\n\tconst url = new URL(full, window.location.origin);\n\tif (input && typeof input === \"object\") {\n\t\turl.search = serializeToSearchParams(input).toString();\n\t}\n\treturn url;\n}\n\nexport function create_typed_to_href<A extends AppConfig>() {\n\treturn <P extends ToViewPattern<A>>(\n\t\tdestination: ToRouteDestination<A, P>,\n\t): string => {\n\t\tconst d = destination as any;\n\t\treturn to_typed_href(d.pattern, d.params, d.splatValues, d.search, d.hash);\n\t};\n}\n\nexport function resolve_body(input: unknown): BodyInit | null | undefined {\n\tif (\n\t\tinput === undefined ||\n\t\tinput === null ||\n\t\ttypeof input === \"string\" ||\n\t\tinput instanceof ReadableStream ||\n\t\tinput instanceof FormData ||\n\t\tinput instanceof URLSearchParams ||\n\t\tinput instanceof Blob ||\n\t\tinput instanceof ArrayBuffer\n\t) {\n\t\treturn input;\n\t}\n\tif (ArrayBuffer.isView(input)) {\n\t\treturn input as ArrayBufferView<ArrayBuffer>;\n\t}\n\treturn JSON.stringify(input);\n}\n\nexport function create_typed_navigate<A extends AppConfig>(\n\tnavigate_fn: (\n\t\thref: string | URL,\n\t\toptions?: {\n\t\t\treplace?: boolean;\n\t\t\tscrollToTop?: boolean;\n\t\t\tstate?: unknown;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t) => Promise<{ didNavigate: boolean }>,\n) {\n\tconst to_href = create_typed_to_href<A>();\n\treturn async <P extends ToViewPattern<A>>(\n\t\targs: ToNavigateArgs<A, P>,\n\t): Promise<{ didNavigate: boolean }> => {\n\t\tconst href = args.href ?? to_href(args as any);\n\t\treturn navigate_fn(href, {\n\t\t\treplace: args.replace,\n\t\t\tscrollToTop: args.scrollToTop,\n\t\t\tstate: args.state,\n\t\t\tskipWorkIndicator: args.skipWorkIndicator,\n\t\t});\n\t};\n}\n\nexport function create_typed_prefetch<A extends AppConfig>(\n\tprefetch_fn: (href: string) => void,\n) {\n\tconst to_href = create_typed_to_href<A>();\n\treturn <P extends ToViewPattern<A>>(target: ToNavigationTarget<A, P>): void => {\n\t\tprefetch_fn(target.href ?? to_href(target as any));\n\t};\n}\n","import { jsonStringifyStable } from \"vorma/kit/json\";\nimport { API_IDENTITY_ARRAY_PREFIX } from \"./constants.ts\";\nimport type {\n\tApiClientOutput,\n\tAppConfig,\n\tMutationResult,\n\tQueryResult,\n\tResourceKind,\n\tToApiClient,\n\tToApiDecorator,\n\tToApiDecoratorContext,\n\tToMutationArgs,\n\tToQueryArgs,\n} from \"./types.ts\";\nimport { build_resource_url, resolve_body } from \"./url.ts\";\n\ntype SubmitFn = <T>(\n\turl: string | URL,\n\trequest_init?: RequestInit,\n\toptions?: {\n\t\tresourceKind?: ResourceKind;\n\t\tdedupeKey?: string;\n\t\trevalidate?: boolean;\n\t\tskipWorkIndicator?: boolean;\n\t},\n) => Promise<QueryResult<T> | MutationResult<T>>;\n\nfunction normalize_api_method(raw_method: string | undefined): string {\n\treturn (raw_method ?? \"GET\").trim().toUpperCase();\n}\n\nfunction normalize_api_pattern(pattern: string): string {\n\treturn pattern.trim();\n}\n\nfunction stringify_identity_value(value: unknown): string {\n\tconst res = jsonStringifyStable(value);\n\tif (!res.ok) {\n\t\tthrow new Error(res.err);\n\t}\n\treturn res.val;\n}\n\nclass ApiErrorBase<T = never> extends Error {\n\tresult: Extract<QueryResult<T> | MutationResult<T>, { success: false }>;\n\n\tconstructor(result: Extract<QueryResult<T> | MutationResult<T>, { success: false }>) {\n\t\tsuper(result.error);\n\t\tthis.result = result;\n\t\tObject.setPrototypeOf(this, new.target.prototype);\n\t}\n}\n\nexport class QueryError<T = never> extends ApiErrorBase<T> {\n\tconstructor(result: Extract<QueryResult<T>, { success: false }>) {\n\t\tsuper(result);\n\t\tthis.name = \"QueryError\";\n\t}\n}\n\nexport class MutationError<T = never> extends ApiErrorBase<T> {\n\tconstructor(result: Extract<MutationResult<T>, { success: false }>) {\n\t\tsuper(result);\n\t\tthis.name = \"MutationError\";\n\t}\n}\n\nexport function create_typed_api_client<A extends AppConfig>(\n\tapi_mount_root: string,\n\tsubmit_fn: SubmitFn,\n\tdecorator?: ToApiDecorator<A>,\n): ToApiClient<A> {\n\tasync function submit<Args extends ToQueryArgs<A> | ToMutationArgs<A>>(\n\t\targs: Args,\n\t\tresource_kind: ResourceKind,\n\t): Promise<\n\t\tQueryResult<ApiClientOutput<A, Args>> | MutationResult<ApiClientOutput<A, Args>>\n\t> {\n\t\tconst {\n\t\t\tdedupeKey,\n\t\t\tinput,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tpattern,\n\t\t\trevalidate,\n\t\t\tskipWorkIndicator,\n\t\t\tsplatValues,\n\t\t\t...request_init\n\t\t} = args as any;\n\t\tconst normalized_method = normalize_api_method(method);\n\t\tconst api_pattern = normalize_api_pattern(pattern);\n\t\tconst is_get = normalized_method === \"GET\" || normalized_method === \"HEAD\";\n\t\tconst url = build_resource_url(\n\t\t\tapi_mount_root,\n\t\t\tapi_pattern,\n\t\t\tparams,\n\t\t\tsplatValues,\n\t\t\tis_get ? input : undefined,\n\t\t);\n\t\tconst ctx = {\n\t\t\tinput,\n\t\t\tmethod: normalized_method,\n\t\t\tpattern: api_pattern,\n\t\t\trequestInit: request_init,\n\t\t} as ToApiDecoratorContext<A>;\n\t\tconst decorated = decorator ? ((await (decorator as any)(ctx)) ?? {}) : {};\n\t\tconst init: RequestInit = { ...decorated, ...request_init };\n\t\tconst headers = new Headers(decorated.headers ?? undefined);\n\t\tnew Headers(request_init.headers ?? undefined).forEach((v, k) => {\n\t\t\theaders.set(k, v);\n\t\t});\n\t\tinit.headers = headers;\n\t\tinit.method = normalized_method;\n\t\tif (is_get) {\n\t\t\tdelete init.body;\n\t\t} else {\n\t\t\tinit.body = resolve_body(input);\n\t\t}\n\t\tconst options: {\n\t\t\tresourceKind?: ResourceKind;\n\t\t\tdedupeKey?: string;\n\t\t\trevalidate?: boolean;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t} = {\n\t\t\tresourceKind: resource_kind,\n\t\t};\n\t\tif (dedupeKey !== undefined) {\n\t\t\toptions.dedupeKey = dedupeKey;\n\t\t}\n\t\tif (revalidate !== undefined) {\n\t\t\toptions.revalidate = revalidate;\n\t\t}\n\t\tif (skipWorkIndicator !== undefined) {\n\t\t\toptions.skipWorkIndicator = skipWorkIndicator;\n\t\t}\n\t\treturn submit_fn<ApiClientOutput<A, Args>>(url, init, options);\n\t}\n\n\treturn {\n\t\ttoIdentityArray: <Args extends ToQueryArgs<A> | ToMutationArgs<A>>(\n\t\t\targs: Args,\n\t\t): unknown[] => {\n\t\t\tconst { input, method, params, pattern, splatValues } = args as any;\n\t\t\tconst normalized_method = normalize_api_method(method);\n\t\t\tconst api_pattern = normalize_api_pattern(pattern);\n\t\t\treturn [\n\t\t\t\tAPI_IDENTITY_ARRAY_PREFIX,\n\t\t\t\tapi_mount_root,\n\t\t\t\tnormalized_method,\n\t\t\t\tapi_pattern,\n\t\t\t\tstringify_identity_value(params ?? null),\n\t\t\t\tstringify_identity_value(splatValues ?? []),\n\t\t\t\tstringify_identity_value(input ?? null),\n\t\t\t];\n\t\t},\n\t\tmutate: <Args extends ToMutationArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<MutationResult<ApiClientOutput<A, Args>>> => {\n\t\t\treturn submit(args, \"mutation\") as Promise<\n\t\t\t\tMutationResult<ApiClientOutput<A, Args>>\n\t\t\t>;\n\t\t},\n\t\tmutateOrThrow: async <Args extends ToMutationArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<ApiClientOutput<A, Args>> => {\n\t\t\tconst result = (await submit(args, \"mutation\")) as MutationResult<\n\t\t\t\tApiClientOutput<A, Args>\n\t\t\t>;\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new MutationError(result);\n\t\t\t}\n\t\t\treturn result.data;\n\t\t},\n\t\tquery: <Args extends ToQueryArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<QueryResult<ApiClientOutput<A, Args>>> => {\n\t\t\treturn submit(args, \"query\") as Promise<\n\t\t\t\tQueryResult<ApiClientOutput<A, Args>>\n\t\t\t>;\n\t\t},\n\t\tqueryOrThrow: async <Args extends ToQueryArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<ApiClientOutput<A, Args>> => {\n\t\t\tconst result = (await submit(args, \"query\")) as QueryResult<\n\t\t\t\tApiClientOutput<A, Args>\n\t\t\t>;\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new QueryError(result);\n\t\t\t}\n\t\t\treturn result.data;\n\t\t},\n\t};\n}\n","/// <reference types=\"vite/client\" />\n/// <reference types=\"node\" />\n\nexport type RawMatcherExports = {\n\tmemory: WebAssembly.Memory;\n\tvorma_client_matcher_alloc: (len: number) => number;\n\tvorma_client_matcher_dealloc: (ptr: number, len: number) => void;\n\tvorma_client_matcher_find_nested_matches: (\n\t\tmatcher_id: number,\n\t\tptr: number,\n\t\tlen: number,\n\t) => number;\n\tvorma_client_matcher_free: (matcher_id: number) => void;\n\tvorma_client_matcher_new: () => number;\n\tvorma_client_matcher_output_len: () => number;\n\tvorma_client_matcher_output_ptr: () => number;\n\tvorma_client_matcher_register_pattern: (\n\t\tmatcher_id: number,\n\t\tptr: number,\n\t\tlen: number,\n\t) => number;\n};\n\nlet init_promise: Promise<RawMatcherExports> | null = null;\n\nconst wasm_url = new URL(\"./vorma_client_wasm_bg.wasm\", import.meta.url);\nconst VITE_FS_URL_PREFIX = \"/@fs/\";\n\nasync function instantiate_wasm(): Promise<RawMatcherExports> {\n\tif (!import.meta.env || import.meta.env.MODE === \"test\") {\n\t\tconst fs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\tconst process = await import(/* @vite-ignore */ \"node:process\");\n\t\tlet file_url = wasm_url;\n\t\tif (wasm_url.protocol !== \"file:\") {\n\t\t\tconst pathname = wasm_url.pathname.startsWith(VITE_FS_URL_PREFIX)\n\t\t\t\t? wasm_url.pathname.slice(VITE_FS_URL_PREFIX.length - 1)\n\t\t\t\t: `.${wasm_url.pathname}`;\n\t\t\tfile_url = new URL(pathname, `file://${process.cwd()}/`);\n\t\t}\n\t\tconst bytes = await fs.readFile(file_url);\n\t\tconst result = await WebAssembly.instantiate(bytes as BufferSource, {});\n\t\treturn result.instance.exports as RawMatcherExports;\n\t}\n\tconst response = await fetch(wasm_url);\n\ttry {\n\t\tconst result = await WebAssembly.instantiateStreaming(\n\t\t\tPromise.resolve(response.clone()),\n\t\t\t{},\n\t\t);\n\t\treturn result.instance.exports as RawMatcherExports;\n\t} catch {\n\t\tconst result = await WebAssembly.instantiate(await response.arrayBuffer(), {});\n\t\treturn result.instance.exports as RawMatcherExports;\n\t}\n}\n\nexport function init_client_wasm(): Promise<RawMatcherExports> {\n\tif (!init_promise) {\n\t\tinit_promise = instantiate_wasm();\n\t}\n\treturn init_promise;\n}\n","import { init_client_wasm, type RawMatcherExports } from \"./load.ts\";\n\nconst STATUS_NO_MATCH = 0;\nconst STATUS_MATCH = 1;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport type ClientMatcherNestedMatch = {\n\tparams: Record<string, string>;\n\tsplat_values: string[];\n\tpatterns: string[];\n};\n\nexport type ClientMatcher = {\n\tregister_pattern: (pattern: string) => void;\n\tfind_nested_matches: (path: string) => ClientMatcherNestedMatch | null;\n\tfree: () => void;\n};\n\nfunction write_input(exports: RawMatcherExports, value: string): [number, number] {\n\tconst bytes = encoder.encode(value);\n\tconst ptr = exports.vorma_client_matcher_alloc(bytes.length);\n\tnew Uint8Array(exports.memory.buffer, ptr, bytes.length).set(bytes);\n\treturn [ptr, bytes.length];\n}\n\nfunction read_u32(view: DataView, offset: number): [number, number] {\n\treturn [view.getUint32(offset, true), offset + 4];\n}\n\nfunction read_string(bytes: Uint8Array, offset: number): [string, number] {\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tlet len: number;\n\t[len, offset] = read_u32(view, offset);\n\treturn [decoder.decode(bytes.subarray(offset, offset + len)), offset + len];\n}\n\nfunction read_output(exports: RawMatcherExports): Uint8Array {\n\tconst ptr = exports.vorma_client_matcher_output_ptr();\n\tconst len = exports.vorma_client_matcher_output_len();\n\tif (len === 0) {\n\t\treturn new Uint8Array();\n\t}\n\treturn new Uint8Array(exports.memory.buffer, ptr, len).slice();\n}\n\nfunction decode_match(bytes: Uint8Array): ClientMatcherNestedMatch | null {\n\tif (bytes.length === 0) {\n\t\treturn null;\n\t}\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tlet offset = 0;\n\tlet param_count: number;\n\t[param_count, offset] = read_u32(view, offset);\n\tconst params: Record<string, string> = {};\n\tfor (let i = 0; i < param_count; i++) {\n\t\tlet key: string;\n\t\tlet value: string;\n\t\t[key, offset] = read_string(bytes, offset);\n\t\t[value, offset] = read_string(bytes, offset);\n\t\tparams[key] = value;\n\t}\n\tlet splat_count: number;\n\t[splat_count, offset] = read_u32(view, offset);\n\tconst splat_values: string[] = [];\n\tfor (let i = 0; i < splat_count; i++) {\n\t\tlet value: string;\n\t\t[value, offset] = read_string(bytes, offset);\n\t\tsplat_values.push(value);\n\t}\n\tlet pattern_count: number;\n\t[pattern_count, offset] = read_u32(view, offset);\n\tconst patterns: string[] = [];\n\tfor (let i = 0; i < pattern_count; i++) {\n\t\tlet pattern: string;\n\t\t[pattern, offset] = read_string(bytes, offset);\n\t\tpatterns.push(pattern);\n\t}\n\treturn { params, splat_values, patterns };\n}\n\nfunction matcher_error(operation: string, status: number): Error {\n\treturn new Error(`Vorma client matcher ${operation} failed with status ${status}`);\n}\n\nexport async function create_client_matcher(): Promise<ClientMatcher> {\n\tconst exports = await init_client_wasm();\n\tconst matcher_id = exports.vorma_client_matcher_new();\n\tif (matcher_id === 0) {\n\t\tthrow new Error(\"Failed to create Vorma client matcher\");\n\t}\n\tlet freed = false;\n\tconst with_input = <T>(value: string, fn: (ptr: number, len: number) => T): T => {\n\t\tconst [ptr, len] = write_input(exports, value);\n\t\ttry {\n\t\t\treturn fn(ptr, len);\n\t\t} finally {\n\t\t\texports.vorma_client_matcher_dealloc(ptr, len);\n\t\t}\n\t};\n\treturn {\n\t\tregister_pattern: (pattern) => {\n\t\t\tif (freed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst status = with_input(pattern, (ptr, len) => {\n\t\t\t\treturn exports.vorma_client_matcher_register_pattern(\n\t\t\t\t\tmatcher_id,\n\t\t\t\t\tptr,\n\t\t\t\t\tlen,\n\t\t\t\t);\n\t\t\t});\n\t\t\tif (status !== STATUS_MATCH) {\n\t\t\t\tthrow matcher_error(\"pattern registration\", status);\n\t\t\t}\n\t\t},\n\t\tfind_nested_matches: (path) => {\n\t\t\tif (freed) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst status = with_input(path, (ptr, len) => {\n\t\t\t\treturn exports.vorma_client_matcher_find_nested_matches(\n\t\t\t\t\tmatcher_id,\n\t\t\t\t\tptr,\n\t\t\t\t\tlen,\n\t\t\t\t);\n\t\t\t});\n\t\t\tif (status === STATUS_NO_MATCH) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (status !== STATUS_MATCH) {\n\t\t\t\tthrow matcher_error(\"path match\", status);\n\t\t\t}\n\t\t\treturn decode_match(read_output(exports));\n\t\t},\n\t\tfree: () => {\n\t\t\tif (freed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfreed = true;\n\t\t\texports.vorma_client_matcher_free(matcher_id);\n\t\t},\n\t};\n}\n","import {\n\tCSS_BUNDLE_ATTR,\n\tCSS_PRELOAD_ATTR,\n\tCSS_PRELOAD_SETTLED_ATTR,\n} from \"./constants.ts\";\n\nexport function preload_css(bundles: string[]): void {\n\tfor (const path of new Set(bundles)) {\n\t\tif (find_css_bundle(path)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (document.head.querySelector(`link[${CSS_PRELOAD_ATTR}=\"${path}\"]`)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst link = document.createElement(\"link\");\n\t\tlink.rel = \"preload\";\n\t\tlink.setAttribute(\"as\", \"style\");\n\t\tlink.setAttribute(CSS_PRELOAD_ATTR, path);\n\t\tlink.setAttribute(CSS_PRELOAD_SETTLED_ATTR, \"0\");\n\t\tconst mark = (): void => {\n\t\t\tlink.removeEventListener(\"load\", mark);\n\t\t\tlink.removeEventListener(\"error\", mark);\n\t\t\tlink.setAttribute(CSS_PRELOAD_SETTLED_ATTR, \"1\");\n\t\t};\n\t\tlink.addEventListener(\"load\", mark);\n\t\tlink.addEventListener(\"error\", mark);\n\t\tlink.href = path;\n\t\tdocument.head.appendChild(link);\n\t}\n}\n\nexport async function wait_for_css(\n\tbundles: string[],\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst pending_nodes: HTMLLinkElement[] = [];\n\n\tfor (const path of new Set(bundles)) {\n\t\tconst node = document.head.querySelector<HTMLLinkElement>(\n\t\t\t`link[${CSS_PRELOAD_ATTR}=\"${path}\"]`,\n\t\t);\n\t\tif (!node || node.getAttribute(CSS_PRELOAD_SETTLED_ATTR) === \"1\") {\n\t\t\tcontinue;\n\t\t}\n\t\tpending_nodes.push(node);\n\t}\n\n\tif (signal.aborted || pending_nodes.length === 0) {\n\t\treturn;\n\t}\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet remaining = pending_nodes.length;\n\t\tlet settled = false;\n\t\tconst cleanups: Array<() => void> = [];\n\n\t\tconst cleanup = (): void => {\n\t\t\tfor (const remove_listener of cleanups.splice(0)) {\n\t\t\t\tremove_listener();\n\t\t\t}\n\t\t};\n\n\t\tconst complete = (): void => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\n\t\tconst on_abort = (): void => {\n\t\t\tcomplete();\n\t\t};\n\t\tsignal.addEventListener(\"abort\", on_abort, { once: true });\n\t\tcleanups.push(() => {\n\t\t\tsignal.removeEventListener(\"abort\", on_abort);\n\t\t});\n\n\t\tfor (const node of pending_nodes) {\n\t\t\tconst done = (): void => {\n\t\t\t\tnode.setAttribute(CSS_PRELOAD_SETTLED_ATTR, \"1\");\n\t\t\t\tremaining -= 1;\n\t\t\t\tif (remaining === 0) {\n\t\t\t\t\tcomplete();\n\t\t\t\t}\n\t\t\t};\n\t\t\tnode.addEventListener(\"load\", done, { once: true });\n\t\t\tnode.addEventListener(\"error\", done, { once: true });\n\t\t\tcleanups.push(() => {\n\t\t\t\tnode.removeEventListener(\"load\", done);\n\t\t\t\tnode.removeEventListener(\"error\", done);\n\t\t\t});\n\t\t}\n\t});\n}\n\nexport function apply_css_bundles(bundles: string[]): void {\n\tfor (const path of new Set(bundles)) {\n\t\tif (find_css_bundle(path)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst link = document.createElement(\"link\");\n\t\tlink.rel = \"stylesheet\";\n\t\tlink.setAttribute(CSS_BUNDLE_ATTR, path);\n\t\tlink.href = path;\n\t\tdocument.head.appendChild(link);\n\t}\n}\n\nfunction find_css_bundle(path: string): HTMLLinkElement | null {\n\treturn document.head.querySelector<HTMLLinkElement>(\n\t\t`link[${CSS_BUNDLE_ATTR}=\"${path}\"]`,\n\t);\n}\n","import { R, type Result } from \"vorma/kit/result\";\n\nexport type HeadEl = {\n\ttag: string;\n\tattributes_known_safe: Record<string, string>;\n\tboolean_attributes?: string[] | null;\n\tdangerous_inner_html?: string;\n};\n\ntype HeadSection = \"meta\" | \"rest\";\n\nexport function apply_head_and_title(\n\ttitle: string | undefined,\n\tmeta_els: HeadEl[],\n\trest_els: HeadEl[],\n): Result<void> {\n\ttry {\n\t\tif (title !== undefined) {\n\t\t\tif (title !== \"\" || document.head.querySelector(\"title\")) {\n\t\t\t\tdocument.title = title;\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\treturn R.err(error instanceof Error ? error.message : String(error));\n\t}\n\n\tconst meta_res = reconcile_section(\"meta\", meta_els);\n\tif (!meta_res.ok) {\n\t\treturn R.err(meta_res.err);\n\t}\n\tconst res_res = reconcile_section(\"rest\", rest_els);\n\tif (!res_res.ok) {\n\t\treturn R.err(res_res.err);\n\t}\n\n\treturn R.ok(undefined);\n}\n\nfunction reconcile_section(section: HeadSection, els: HeadEl[]): Result<void> {\n\tconst boundary_res = find_boundary_comments(section);\n\tif (!boundary_res.ok) {\n\t\treturn R.err(boundary_res.err);\n\t}\n\tconst { start, end } = boundary_res.val;\n\tif (!end.parentNode) {\n\t\treturn R.err(`Invalid head section boundaries for section \"${section}\"`);\n\t}\n\tconst parent = end.parentNode;\n\tlet first_error: string | undefined;\n\n\ttry {\n\t\tconst current_elements: Element[] = [];\n\t\tlet node: Node | null = start.nextSibling;\n\t\twhile (node && node !== end) {\n\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tcurrent_elements.push(node as Element);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\n\t\tconst new_elements: Element[] = [];\n\t\tconst new_element_fingerprints = new Map<string, Element>();\n\n\t\tfor (const block of els) {\n\t\t\tif (!block.tag) {\n\t\t\t\tfirst_error ??= `Invalid head element tag for section \"${section}\"`;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst el = document.createElement(block.tag);\n\t\t\tif (block.attributes_known_safe) {\n\t\t\t\tfor (const [key, value] of Object.entries(block.attributes_known_safe)) {\n\t\t\t\t\tel.setAttribute(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (block.boolean_attributes) {\n\t\t\t\tfor (const key of block.boolean_attributes) {\n\t\t\t\t\tel.setAttribute(key, \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (block.dangerous_inner_html) {\n\t\t\t\tel.innerHTML = block.dangerous_inner_html;\n\t\t\t}\n\n\t\t\tconst fp = fingerprint_element(el);\n\n\t\t\tif (new_element_fingerprints.has(fp)) {\n\t\t\t\tconst prev = new_element_fingerprints.get(fp)!;\n\t\t\t\tconst idx = new_elements.indexOf(prev);\n\t\t\t\tif (idx > -1) {\n\t\t\t\t\tnew_elements.splice(idx, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnew_elements.push(el);\n\t\t\tnew_element_fingerprints.set(fp, el);\n\t\t}\n\n\t\tconst current_by_fp = new Map<string, Element[]>();\n\t\tfor (const el of current_elements) {\n\t\t\tconst fp = fingerprint_element(el);\n\t\t\tconst list = current_by_fp.get(fp);\n\t\t\tif (list) {\n\t\t\t\tlist.push(el);\n\t\t\t} else {\n\t\t\t\tcurrent_by_fp.set(fp, [el]);\n\t\t\t}\n\t\t}\n\n\t\tconst final_elements: Element[] = [];\n\t\tconst used = new Set<Element>();\n\n\t\tfor (const new_el of new_elements) {\n\t\t\tconst fp = fingerprint_element(new_el);\n\t\t\tconst candidates = current_by_fp.get(fp) ?? [];\n\t\t\tconst matched = candidates.find((el) => {\n\t\t\t\treturn !used.has(el);\n\t\t\t});\n\n\t\t\tif (matched) {\n\t\t\t\tused.add(matched);\n\t\t\t\tfinal_elements.push(matched);\n\t\t\t} else {\n\t\t\t\tfinal_elements.push(new_el);\n\t\t\t}\n\t\t}\n\n\t\tconst remaining = new Set(current_elements);\n\t\tfor (const el of current_elements) {\n\t\t\tif (!used.has(el)) {\n\t\t\t\tparent.removeChild(el);\n\t\t\t\tremaining.delete(el);\n\t\t\t}\n\t\t}\n\n\t\tnode = start.nextSibling;\n\t\twhile (node && node !== end) {\n\t\t\tconst next = node.nextSibling;\n\t\t\tif (node.nodeType !== Node.ELEMENT_NODE) {\n\t\t\t\tparent.removeChild(node);\n\t\t\t}\n\t\t\tnode = next;\n\t\t}\n\n\t\tlet last_processed: Element | null = null;\n\n\t\tfor (const element of final_elements) {\n\t\t\tconst is_existing = used.has(element);\n\n\t\t\tif (is_existing) {\n\t\t\t\tconst expected_next: Element | null = last_processed\n\t\t\t\t\t? last_processed.nextElementSibling\n\t\t\t\t\t: start.nextElementSibling;\n\n\t\t\t\tif (expected_next !== element) {\n\t\t\t\t\tparent.insertBefore(element, (expected_next as Node) ?? end);\n\t\t\t\t}\n\t\t\t\tremaining.delete(element);\n\t\t\t} else {\n\t\t\t\tconst insert_before = last_processed\n\t\t\t\t\t? last_processed.nextSibling\n\t\t\t\t\t: start.nextSibling;\n\t\t\t\tparent.insertBefore(element, insert_before ?? end);\n\t\t\t}\n\n\t\t\tlast_processed = element;\n\t\t}\n\n\t\tif (first_error) {\n\t\t\treturn R.err(first_error);\n\t\t}\n\t\treturn R.ok(undefined);\n\t} catch (error) {\n\t\treturn R.err(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nfunction find_boundary_comments(section: HeadSection): Result<{\n\tstart: Comment;\n\tend: Comment;\n}> {\n\tconst start_text = `vorma-${section}-start`;\n\tconst end_text = `vorma-${section}-end`;\n\tlet start: Comment | undefined;\n\tfor (const node of Array.from(document.head.childNodes)) {\n\t\tif (node.nodeType !== Node.COMMENT_NODE) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst val = (node as Comment).nodeValue?.trim();\n\t\tif (val === start_text) {\n\t\t\tstart = node as Comment;\n\t\t} else if (val === end_text && start) {\n\t\t\treturn R.ok({ start, end: node as Comment });\n\t\t}\n\t}\n\treturn R.err(`Could not find head boundary comments for section \"${section}\"`);\n}\n\nfunction fingerprint_element(element: Element): string {\n\tconst attrs: string[] = [];\n\tfor (let i = 0; i < element.attributes.length; i++) {\n\t\tconst attr = element.attributes[i]!;\n\t\tconst value =\n\t\t\telement.hasAttribute(attr.name) && attr.value === \"\" ? \"\" : attr.value;\n\t\tattrs.push(`${attr.name}=\"${value}\"`);\n\t}\n\tattrs.sort();\n\treturn `${element.tagName.toUpperCase()}|${attrs.join(\",\")}|${(element.innerHTML || \"\").trim()}`;\n}\n","/// <reference types=\"vite/client\" />\n\nexport function preload_modules(deps: string[]): void {\n\tif (import.meta.env.DEV) {\n\t\treturn;\n\t}\n\tfor (const dep of new Set(deps)) {\n\t\tif (document.head.querySelector(`link[rel=\"modulepreload\"][href=\"${dep}\"]`)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst link = document.createElement(\"link\");\n\t\tlink.rel = \"modulepreload\";\n\t\tlink.href = dep;\n\t\tdocument.head.appendChild(link);\n\t}\n}\n","/// <reference types=\"vite/client\" />\n\nimport { jsonDeepEquals, parseSearchParams } from \"vorma/kit/json\";\nimport { addOnWindowFocusListener } from \"vorma/kit/listeners\";\nimport { R, type Result } from \"vorma/kit/result\";\nimport {\n\tcreate_client_matcher,\n\ttype ClientMatcher,\n\ttype ClientMatcherNestedMatch,\n} from \"./client_wasm/matcher.ts\";\nimport {\n\tBUILD_ID_HEADER,\n\tDATA_SCRIPT_ID,\n\tHISTORY_KEY_FIELD,\n\tHISTORY_USER_STATE_FIELD,\n\tSCROLL_STORAGE_KEY,\n\tSCROLL_STORAGE_RELOAD_KEY,\n\tVERCEL_DPL_QUERY_PARAM_KEY,\n\tVERCEL_X_DEPLOYMENT_ID,\n\tVORMA_JSON_KEY,\n\tVORMA_ROOT_EL_ID,\n\tX_ACCEPTS_CLIENT_REDIRECT,\n\tX_CLIENT_REDIRECT,\n\tX_VORMA_BUILD_SKEW,\n} from \"./constants.ts\";\nimport { apply_css_bundles, preload_css, wait_for_css } from \"./css.ts\";\nimport { apply_head_and_title, type HeadEl } from \"./head.ts\";\nimport { preload_modules } from \"./modules.ts\";\nimport type {\n\tAppConfig,\n\tBeforeRouteCommitFn,\n\tBeforeRouteYieldFn,\n\tResourceKind,\n\tRevalidationResult,\n\tRouteErrorState,\n\tRouteState,\n\tRouteUpdateReason,\n} from \"./types.ts\";\n\n/////////////////////////////////////////////////////////////////////\n/////// Public Types\n/////////////////////////////////////////////////////////////////////\n\nexport type ScrollState = { x: number; y: number } | { hash: string };\n\nexport type ScrollIntent = {\n\tscroll: ScrollState;\n\ttarget_entry_id: string;\n};\n\nexport type RouteRenderEntry = {\n\tpattern: string;\n\tinput: unknown;\n\tmodule_url: string;\n\tmodule: Record<string, unknown>;\n\tview_data: unknown;\n\tclient_loader_data: unknown;\n};\n\nexport type RouteRenderState = {\n\tentries: RouteRenderEntry[];\n\terror: RouteErrorState | null;\n\tparams: Record<string, string>;\n\tsplat_values: string[];\n\tclient_build_id: string;\n\thistory_state: unknown;\n};\n\nexport type WorkState = {\n\tnavigation: null | {\n\t\thref: string;\n\t\treplace: boolean;\n\t\tsource: \"navigate\" | \"popstate\" | \"redirect\";\n\t};\n\trevalidation: null | {\n\t\tstatus: \"debouncing\" | \"running\" | \"retrying\";\n\t\tattempt: number;\n\t};\n\tprefetch: null | {\n\t\thref: string;\n\t};\n\tapiRequests: Array<{\n\t\tkey: string;\n\t\tmethod: string;\n\t\thref: string;\n\t}>;\n};\n\nexport type RevalidationReason = \"manual\" | \"retry\" | \"apiRequest\" | \"windowFocus\";\n\nexport type BuildSkewDetectedEvent = {\n\tactiveClientBuildId: string;\n\tserverBuildId: string;\n\ttriggeringResponse:\n\t\t| {\n\t\t\t\tkind: \"route\";\n\t\t\t\ttrigger: \"navigation\" | \"popstate\" | \"prefetch\";\n\t\t\t\trequestedHref: string;\n\t\t\t\tstatus: number;\n\t\t\t\tok: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"route\";\n\t\t\t\ttrigger: \"revalidation\";\n\t\t\t\trevalidationReason: RevalidationReason;\n\t\t\t\trequestedHref: string;\n\t\t\t\tstatus: number;\n\t\t\t\tok: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"resource\";\n\t\t\t\tresourceKind: ResourceKind;\n\t\t\t\trequestedHref: string;\n\t\t\t\tmethod: string;\n\t\t\t\tstatus: number;\n\t\t\t\tok: boolean;\n\t\t };\n\tcurrentRouteState: RouteState;\n\tcurrentWorkState: WorkState;\n};\n\nexport type WorkIndicator = {\n\ttrack: <T>(promise: PromiseLike<T>) => Promise<T>;\n\tisActive: () => boolean;\n};\n\nexport type WorkIndicatorOptions = {\n\tstart: () => void;\n\tstop: () => void;\n\tstartDelayMs?: number;\n\tstopDelayMs?: number;\n\tskipNavigations?: boolean;\n\tskipApiRequests?: boolean;\n\tskipRevalidations?: boolean;\n};\n\nexport type ClientOptions = {\n\trender?: () => void | Promise<void>;\n\tworkIndicator?: WorkIndicatorOptions;\n\trevalidateOnWindowFocus?:\n\t\t| boolean\n\t\t| { staleTimeMs: number; skipWorkIndicator?: boolean };\n\tdefaultErrorBoundary?: (props: { error: unknown }) => any;\n\tuseViewTransitions?: boolean;\n\tonRouteUpdate?: (\n\t\troute: RouteState,\n\t\tpreviousRoute: RouteState | null,\n\t\treason: RouteUpdateReason,\n\t) => void;\n\tonWorkUpdate?: (work: WorkState) => void;\n\tonBuildSkewDetected?: (event: BuildSkewDetectedEvent) => void;\n};\n\nexport type ClientCommit = {\n\troute_render?: {\n\t\tstate: RouteRenderState;\n\t\tscroll_intent?: ScrollIntent;\n\t};\n\troute_update?: {\n\t\tprevious_route: RouteState | null;\n\t\treason: RouteUpdateReason;\n\t\troute: RouteState;\n\t};\n\twork?: WorkState;\n};\n\nexport type CommitFn = (commit: ClientCommit) => void;\n\nexport type ViewDefinition = {\n\tpattern: string;\n\tcomponent: (props: any) => any;\n\terror_boundary?: (props: { error: unknown }) => any;\n\tclient_loader?: ClientLoaderFn;\n\tbefore_route_commit?: BeforeRouteCommitFn;\n\tbefore_route_yield?: BeforeRouteYieldFn;\n};\n\ntype ClientLoaderFn = (args: {\n\ttrigger: \"boot\" | \"navigation\" | \"revalidation\" | \"prefetch\";\n\thref: string;\n\thistoryState: unknown;\n\tpattern: string;\n\tparams: Record<string, string>;\n\tsplatValues: string[];\n\tinput: unknown;\n\tknownMatches: ClientLoaderKnownMatch[];\n\tserverPromise: Promise<ClientLoaderServerState>;\n\tsignal: AbortSignal;\n}) => Promise<unknown>;\n\ntype ClientLoaderKnownMatch = {\n\tpattern: string;\n\tinput: unknown;\n};\n\ntype ClientLoaderServerState = {\n\tclientBuildId: string;\n\tmatches: Array<{\n\t\tpattern: string;\n\t\tinput: unknown;\n\t\tviewData: unknown;\n\t}>;\n\toutermostServerError: null | {\n\t\tidx: number;\n\t\terror: unknown;\n\t};\n\tviewData: unknown;\n};\n\ntype ApiResult<T> =\n\t| {\n\t\t\tsuccess: true;\n\t\t\tdata: T;\n\t\t\tresponse: Response;\n\t\t\trevalidationPromise: Promise<RevalidationResult>;\n\t }\n\t| {\n\t\t\tsuccess: false;\n\t\t\terror: string;\n\t\t\tresponse?: Response;\n\t\t\trevalidationPromise: Promise<RevalidationResult>;\n\t };\n\nexport type ClientCore = {\n\tboot: (options: ClientOptions) => Promise<Result<void>>;\n\tworkIndicator: WorkIndicator;\n\tnavigate: (\n\t\thref: string | URL,\n\t\toptions?: {\n\t\t\treplace?: boolean;\n\t\t\tscrollToTop?: boolean;\n\t\t\tstate?: unknown;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t) => Promise<{ didNavigate: boolean }>;\n\trevalidate: () => Promise<RevalidationResult>;\n\tsubmit_inner: <T = unknown>(\n\t\turl: string | URL,\n\t\trequestInit?: RequestInit,\n\t\toptions?: {\n\t\t\tresourceKind?: ResourceKind;\n\t\t\tdedupeKey?: string;\n\t\t\trevalidate?: boolean;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t) => Promise<ApiResult<T>>;\n\tgetRouteState: () => RouteState;\n\tgetWorkState: () => WorkState;\n\tgetClientBuildId: () => string;\n\tgetRootEl: () => HTMLElement;\n\tdefineView: <T = any>(input: {\n\t\tpattern: string;\n\t\tcomponent: (props: any) => any;\n\t\terrorBoundary?: (props: { error: unknown }) => any;\n\t\tclientLoader?: (props: any) => Promise<T>;\n\t\tbeforeRouteCommit?: BeforeRouteCommitFn;\n\t\tbeforeRouteYield?: BeforeRouteYieldFn;\n\t\trunClientLoaderOnHmr?: boolean;\n\t}) => ViewDefinition & { __phantom_client_loader_data?: T };\n\tstart_prefetch: (href: string) => void;\n\tstop_prefetch: (href: string) => void;\n\tsave_current_scroll: () => void;\n\tget_default_error_boundary: () => ((props: { error: unknown }) => any) | undefined;\n};\n\n/////////////////////////////////////////////////////////////////////\n/////// Constants\n/////////////////////////////////////////////////////////////////////\n\nexport const MAX_SCROLL_ENTRIES = 50;\nexport const REFRESH_MAX_AGE_MS = 3333;\nexport const MAX_REDIRECTS = 10;\nexport const REVALIDATION_DEBOUNCE_MS = 8;\nexport const MAX_REVALIDATION_RETRIES = 8;\nexport const REVALIDATION_BACKOFF_BASE_MS = 500;\nexport const REVALIDATION_BACKOFF_CAP_MS = 30000;\n\nconst REVALIDATION_OK: RevalidationResult = { ok: true };\nconst REVALIDATION_BUILD_SKEW: RevalidationResult = {\n\tok: false,\n\treason: \"build_skew\",\n};\nconst REVALIDATION_EXHAUSTED: RevalidationResult = {\n\tok: false,\n\treason: \"max_retries_exhausted\",\n};\nlet focus_revalidation_cleanup: (() => void) | null = null;\n\n/////////////////////////////////////////////////////////////////////\n/////// Module-Level Utilities\n/////////////////////////////////////////////////////////////////////\n\ntype TestOptions = {\n\treload?: () => void;\n\thard_redirect?: (url: string) => void;\n\tscroll_to?: (x: number, y: number) => void;\n};\n\nexport function apply_scroll(\n\tscroll: ScrollState | undefined,\n\ttest_options?: TestOptions,\n): void {\n\tif (!scroll) {\n\t\treturn;\n\t}\n\tif (\"hash\" in scroll) {\n\t\tconst raw = scroll.hash.startsWith(\"#\") ? scroll.hash.slice(1) : scroll.hash;\n\t\tlet id: string;\n\t\ttry {\n\t\t\tid = decodeURIComponent(raw);\n\t\t} catch {\n\t\t\tid = raw;\n\t\t}\n\t\tdocument.getElementById(id)?.scrollIntoView();\n\t\treturn;\n\t}\n\tconst scroll_to =\n\t\ttest_options?.scroll_to ??\n\t\t((x: number, y: number) => {\n\t\t\twindow.scrollTo(x, y);\n\t\t});\n\tscroll_to(scroll.x, scroll.y);\n}\n\nexport function make_entry_id(idx: number, pattern: string): string {\n\treturn `${idx}:${pattern}`;\n}\n\nfunction is_abort_error(e: unknown): boolean {\n\treturn e instanceof DOMException && e.name === \"AbortError\";\n}\n\nfunction new_abort_error(): DOMException {\n\treturn new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction to_error_string(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction normalize_module_url(url: string): string {\n\treturn new URL(url, window.location.href).pathname;\n}\n\ntype Deferred<T> = {\n\tpromise: Promise<T>;\n\tresolve: (value: T) => void;\n};\n\nfunction make_deferred<T>(): Deferred<T> {\n\tlet resolve!: (v: T) => void;\n\tconst promise = new Promise<T>((r) => {\n\t\tresolve = r;\n\t});\n\treturn { promise, resolve };\n}\n\ntype WorkIndicatorController = {\n\tindicator: WorkIndicator;\n\tconfigure: (options: WorkIndicatorOptions | undefined) => void;\n\tset_vorma_active: (active: boolean) => void;\n};\n\nfunction create_work_indicator(): WorkIndicatorController {\n\tlet options: WorkIndicatorOptions | undefined;\n\tlet visible = false;\n\tlet show_timer: number | undefined;\n\tlet hide_timer: number | undefined;\n\tconst active_tokens = new Set<symbol>();\n\tlet release_vorma_work: (() => void) | undefined;\n\n\tfunction clear_show_timer(): void {\n\t\tif (show_timer === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tclearTimeout(show_timer);\n\t\tshow_timer = undefined;\n\t}\n\n\tfunction clear_hide_timer(): void {\n\t\tif (hide_timer === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tclearTimeout(hide_timer);\n\t\thide_timer = undefined;\n\t}\n\n\tfunction sync(): void {\n\t\tconst current_options = options;\n\t\tif (!current_options) {\n\t\t\tclear_show_timer();\n\t\t\tclear_hide_timer();\n\t\t\treturn;\n\t\t}\n\n\t\tif (active_tokens.size > 0) {\n\t\t\tclear_hide_timer();\n\t\t\tif (visible || show_timer !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tshow_timer = window.setTimeout(() => {\n\t\t\t\tshow_timer = undefined;\n\t\t\t\tconst latest_options = options;\n\t\t\t\tif (!latest_options || active_tokens.size === 0 || visible) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatest_options.start();\n\t\t\t\tvisible = true;\n\t\t\t}, current_options.startDelayMs ?? 12);\n\t\t\treturn;\n\t\t}\n\n\t\tclear_show_timer();\n\t\tif (!visible) {\n\t\t\treturn;\n\t\t}\n\t\tif (hide_timer !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\thide_timer = window.setTimeout(() => {\n\t\t\thide_timer = undefined;\n\t\t\tconst latest_options = options;\n\t\t\tif (!latest_options || active_tokens.size > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlatest_options.stop();\n\t\t\tvisible = false;\n\t\t}, current_options.stopDelayMs ?? 12);\n\t}\n\n\tfunction begin(): () => void {\n\t\tconst token = Symbol(\"v-work-indicator\");\n\t\tlet released = false;\n\t\tactive_tokens.add(token);\n\t\tsync();\n\t\treturn () => {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tactive_tokens.delete(token);\n\t\t\tsync();\n\t\t};\n\t}\n\n\tfunction configure(next_options: WorkIndicatorOptions | undefined): void {\n\t\tconst previous_options = options;\n\t\tclear_show_timer();\n\t\tclear_hide_timer();\n\t\tif (visible && previous_options && previous_options !== next_options) {\n\t\t\tprevious_options.stop();\n\t\t\tvisible = false;\n\t\t}\n\t\toptions = next_options;\n\t\tsync();\n\t}\n\n\tfunction set_vorma_active(active: boolean): void {\n\t\tif (active) {\n\t\t\tif (!release_vorma_work) {\n\t\t\t\trelease_vorma_work = begin();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (!release_vorma_work) {\n\t\t\tsync();\n\t\t\treturn;\n\t\t}\n\t\trelease_vorma_work();\n\t\trelease_vorma_work = undefined;\n\t}\n\n\treturn {\n\t\tindicator: {\n\t\t\ttrack: async <T>(promise: PromiseLike<T>): Promise<T> => {\n\t\t\t\tconst release = begin();\n\t\t\t\treturn Promise.resolve(promise).finally(() => {\n\t\t\t\t\trelease();\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (): boolean => {\n\t\t\t\treturn active_tokens.size > 0;\n\t\t\t},\n\t\t},\n\t\tconfigure,\n\t\tset_vorma_active,\n\t};\n}\n\n/////////////////////////////////////////////////////////////////////\n/////// Client Core\n/////////////////////////////////////////////////////////////////////\n\nexport function create_client_core(\n\t_: Omit<AppConfig, \"__vorma_views\" | \"__vorma_resources\">,\n\tcommit: CommitFn,\n\ttest_options?: TestOptions,\n): Result<ClientCore> {\n\t/////// Internal Types\n\n\ttype HistoryPosition = {\n\t\thref: string;\n\t\tkey: string;\n\t\tstate: unknown;\n\t};\n\n\ttype RouteSnapshot = {\n\t\tposition: HistoryPosition;\n\t\troute: RouteRecord;\n\t};\n\n\ttype RouteRecord = {\n\t\tparams: Record<string, string>;\n\t\tsplat_values: string[];\n\t\tmatches: RouteMatchRecord[];\n\t\terror: RouteErrorState | null;\n\t\tclient_build_id: string;\n\t};\n\n\ttype RouteMatchRecord = {\n\t\tpattern: string;\n\t\tinput: unknown;\n\t\tmodule_url: string;\n\t\tmodule: Record<string, unknown>;\n\t\tview_data: unknown;\n\t\tclient_loader_data: unknown;\n\t};\n\n\ttype RouteRenderCommitReason =\n\t\t| \"initial\"\n\t\t| \"navigation\"\n\t\t| \"popstate\"\n\t\t| \"revalidation\"\n\t\t| \"hmr\";\n\n\ttype WorkProjection =\n\t\t| {\n\t\t\t\tkind: \"navigation\";\n\t\t\t\tskip_work_indicator?: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"revalidation\";\n\t\t\t\tskip_work_indicator?: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"apiRequest\";\n\t\t\t\tskip_work_indicator?: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"prefetch\";\n\t\t };\n\n\ttype NavOptions = {\n\t\treplace?: boolean;\n\t\tscroll_to_top?: boolean;\n\t\tstate?: unknown;\n\t\tis_popstate?: boolean;\n\t\tpopstate_scroll?: ScrollState;\n\t\tskip_work_indicator?: boolean;\n\t};\n\n\ttype NavResult = { didNavigate: boolean };\n\n\ttype RedirectResult = \"settled\" | \"transferred\";\n\n\ttype NavigationSource = \"navigate\" | \"popstate\" | \"redirect\";\n\n\ttype NavFetchIntent = {\n\t\tkind: \"nav\";\n\t\turl: URL;\n\t\toptions: NavOptions;\n\t\tsource: NavigationSource;\n\t\tredirect_count: number;\n\t\tdeferred: Deferred<NavResult>;\n\t};\n\n\ttype RevalidationFetchIntent = {\n\t\tkind: \"reval\";\n\t\tattempt: number;\n\t\treason: RevalidationReason;\n\t\tskip_work_indicator?: boolean;\n\t};\n\n\ttype ActiveFetchIntent = NavFetchIntent | RevalidationFetchIntent;\n\n\ttype PrefetchFetchIntent = { kind: \"prefetch\" };\n\n\ttype FetchIntent = ActiveFetchIntent | PrefetchFetchIntent;\n\n\ttype FetchBase = {\n\t\turl: URL; // what we asked the server for (minus hash sensitivity)\n\t\tac: AbortController;\n\t\tseq: number;\n\t\tdata_promise: Promise<FetchResult>;\n\t\tcl_prefetches: ClientLoaderPrefetch[];\n\t\tcl_prefetches_ready: Promise<void>;\n\t};\n\n\ttype ActiveFetch = FetchBase & {\n\t\t// Resolves when prefetch-phase preparation (modules, client-loader\n\t\t// prefetch seeding) is done after a prefetch is promoted.\n\t\tprepare_ready: Promise<void>;\n\t\tintent: ActiveFetchIntent;\n\t};\n\n\ttype PrefetchFetch = FetchBase & {\n\t\tis_pending: boolean;\n\t\tprepare_ready: Promise<void>;\n\t\tintent: PrefetchFetchIntent;\n\t};\n\n\ttype FetchResult =\n\t\t| { kind: \"data\"; data: unknown; response: Response }\n\t\t| { kind: \"build_skew\"; response: Response }\n\t\t| { kind: \"redirect\"; href: string; hard: boolean; response: Response }\n\t\t| {\n\t\t\t\tkind: \"error\";\n\t\t\t\tstatus: number;\n\t\t\t\tstatus_text: string;\n\t\t\t\tresponse?: Response;\n\t\t };\n\n\ttype ClientLoaderPrefetch = {\n\t\tpattern: string;\n\t\tresolve_server_state: (data: ClientLoaderServerState) => void;\n\t\tabort: () => void;\n\t\tresult_promise: Promise<unknown>;\n\t};\n\n\ttype DecodedRoute = {\n\t\tpattern: string;\n\t\tinput: unknown;\n\t\tmodule_url: string;\n\t\tview_data: unknown;\n\t\tserver_error: unknown;\n\t};\n\n\ttype DecodedPayload = {\n\t\troutes: DecodedRoute[];\n\t\tparams: Record<string, string>;\n\t\tsplat_values: string[];\n\t\ttitle: string | undefined;\n\t\tmeta_head_els: HeadEl[];\n\t\trest_head_els: HeadEl[];\n\t\tcss_bundles: string[];\n\t\tdeps: string[];\n\t};\n\n\ttype PreparedRoute = {\n\t\troute: RouteRecord;\n\t\tapply_dom_side_effects: () => void;\n\t};\n\n\ttype Submission = {\n\t\tac: AbortController;\n\t\tdeferred: Deferred<ApiResult<unknown>>;\n\t\tdid_dispatch: boolean;\n\t\tkey: string;\n\t\tmethod: string;\n\t\thref: string;\n\t\trevalidation_promise: Promise<RevalidationResult>;\n\t\tsettled: boolean;\n\t\tshould_revalidate: boolean;\n\t\tskip_work_indicator?: boolean;\n\t};\n\n\ttype RefreshWaiter = Deferred<RevalidationResult>;\n\n\ttype RefreshDemand = {\n\t\t// A fetch with seq > this value satisfies the demand.\n\t\tafter_seq: number;\n\t\treason: RevalidationReason;\n\t\tskip_work_indicator?: boolean;\n\t\twaiters: RefreshWaiter[];\n\t};\n\n\ttype RefreshState =\n\t\t| { kind: \"idle\" }\n\t\t| { kind: \"pending\"; demand: RefreshDemand; attempt: number }\n\t\t| {\n\t\t\t\tkind: \"debouncing\";\n\t\t\t\tdemand: RefreshDemand;\n\t\t\t\ttimer: ReturnType<typeof setTimeout>;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"retrying\";\n\t\t\t\tdemand: RefreshDemand;\n\t\t\t\tattempt: number;\n\t\t\t\ttimer: ReturnType<typeof setTimeout>;\n\t\t };\n\n\ttype StoredScrollEntry = [string, { x: number; y: number }];\n\n\t/*\n\tNine base facts:\n\n\t 1. phase: router lifecycle ('booting' | 'ready')\n\t 2. browser: the browser's current history entry\n\t 3. route_snapshot: current RouteState data available to Vorma APIs\n\t 4. active: the one in-flight nav or revalidation (at most one, ever)\n\t 5. prefetch: the at-most-one in-flight prefetch\n\t 6. refresh: outstanding view-data demand and its retry timing\n\t 7. apiRequests: concurrent API requests (independent of routes)\n\t 8. deferred_submit_redirect: submit redirect waiting for boot completion\n\t 9. seq: monotonic counter; refresh is ordered by seq, never wall clock\n\n\tAborting a fetch and publishing a route are each single operations.\n\n\tWorkProjection and WorkState are derived from these facts. RouteRenderState\n\tis derived only at the adapter commit boundary.\n\t*/\n\n\t/////// Base Facts\n\n\tlet phase: \"booting\" | \"ready\" = \"booting\";\n\tlet browser: HistoryPosition = { href: \"\", key: \"\", state: undefined };\n\tlet route_snapshot: RouteSnapshot | null = null;\n\tlet active: ActiveFetch | null = null;\n\tlet prefetch: PrefetchFetch | null = null;\n\tlet refresh: RefreshState = { kind: \"idle\" };\n\tconst submissions = new Map<string, Submission>();\n\tlet seq = 0;\n\n\t/////// Config And Listeners\n\n\tlet client_build_id = \"\";\n\tlet deployment_id = \"\";\n\tlet use_view_transitions = false;\n\tlet default_error_boundary: ((props: { error: unknown }) => any) | undefined;\n\tlet user_on_route_update:\n\t\t| ((\n\t\t\t\troute: RouteState,\n\t\t\t\tpreviousRoute: RouteState | null,\n\t\t\t\treason: RouteUpdateReason,\n\t\t ) => void)\n\t\t| undefined;\n\tlet user_on_work_update: ((work: WorkState) => void) | undefined;\n\tlet user_on_build_skew_detected:\n\t\t| ((event: BuildSkewDetectedEvent) => void)\n\t\t| undefined;\n\tlet deferred_submit_redirect: URL | null = null;\n\tlet last_activity_ts = Date.now();\n\tlet last_work_state: WorkState = empty_work_state();\n\tlet route_matcher: ClientMatcher | null = null;\n\tconst queued_route_patterns = new Set<string>();\n\tconst route_matcher_ready = create_client_matcher()\n\t\t.then((matcher) => {\n\t\t\troute_matcher = matcher;\n\t\t\tfor (const pattern of queued_route_patterns) {\n\t\t\t\tmatcher.register_pattern(pattern);\n\t\t\t}\n\t\t})\n\t\t.catch(() => {});\n\n\tconst work_indicator = create_work_indicator();\n\tlet work_indicator_options: WorkIndicatorOptions | undefined;\n\tlet work_indicator_sync_registered = false;\n\tconst work_update_listeners = new Set<(work: WorkState) => void>();\n\tconst client_loader_map: Record<string, ClientLoaderFn> = {};\n\tconst search_schema_map: Record<string, unknown> = {};\n\tconst hmr_rerun_patterns = new Set<string>();\n\tconst module_cache = new Map<string, Record<string, unknown>>();\n\n\tconst reload_page =\n\t\ttest_options?.reload ??\n\t\t(() => {\n\t\t\twindow.location.reload();\n\t\t});\n\tconst hard_redirect =\n\t\ttest_options?.hard_redirect ??\n\t\t((url: string) => {\n\t\t\twindow.location.assign(url);\n\t\t});\n\n\t/////// Client Matcher\n\n\tfunction register_route_pattern(pattern: string): void {\n\t\tif (queued_route_patterns.has(pattern)) {\n\t\t\treturn;\n\t\t}\n\t\tqueued_route_patterns.add(pattern);\n\t\troute_matcher?.register_pattern(pattern);\n\t}\n\n\t// If the full path does not match, find_client_view_match tries progressively\n\t// shorter path prefixes: `/a/b/c`, then `/a/b`, then `/a`, then `/`. The reason\n\t// is that the client matcher only knows patterns for view modules that have\n\t// already been loaded and that have client loaders registered. So if the user\n\t// navigates to `/parent/child`, but the client currently only knows `/parent`,\n\t// exact matching would return null even though `/parent` is a real parent view\n\t// whose client loader can and must be started early.\n\tfunction find_client_view_match(path: string): ClientMatcherNestedMatch | null {\n\t\tconst matcher = route_matcher;\n\t\tif (!matcher) {\n\t\t\treturn null;\n\t\t}\n\t\tlet match = matcher.find_nested_matches(path);\n\t\tif (match) {\n\t\t\treturn match;\n\t\t}\n\t\tconst segments = path.split(\"/\").filter(Boolean);\n\t\tfor (let i = segments.length; i >= 0; i--) {\n\t\t\tconst partial = i === 0 ? \"/\" : \"/\" + segments.slice(0, i).join(\"/\");\n\t\t\tmatch = matcher.find_nested_matches(partial);\n\t\t\tif (match) {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/////// URL And History\n\n\tfunction current_url(): URL {\n\t\treturn new URL(window.location.href);\n\t}\n\n\tfunction next_seq(): number {\n\t\tseq++;\n\t\treturn seq;\n\t}\n\n\tfunction is_http(href: string): boolean {\n\t\ttry {\n\t\t\tconst p = new URL(href).protocol;\n\t\t\treturn p === \"http:\" || p === \"https:\";\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction is_same_origin(url: URL): boolean {\n\t\treturn url.origin === current_url().origin;\n\t}\n\n\tfunction is_same_origin_href(href: string): boolean {\n\t\ttry {\n\t\t\treturn new URL(href).origin === current_url().origin;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction matches_without_hash(a: URL, b: URL): boolean {\n\t\tconst x = new URL(a.href);\n\t\tx.hash = \"\";\n\t\tconst y = new URL(b.href);\n\t\ty.hash = \"\";\n\t\treturn x.href === y.href;\n\t}\n\n\tfunction route_snapshot_matches(url: URL): boolean {\n\t\treturn (\n\t\t\troute_snapshot !== null &&\n\t\t\tmatches_without_hash(url, new URL(route_snapshot.position.href))\n\t\t);\n\t}\n\n\tfunction normalize_hash(hash: string): string {\n\t\tconst s = hash.startsWith(\"#\") ? hash.slice(1) : hash;\n\t\tif (s.length === 0) {\n\t\t\treturn s;\n\t\t}\n\t\ttry {\n\t\t\treturn decodeURIComponent(s);\n\t\t} catch {\n\t\t\treturn s;\n\t\t}\n\t}\n\n\tfunction make_history_key(): string {\n\t\treturn Math.random().toString(36).slice(2, 10);\n\t}\n\n\tfunction read_browser_position(): HistoryPosition {\n\t\tconst state = window.history.state;\n\t\tconst key =\n\t\t\tstate && typeof state === \"object\" && HISTORY_KEY_FIELD in state\n\t\t\t\t? (state as Record<string, string>)[HISTORY_KEY_FIELD]!\n\t\t\t\t: \"\";\n\t\treturn {\n\t\t\thref: current_url().href,\n\t\t\tkey,\n\t\t\tstate: state?.[HISTORY_USER_STATE_FIELD],\n\t\t};\n\t}\n\n\tfunction commit_history(\n\t\turl: string,\n\t\treplace: boolean | undefined,\n\t\tuser_state: unknown,\n\t): HistoryPosition {\n\t\tconst key = make_history_key();\n\t\tconst next_state: Record<string, unknown> = {\n\t\t\t[HISTORY_KEY_FIELD]: key,\n\t\t\t[HISTORY_USER_STATE_FIELD]: user_state,\n\t\t};\n\n\t\tif (replace) {\n\t\t\tconst existing = window.history.state;\n\t\t\tconst base = existing && typeof existing === \"object\" ? existing : {};\n\t\t\twindow.history.replaceState({ ...(base as object), ...next_state }, \"\", url);\n\t\t} else {\n\t\t\twindow.history.pushState(next_state, \"\", url);\n\t\t}\n\n\t\tbrowser = { href: url, key, state: user_state };\n\t\treturn browser;\n\t}\n\n\tfunction route_snapshot_matches_browser(): boolean {\n\t\treturn (\n\t\t\troute_snapshot !== null &&\n\t\t\troute_snapshot.position.href === browser.href &&\n\t\t\troute_snapshot.position.key === browser.key\n\t\t);\n\t}\n\n\t/////// Scroll Storage\n\n\tfunction get_scroll_pos(): { x: number; y: number } {\n\t\treturn { x: window.scrollX, y: window.scrollY };\n\t}\n\n\tfunction read_scroll_entries(): StoredScrollEntry[] {\n\t\ttry {\n\t\t\tconst raw = sessionStorage.getItem(SCROLL_STORAGE_KEY);\n\t\t\tif (!raw) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst parsed = JSON.parse(raw);\n\t\t\tif (!Array.isArray(parsed)) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn parsed.filter((e: unknown): e is StoredScrollEntry => {\n\t\t\t\treturn (\n\t\t\t\t\tArray.isArray(e) &&\n\t\t\t\t\te.length === 2 &&\n\t\t\t\t\ttypeof e[0] === \"string\" &&\n\t\t\t\t\t!!e[1] &&\n\t\t\t\t\ttypeof e[1] === \"object\" &&\n\t\t\t\t\tNumber.isFinite((e[1] as any).x) &&\n\t\t\t\t\tNumber.isFinite((e[1] as any).y)\n\t\t\t\t);\n\t\t\t});\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tfunction save_scroll_for_key(key: string, pos: { x: number; y: number }): void {\n\t\tconst entries = read_scroll_entries().filter((e) => e[0] !== key);\n\t\tentries.push([key, pos]);\n\t\tif (entries.length > MAX_SCROLL_ENTRIES) {\n\t\t\tentries.splice(0, entries.length - MAX_SCROLL_ENTRIES);\n\t\t}\n\t\ttry {\n\t\t\tsessionStorage.setItem(SCROLL_STORAGE_KEY, JSON.stringify(entries));\n\t\t} catch {}\n\t}\n\n\tfunction get_scroll_for_key(key: string): { x: number; y: number } | undefined {\n\t\tfor (const [k, v] of read_scroll_entries()) {\n\t\t\tif (k === key) {\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tfunction save_current_scroll(): void {\n\t\tif (browser.key) {\n\t\t\tsave_scroll_for_key(browser.key, get_scroll_pos());\n\t\t}\n\t}\n\n\t/////// Payload Decoding\n\n\tfunction decode_payload(raw: unknown, url: URL): DecodedPayload {\n\t\tconst p = raw as Record<string, any>;\n\t\tconst patterns: string[] = p.matched_patterns ?? [];\n\t\tconst schemas: unknown[] = Array.isArray(p.search_schemas)\n\t\t\t? p.search_schemas\n\t\t\t: [];\n\t\tconst views_data: unknown[] = p.views_data ?? [];\n\t\tconst import_urls: string[] = p.import_urls ?? [];\n\t\tconst err_idx: number | null = p.outermost_server_err_idx ?? null;\n\t\tconst err_msg: string = p.outermost_server_err ?? \"\";\n\t\tconst search_params = url.searchParams;\n\n\t\tconst routes: DecodedRoute[] = patterns.map((pattern, i) => {\n\t\t\tconst schema = schemas[i];\n\t\t\tsearch_schema_map[pattern] = schema;\n\t\t\treturn {\n\t\t\t\tpattern,\n\t\t\t\tinput: parseSearchParams(schema, search_params),\n\t\t\t\tmodule_url: import_urls[i] ?? \"\",\n\t\t\t\tview_data: views_data[i],\n\t\t\t\tserver_error: err_idx !== null && i === err_idx ? err_msg : undefined,\n\t\t\t};\n\t\t});\n\n\t\tlet title: string | undefined;\n\t\tif (p.title?.dangerous_inner_html !== undefined) {\n\t\t\tconst el = document.createElement(\"textarea\");\n\t\t\tel.innerHTML = p.title.dangerous_inner_html;\n\t\t\ttitle = el.value;\n\t\t}\n\n\t\treturn {\n\t\t\troutes,\n\t\t\tparams: p.params ?? {},\n\t\t\tsplat_values: p.splat_values ?? [],\n\t\t\ttitle,\n\t\t\tmeta_head_els: p.meta_head_els ?? [],\n\t\t\trest_head_els: p.rest_head_els ?? [],\n\t\t\tcss_bundles: p.css_bundles ?? [],\n\t\t\tdeps: p.deps ?? [],\n\t\t};\n\t}\n\n\t/////// Modules And Client Loader Prefetches\n\n\tfunction make_cl_prefetch(input: {\n\t\thref: string;\n\t\thistory_state: unknown;\n\t\tknown_matches: ClientLoaderKnownMatch[];\n\t\tclient_loader: ClientLoaderFn;\n\t\tparams: Record<string, string>;\n\t\tpattern: string;\n\t\troute_input: unknown;\n\t\tsignal: AbortSignal;\n\t\tsplat_values: string[];\n\t\ttrigger: \"navigation\" | \"revalidation\" | \"prefetch\";\n\t}): ClientLoaderPrefetch {\n\t\tlet resolve_server_state!: (v: ClientLoaderServerState) => void;\n\t\tlet reject_server_state!: (err: unknown) => void;\n\t\tconst server_promise = new Promise<ClientLoaderServerState>((res, rej) => {\n\t\t\tresolve_server_state = res;\n\t\t\treject_server_state = rej;\n\t\t});\n\t\tserver_promise.catch(() => {});\n\n\t\tconst ac = new AbortController();\n\t\tif (input.signal.aborted) {\n\t\t\tac.abort();\n\t\t\treject_server_state(new_abort_error());\n\t\t} else {\n\t\t\tinput.signal.addEventListener(\n\t\t\t\t\"abort\",\n\t\t\t\t() => {\n\t\t\t\t\tac.abort();\n\t\t\t\t\treject_server_state(new_abort_error());\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t);\n\t\t}\n\n\t\tconst result_promise = input.client_loader({\n\t\t\ttrigger: input.trigger,\n\t\t\thref: input.href,\n\t\t\thistoryState: input.history_state,\n\t\t\tpattern: input.pattern,\n\t\t\tparams: input.params,\n\t\t\tsplatValues: input.splat_values,\n\t\t\tinput: input.route_input,\n\t\t\tknownMatches: input.known_matches,\n\t\t\tserverPromise: server_promise,\n\t\t\tsignal: ac.signal,\n\t\t});\n\t\tresult_promise.catch(() => {});\n\n\t\treturn {\n\t\t\tpattern: input.pattern,\n\t\t\tresolve_server_state,\n\t\t\tabort: () => {\n\t\t\t\tac.abort();\n\t\t\t\treject_server_state(new_abort_error());\n\t\t\t},\n\t\t\tresult_promise,\n\t\t};\n\t}\n\n\tfunction routes_to_known_matches(routes: DecodedRoute[]): ClientLoaderKnownMatch[] {\n\t\treturn routes.map((r) => {\n\t\t\treturn {\n\t\t\t\tpattern: r.pattern,\n\t\t\t\tinput: r.input,\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction build_server_state(\n\t\troutes: DecodedRoute[],\n\t\tidx: number,\n\t): ClientLoaderServerState {\n\t\tconst err_idx = routes.findIndex((r) => {\n\t\t\treturn r.server_error !== undefined;\n\t\t});\n\t\treturn {\n\t\t\tclientBuildId: client_build_id,\n\t\t\tmatches: routes.map((r) => {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: r.pattern,\n\t\t\t\t\tinput: r.input,\n\t\t\t\t\tviewData: r.view_data,\n\t\t\t\t};\n\t\t\t}),\n\t\t\toutermostServerError:\n\t\t\t\terr_idx === -1\n\t\t\t\t\t? null\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tidx: err_idx,\n\t\t\t\t\t\t\terror: routes[err_idx]!.server_error,\n\t\t\t\t\t\t},\n\t\t\tviewData: routes[idx]?.view_data,\n\t\t};\n\t}\n\n\tasync function run_client_loaders(\n\t\troutes: DecodedRoute[],\n\t\tpayload: DecodedPayload,\n\t\tcl_prefetches: ClientLoaderPrefetch[],\n\t\ttrigger: \"boot\" | \"navigation\" | \"revalidation\",\n\t\thref: string,\n\t\thistory_state: unknown,\n\t\tsignal: AbortSignal,\n\t): Promise<Array<{ data: unknown } | { error: unknown } | undefined>> {\n\t\tconst by_pattern = new Map<string, ClientLoaderPrefetch>();\n\t\tfor (const p of cl_prefetches) {\n\t\t\tby_pattern.set(p.pattern, p);\n\t\t}\n\t\tconst err_idx = routes.findIndex((r) => r.server_error !== undefined);\n\t\tconst known_matches = routes_to_known_matches(routes);\n\n\t\tconst abort_later: Array<(() => void) | null> = [];\n\t\tconst promises: Array<Promise<unknown>> = [];\n\t\tconst retained_prefetches = new Set<ClientLoaderPrefetch>();\n\n\t\tfor (let i = 0; i < routes.length; i++) {\n\t\t\tconst route = routes[i]!;\n\t\t\tconst existing = by_pattern.get(route.pattern);\n\t\t\tif (err_idx !== -1 && i >= err_idx) {\n\t\t\t\texisting?.abort();\n\t\t\t\tpromises.push(Promise.resolve(undefined));\n\t\t\t\tabort_later.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (existing) {\n\t\t\t\texisting.resolve_server_state(build_server_state(routes, i));\n\t\t\t\tretained_prefetches.add(existing);\n\t\t\t\tabort_later.push(existing.abort);\n\t\t\t\tpromises.push(existing.result_promise);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst client_loader = client_loader_map[route.pattern];\n\t\t\tif (!client_loader) {\n\t\t\t\tpromises.push(Promise.resolve(undefined));\n\t\t\t\tabort_later.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst ac = new AbortController();\n\t\t\tabort_later.push(() => {\n\t\t\t\tac.abort();\n\t\t\t});\n\t\t\tif (signal.aborted) {\n\t\t\t\tac.abort();\n\t\t\t} else {\n\t\t\t\tsignal.addEventListener(\"abort\", () => ac.abort(), {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tpromises.push(\n\t\t\t\tclient_loader({\n\t\t\t\t\ttrigger,\n\t\t\t\t\thref,\n\t\t\t\t\thistoryState: history_state,\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\tparams: payload.params,\n\t\t\t\t\tsplatValues: payload.splat_values,\n\t\t\t\t\tinput: route.input,\n\t\t\t\t\tknownMatches: known_matches,\n\t\t\t\t\tserverPromise: Promise.resolve(build_server_state(routes, i)),\n\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tfor (const p of cl_prefetches) {\n\t\t\tif (!retained_prefetches.has(p)) {\n\t\t\t\tp.abort();\n\t\t\t}\n\t\t}\n\n\t\tconst wrapped = promises.map(async (p, i) => {\n\t\t\treturn p.catch((err) => {\n\t\t\t\t// On non-abort failure, cascade abort to later routes to avoid\n\t\t\t\t// running client loaders that can never be used.\n\t\t\t\tif (!is_abort_error(err)) {\n\t\t\t\t\tfor (let j = i + 1; j < abort_later.length; j++) {\n\t\t\t\t\t\tabort_later[j]?.();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t});\n\n\t\tconst settled = await Promise.allSettled(wrapped);\n\t\tconst out: Array<{ data: unknown } | { error: unknown } | undefined> = [];\n\t\tfor (const r of settled) {\n\t\t\tif (r.status === \"fulfilled\") {\n\t\t\t\tout.push(r.value !== undefined ? { data: r.value } : undefined);\n\t\t\t} else if (!is_abort_error(r.reason)) {\n\t\t\t\tout.push({ error: to_error_string(r.reason) });\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tout.push(undefined);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\t/////// Route Preparation\n\n\tasync function prepare_modules(\n\t\tpayload: DecodedPayload,\n\t\tsignal: AbortSignal,\n\t): Promise<Map<string, Record<string, unknown>> | null> {\n\t\tpreload_css(payload.css_bundles);\n\t\tconst urls = payload.routes.map((r) => {\n\t\t\treturn r.module_url;\n\t\t});\n\t\tconst unique = [...new Set(urls.filter(Boolean))];\n\t\tconst pairs = await Promise.all(\n\t\t\tunique.map(async (url) => {\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconst key = normalize_module_url(url);\n\t\t\t\t\tconst cached = module_cache.get(key);\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\treturn [url, cached] as const;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst mod = (await import(/* @vite-ignore */ url)) as Record<\n\t\t\t\t\tstring,\n\t\t\t\t\tunknown\n\t\t\t\t>;\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tmodule_cache.set(normalize_module_url(url), mod);\n\t\t\t\t}\n\t\t\t\treturn [url, mod] as const;\n\t\t\t}),\n\t\t);\n\t\tconst modules = new Map(pairs);\n\t\tif (signal.aborted) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (const route of payload.routes) {\n\t\t\tconst mod = modules.get(route.module_url);\n\t\t\tif (!mod) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst def = mod.default as ViewDefinition | undefined;\n\t\t\tif (def?.client_loader) {\n\t\t\t\tclient_loader_map[route.pattern] = def.client_loader;\n\t\t\t\tregister_route_pattern(route.pattern);\n\t\t\t}\n\t\t}\n\t\treturn modules;\n\t}\n\n\tfunction build_route_record(\n\t\tpayload: DecodedPayload,\n\t\tmodules: Map<string, Record<string, unknown>>,\n\t\tcl_results: Array<{ data: unknown } | { error: unknown } | undefined>,\n\t): RouteRecord {\n\t\tconst matches: RouteMatchRecord[] = payload.routes.map((route, i) => {\n\t\t\tconst cl_res = cl_results[i];\n\t\t\treturn {\n\t\t\t\tpattern: route.pattern,\n\t\t\t\tinput: route.input,\n\t\t\t\tmodule_url: route.module_url,\n\t\t\t\tmodule: modules.get(route.module_url) ?? {},\n\t\t\t\tview_data: route.view_data,\n\t\t\t\tclient_loader_data: cl_res && \"data\" in cl_res ? cl_res.data : undefined,\n\t\t\t};\n\t\t});\n\t\tlet error: RouteErrorState | null = null;\n\t\tconst server_error_idx = payload.routes.findIndex((route) => {\n\t\t\treturn route.server_error !== undefined;\n\t\t});\n\t\tif (server_error_idx !== -1) {\n\t\t\terror = {\n\t\t\t\tidx: server_error_idx,\n\t\t\t\terror: payload.routes[server_error_idx]!.server_error,\n\t\t\t\tsource: \"server\",\n\t\t\t};\n\t\t} else {\n\t\t\tconst client_loader_error_idx = cl_results.findIndex((cl_res) => {\n\t\t\t\treturn cl_res !== undefined && \"error\" in cl_res;\n\t\t\t});\n\t\t\tif (client_loader_error_idx !== -1) {\n\t\t\t\terror = {\n\t\t\t\t\tidx: client_loader_error_idx,\n\t\t\t\t\terror: (\n\t\t\t\t\t\tcl_results[client_loader_error_idx] as {\n\t\t\t\t\t\t\terror: unknown;\n\t\t\t\t\t\t}\n\t\t\t\t\t).error,\n\t\t\t\t\tsource: \"clientLoader\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tparams: payload.params,\n\t\t\tsplat_values: payload.splat_values,\n\t\t\tmatches,\n\t\t\terror,\n\t\t\tclient_build_id,\n\t\t};\n\t}\n\n\tasync function prepare_route(\n\t\tpayload: DecodedPayload,\n\t\tcl_prefetches: ClientLoaderPrefetch[],\n\t\ttrigger: \"navigation\" | \"revalidation\",\n\t\thref: string,\n\t\thistory_state: unknown,\n\t\tsignal: AbortSignal,\n\t): Promise<PreparedRoute | null> {\n\t\tconst modules = await prepare_modules(payload, signal);\n\t\tif (!modules) {\n\t\t\treturn null;\n\t\t}\n\t\tconst cl_results = await run_client_loaders(\n\t\t\tpayload.routes,\n\t\t\tpayload,\n\t\t\tcl_prefetches,\n\t\t\ttrigger,\n\t\t\thref,\n\t\t\thistory_state,\n\t\t\tsignal,\n\t\t);\n\t\tif (signal.aborted) {\n\t\t\treturn null;\n\t\t}\n\t\tawait wait_for_css(payload.css_bundles, signal);\n\t\tif (signal.aborted) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\troute: build_route_record(payload, modules, cl_results),\n\t\t\tapply_dom_side_effects: () => {\n\t\t\t\tapply_head_and_title(\n\t\t\t\t\tpayload.title,\n\t\t\t\t\tpayload.meta_head_els,\n\t\t\t\t\tpayload.rest_head_els,\n\t\t\t\t);\n\t\t\t\tapply_css_bundles(payload.css_bundles);\n\t\t\t\tpreload_modules(payload.deps);\n\t\t\t},\n\t\t};\n\t}\n\n\t/////// Fetch\n\n\tfunction detect_redirect(\n\t\tres: Response,\n\t\tbase: URL,\n\t): { href: string; hard: boolean } | null {\n\t\tconst soft = res.headers.get(X_CLIENT_REDIRECT);\n\t\tif (soft) {\n\t\t\treturn { href: new URL(soft, base).href, hard: false };\n\t\t}\n\t\tif (res.redirected && res.url && res.url !== base.href) {\n\t\t\treturn { href: new URL(res.url, base).href, hard: false };\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction report_build_skew(\n\t\tevent: Omit<\n\t\t\tBuildSkewDetectedEvent,\n\t\t\t| \"activeClientBuildId\"\n\t\t\t| \"currentRouteState\"\n\t\t\t| \"currentWorkState\"\n\t\t\t| \"serverBuildId\"\n\t\t> & {\n\t\t\tresponse: Response;\n\t\t},\n\t): boolean {\n\t\tconst server_build_id = event.response.headers.get(BUILD_ID_HEADER) ?? \"\";\n\t\tif (!server_build_id || server_build_id === client_build_id) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!route_snapshot) {\n\t\t\treturn false;\n\t\t}\n\t\tuser_on_build_skew_detected?.({\n\t\t\tactiveClientBuildId: client_build_id,\n\t\t\tserverBuildId: server_build_id,\n\t\t\ttriggeringResponse: event.triggeringResponse,\n\t\t\tcurrentRouteState: route_snapshot_to_state(route_snapshot),\n\t\t\tcurrentWorkState: derive_work_state(),\n\t\t});\n\t\treturn true;\n\t}\n\n\tfunction report_route_build_skew(\n\t\tf: FetchBase & { intent: FetchIntent },\n\t\tresponse: Response,\n\t): boolean {\n\t\tconst base = {\n\t\t\tkind: \"route\" as const,\n\t\t\trequestedHref: f.url.href,\n\t\t\tstatus: response.status,\n\t\t\tok: response.ok,\n\t\t};\n\t\tlet triggering_response: BuildSkewDetectedEvent[\"triggeringResponse\"];\n\t\tif (f.intent.kind === \"reval\") {\n\t\t\ttriggering_response = {\n\t\t\t\t...base,\n\t\t\t\ttrigger: \"revalidation\",\n\t\t\t\trevalidationReason: f.intent.reason,\n\t\t\t};\n\t\t} else if (f.intent.kind === \"prefetch\") {\n\t\t\ttriggering_response = {\n\t\t\t\t...base,\n\t\t\t\ttrigger: \"prefetch\",\n\t\t\t};\n\t\t} else {\n\t\t\ttriggering_response = {\n\t\t\t\t...base,\n\t\t\t\ttrigger: f.intent.source === \"popstate\" ? \"popstate\" : \"navigation\",\n\t\t\t};\n\t\t}\n\n\t\treturn report_build_skew({\n\t\t\tresponse,\n\t\t\ttriggeringResponse: triggering_response,\n\t\t});\n\t}\n\n\tfunction history_state_for_fetch(intent: FetchIntent): unknown {\n\t\tif (intent.kind === \"nav\") {\n\t\t\treturn intent.options.is_popstate ? browser.state : intent.options.state;\n\t\t}\n\t\tif (intent.kind === \"reval\") {\n\t\t\treturn browser.state;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/////// Fetch Lifecycle\n\n\tfunction start_fetch<T extends FetchIntent>(\n\t\turl: URL,\n\t\tintent: T,\n\t\tis_revalidation: boolean,\n\t\tprepare_ready?: Promise<void>,\n\t): FetchBase & { prepare_ready: Promise<void>; intent: T } {\n\t\tconst ac = new AbortController();\n\t\tconst cl_prefetches: ClientLoaderPrefetch[] = [];\n\t\tconst cl_prefetches_ready = route_matcher_ready\n\t\t\t.then(() => {\n\t\t\t\tif (ac.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst match = find_client_view_match(url.pathname);\n\t\t\t\tif (!match || ac.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst known_matches = match.patterns.map((pattern) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpattern,\n\t\t\t\t\t\tinput: parseSearchParams(\n\t\t\t\t\t\t\tsearch_schema_map[pattern],\n\t\t\t\t\t\t\turl.searchParams,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tconst input_by_pattern = new Map(\n\t\t\t\t\tknown_matches.map((m) => {\n\t\t\t\t\t\treturn [m.pattern, m.input] as const;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst history_state = history_state_for_fetch(intent);\n\t\t\t\tfor (const pattern of match.patterns) {\n\t\t\t\t\tconst client_loader = client_loader_map[pattern];\n\t\t\t\t\tif (client_loader) {\n\t\t\t\t\t\tcl_prefetches.push(\n\t\t\t\t\t\t\tmake_cl_prefetch({\n\t\t\t\t\t\t\t\thref: url.href,\n\t\t\t\t\t\t\t\thistory_state,\n\t\t\t\t\t\t\t\tknown_matches,\n\t\t\t\t\t\t\t\tclient_loader,\n\t\t\t\t\t\t\t\tparams: match.params,\n\t\t\t\t\t\t\t\tpattern,\n\t\t\t\t\t\t\t\troute_input: input_by_pattern.get(pattern),\n\t\t\t\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t\t\t\t\tsplat_values: match.splat_values,\n\t\t\t\t\t\t\t\ttrigger:\n\t\t\t\t\t\t\t\t\tintent.kind === \"prefetch\"\n\t\t\t\t\t\t\t\t\t\t? \"prefetch\"\n\t\t\t\t\t\t\t\t\t\t: intent.kind === \"reval\"\n\t\t\t\t\t\t\t\t\t\t\t? \"revalidation\"\n\t\t\t\t\t\t\t\t\t\t\t: \"navigation\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {});\n\t\treturn {\n\t\t\turl,\n\t\t\tac,\n\t\t\tseq: next_seq(),\n\t\t\tdata_promise: (async () => {\n\t\t\t\tconst modified = new URL(url.href);\n\t\t\t\tmodified.searchParams.set(VORMA_JSON_KEY, client_build_id);\n\t\t\t\tif (is_revalidation && deployment_id) {\n\t\t\t\t\tmodified.searchParams.set(VERCEL_DPL_QUERY_PARAM_KEY, deployment_id);\n\t\t\t\t}\n\t\t\t\tconst res = await fetch(modified, {\n\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t\theaders: { [X_ACCEPTS_CLIENT_REDIRECT]: \"1\" },\n\t\t\t\t});\n\n\t\t\t\tif (res.headers.get(X_VORMA_BUILD_SKEW) === \"1\") {\n\t\t\t\t\treturn { kind: \"build_skew\", response: res };\n\t\t\t\t}\n\t\t\t\tconst redirect = detect_redirect(res, modified);\n\t\t\t\tif (redirect) {\n\t\t\t\t\treturn { kind: \"redirect\", ...redirect, response: res };\n\t\t\t\t}\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"error\",\n\t\t\t\t\t\tstatus: res.status,\n\t\t\t\t\t\tstatus_text: res.statusText,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await res.json();\n\t\t\t\t\treturn { kind: \"data\", data, response: res };\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"error\",\n\t\t\t\t\t\tstatus: res.status,\n\t\t\t\t\t\tstatus_text: res.statusText,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t})(),\n\t\t\tcl_prefetches,\n\t\t\tcl_prefetches_ready,\n\t\t\tprepare_ready: prepare_ready ?? Promise.resolve(),\n\t\t\tintent,\n\t\t};\n\t}\n\n\tfunction resolve_nav(f: ActiveFetch, result: NavResult): void {\n\t\tif (f.intent.kind === \"nav\") {\n\t\t\tf.intent.deferred.resolve(result);\n\t\t}\n\t}\n\n\tfunction can_commit(f: ActiveFetch): boolean {\n\t\treturn active === f && !f.ac.signal.aborted;\n\t}\n\n\t// Core lifecycle for any fetch intent. The only place that drives\n\t// fetch-to-publish: resolve response, follow redirects, prepare, publish.\n\tasync function run_active(f: ActiveFetch): Promise<void> {\n\t\tactive = f;\n\t\tnotify_work_update();\n\n\t\tlet published = false;\n\t\tlet nav_transferred = false;\n\t\ttry {\n\t\t\tconst result = await f.data_promise;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.kind === \"build_skew\") {\n\t\t\t\treport_route_build_skew(f, result.response);\n\t\t\t\tif (f.intent.kind === \"reval\") {\n\t\t\t\t\tmark_refresh_build_skew();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\thard_redirect(f.url.href);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.response) {\n\t\t\t\tconst did_detect_skew = report_route_build_skew(f, result.response);\n\t\t\t\tif (\n\t\t\t\t\tdid_detect_skew &&\n\t\t\t\t\tresult.kind === \"redirect\" &&\n\t\t\t\t\tresult.hard &&\n\t\t\t\t\tf.intent.kind === \"reval\"\n\t\t\t\t) {\n\t\t\t\t\tmark_refresh_build_skew();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (result.kind === \"error\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.kind === \"redirect\") {\n\t\t\t\tnav_transferred = handle_redirect(f, result) === \"transferred\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst payload = decode_payload(result.data, f.url);\n\t\t\tpreload_modules(payload.deps);\n\n\t\t\tawait f.cl_prefetches_ready;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait f.prepare_ready;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prepared = await prepare_route(\n\t\t\t\tpayload,\n\t\t\t\tf.cl_prefetches,\n\t\t\t\tf.intent.kind === \"reval\" ? \"revalidation\" : \"navigation\",\n\t\t\t\tf.url.href,\n\t\t\t\thistory_state_for_fetch(f.intent),\n\t\t\t\tf.ac.signal,\n\t\t\t);\n\t\t\tif (!prepared || !can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst was_published = await publish(f, prepared);\n\t\t\tif (was_published) {\n\t\t\t\tpublished = true;\n\t\t\t\tlast_activity_ts = Date.now();\n\t\t\t\tmark_fresh(f);\n\t\t\t}\n\t\t} catch {\n\t\t\t// swallow\n\t\t} finally {\n\t\t\tif (f.intent.kind === \"nav\" && !nav_transferred) {\n\t\t\t\tresolve_nav(f, { didNavigate: published });\n\t\t\t}\n\t\t\tif (active === f) {\n\t\t\t\tactive = null;\n\t\t\t}\n\t\t\tnotify_work_update();\n\t\t\tmaybe_revalidate();\n\t\t}\n\t}\n\n\t// Publish a prepared route. Clears `active` as soon as the commit lands\n\t// inside the view transition so subsequent same-page navs can fire\n\t// while the transition animation is still running. Returns true if the\n\t// commit actually happened (it may be superseded mid-callback).\n\tasync function publish(f: ActiveFetch, prepared: PreparedRoute): Promise<boolean> {\n\t\tconst commit_reason: Exclude<RouteUpdateReason, \"boot\"> =\n\t\t\tf.intent.kind === \"reval\"\n\t\t\t\t? \"revalidation\"\n\t\t\t\t: f.intent.options.is_popstate\n\t\t\t\t\t? \"popstate\"\n\t\t\t\t\t: \"navigation\";\n\n\t\tconst prev_snapshot = route_snapshot;\n\t\tif (!prev_snapshot) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst next_href =\n\t\t\tf.intent.kind === \"nav\" ? f.intent.url.href : prev_snapshot.position.href;\n\t\tconst next_history_state =\n\t\t\tf.intent.kind === \"nav\"\n\t\t\t\t? f.intent.options.is_popstate\n\t\t\t\t\t? browser.state\n\t\t\t\t\t: f.intent.options.state\n\t\t\t\t: prev_snapshot.position.state;\n\t\tconst yield_hooks = prev_snapshot.route.matches\n\t\t\t.map((m) => {\n\t\t\t\treturn (m.module.default as ViewDefinition | undefined)\n\t\t\t\t\t?.before_route_yield;\n\t\t\t})\n\t\t\t.filter((h): h is BeforeRouteYieldFn => {\n\t\t\t\treturn typeof h === \"function\";\n\t\t\t});\n\t\tconst commit_hooks = prepared.route.matches\n\t\t\t.map((m) => {\n\t\t\t\treturn (m.module.default as ViewDefinition | undefined)\n\t\t\t\t\t?.before_route_commit;\n\t\t\t})\n\t\t\t.filter((h): h is BeforeRouteCommitFn => {\n\t\t\t\treturn typeof h === \"function\";\n\t\t\t});\n\t\tif (yield_hooks.length > 0 || commit_hooks.length > 0) {\n\t\t\tconst current = route_snapshot_to_state(prev_snapshot);\n\t\t\tconst next = route_record_to_state(\n\t\t\t\tprepared.route,\n\t\t\t\tnext_href,\n\t\t\t\tnext_history_state,\n\t\t\t);\n\t\t\tawait Promise.all(\n\t\t\t\tyield_hooks\n\t\t\t\t\t.map((h) => {\n\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\th({\n\t\t\t\t\t\t\t\ttrigger: commit_reason,\n\t\t\t\t\t\t\t\tsignal: f.ac.signal,\n\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t\t.concat(\n\t\t\t\t\t\tcommit_hooks.map((h) => {\n\t\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\t\th({\n\t\t\t\t\t\t\t\t\ttrigger: commit_reason,\n\t\t\t\t\t\t\t\t\tsignal: f.ac.signal,\n\t\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tlet did_publish = false;\n\n\t\tconst do_publish = () => {\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet position: HistoryPosition;\n\t\t\tif (f.intent.kind === \"nav\" && !f.intent.options.is_popstate) {\n\t\t\t\tsave_current_scroll();\n\t\t\t\tposition = commit_history(\n\t\t\t\t\tf.intent.url.href,\n\t\t\t\t\tf.intent.options.replace,\n\t\t\t\t\tf.intent.options.state,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// popstate: browser already at the new URL; revalidation: URL unchanged\n\t\t\t\tposition = browser;\n\t\t\t}\n\n\t\t\tconst prev = route_snapshot;\n\t\t\tprepared.apply_dom_side_effects();\n\t\t\troute_snapshot = { position, route: prepared.route };\n\n\t\t\tlet scroll_intent: ScrollIntent | undefined;\n\t\t\tif (f.intent.kind === \"nav\") {\n\t\t\t\tlet ss: ScrollState | undefined;\n\t\t\t\tif (f.intent.options.is_popstate) {\n\t\t\t\t\tif (normalize_hash(f.intent.url.hash).length > 0) {\n\t\t\t\t\t\tss = { hash: f.intent.url.hash };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tss = f.intent.options.popstate_scroll ?? { x: 0, y: 0 };\n\t\t\t\t\t}\n\t\t\t\t} else if (normalize_hash(f.intent.url.hash).length > 0) {\n\t\t\t\t\tss = { hash: f.intent.url.hash };\n\t\t\t\t} else if (f.intent.options.scroll_to_top !== false) {\n\t\t\t\t\tss = { x: 0, y: 0 };\n\t\t\t\t}\n\t\t\t\tif (ss) {\n\t\t\t\t\tscroll_intent = {\n\t\t\t\t\t\tscroll: ss,\n\t\t\t\t\t\ttarget_entry_id: make_entry_id(\n\t\t\t\t\t\t\tprepared.route.matches.length - 1,\n\t\t\t\t\t\t\tprepared.route.matches[prepared.route.matches.length - 1]\n\t\t\t\t\t\t\t\t?.pattern ?? \"\",\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tactive = null;\n\t\t\tcommit_route_snapshot(\n\t\t\t\tcommit_reason,\n\t\t\t\tprev,\n\t\t\t\troute_snapshot,\n\t\t\t\tscroll_intent,\n\t\t\t\ttake_work_update(),\n\t\t\t);\n\t\t\tdid_publish = true;\n\t\t};\n\n\t\tconst vt = (document as any).startViewTransition;\n\t\tif (f.intent.kind === \"nav\" && use_view_transitions && typeof vt === \"function\") {\n\t\t\tconst transition = vt.call(document, do_publish);\n\t\t\t// Prefer updateCallbackDone (modern API); fall back to finished.\n\t\t\tawait (transition.updateCallbackDone ?? transition.finished);\n\t\t\tif (transition.finished) {\n\t\t\t\tawait transition.finished;\n\t\t\t}\n\t\t} else {\n\t\t\tdo_publish();\n\t\t}\n\t\treturn did_publish;\n\t}\n\n\tfunction route_to_render_state(\n\t\troute: RouteRecord,\n\t\thistory_state: unknown,\n\t): RouteRenderState {\n\t\treturn {\n\t\t\tentries: route.matches.map((m) => {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: m.pattern,\n\t\t\t\t\tinput: m.input,\n\t\t\t\t\tmodule_url: m.module_url,\n\t\t\t\t\tmodule: m.module,\n\t\t\t\t\tview_data: m.view_data,\n\t\t\t\t\tclient_loader_data: m.client_loader_data,\n\t\t\t\t};\n\t\t\t}),\n\t\t\terror: route.error,\n\t\t\tparams: route.params,\n\t\t\tsplat_values: route.splat_values,\n\t\t\tclient_build_id: route.client_build_id,\n\t\t\thistory_state,\n\t\t};\n\t}\n\n\tfunction route_snapshot_to_state(snapshot: RouteSnapshot): RouteState {\n\t\treturn route_record_to_state(\n\t\t\tsnapshot.route,\n\t\t\tsnapshot.position.href,\n\t\t\tsnapshot.position.state,\n\t\t);\n\t}\n\n\tfunction route_record_to_state(\n\t\troute: RouteRecord,\n\t\thref: string,\n\t\thistory_state: unknown,\n\t): RouteState {\n\t\treturn {\n\t\t\thref,\n\t\t\thistoryState: history_state,\n\t\t\tclientBuildId: route.client_build_id,\n\t\t\tparams: route.params,\n\t\t\tsplatValues: route.splat_values,\n\t\t\tmatches: route.matches.map((m) => {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: m.pattern,\n\t\t\t\t\tinput: m.input,\n\t\t\t\t\tviewData: m.view_data,\n\t\t\t\t\tclientLoaderData: m.client_loader_data,\n\t\t\t\t};\n\t\t\t}),\n\t\t\terror: route.error,\n\t\t};\n\t}\n\n\tfunction to_route_update_reason(reason: RouteRenderCommitReason): RouteUpdateReason {\n\t\tif (reason === \"initial\") {\n\t\t\treturn \"boot\";\n\t\t}\n\t\tif (reason === \"hmr\") {\n\t\t\treturn \"revalidation\";\n\t\t}\n\t\treturn reason;\n\t}\n\n\tfunction commit_route_snapshot(\n\t\treason: RouteRenderCommitReason,\n\t\tprev: RouteSnapshot | null,\n\t\tnext: RouteSnapshot,\n\t\tscroll_intent?: ScrollIntent,\n\t\twork?: WorkState,\n\t): void {\n\t\tconst previous_route = prev ? route_snapshot_to_state(prev) : null;\n\t\tconst route = route_snapshot_to_state(next);\n\t\tconst client_commit: ClientCommit = {\n\t\t\troute_render: {\n\t\t\t\tstate: route_to_render_state(next.route, next.position.state),\n\t\t\t\tscroll_intent,\n\t\t\t},\n\t\t\twork,\n\t\t};\n\t\tif (!previous_route || !jsonDeepEquals(previous_route, route)) {\n\t\t\tclient_commit.route_update = {\n\t\t\t\tprevious_route,\n\t\t\t\treason: to_route_update_reason(reason),\n\t\t\t\troute,\n\t\t\t};\n\t\t}\n\t\temit_client_commit(client_commit);\n\t}\n\n\tfunction handle_redirect(\n\t\tf: ActiveFetch,\n\t\tredirect: Extract<FetchResult, { kind: \"redirect\" }>,\n\t): RedirectResult {\n\t\tconst nav_intent = f.intent.kind === \"nav\" ? f.intent : null;\n\n\t\t// Invalid scheme: treat as failure for nav, no-op otherwise.\n\t\tif (!is_http(redirect.href)) {\n\t\t\tif (nav_intent) {\n\t\t\t\tnav_intent.deferred.resolve({ didNavigate: false });\n\t\t\t}\n\t\t\tactive = null;\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\t// Hard redirect or cross-origin: leave the page.\n\t\tif (redirect.hard || !is_same_origin_href(redirect.href)) {\n\t\t\thard_redirect(redirect.href);\n\t\t\tif (nav_intent) {\n\t\t\t\tnav_intent.deferred.resolve({ didNavigate: false });\n\t\t\t}\n\t\t\tactive = null;\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\t// Redirect loop guard (only meaningful for nav, which tracks count).\n\t\tif (nav_intent && nav_intent.redirect_count >= MAX_REDIRECTS) {\n\t\t\tnav_intent.deferred.resolve({ didNavigate: false });\n\t\t\tactive = null;\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\tconst target = new URL(redirect.href);\n\t\tactive = null;\n\n\t\t// Same-page redirect (same path, maybe different hash): no re-fetch,\n\t\t// just handle as same-page nav.\n\t\tif (route_snapshot_matches(target)) {\n\t\t\tconst result = handle_same_page_nav(target, nav_intent?.options ?? {});\n\t\t\tif (nav_intent) {\n\t\t\t\tnav_intent.deferred.resolve(result);\n\t\t\t}\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\t// Continue nav chain at redirect target.\n\t\tif (nav_intent) {\n\t\t\tvoid start_nav_inner(\n\t\t\t\ttarget,\n\t\t\t\tnav_intent.options,\n\t\t\t\tnav_intent.redirect_count + 1,\n\t\t\t\t{\n\t\t\t\t\treuse_deferred: nav_intent.deferred,\n\t\t\t\t\tsource: \"redirect\",\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn \"transferred\";\n\t\t} else {\n\t\t\t// Revalidation redirect becomes a replace navigation.\n\t\t\tvoid start_nav_inner(target, { replace: true }, 0, {\n\t\t\t\tsource: \"redirect\",\n\t\t\t});\n\t\t\treturn \"settled\";\n\t\t}\n\t}\n\n\t/////// Navigation Entry\n\n\tfunction try_merge_active_nav(\n\t\turl: URL,\n\t\toptions: NavOptions,\n\t\tsource: NavigationSource,\n\t\tdeferred: Deferred<NavResult>,\n\t): boolean {\n\t\tif (\n\t\t\t!active ||\n\t\t\tactive.intent.kind !== \"nav\" ||\n\t\t\t!matches_without_hash(active.url, url)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Identical intent: share the result promise.\n\t\tconst cur = active.intent;\n\t\tif (\n\t\t\tcur.url.href === url.href &&\n\t\t\tcur.options.replace === options.replace &&\n\t\t\tcur.options.scroll_to_top === options.scroll_to_top &&\n\t\t\tcur.options.state === options.state &&\n\t\t\tcur.options.is_popstate === options.is_popstate &&\n\t\t\tcur.options.popstate_scroll === options.popstate_scroll &&\n\t\t\tcur.options.skip_work_indicator === options.skip_work_indicator &&\n\t\t\tcur.source === source\n\t\t) {\n\t\t\tcur.deferred.promise.then(deferred.resolve, () =>\n\t\t\t\tdeferred.resolve({ didNavigate: false }),\n\t\t\t);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Same path, different hash or options: swap the request.\n\t\tcur.deferred.resolve({ didNavigate: false });\n\t\tactive.intent = {\n\t\t\tkind: \"nav\",\n\t\t\turl,\n\t\t\toptions,\n\t\t\tsource,\n\t\t\tredirect_count: cur.redirect_count,\n\t\t\tdeferred,\n\t\t};\n\t\tnotify_work_update();\n\t\treturn true;\n\t}\n\n\tfunction cancel_prefetch(): void {\n\t\tif (prefetch) {\n\t\t\tconst p = prefetch;\n\t\t\tprefetch = null;\n\t\t\tp.ac.abort();\n\t\t\tnotify_work_update();\n\t\t}\n\t}\n\n\tfunction handle_same_page_nav(url: URL, options: NavOptions): NavResult {\n\t\tif (!route_snapshot) {\n\t\t\treturn { didNavigate: false };\n\t\t}\n\t\tconst cur_url = new URL(route_snapshot.position.href);\n\t\tconst target_hash = normalize_hash(url.hash);\n\t\tconst current_hash = normalize_hash(cur_url.hash);\n\n\t\tif (target_hash !== current_hash) {\n\t\t\tsave_current_scroll();\n\t\t\tconst position = commit_history(url.href, options.replace, options.state);\n\t\t\tconst prev = route_snapshot;\n\t\t\troute_snapshot = { position, route: route_snapshot.route };\n\t\t\tcommit_route_snapshot(\"navigation\", prev, route_snapshot);\n\t\t\tapply_scroll(\n\t\t\t\ttarget_hash.length > 0 ? { hash: url.hash } : { x: 0, y: 0 },\n\t\t\t\ttest_options,\n\t\t\t);\n\t\t\treturn { didNavigate: true };\n\t\t}\n\n\t\tif (options.replace) {\n\t\t\tconst position = commit_history(url.href, true, options.state);\n\t\t\tconst prev = route_snapshot;\n\t\t\troute_snapshot = { position, route: route_snapshot.route };\n\t\t\tcommit_route_snapshot(\"navigation\", prev, route_snapshot);\n\t\t}\n\t\tapply_scroll({ x: 0, y: 0 }, test_options);\n\t\treturn { didNavigate: false };\n\t}\n\n\tfunction start_nav_inner(\n\t\turl: URL,\n\t\toptions: NavOptions,\n\t\tredirect_count: number,\n\t\treuse?: {\n\t\t\treuse_deferred?: Deferred<NavResult>;\n\t\t\tsource?: NavigationSource;\n\t\t},\n\t): Promise<NavResult> {\n\t\tconst deferred = reuse?.reuse_deferred ?? make_deferred<NavResult>();\n\t\tconst source = reuse?.source ?? (options.is_popstate ? \"popstate\" : \"navigate\");\n\n\t\t// Same-page short-circuit (not for popstate, which always owns the commit).\n\t\tif (!options.is_popstate && route_snapshot_matches(url)) {\n\t\t\tconst result = handle_same_page_nav(url, options);\n\t\t\tdeferred.resolve(result);\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\t// Merge into active nav if URLs match by path.\n\t\tif (try_merge_active_nav(url, options, source, deferred)) {\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\t// Supersede any other active work.\n\t\tif (active) {\n\t\t\tconst prev = active;\n\t\t\tactive = null;\n\t\t\tresolve_nav(prev, { didNavigate: false });\n\t\t\tprev.ac.abort();\n\t\t}\n\n\t\t// Promote matching prefetch if present.\n\t\tlet promoted: PrefetchFetch | null = null;\n\t\tif (prefetch && matches_without_hash(prefetch.url, url)) {\n\t\t\tpromoted = prefetch;\n\t\t\tprefetch = null;\n\t\t}\n\t\tconst fetch_record: ActiveFetch = promoted\n\t\t\t? {\n\t\t\t\t\t...promoted,\n\t\t\t\t\tintent: {\n\t\t\t\t\t\tkind: \"nav\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tredirect_count,\n\t\t\t\t\t\tdeferred,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: (cancel_prefetch(),\n\t\t\t\tstart_fetch(\n\t\t\t\t\turl,\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"nav\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tredirect_count,\n\t\t\t\t\t\tdeferred,\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t));\n\n\t\tvoid run_active(fetch_record);\n\t\treturn deferred.promise;\n\t}\n\n\t/////// Refresh\n\n\tfunction mark_fresh(f: ActiveFetch): void {\n\t\tconst demand = refresh_demand();\n\t\tif (!demand) {\n\t\t\treturn;\n\t\t}\n\t\tif (f.seq <= demand.after_seq) {\n\t\t\treturn;\n\t\t}\n\t\tconst waiters = demand.waiters;\n\t\tclear_refresh();\n\t\tfor (const w of waiters) {\n\t\t\tw.resolve(REVALIDATION_OK);\n\t\t}\n\t}\n\n\tfunction mark_refresh_build_skew(): void {\n\t\tconst demand = refresh_demand();\n\t\tif (!demand) {\n\t\t\treturn;\n\t\t}\n\t\tconst waiters = demand.waiters;\n\t\tclear_refresh();\n\t\tfor (const w of waiters) {\n\t\t\tw.resolve(REVALIDATION_BUILD_SKEW);\n\t\t}\n\t}\n\n\tfunction refresh_demand(): RefreshDemand | null {\n\t\tif (refresh.kind === \"idle\") {\n\t\t\treturn null;\n\t\t}\n\t\treturn refresh.demand;\n\t}\n\n\tfunction clear_refresh(): void {\n\t\tif (refresh.kind === \"debouncing\" || refresh.kind === \"retrying\") {\n\t\t\tclearTimeout(refresh.timer);\n\t\t}\n\t\trefresh = { kind: \"idle\" };\n\t}\n\n\tfunction require_refresh(\n\t\treason: RevalidationReason,\n\t\twaiter?: RefreshWaiter,\n\t\tdebounce?: boolean,\n\t\tskip_work_indicator?: boolean,\n\t): void {\n\t\tconst previous_demand = refresh_demand();\n\t\tconst waiters = previous_demand?.waiters ?? [];\n\t\tclear_refresh();\n\t\tif (waiter) {\n\t\t\twaiters.push(waiter);\n\t\t}\n\t\tconst demand: RefreshDemand = {\n\t\t\tafter_seq: next_seq(),\n\t\t\treason,\n\t\t\tskip_work_indicator:\n\t\t\t\t(previous_demand?.skip_work_indicator ?? true) &&\n\t\t\t\tskip_work_indicator === true,\n\t\t\twaiters,\n\t\t};\n\n\t\tif (debounce) {\n\t\t\tlet next_refresh!: Extract<RefreshState, { kind: \"debouncing\" }>;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tif (refresh !== next_refresh) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trefresh = { kind: \"pending\", demand, attempt: 0 };\n\t\t\t\tmaybe_revalidate();\n\t\t\t}, REVALIDATION_DEBOUNCE_MS);\n\t\t\tnext_refresh = { kind: \"debouncing\", demand, timer };\n\t\t\trefresh = next_refresh;\n\t\t} else {\n\t\t\trefresh = { kind: \"pending\", demand, attempt: 0 };\n\t\t}\n\t}\n\n\tfunction active_will_refresh(): boolean {\n\t\tconst demand = refresh_demand();\n\t\treturn active !== null && demand !== null && active.seq > demand.after_seq;\n\t}\n\n\tfunction maybe_revalidate(): void {\n\t\tif (phase !== \"ready\") {\n\t\t\treturn;\n\t\t}\n\t\tif (refresh.kind === \"idle\") {\n\t\t\treturn;\n\t\t}\n\t\tif (refresh.kind === \"debouncing\") {\n\t\t\treturn;\n\t\t}\n\t\tif (active_will_refresh() || active) {\n\t\t\treturn;\n\t\t}\n\t\tif (refresh.kind === \"retrying\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst demand = refresh.demand;\n\t\tconst attempt = refresh.attempt;\n\t\tif (attempt >= MAX_REVALIDATION_RETRIES) {\n\t\t\tclear_refresh();\n\t\t\tfor (const w of demand.waiters) {\n\t\t\t\tw.resolve(REVALIDATION_EXHAUSTED);\n\t\t\t}\n\t\t\tnotify_work_update();\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay =\n\t\t\tattempt === 0\n\t\t\t\t? 0\n\t\t\t\t: Math.min(\n\t\t\t\t\t\tREVALIDATION_BACKOFF_BASE_MS * Math.pow(2, attempt - 1),\n\t\t\t\t\t\tREVALIDATION_BACKOFF_CAP_MS,\n\t\t\t\t\t);\n\n\t\tif (delay === 0) {\n\t\t\trefresh = { kind: \"pending\", demand, attempt: attempt + 1 };\n\t\t\tvoid run_revalidation().catch(() => {});\n\t\t} else {\n\t\t\tconst retry_demand: RefreshDemand = {\n\t\t\t\t...demand,\n\t\t\t\treason: \"retry\",\n\t\t\t};\n\t\t\tlet next_refresh!: Extract<RefreshState, { kind: \"retrying\" }>;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tif (refresh !== next_refresh) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trefresh = {\n\t\t\t\t\tkind: \"pending\",\n\t\t\t\t\tdemand: retry_demand,\n\t\t\t\t\tattempt: attempt + 1,\n\t\t\t\t};\n\t\t\t\tif (active) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoid run_revalidation().catch(() => {});\n\t\t\t}, delay);\n\t\t\tnext_refresh = {\n\t\t\t\tkind: \"retrying\",\n\t\t\t\tdemand: retry_demand,\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\ttimer,\n\t\t\t};\n\t\t\trefresh = next_refresh;\n\t\t\tnotify_work_update();\n\t\t}\n\t}\n\n\tasync function run_revalidation(): Promise<void> {\n\t\tconst url = new URL(browser.href || window.location.href);\n\t\tconst attempt = refresh.kind === \"pending\" ? refresh.attempt : 0;\n\t\tconst reason = refresh.kind === \"pending\" ? refresh.demand.reason : \"manual\";\n\t\tconst skip_work_indicator =\n\t\t\trefresh.kind === \"pending\" ? refresh.demand.skip_work_indicator : undefined;\n\t\tconst f = start_fetch(\n\t\t\turl,\n\t\t\t{ kind: \"reval\", attempt, reason, skip_work_indicator },\n\t\t\ttrue,\n\t\t);\n\n\t\t// Guard: discard if URL path changes during flight (hash-only changes\n\t\t// are OK; matches_without_hash on publish time handles it).\n\t\tawait run_active_with_url_guard(f, url);\n\t}\n\n\tasync function run_active_with_url_guard(\n\t\tf: ActiveFetch,\n\t\texpected: URL,\n\t): Promise<void> {\n\t\tactive = f;\n\t\tnotify_work_update();\n\n\t\ttry {\n\t\t\tconst result = await f.data_promise;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!matches_without_hash(new URL(browser.href), expected)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.kind === \"build_skew\") {\n\t\t\t\treport_route_build_skew(f, result.response);\n\t\t\t\tmark_refresh_build_skew();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.response) {\n\t\t\t\tconst did_detect_skew = report_route_build_skew(f, result.response);\n\t\t\t\tif (did_detect_skew && result.kind === \"redirect\" && result.hard) {\n\t\t\t\t\tmark_refresh_build_skew();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (result.kind === \"error\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.kind === \"redirect\") {\n\t\t\t\thandle_redirect(f, result);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst payload = decode_payload(result.data, f.url);\n\t\t\tpreload_modules(payload.deps);\n\n\t\t\tawait f.cl_prefetches_ready;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prepared = await prepare_route(\n\t\t\t\tpayload,\n\t\t\t\tf.cl_prefetches,\n\t\t\t\t\"revalidation\",\n\t\t\t\tf.url.href,\n\t\t\t\thistory_state_for_fetch(f.intent),\n\t\t\t\tf.ac.signal,\n\t\t\t);\n\t\t\tif (!prepared || !can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!matches_without_hash(new URL(browser.href), expected)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst did_publish = await publish(f, prepared);\n\t\t\tif (did_publish) {\n\t\t\t\tlast_activity_ts = Date.now();\n\t\t\t\tmark_fresh(f);\n\t\t\t}\n\t\t} catch {\n\t\t\t// swallow\n\t\t} finally {\n\t\t\tif (active === f) {\n\t\t\t\tactive = null;\n\t\t\t}\n\t\t\tnotify_work_update();\n\t\t\tmaybe_revalidate();\n\t\t}\n\t}\n\n\t/////// Prefetch\n\n\tasync function prepare_prefetch(f: PrefetchFetch): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await f.data_promise;\n\t\t\tif (f.ac.signal.aborted) {\n\t\t\t\tif (prefetch === f) {\n\t\t\t\t\tprefetch = null;\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.response) {\n\t\t\t\treport_route_build_skew(f, result.response);\n\t\t\t}\n\t\t\tif (result.kind !== \"data\") {\n\t\t\t\tif (prefetch === f) {\n\t\t\t\t\tprefetch = null;\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst payload = decode_payload(result.data, f.url);\n\t\t\tpreload_modules(payload.deps);\n\t\t\tconst modules = await prepare_modules(payload, f.ac.signal);\n\t\t\tawait f.cl_prefetches_ready;\n\t\t\tif (!modules || f.ac.signal.aborted) {\n\t\t\t\tif (prefetch === f) {\n\t\t\t\t\tprefetch = null;\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst by_pattern = new Map<string, ClientLoaderPrefetch>();\n\t\t\tfor (const p of f.cl_prefetches) {\n\t\t\t\tby_pattern.set(p.pattern, p);\n\t\t\t}\n\t\t\tconst err_idx = payload.routes.findIndex((r) => {\n\t\t\t\treturn r.server_error !== undefined;\n\t\t\t});\n\t\t\tconst known_matches = routes_to_known_matches(payload.routes);\n\t\t\tconst next_cl_prefetches: ClientLoaderPrefetch[] = [];\n\t\t\tconst retained_prefetches = new Set<ClientLoaderPrefetch>();\n\t\t\tfor (let i = 0; i < payload.routes.length; i++) {\n\t\t\t\tconst route = payload.routes[i]!;\n\t\t\t\tconst existing = by_pattern.get(route.pattern);\n\t\t\t\tif (err_idx !== -1 && i >= err_idx) {\n\t\t\t\t\texisting?.abort();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (existing) {\n\t\t\t\t\texisting.resolve_server_state(build_server_state(payload.routes, i));\n\t\t\t\t\tnext_cl_prefetches.push(existing);\n\t\t\t\t\tretained_prefetches.add(existing);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst client_loader = client_loader_map[route.pattern];\n\t\t\t\tif (!client_loader) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst p = make_cl_prefetch({\n\t\t\t\t\thref: f.url.href,\n\t\t\t\t\thistory_state: undefined,\n\t\t\t\t\tknown_matches,\n\t\t\t\t\tclient_loader,\n\t\t\t\t\tparams: payload.params,\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\troute_input: route.input,\n\t\t\t\t\tsignal: f.ac.signal,\n\t\t\t\t\tsplat_values: payload.splat_values,\n\t\t\t\t\ttrigger: \"prefetch\",\n\t\t\t\t});\n\t\t\t\tp.resolve_server_state(build_server_state(payload.routes, i));\n\t\t\t\tnext_cl_prefetches.push(p);\n\t\t\t\tretained_prefetches.add(p);\n\t\t\t}\n\t\t\tfor (const p of f.cl_prefetches) {\n\t\t\t\tif (!retained_prefetches.has(p)) {\n\t\t\t\t\tp.abort();\n\t\t\t\t}\n\t\t\t}\n\t\t\tf.cl_prefetches = next_cl_prefetches;\n\t\t} catch {\n\t\t\tif (prefetch === f) {\n\t\t\t\tprefetch = null;\n\t\t\t\tnotify_work_update();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (f.is_pending) {\n\t\t\t\tf.is_pending = false;\n\t\t\t\tnotify_work_update();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction start_prefetch(href: string): void {\n\t\tif (phase !== \"ready\") {\n\t\t\treturn;\n\t\t}\n\t\tconst url = new URL(href, window.location.href);\n\t\tif (!is_same_origin(url) || route_snapshot_matches(url)) {\n\t\t\treturn;\n\t\t}\n\t\tif (active?.intent.kind === \"nav\" && matches_without_hash(active.url, url)) {\n\t\t\treturn;\n\t\t}\n\t\tif (prefetch && matches_without_hash(prefetch.url, url)) {\n\t\t\treturn;\n\t\t}\n\t\tcancel_prefetch();\n\n\t\t// Prefetch's prepare_ready resolves when modules + CL seeding are done.\n\t\tlet resolve_prepare!: () => void;\n\t\tconst prepare_ready = new Promise<void>((r) => {\n\t\t\tresolve_prepare = r;\n\t\t});\n\n\t\tconst f: PrefetchFetch = {\n\t\t\t...start_fetch(url, { kind: \"prefetch\" }, false, prepare_ready),\n\t\t\tis_pending: true,\n\t\t};\n\t\tprefetch = f;\n\t\tnotify_work_update();\n\t\tvoid prepare_prefetch(f).finally(() => resolve_prepare());\n\t}\n\n\tfunction stop_prefetch(href: string): void {\n\t\tconst url = new URL(href, window.location.href);\n\t\tif (prefetch && matches_without_hash(prefetch.url, url)) {\n\t\t\tcancel_prefetch();\n\t\t}\n\t}\n\n\t/////// Submit\n\n\tfunction schedule_submission_revalidation(\n\t\tsub: Submission,\n\t\tstart = true,\n\t): Promise<RevalidationResult> {\n\t\tif (!sub.should_revalidate) {\n\t\t\treturn Promise.resolve(REVALIDATION_OK);\n\t\t}\n\t\tif (phase === \"ready\") {\n\t\t\tconst waiter = make_deferred<RevalidationResult>();\n\t\t\trequire_refresh(\"apiRequest\", waiter, undefined, sub.skip_work_indicator);\n\t\t\tif (start) {\n\t\t\t\tmaybe_revalidate();\n\t\t\t}\n\t\t\treturn waiter.promise;\n\t\t}\n\t\trequire_refresh(\"apiRequest\", undefined, undefined, sub.skip_work_indicator);\n\t\treturn Promise.resolve(REVALIDATION_OK);\n\t}\n\n\tfunction settle_submission(\n\t\tsub: Submission,\n\t\tresult: ApiResult<unknown>,\n\t\tnotify = true,\n\t): void {\n\t\tif (sub.settled) {\n\t\t\treturn;\n\t\t}\n\t\tsub.settled = true;\n\t\tif (submissions.get(sub.key)?.ac === sub.ac) {\n\t\t\tsubmissions.delete(sub.key);\n\t\t}\n\t\tsub.deferred.resolve(result);\n\t\tif (notify) {\n\t\t\tnotify_work_update();\n\t\t}\n\t}\n\n\tfunction replace_submission(sub: Submission): boolean {\n\t\tsub.ac.abort();\n\t\tlet scheduled_revalidation = false;\n\t\tif (sub.did_dispatch) {\n\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub, false);\n\t\t\tscheduled_revalidation = sub.should_revalidate;\n\t\t}\n\t\tsettle_submission(\n\t\t\tsub,\n\t\t\t{\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Aborted\",\n\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\t\treturn scheduled_revalidation;\n\t}\n\n\tfunction submit_inner<T = unknown>(\n\t\turl: string | URL,\n\t\trequest_init?: RequestInit,\n\t\toptions?: {\n\t\t\tresourceKind?: ResourceKind;\n\t\t\tdedupeKey?: string;\n\t\t\trevalidate?: boolean;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t): Promise<ApiResult<T>> {\n\t\tif (!route_snapshot) {\n\t\t\treturn Promise.reject(new Error(\"Vorma not booted\"));\n\t\t}\n\t\tconst resolved = new URL(String(url), window.location.href);\n\n\t\tif (!is_same_origin(resolved)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `submit only supports same-origin targets. Received: \"${resolved.href}\".`,\n\t\t\t\trevalidationPromise: Promise.resolve(REVALIDATION_OK),\n\t\t\t});\n\t\t}\n\n\t\tconst method = request_init?.method\n\t\t\t? request_init.method.toUpperCase().trim()\n\t\t\t: \"GET\";\n\t\tconst resource_kind =\n\t\t\toptions?.resourceKind ??\n\t\t\t(method === \"GET\" || method === \"HEAD\" ? \"query\" : \"mutation\");\n\t\tlet should_revalidate = resource_kind === \"mutation\";\n\t\tif (options?.revalidate !== undefined) {\n\t\t\tshould_revalidate = options.revalidate;\n\t\t}\n\n\t\tlet dedupe_key = options?.dedupeKey;\n\t\tlet start_replaced_revalidation = false;\n\t\tif (dedupe_key) {\n\t\t\tconst previous = submissions.get(dedupe_key);\n\t\t\tif (previous) {\n\t\t\t\tstart_replaced_revalidation = replace_submission(previous);\n\t\t\t}\n\t\t} else {\n\t\t\tdedupe_key = crypto.randomUUID();\n\t\t}\n\n\t\tconst ac = new AbortController();\n\t\tconst deferred = make_deferred<ApiResult<unknown>>();\n\t\tconst sub: Submission = {\n\t\t\tac,\n\t\t\tdeferred,\n\t\t\tdid_dispatch: false,\n\t\t\tkey: dedupe_key,\n\t\t\tmethod,\n\t\t\thref: resolved.href,\n\t\t\trevalidation_promise: Promise.resolve(REVALIDATION_OK),\n\t\t\tsettled: false,\n\t\t\tshould_revalidate,\n\t\t\tskip_work_indicator: options?.skipWorkIndicator,\n\t\t};\n\t\tsubmissions.set(dedupe_key, sub);\n\t\tnotify_work_update();\n\n\t\tvoid run_submission(sub, resolved, request_init, resource_kind);\n\t\tif (start_replaced_revalidation) {\n\t\t\tmaybe_revalidate();\n\t\t}\n\t\treturn deferred.promise as Promise<ApiResult<T>>;\n\t}\n\n\tasync function run_submission<T = unknown>(\n\t\tsub: Submission,\n\t\tresolved: URL,\n\t\trequest_init: RequestInit | undefined,\n\t\tresource_kind: ResourceKind,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst is_get = sub.method === \"GET\" || sub.method === \"HEAD\";\n\n\t\t\tconst headers = new Headers();\n\t\t\tif (deployment_id) {\n\t\t\t\theaders.set(VERCEL_X_DEPLOYMENT_ID, deployment_id);\n\t\t\t}\n\t\t\tnew Headers(request_init?.headers ?? undefined).forEach((v, k) => {\n\t\t\t\theaders.set(k, v);\n\t\t\t});\n\t\t\theaders.set(X_ACCEPTS_CLIENT_REDIRECT, \"1\");\n\n\t\t\tconst body = request_init?.body;\n\t\t\tconst should_json =\n\t\t\t\t!is_get &&\n\t\t\t\tbody &&\n\t\t\t\ttypeof body === \"object\" &&\n\t\t\t\t!(body instanceof ReadableStream) &&\n\t\t\t\t!(body instanceof FormData) &&\n\t\t\t\t!(body instanceof URLSearchParams) &&\n\t\t\t\t!(body instanceof Blob) &&\n\t\t\t\t!(body instanceof ArrayBuffer) &&\n\t\t\t\t!ArrayBuffer.isView(body);\n\n\t\t\tconst final_init: RequestInit = {\n\t\t\t\t...request_init,\n\t\t\t\tmethod: sub.method,\n\t\t\t\theaders,\n\t\t\t\tsignal: sub.ac.signal,\n\t\t\t};\n\t\t\tif (is_get) {\n\t\t\t\tdelete final_init.body;\n\t\t\t} else if (should_json) {\n\t\t\t\tfinal_init.body = JSON.stringify(body);\n\t\t\t\tif (!headers.has(\"Content-Type\")) {\n\t\t\t\t\theaders.set(\"Content-Type\", \"application/json\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsub.did_dispatch = true;\n\t\t\tconst res = await fetch(resolved, final_init);\n\t\t\tif (sub.settled || sub.ac.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst redirect = detect_redirect(res, resolved);\n\t\t\treport_build_skew({\n\t\t\t\tresponse: res,\n\t\t\t\ttriggeringResponse: {\n\t\t\t\t\tkind: \"resource\",\n\t\t\t\t\tresourceKind: resource_kind,\n\t\t\t\t\trequestedHref: resolved.href,\n\t\t\t\t\tmethod: sub.method,\n\t\t\t\t\tstatus: res.status,\n\t\t\t\t\tok: res.ok,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (redirect) {\n\t\t\t\tif (!is_http(redirect.href)) {\n\t\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: `Redirect target must use an HTTP(S) scheme. Received: \"${redirect.href}\".`,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (redirect.hard || !is_same_origin_href(redirect.href)) {\n\t\t\t\t\thard_redirect(redirect.href);\n\t\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tdata: undefined as T,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (phase !== \"ready\") {\n\t\t\t\t\tdeferred_submit_redirect = new URL(redirect.href);\n\t\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tdata: undefined as T,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoid start_nav_inner(new URL(redirect.href), { replace: true }, 0, {\n\t\t\t\t\tsource: \"redirect\",\n\t\t\t\t});\n\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: undefined as T,\n\t\t\t\t\tresponse: res,\n\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!res.ok) {\n\t\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: res.statusText,\n\t\t\t\t\tresponse: res,\n\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet data: unknown;\n\t\t\tif (res.status !== 204) {\n\t\t\t\tconst ct = res.headers.get(\"Content-Type\");\n\t\t\t\tif (ct?.toLowerCase().includes(\"json\")) {\n\t\t\t\t\tdata = await res.json();\n\t\t\t\t} else {\n\t\t\t\t\tconst t = await res.text();\n\t\t\t\t\tdata = t.length > 0 ? t : undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\tsettle_submission(sub, {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: data as T,\n\t\t\t\tresponse: res,\n\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (sub.settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (is_abort_error(e)) {\n\t\t\t\tif (sub.did_dispatch) {\n\t\t\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\t\t}\n\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"Aborted\",\n\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sub.did_dispatch) {\n\t\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\t}\n\t\t\tsettle_submission(sub, {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: String(e instanceof Error ? e.message : e),\n\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t});\n\t\t}\n\t}\n\n\t/////// Popstate\n\n\tasync function handle_popstate(): Promise<void> {\n\t\tconst prev = browser;\n\t\tconst next = read_browser_position();\n\t\tif (next.key === prev.key && next.href === prev.href) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prev.key && prev.key !== next.key) {\n\t\t\tsave_scroll_for_key(prev.key, get_scroll_pos());\n\t\t}\n\t\tbrowser = next;\n\n\t\tconst prev_url = new URL(prev.href);\n\t\tconst next_url = new URL(next.href);\n\n\t\t// Hash-only popstate on same path: scroll, no fetch.\n\t\tif (matches_without_hash(prev_url, next_url)) {\n\t\t\tif (route_snapshot) {\n\t\t\t\tconst prev_snapshot = route_snapshot;\n\t\t\t\troute_snapshot = {\n\t\t\t\t\tposition: browser,\n\t\t\t\t\troute: route_snapshot.route,\n\t\t\t\t};\n\t\t\t\tcommit_route_snapshot(\"popstate\", prev_snapshot, route_snapshot);\n\t\t\t}\n\t\t\tconst hash = normalize_hash(next_url.hash);\n\t\t\tapply_scroll(\n\t\t\t\thash.length > 0\n\t\t\t\t\t? { hash: next_url.hash }\n\t\t\t\t\t: (get_scroll_for_key(next.key) ?? { x: 0, y: 0 }),\n\t\t\t\ttest_options,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst restored_scroll = get_scroll_for_key(next.key);\n\n\t\ttry {\n\t\t\tconst result = await start_nav_inner(\n\t\t\t\tnext_url,\n\t\t\t\t{ is_popstate: true, popstate_scroll: restored_scroll },\n\t\t\t\t0,\n\t\t\t);\n\t\t\tif (!result.didNavigate && !active && !route_snapshot_matches_browser()) {\n\t\t\t\treload_page();\n\t\t\t}\n\t\t} catch {\n\t\t\tif (!active && !route_snapshot_matches_browser()) {\n\t\t\t\treload_page();\n\t\t\t}\n\t\t}\n\t}\n\n\t/////// Status\n\n\tfunction derive_work_projection(): WorkProjection[] {\n\t\tconst work: WorkProjection[] = [];\n\n\t\tconst active_fetch = active;\n\t\tif (active_fetch?.intent.kind === \"nav\") {\n\t\t\twork.push({\n\t\t\t\tkind: \"navigation\",\n\t\t\t\tskip_work_indicator: active_fetch.intent.options.skip_work_indicator,\n\t\t\t});\n\t\t}\n\n\t\tconst pending_revalidation =\n\t\t\trefresh.kind !== \"idle\" &&\n\t\t\t(refresh.kind === \"debouncing\" ||\n\t\t\t\trefresh.kind === \"retrying\" ||\n\t\t\t\t(!active_will_refresh() && !active));\n\t\tif (active_fetch?.intent.kind === \"reval\" || pending_revalidation) {\n\t\t\tconst revalidation_demand = refresh_demand();\n\t\t\twork.push({\n\t\t\t\tkind: \"revalidation\",\n\t\t\t\tskip_work_indicator:\n\t\t\t\t\tactive_fetch?.intent.kind === \"reval\"\n\t\t\t\t\t\t? active_fetch.intent.skip_work_indicator\n\t\t\t\t\t\t: revalidation_demand?.skip_work_indicator,\n\t\t\t});\n\t\t}\n\n\t\tfor (const s of submissions.values()) {\n\t\t\twork.push({\n\t\t\t\tkind: \"apiRequest\",\n\t\t\t\tskip_work_indicator: s.skip_work_indicator,\n\t\t\t});\n\t\t}\n\n\t\tif (prefetch?.is_pending) {\n\t\t\twork.push({\n\t\t\t\tkind: \"prefetch\",\n\t\t\t});\n\t\t}\n\n\t\treturn work;\n\t}\n\n\tfunction empty_work_state(): WorkState {\n\t\treturn {\n\t\t\tnavigation: null,\n\t\t\trevalidation: null,\n\t\t\tprefetch: null,\n\t\t\tapiRequests: [],\n\t\t};\n\t}\n\n\tfunction derive_work_state(): WorkState {\n\t\tconst active_fetch = active;\n\t\tlet revalidation: WorkState[\"revalidation\"] = null;\n\t\tif (active_fetch?.intent.kind === \"reval\") {\n\t\t\trevalidation = {\n\t\t\t\tstatus: \"running\",\n\t\t\t\tattempt: active_fetch.intent.attempt,\n\t\t\t};\n\t\t} else if (refresh.kind === \"debouncing\") {\n\t\t\trevalidation = { status: \"debouncing\", attempt: 0 };\n\t\t} else if (refresh.kind === \"retrying\") {\n\t\t\trevalidation = {\n\t\t\t\tstatus: \"retrying\",\n\t\t\t\tattempt: refresh.attempt,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tnavigation:\n\t\t\t\tactive_fetch?.intent.kind === \"nav\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\thref: active_fetch.intent.url.href,\n\t\t\t\t\t\t\treplace: active_fetch.intent.options.replace === true,\n\t\t\t\t\t\t\tsource: active_fetch.intent.source,\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\trevalidation,\n\t\t\tprefetch: prefetch?.is_pending ? { href: prefetch.url.href } : null,\n\t\t\tapiRequests: Array.from(submissions.values(), (s) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: s.key,\n\t\t\t\t\tmethod: s.method,\n\t\t\t\t\thref: s.href,\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t}\n\n\tfunction take_work_update(): WorkState | undefined {\n\t\tconst next = derive_work_state();\n\t\tif (jsonDeepEquals(last_work_state, next)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tlast_work_state = next;\n\t\treturn next;\n\t}\n\n\tfunction emit_client_commit(client_commit: ClientCommit): void {\n\t\tcommit(client_commit);\n\t\tif (client_commit.route_update && user_on_route_update) {\n\t\t\tuser_on_route_update(\n\t\t\t\tclient_commit.route_update.route,\n\t\t\t\tclient_commit.route_update.previous_route,\n\t\t\t\tclient_commit.route_update.reason,\n\t\t\t);\n\t\t}\n\t\tif (client_commit.work) {\n\t\t\tfor (const fn of work_update_listeners) {\n\t\t\t\tfn(client_commit.work);\n\t\t\t}\n\t\t\tuser_on_work_update?.(client_commit.work);\n\t\t}\n\t}\n\n\tfunction notify_work_update(): void {\n\t\tconst work = take_work_update();\n\t\tif (!work) {\n\t\t\tsync_work_indicator();\n\t\t\treturn;\n\t\t}\n\t\temit_client_commit({ work });\n\t}\n\n\t/////// HMR\n\n\tfunction register_hmr(): void {\n\t\tif (!import.meta.env.DEV || !import.meta.hot) {\n\t\t\treturn;\n\t\t}\n\t\twindow.__vorma_hmr_view_update = async (raw_url, mod) => {\n\t\t\tif (!route_snapshot) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst url = normalize_module_url(raw_url);\n\t\t\tmodule_cache.set(url, mod);\n\t\t\tconst idx = route_snapshot.route.matches.findIndex(\n\t\t\t\t(m) => normalize_module_url(m.module_url) === url,\n\t\t\t);\n\t\t\tif (idx === -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst match = route_snapshot.route.matches[idx]!;\n\t\t\tconst def = mod.default as ViewDefinition | undefined;\n\t\t\tif (def?.client_loader) {\n\t\t\t\tclient_loader_map[match.pattern] = def.client_loader;\n\t\t\t\tregister_route_pattern(match.pattern);\n\t\t\t} else {\n\t\t\t\tdelete client_loader_map[match.pattern];\n\t\t\t}\n\n\t\t\tlet client_loader_data = match.client_loader_data;\n\t\t\tif (hmr_rerun_patterns.has(match.pattern)) {\n\t\t\t\tconst client_loader = client_loader_map[match.pattern];\n\t\t\t\tif (client_loader) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst current_route = route_snapshot.route;\n\t\t\t\t\t\tconst routes = current_route.matches.map((m, i) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tpattern: m.pattern,\n\t\t\t\t\t\t\t\tinput: m.input,\n\t\t\t\t\t\t\t\tmodule_url: m.module_url,\n\t\t\t\t\t\t\t\tview_data: m.view_data,\n\t\t\t\t\t\t\t\tserver_error:\n\t\t\t\t\t\t\t\t\tcurrent_route.error?.source === \"server\" &&\n\t\t\t\t\t\t\t\t\tcurrent_route.error.idx === i\n\t\t\t\t\t\t\t\t\t\t? current_route.error.error\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t\tclient_loader_data = await client_loader({\n\t\t\t\t\t\t\ttrigger: \"revalidation\",\n\t\t\t\t\t\t\thref: route_snapshot.position.href,\n\t\t\t\t\t\t\thistoryState: route_snapshot.position.state,\n\t\t\t\t\t\t\tpattern: match.pattern,\n\t\t\t\t\t\t\tparams: route_snapshot.route.params,\n\t\t\t\t\t\t\tsplatValues: route_snapshot.route.splat_values,\n\t\t\t\t\t\t\tinput: match.input,\n\t\t\t\t\t\t\tknownMatches: routes_to_known_matches(routes),\n\t\t\t\t\t\t\tserverPromise: Promise.resolve(\n\t\t\t\t\t\t\t\tbuild_server_state(routes, idx),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tsignal: new AbortController().signal,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(\"Vorma: HMR client loader re-run failed\", err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!route_snapshot) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prev = route_snapshot;\n\t\t\tconst matches = route_snapshot.route.matches.map((m, i) =>\n\t\t\t\ti === idx ? { ...m, module: mod, client_loader_data } : m,\n\t\t\t);\n\t\t\troute_snapshot = {\n\t\t\t\tposition: route_snapshot.position,\n\t\t\t\troute: { ...route_snapshot.route, matches },\n\t\t\t};\n\t\t\tcommit_route_snapshot(\"hmr\", prev, route_snapshot);\n\t\t};\n\t}\n\n\t/////// Work Indicator\n\n\tfunction setup_work_indicator(options: WorkIndicatorOptions | undefined): void {\n\t\twork_indicator_options = options;\n\t\twork_indicator.configure(options);\n\t\tif (!work_indicator_sync_registered) {\n\t\t\twork_update_listeners.add(sync_work_indicator);\n\t\t\twork_indicator_sync_registered = true;\n\t\t}\n\t\tsync_work_indicator();\n\t}\n\n\tfunction sync_work_indicator(_work?: WorkState): void {\n\t\tconst options = work_indicator_options;\n\t\tif (!options) {\n\t\t\twork_indicator.set_vorma_active(false);\n\t\t\treturn;\n\t\t}\n\n\t\tlet active_for_vorma = false;\n\t\tfor (const work of derive_work_projection()) {\n\t\t\tif (\n\t\t\t\twork.kind === \"navigation\" &&\n\t\t\t\toptions.skipNavigations !== true &&\n\t\t\t\t!work.skip_work_indicator\n\t\t\t) {\n\t\t\t\tactive_for_vorma = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (\n\t\t\t\twork.kind === \"revalidation\" &&\n\t\t\t\toptions.skipRevalidations !== true &&\n\t\t\t\t!work.skip_work_indicator\n\t\t\t) {\n\t\t\t\tactive_for_vorma = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (\n\t\t\t\twork.kind === \"apiRequest\" &&\n\t\t\t\toptions.skipApiRequests !== true &&\n\t\t\t\t!work.skip_work_indicator\n\t\t\t) {\n\t\t\t\tactive_for_vorma = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\twork_indicator.set_vorma_active(active_for_vorma);\n\t}\n\n\t/////// Boot\n\n\tasync function boot(options: ClientOptions): Promise<Result<void>> {\n\t\tconst payload_el = document.getElementById(DATA_SCRIPT_ID);\n\t\tif (!payload_el) {\n\t\t\treturn R.err(`Missing element: #${DATA_SCRIPT_ID}`);\n\t\t}\n\t\tlet raw_payload: Record<string, any>;\n\t\ttry {\n\t\t\traw_payload = JSON.parse(payload_el.textContent ?? \"{}\");\n\t\t} catch (err) {\n\t\t\treturn R.err(`Failed to parse #${DATA_SCRIPT_ID}: ${to_error_string(err)}`);\n\t\t}\n\t\tif (raw_payload.client_build_id) {\n\t\t\tclient_build_id = raw_payload.client_build_id;\n\t\t}\n\t\tif (raw_payload.deployment_id) {\n\t\t\tdeployment_id = raw_payload.deployment_id;\n\t\t}\n\t\tconst payload = decode_payload(raw_payload, current_url());\n\n\t\tuser_on_route_update = options.onRouteUpdate;\n\t\tuser_on_work_update = options.onWorkUpdate;\n\t\tuser_on_build_skew_detected = options.onBuildSkewDetected;\n\t\tdefault_error_boundary = options.defaultErrorBoundary;\n\t\tuse_view_transitions = options.useViewTransitions ?? false;\n\n\t\tconst history_state = window.history.state;\n\t\tconst has_history_key =\n\t\t\thistory_state &&\n\t\t\ttypeof history_state === \"object\" &&\n\t\t\tHISTORY_KEY_FIELD in (history_state as Record<string, unknown>);\n\t\tif (!has_history_key) {\n\t\t\tconst base =\n\t\t\t\thistory_state && typeof history_state === \"object\" ? history_state : {};\n\t\t\twindow.history.replaceState(\n\t\t\t\t{\n\t\t\t\t\t...(base as object),\n\t\t\t\t\t[HISTORY_KEY_FIELD]: make_history_key(),\n\t\t\t\t},\n\t\t\t\t\"\",\n\t\t\t\tcurrent_url().href,\n\t\t\t);\n\t\t}\n\t\tbrowser = read_browser_position();\n\t\ttry {\n\t\t\twindow.history.scrollRestoration = \"manual\";\n\t\t} catch {}\n\n\t\tconst initial_ac = new AbortController();\n\t\tconst modules = await prepare_modules(payload, initial_ac.signal);\n\t\tif (!modules) {\n\t\t\treturn R.err(\"Initial navigation produced no state\");\n\t\t}\n\n\t\t// Install a provisional snapshot so router APIs (getRouteState, submit)\n\t\t// work during initial client-loader execution.\n\t\troute_snapshot = {\n\t\t\tposition: browser,\n\t\t\troute: build_route_record(payload, modules, []),\n\t\t};\n\n\t\tconst cl_results = await run_client_loaders(\n\t\t\tpayload.routes,\n\t\t\tpayload,\n\t\t\t[],\n\t\t\t\"boot\",\n\t\t\tbrowser.href,\n\t\t\tbrowser.state,\n\t\t\tinitial_ac.signal,\n\t\t);\n\t\tif (initial_ac.signal.aborted) {\n\t\t\treturn R.err(\"Initial navigation produced no state\");\n\t\t}\n\n\t\tawait wait_for_css(payload.css_bundles, initial_ac.signal);\n\t\tif (initial_ac.signal.aborted) {\n\t\t\treturn R.err(\"Initial navigation produced no state\");\n\t\t}\n\n\t\tconst route = build_route_record(payload, modules, cl_results);\n\t\troute_snapshot = { position: browser, route };\n\n\t\tapply_head_and_title(payload.title, payload.meta_head_els, payload.rest_head_els);\n\t\tapply_css_bundles(payload.css_bundles);\n\t\tpreload_modules(payload.deps);\n\n\t\tlet scroll_intent: ScrollIntent | undefined;\n\t\tconst make_scroll_intent = (scroll: ScrollState): ScrollIntent => {\n\t\t\treturn {\n\t\t\t\tscroll,\n\t\t\t\ttarget_entry_id: make_entry_id(\n\t\t\t\t\troute.matches.length - 1,\n\t\t\t\t\troute.matches[route.matches.length - 1]?.pattern ?? \"\",\n\t\t\t\t),\n\t\t\t};\n\t\t};\n\t\tlet refresh_scroll_raw: string | null;\n\t\ttry {\n\t\t\trefresh_scroll_raw = sessionStorage.getItem(SCROLL_STORAGE_RELOAD_KEY);\n\t\t} catch {\n\t\t\trefresh_scroll_raw = null;\n\t\t}\n\t\tif (refresh_scroll_raw) {\n\t\t\ttry {\n\t\t\t\tsessionStorage.removeItem(SCROLL_STORAGE_RELOAD_KEY);\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tconst s = JSON.parse(refresh_scroll_raw);\n\t\t\t\tif (\n\t\t\t\t\ttypeof s?.x === \"number\" &&\n\t\t\t\t\ttypeof s?.y === \"number\" &&\n\t\t\t\t\ttypeof s?.unix === \"number\" &&\n\t\t\t\t\ttypeof s?.href === \"string\" &&\n\t\t\t\t\tDate.now() - s.unix <= REFRESH_MAX_AGE_MS &&\n\t\t\t\t\tmatches_without_hash(new URL(s.href), current_url())\n\t\t\t\t) {\n\t\t\t\t\tscroll_intent = make_scroll_intent({ x: s.x, y: s.y });\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t\tif (!scroll_intent) {\n\t\t\tconst hash = normalize_hash(current_url().hash);\n\t\t\tif (hash.length > 0) {\n\t\t\t\tscroll_intent = make_scroll_intent({\n\t\t\t\t\thash: current_url().hash,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tcommit_route_snapshot(\"initial\", null, route_snapshot, scroll_intent);\n\n\t\tsetup_work_indicator(options.workIndicator);\n\t\tif (focus_revalidation_cleanup) {\n\t\t\tfocus_revalidation_cleanup();\n\t\t\tfocus_revalidation_cleanup = null;\n\t\t}\n\t\tif (options.revalidateOnWindowFocus) {\n\t\t\tconst focus_revalidation_options =\n\t\t\t\ttypeof options.revalidateOnWindowFocus === \"object\"\n\t\t\t\t\t? options.revalidateOnWindowFocus\n\t\t\t\t\t: null;\n\t\t\tconst stale_ms = focus_revalidation_options?.staleTimeMs ?? 5_000;\n\t\t\tconst skip_work_indicator =\n\t\t\t\tfocus_revalidation_options?.skipWorkIndicator === true;\n\t\t\tfocus_revalidation_cleanup = addOnWindowFocusListener(() => {\n\t\t\t\tconst work = derive_work_state();\n\t\t\t\tif (work.navigation || work.revalidation || work.apiRequests.length > 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (Date.now() - last_activity_ts >= stale_ms) {\n\t\t\t\t\trequire_refresh(\"windowFocus\", undefined, true, skip_work_indicator);\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (options.render) {\n\t\t\tawait options.render();\n\t\t}\n\n\t\twindow.addEventListener(\"popstate\", () => {\n\t\t\tvoid handle_popstate();\n\t\t});\n\t\twindow.addEventListener(\"beforeunload\", () => {\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem(\n\t\t\t\t\tSCROLL_STORAGE_RELOAD_KEY,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t...get_scroll_pos(),\n\t\t\t\t\t\tunix: Date.now(),\n\t\t\t\t\t\thref: current_url().href,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t});\n\t\tregister_hmr();\n\n\t\tphase = \"ready\";\n\t\tif (deferred_submit_redirect) {\n\t\t\tconst redirect = deferred_submit_redirect;\n\t\t\tdeferred_submit_redirect = null;\n\t\t\tvoid start_nav_inner(redirect, { replace: true }, 0, {\n\t\t\t\tsource: \"redirect\",\n\t\t\t});\n\t\t}\n\t\tmaybe_revalidate();\n\t\treturn R.ok(undefined);\n\t}\n\n\t/////// Public API\n\n\tasync function navigate(\n\t\thref: string | URL,\n\t\toptions?: {\n\t\t\treplace?: boolean;\n\t\t\tscrollToTop?: boolean;\n\t\t\tstate?: unknown;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t): Promise<NavResult> {\n\t\tif (phase !== \"ready\") {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\tconst url = new URL(String(href), window.location.href);\n\t\tif (!is_same_origin(url)) {\n\t\t\thard_redirect(url.href);\n\t\t\treturn { didNavigate: false };\n\t\t}\n\t\treturn start_nav_inner(\n\t\t\turl,\n\t\t\t{\n\t\t\t\treplace: options?.replace,\n\t\t\t\tscroll_to_top: options?.scrollToTop,\n\t\t\t\tstate: options?.state,\n\t\t\t\tskip_work_indicator: options?.skipWorkIndicator,\n\t\t\t},\n\t\t\t0,\n\t\t);\n\t}\n\n\tasync function revalidate(): Promise<RevalidationResult> {\n\t\tif (phase !== \"ready\") {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\tconst waiter = make_deferred<RevalidationResult>();\n\t\trequire_refresh(\"manual\", waiter, true);\n\t\tnotify_work_update();\n\t\treturn waiter.promise;\n\t}\n\n\tfunction get_route_state(): RouteState {\n\t\tconst snapshot = route_snapshot;\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\treturn route_snapshot_to_state(snapshot);\n\t}\n\n\tfunction get_work_state(): WorkState {\n\t\tif (!route_snapshot) {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\treturn derive_work_state();\n\t}\n\n\tfunction get_root_el(): HTMLElement {\n\t\tconst el = document.getElementById(VORMA_ROOT_EL_ID);\n\t\tif (el) {\n\t\t\treturn el;\n\t\t}\n\t\tconst fresh = document.createElement(\"div\");\n\t\tfresh.id = VORMA_ROOT_EL_ID;\n\t\tdocument.body.insertBefore(fresh, document.body.firstChild);\n\t\treturn fresh;\n\t}\n\n\tfunction define_view<T = any>(input: {\n\t\tpattern: string;\n\t\tcomponent: (props: any) => any;\n\t\terrorBoundary?: (props: { error: unknown }) => any;\n\t\tclientLoader?: (props: any) => Promise<T>;\n\t\tbeforeRouteCommit?: BeforeRouteCommitFn;\n\t\tbeforeRouteYield?: BeforeRouteYieldFn;\n\t\trunClientLoaderOnHmr?: boolean;\n\t}): ViewDefinition & { __phantom_client_loader_data?: T } {\n\t\tif (import.meta.env.DEV) {\n\t\t\tif (input.runClientLoaderOnHmr) {\n\t\t\t\thmr_rerun_patterns.add(input.pattern);\n\t\t\t} else {\n\t\t\t\thmr_rerun_patterns.delete(input.pattern);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tpattern: input.pattern,\n\t\t\tcomponent: input.component,\n\t\t\terror_boundary: input.errorBoundary,\n\t\t\tclient_loader: input.clientLoader,\n\t\t\tbefore_route_commit: input.beforeRouteCommit,\n\t\t\tbefore_route_yield: input.beforeRouteYield,\n\t\t};\n\t}\n\n\t(window as any)[Symbol.for(\"vorma-data-revalidate-fn\")] = revalidate;\n\n\treturn R.ok({\n\t\tboot,\n\t\tworkIndicator: work_indicator.indicator,\n\t\tnavigate,\n\t\trevalidate,\n\t\tsubmit_inner,\n\t\tgetRouteState: get_route_state,\n\t\tgetWorkState: get_work_state,\n\t\tgetClientBuildId: () => client_build_id,\n\t\tgetRootEl: get_root_el,\n\t\tdefineView: define_view,\n\t\tstart_prefetch,\n\t\tstop_prefetch,\n\t\tsave_current_scroll,\n\t\tget_default_error_boundary: () => default_error_boundary,\n\t});\n}\n\ndeclare global {\n\tinterface Window {\n\t\t__vorma_hmr_view_update?: (\n\t\t\traw_url: string,\n\t\t\tmod: Record<string, unknown>,\n\t\t) => Promise<void>;\n\t}\n}\n","import {\n\tLINK_ACTIVE_ANCESTOR_ATTR,\n\tLINK_ACTIVE_EXACT_ATTR,\n\tLINK_PENDING_ANCESTOR_ATTR,\n\tLINK_PENDING_EXACT_ATTR,\n} from \"./constants.ts\";\nimport type { WorkState } from \"./create_client_core.ts\";\nimport type { LinkPropsBase, RouteState } from \"./types.ts\";\n\nexport type LinkRouteState = {\n\thref: string;\n\tmatched_patterns: string[];\n};\n\nexport type LinkWorkState = {\n\tnavigation_href: string | null;\n};\n\nexport type LinkPropsResult = {\n\tis_external: boolean;\n\tanchor_props: Record<string, unknown>;\n\tonClick?: (e: unknown) => void;\n\tonPointerDown?: (e: unknown) => void;\n\tonPointerEnter?: (e: unknown) => void;\n\tonFocus?: (e: unknown) => void;\n\tonPointerLeave?: (e: unknown) => void;\n\tonBlur?: (e: unknown) => void;\n\tonTouchCancel?: (e: unknown) => void;\n};\n\nexport type LinkNavFns = {\n\tnavigate: (args: {\n\t\thref: string;\n\t\treplace?: boolean;\n\t\tscrollToTop?: boolean;\n\t\tskipWorkIndicator?: boolean;\n\t\tstate?: unknown;\n\t}) => Promise<{ didNavigate: boolean }>;\n\tstart_prefetch: (href: string) => void;\n\tstop_prefetch: (href: string) => void;\n\tsave_current_scroll: () => void;\n\tregister_link_pattern: (pattern: string) => void;\n\tget_link_state_version: () => number;\n\tsubscribe_link_state: (listener: () => void) => () => void;\n\tget_link_attribute_state: (\n\t\thref: string,\n\t\tmatch_rules: LinkPropsBase[\"attributeMatchRules\"],\n\t\troute_state: LinkRouteState | null,\n\t\twork_state: LinkWorkState,\n\t) => {\n\t\tactive_exact: boolean;\n\t\tactive_ancestor: boolean;\n\t\tpending_exact: boolean;\n\t\tpending_ancestor: boolean;\n\t};\n};\n\nexport const skip_work_indicator_link_prop = \"skipWorkIndicator\";\n\nconst VORMA_KEYS = new Set([\n\t\"attributeMatchRules\",\n\t\"pattern\",\n\t\"prefetch\",\n\t\"prefetchDelayMs\",\n\t\"replace\",\n\t\"scrollToTop\",\n\tskip_work_indicator_link_prop,\n\t\"state\",\n\t\"visitOnPointerDown\",\n]);\n\nconst COMPOSED_EVENT_KEYS = new Set([\n\t\"onClick\",\n\t\"onPointerDown\",\n\t\"onPointerEnter\",\n\t\"onFocus\",\n\t\"onPointerLeave\",\n\t\"onBlur\",\n\t\"onTouchCancel\",\n]);\n\nlet is_touch_active = false;\nlet input_modality_registered = false;\n\nfunction register_input_modality(): void {\n\tif (input_modality_registered) {\n\t\treturn;\n\t}\n\tinput_modality_registered = true;\n\n\twindow.addEventListener(\"touchstart\", () => {\n\t\tis_touch_active = true;\n\t});\n\n\tconst on_pointer = (e: PointerEvent): void => {\n\t\tconst pt = e.pointerType;\n\t\tif (pt === \"touch\") {\n\t\t\tis_touch_active = true;\n\t\t} else if (pt === \"mouse\" || pt === \"pen\") {\n\t\t\tis_touch_active = false;\n\t\t}\n\t};\n\n\twindow.addEventListener(\"pointerdown\", on_pointer);\n\twindow.addEventListener(\"pointermove\", on_pointer);\n}\n\nexport function select_link_route_state(route: RouteState): LinkRouteState {\n\treturn {\n\t\thref: route.href,\n\t\tmatched_patterns: route.matches.map((m) => {\n\t\t\treturn m.pattern;\n\t\t}),\n\t};\n}\n\nexport function select_link_work_state(work: WorkState): LinkWorkState {\n\treturn {\n\t\tnavigation_href: work.navigation?.href ?? null,\n\t};\n}\n\nfunction strip_keys(\n\tprops: Record<string, unknown>,\n\tkeys: Set<string>,\n): Record<string, unknown> {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(props)) {\n\t\tif (!keys.has(k)) {\n\t\t\tout[k] = v;\n\t\t}\n\t}\n\treturn out;\n}\n\nexport function make_link_props(\n\tprops: Record<string, unknown>,\n\tnav: LinkNavFns,\n\troute_state: LinkRouteState | null = null,\n\twork_state?: LinkWorkState,\n): LinkPropsResult {\n\tregister_input_modality();\n\n\tconst href = (props.href as string) ?? \"\";\n\tconst pattern = props.pattern as string | undefined;\n\tif (pattern) {\n\t\tnav.register_link_pattern(pattern);\n\t}\n\n\tconst details = get_href_details(href);\n\tconst is_external = details.is_http ? details.is_external : true;\n\tconst consumer_click = props.onClick as ((e: unknown) => void) | undefined;\n\n\tif (is_external) {\n\t\treturn {\n\t\t\tis_external: true,\n\t\t\tanchor_props: strip_keys(props, VORMA_KEYS),\n\t\t\tonClick: consumer_click,\n\t\t};\n\t}\n\n\tconst anchor_props = strip_keys(strip_keys(props, VORMA_KEYS), COMPOSED_EVENT_KEYS);\n\tconst attribute_match_rules =\n\t\tprops.attributeMatchRules as LinkPropsBase[\"attributeMatchRules\"];\n\tconst link_state =\n\t\tattribute_match_rules?.skip === true || !route_state || !work_state\n\t\t\t? null\n\t\t\t: nav.get_link_attribute_state(\n\t\t\t\t\thref,\n\t\t\t\t\tattribute_match_rules,\n\t\t\t\t\troute_state,\n\t\t\t\t\twork_state,\n\t\t\t\t);\n\tif (link_state?.active_exact) {\n\t\tanchor_props[LINK_ACTIVE_EXACT_ATTR] = \"\";\n\t}\n\tif (link_state?.active_ancestor) {\n\t\tanchor_props[LINK_ACTIVE_ANCESTOR_ATTR] = \"\";\n\t}\n\tif (link_state?.pending_exact) {\n\t\tanchor_props[LINK_PENDING_EXACT_ATTR] = \"\";\n\t}\n\tif (link_state?.pending_ancestor) {\n\t\tanchor_props[LINK_PENDING_ANCESTOR_ATTR] = \"\";\n\t}\n\tif (link_state?.active_exact && anchor_props[\"aria-current\"] === undefined) {\n\t\tanchor_props[\"aria-current\"] = \"page\";\n\t}\n\n\tconst prefetch_mode = props.prefetch as string | undefined;\n\tconst prefetch_delay = (props.prefetchDelayMs as number | undefined) ?? 100;\n\tconst replace = props.replace as boolean | undefined;\n\tconst scroll_to_top = props.scrollToTop as boolean | undefined;\n\tconst skip_work_indicator = props[skip_work_indicator_link_prop] as\n\t\t| boolean\n\t\t| undefined;\n\tconst state = props.state as unknown;\n\tconst target_attr = props.target as string | undefined;\n\tconst visit_on_pointer_down = props.visitOnPointerDown as boolean | undefined;\n\tconst consumer_pointer_down = props.onPointerDown as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\tconst consumer_pointer_enter = props.onPointerEnter as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\tconst consumer_focus = props.onFocus as ((e: unknown) => void) | undefined;\n\tconst consumer_pointer_leave = props.onPointerLeave as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\tconst consumer_blur = props.onBlur as ((e: unknown) => void) | undefined;\n\tconst consumer_touch_cancel = props.onTouchCancel as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\n\tlet prefetch_timer: number | undefined;\n\tconst wants_prefetch = prefetch_mode === \"intent\";\n\n\tconst start_pf = (): void => {\n\t\tif (prefetch_timer !== undefined) {\n\t\t\tclearTimeout(prefetch_timer);\n\t\t}\n\t\tprefetch_timer = window.setTimeout(() => {\n\t\t\tprefetch_timer = undefined;\n\t\t\tnav.start_prefetch(href);\n\t\t}, prefetch_delay);\n\t};\n\n\tconst stop_pf = (): void => {\n\t\tif (prefetch_timer !== undefined) {\n\t\t\tclearTimeout(prefetch_timer);\n\t\t\tprefetch_timer = undefined;\n\t\t}\n\t\tnav.stop_prefetch(href);\n\t};\n\n\treturn {\n\t\tis_external: false,\n\t\tanchor_props,\n\n\t\tonClick: async (e: unknown) => {\n\t\t\tconst ev = e as any;\n\t\t\tconsumer_click?.(e);\n\n\t\t\tif (ev.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (get_is_modified_navigation_click(ev)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!get_is_primary_navigation_click(ev)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target_attr && target_attr !== \"\" && target_attr !== \"_self\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tev.preventDefault?.();\n\n\t\t\ttry {\n\t\t\t\tawait nav.navigate({\n\t\t\t\t\thref,\n\t\t\t\t\treplace,\n\t\t\t\t\tscrollToTop: scroll_to_top,\n\t\t\t\t\t...(skip_work_indicator === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { skipWorkIndicator: skip_work_indicator }),\n\t\t\t\t\tstate,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"Vorma: Link click failed\", err);\n\t\t\t}\n\t\t},\n\n\t\tonPointerDown:\n\t\t\tvisit_on_pointer_down || consumer_pointer_down\n\t\t\t\t? async (e: unknown) => {\n\t\t\t\t\t\tconst ev = e as any;\n\t\t\t\t\t\tconsumer_pointer_down?.(e);\n\t\t\t\t\t\tif (!visit_on_pointer_down) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ev.defaultPrevented) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst pt = ev.pointerType;\n\t\t\t\t\t\tif (pt !== \"mouse\" && pt !== \"pen\") {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (get_is_modified_navigation_click(ev)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!get_is_primary_navigation_click(ev)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttarget_attr &&\n\t\t\t\t\t\t\ttarget_attr !== \"\" &&\n\t\t\t\t\t\t\ttarget_attr !== \"_self\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tev.preventDefault?.();\n\n\t\t\t\t\t\tconst el = ev.currentTarget as HTMLElement;\n\t\t\t\t\t\tel.addEventListener(\n\t\t\t\t\t\t\t\"click\",\n\t\t\t\t\t\t\t(ce: Event) => {\n\t\t\t\t\t\t\t\tce.preventDefault();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ once: true },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait nav.navigate({\n\t\t\t\t\t\t\t\thref,\n\t\t\t\t\t\t\t\treplace,\n\t\t\t\t\t\t\t\tscrollToTop: scroll_to_top,\n\t\t\t\t\t\t\t\t...(skip_work_indicator === undefined\n\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\tskipWorkIndicator: skip_work_indicator,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\"Vorma: Link pointerdown navigation failed\",\n\t\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonPointerEnter:\n\t\t\twants_prefetch || consumer_pointer_enter\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstart_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_pointer_enter?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonFocus:\n\t\t\twants_prefetch || consumer_focus\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstart_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_focus?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonPointerLeave:\n\t\t\twants_prefetch || consumer_pointer_leave\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch && !is_touch_active) {\n\t\t\t\t\t\t\tstop_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_pointer_leave?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonBlur:\n\t\t\twants_prefetch || consumer_blur\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstop_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_blur?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonTouchCancel:\n\t\t\twants_prefetch || consumer_touch_cancel\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstop_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_touch_cancel?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction get_is_modified_navigation_click(event: {\n\tmetaKey?: boolean;\n\taltKey?: boolean;\n\tctrlKey?: boolean;\n\tshiftKey?: boolean;\n}): boolean {\n\treturn (\n\t\tBoolean(event.metaKey) ||\n\t\tBoolean(event.altKey) ||\n\t\tBoolean(event.ctrlKey) ||\n\t\tBoolean(event.shiftKey)\n\t);\n}\n\nfunction get_is_primary_navigation_click(event: { button?: number }): boolean {\n\treturn event.button === undefined || event.button === 0;\n}\n\ntype HrefDetails =\n\t| {\n\t\t\turl: URL;\n\t\t\tis_http: true;\n\t\t\tabsoluteUrl: string;\n\t\t\trelativeUrl: string;\n\t\t\tis_external: boolean;\n\t\t\tis_internal: boolean;\n\t }\n\t| {\n\t\t\tis_http: false;\n\t };\n\nexport function get_href_details(href: string): HrefDetails {\n\tif (!href) {\n\t\treturn { is_http: false };\n\t}\n\n\tlet url: URL;\n\n\ttry {\n\t\turl = new URL(href, window.location.href);\n\t} catch {\n\t\treturn { is_http: false };\n\t}\n\n\tconst is_external = url.origin !== window.location.origin;\n\tconst is_internal = !is_external;\n\n\t// Filter out things like \"#\", \"tel:\", \"mailto:\", or custom schemes.\n\tconst is_http = url.protocol === \"http:\" || url.protocol === \"https:\";\n\tif (!is_http) {\n\t\treturn { is_http: false };\n\t}\n\n\tif (is_external) {\n\t\treturn {\n\t\t\turl,\n\t\t\tis_http: true,\n\t\t\tabsoluteUrl: url.href,\n\t\t\trelativeUrl: \"\",\n\t\t\tis_external,\n\t\t\tis_internal,\n\t\t};\n\t}\n\n\treturn {\n\t\turl,\n\t\tis_http: true,\n\t\tabsoluteUrl: url.href,\n\t\trelativeUrl: url.href.replace(url.origin, \"\"),\n\t\tis_external,\n\t\tis_internal,\n\t};\n}\n","import type { RouteRenderEntry, ViewDefinition } from \"./create_client_core.ts\";\nimport type { RouteErrorState } from \"./types.ts\";\n\nexport type OutletSlot =\n\t| { kind: \"component\"; component: (props: any) => any }\n\t| {\n\t\t\tkind: \"error\";\n\t\t\terror: unknown;\n\t\t\tboundary: (props: { error: unknown }) => any;\n\t }\n\t| { kind: \"pass_through\" }\n\t| { kind: \"empty\" };\n\nconst component_refs = new Map<\n\tstring,\n\t{\n\t\timpl: (props: any) => any;\n\t\twrapper: (props: any) => any;\n\t\tholder: { current: (props: any) => any };\n\t}\n>();\n\nconst error_refs = new Map<\n\tstring,\n\t{\n\t\timpl: (props: { error: unknown }) => any;\n\t\twrapper: (props: { error: unknown }) => any;\n\t\tholder: { current: (props: { error: unknown }) => any };\n\t}\n>();\n\nfunction get_stable_component(\n\tkey: string,\n\timpl: (props: any) => any,\n): (props: any) => any {\n\tlet entry = component_refs.get(key);\n\tif (!entry) {\n\t\tconst holder = { current: impl };\n\t\tconst wrapper = (props: any) => {\n\t\t\treturn holder.current(props);\n\t\t};\n\t\tentry = { impl, wrapper, holder };\n\t\tcomponent_refs.set(key, entry);\n\t}\n\tentry.holder.current = impl;\n\treturn entry.wrapper;\n}\n\nfunction get_stable_error_boundary(\n\tkey: string,\n\timpl: (props: { error: unknown }) => any,\n): (props: { error: unknown }) => any {\n\tlet entry = error_refs.get(key);\n\tif (!entry) {\n\t\tconst holder = { current: impl };\n\t\tconst wrapper = (props: { error: unknown }) => {\n\t\t\treturn holder.current(props);\n\t\t};\n\t\tentry = { impl, wrapper, holder };\n\t\terror_refs.set(key, entry);\n\t}\n\tentry.holder.current = impl;\n\treturn entry.wrapper;\n}\n\nexport function resolve_outlet_slot(\n\tentries: RouteRenderEntry[],\n\terror: RouteErrorState | null,\n\tidx: number,\n\tdefault_error_boundary: ((props: { error: unknown }) => any) | undefined,\n): OutletSlot {\n\tif (idx >= entries.length) {\n\t\treturn { kind: \"empty\" };\n\t}\n\n\tif (error !== null && idx >= error.idx) {\n\t\tconst error_entry = entries[error.idx]!;\n\t\tconst def = error_entry.module.default as ViewDefinition | undefined;\n\t\tconst raw_boundary =\n\t\t\tdef?.error_boundary ?? default_error_boundary ?? fallback_error_boundary;\n\t\tconst boundary = get_stable_error_boundary(error_entry.pattern, raw_boundary);\n\t\treturn { kind: \"error\", error: error.error, boundary };\n\t}\n\n\tconst entry = entries[idx]!;\n\tconst def = entry.module.default as ViewDefinition | undefined;\n\n\tif (!def?.component) {\n\t\tif (idx + 1 < entries.length) {\n\t\t\treturn { kind: \"pass_through\" };\n\t\t}\n\t\treturn { kind: \"empty\" };\n\t}\n\n\tconst component = get_stable_component(entry.pattern, def.component);\n\treturn { kind: \"component\", component };\n}\n\nexport function get_entry_key(entry: RouteRenderEntry): string {\n\treturn `${entry.pattern}::${entry.module_url}`;\n}\n\nfunction fallback_error_boundary(props: { error: unknown }): string {\n\tif (props.error instanceof Error) {\n\t\treturn `Error: ${props.error.message}`;\n\t}\n\tif (typeof props.error === \"string\") {\n\t\treturn `Error: ${props.error}`;\n\t}\n\treturn \"An unexpected error occurred.\";\n}\n","import type { ReadonlySignal } from \"@preact/signals\";\nimport { jsonDeepEquals } from \"vorma/kit/json\";\nimport { R, type Result } from \"vorma/kit/result\";\nimport { create_typed_api_client } from \"./api_client.ts\";\nimport { create_client_matcher, type ClientMatcher } from \"./client_wasm/matcher.ts\";\nimport type {\n\tClientCore,\n\tClientOptions as CoreClientOptions,\n\tViewDefinition,\n} from \"./create_client_core\";\nimport {\n\tcreate_client_core,\n\ttype ClientCommit,\n\ttype RouteRenderEntry,\n\ttype RouteRenderState,\n\ttype ScrollIntent,\n\ttype WorkState,\n} from \"./create_client_core.ts\";\nimport {\n\ttype LinkNavFns,\n\ttype LinkRouteState,\n\ttype LinkWorkState,\n} from \"./make_link_props.ts\";\nimport { get_entry_key } from \"./resolve_outlet_slot.ts\";\nimport type {\n\tAppConfig,\n\tLinkPropsBase,\n\tRouteErrorState,\n\tRouteState,\n\tRouteUpdateReason,\n\tToApiClient,\n\tToApiDecorator,\n\tToDefineViewArgs,\n\tToLinkProps,\n\tToNavigateArgs,\n\tToNavigationTarget,\n\tToRouteDestination,\n\tToRouteSyncArgs,\n\tToViewComponentProps,\n\tToViewOutput,\n\tToViewPattern,\n} from \"./types\";\nimport {\n\tcreate_typed_navigate,\n\tcreate_typed_prefetch,\n\tcreate_typed_to_href,\n} from \"./url.ts\";\n\ntype ClientMatcherFactory = () => Promise<ClientMatcher>;\n\nexport type DecomposedState = {\n\t// Always a new reference\n\tentries: RouteRenderEntry[];\n\terror: RouteErrorState | null;\n\n\t// Stable per channel\n\tviews_data: unknown[];\n\tclient_loaders_data: unknown[];\n\tmatched_patterns: string[];\n\timport_urls: string[];\n\tentry_keys: string[];\n\tparams: Record<string, string>;\n\tsplat_values: string[];\n\tclient_build_id: string;\n\thistory_state: unknown;\n};\n\nexport type DecomposedCommit = {\n\tlink_state_version?: number;\n\troute?: RouteState;\n\troute_reason?: RouteUpdateReason;\n\tscroll_intent?: ScrollIntent;\n\tstate?: DecomposedState;\n\twork?: WorkState;\n};\n\nexport type DecomposedCommitFn = (commit: DecomposedCommit) => void;\n\ntype LinkAttributeCandidate = {\n\turl: URL;\n\tmatched_patterns: string[];\n};\n\nlet client_matcher_factory_for_test: ClientMatcherFactory | null = null;\n\nexport function set_client_matcher_factory_for_test(\n\tfactory: ClientMatcherFactory | null,\n): () => void {\n\tconst prev_factory = client_matcher_factory_for_test;\n\tclient_matcher_factory_for_test = factory;\n\treturn () => {\n\t\tclient_matcher_factory_for_test = prev_factory;\n\t};\n}\n\n// __TODO why is this generic called \"App\"? Shouldn't it be \"Component\" or something?\nexport type AdapterRenderArgs<App> = {\n\tRootOutlet: App;\n\trootEl: HTMLElement;\n};\n\nexport type AdapterClientOptions<App> = Omit<CoreClientOptions, \"render\"> & {\n\trender?: (args: AdapterRenderArgs<App>) => void | Promise<void>;\n};\n\ntype AdapterBase<A extends AppConfig> = {\n\tcore: ClientCore;\n\n\tnav_fns: LinkNavFns;\n\n\tpassthrough: Pick<\n\t\tClientCore,\n\t\t\"revalidate\" | \"getRouteState\" | \"getWorkState\" | \"workIndicator\"\n\t> & {\n\t\tnavigate: <P extends ToViewPattern<A>>(\n\t\t\targs: ToNavigateArgs<A, P>,\n\t\t) => Promise<{ didNavigate: boolean }>;\n\n\t\tprefetch: <P extends ToViewPattern<A>>(target: ToNavigationTarget<A, P>) => void;\n\n\t\tcancelPrefetch: <P extends ToViewPattern<A>>(\n\t\t\ttarget: ToNavigationTarget<A, P>,\n\t\t) => void;\n\n\t\ttoHref: <P extends ToViewPattern<A>>(\n\t\t\tdestination: ToRouteDestination<A, P>,\n\t\t) => string;\n\n\t\tapiClient: ToApiClient<A>;\n\t};\n};\n\nexport function create_adapter_base<A extends AppConfig>(\n\tapp_config: A,\n\ton_commit: DecomposedCommitFn,\n\tapi_decorator?: ToApiDecorator<A>,\n): Result<AdapterBase<A>> {\n\tlet prev: DecomposedState = {\n\t\tentries: [],\n\t\terror: null,\n\t\tviews_data: [],\n\t\tclient_loaders_data: [],\n\t\tmatched_patterns: [],\n\t\timport_urls: [],\n\t\tentry_keys: [],\n\t\tparams: {},\n\t\tsplat_values: [],\n\t\tclient_build_id: \"\",\n\t\thistory_state: undefined,\n\t};\n\tlet link_matcher: ClientMatcher | null = null;\n\tlet link_matcher_loading = false;\n\tlet link_state_version = 0;\n\tconst link_state_listeners = new Set<() => void>();\n\tconst queued_link_patterns = new Set<string>();\n\n\tfunction decomposed_commit(client_commit: ClientCommit): void {\n\t\tconst adapter_commit: DecomposedCommit = {};\n\t\tconst route_render = client_commit.route_render;\n\t\tif (route_render) {\n\t\t\tadapter_commit.state = decompose_route_render_state(route_render.state);\n\t\t\tadapter_commit.scroll_intent = route_render.scroll_intent;\n\t\t}\n\t\tif (client_commit.route_update) {\n\t\t\tadapter_commit.route = client_commit.route_update.route;\n\t\t\tadapter_commit.route_reason = client_commit.route_update.reason;\n\t\t}\n\t\tif (client_commit.work) {\n\t\t\tadapter_commit.work = client_commit.work;\n\t\t}\n\t\ton_commit(adapter_commit);\n\t}\n\n\tfunction emit_link_state_update(): void {\n\t\tlink_state_version++;\n\t\ton_commit({ link_state_version });\n\t\tfor (const listener of link_state_listeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\tfunction start_link_matcher_load(): void {\n\t\tif (link_matcher || link_matcher_loading) {\n\t\t\treturn;\n\t\t}\n\t\tlink_matcher_loading = true;\n\t\tvoid (client_matcher_factory_for_test ?? create_client_matcher)()\n\t\t\t.then((matcher) => {\n\t\t\t\tlink_matcher = matcher;\n\t\t\t\tfor (const pattern of queued_link_patterns) {\n\t\t\t\t\tmatcher.register_pattern(pattern);\n\t\t\t\t}\n\t\t\t\temit_link_state_update();\n\t\t\t})\n\t\t\t.catch(() => {});\n\t}\n\n\tfunction decompose_route_render_state(\n\t\troute_state: RouteRenderState,\n\t): DecomposedState {\n\t\tfor (const entry of route_state.entries) {\n\t\t\tregister_link_pattern(entry.pattern);\n\t\t}\n\n\t\tconst next: DecomposedState = {\n\t\t\tentries: route_state.entries,\n\t\t\terror: route_state.error,\n\t\t\tviews_data: stable(\n\t\t\t\tprev.views_data,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.view_data;\n\t\t\t\t}),\n\t\t\t),\n\t\t\tclient_loaders_data: stable(\n\t\t\t\tprev.client_loaders_data,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.client_loader_data;\n\t\t\t\t}),\n\t\t\t),\n\t\t\tmatched_patterns: stable(\n\t\t\t\tprev.matched_patterns,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.pattern;\n\t\t\t\t}),\n\t\t\t),\n\t\t\timport_urls: stable(\n\t\t\t\tprev.import_urls,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.module_url;\n\t\t\t\t}),\n\t\t\t),\n\t\t\tentry_keys: stable(\n\t\t\t\tprev.entry_keys,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn get_entry_key(e);\n\t\t\t\t}),\n\t\t\t),\n\t\t\tparams: stable(prev.params, route_state.params),\n\t\t\tsplat_values: stable(prev.splat_values, route_state.splat_values),\n\t\t\tclient_build_id: stable(prev.client_build_id, route_state.client_build_id),\n\t\t\thistory_state: stable(prev.history_state, route_state.history_state),\n\t\t};\n\n\t\tprev = next;\n\t\treturn next;\n\t}\n\n\tconst core_res = create_client_core(app_config, decomposed_commit);\n\tif (!core_res.ok) {\n\t\treturn R.err(core_res.err);\n\t}\n\tconst core = core_res.val;\n\n\tconst nav_fns: LinkNavFns = {\n\t\tnavigate: (args) => {\n\t\t\treturn core.navigate(args.href, {\n\t\t\t\treplace: args.replace,\n\t\t\t\tscrollToTop: args.scrollToTop,\n\t\t\t\tskipWorkIndicator: args.skipWorkIndicator,\n\t\t\t\tstate: args.state,\n\t\t\t});\n\t\t},\n\t\tstart_prefetch: core.start_prefetch,\n\t\tstop_prefetch: core.stop_prefetch,\n\t\tsave_current_scroll: core.save_current_scroll,\n\t\tregister_link_pattern,\n\t\tget_link_attribute_state,\n\t\tget_link_state_version: () => {\n\t\t\treturn link_state_version;\n\t\t},\n\t\tsubscribe_link_state: (listener) => {\n\t\t\tlink_state_listeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlink_state_listeners.delete(listener);\n\t\t\t};\n\t\t},\n\t};\n\tstart_link_matcher_load();\n\n\tconst navigate = create_typed_navigate<A>(core.navigate);\n\tconst prefetch = create_typed_prefetch<A>(core.start_prefetch);\n\tconst cancel_prefetch = create_typed_prefetch<A>(core.stop_prefetch);\n\tconst to_href = create_typed_to_href<A>();\n\n\tconst api_client = create_typed_api_client<A>(\n\t\tapp_config.apiMountRoot,\n\t\tcore.submit_inner,\n\t\tapi_decorator,\n\t);\n\n\treturn R.ok({\n\t\tcore,\n\t\tnav_fns,\n\t\tpassthrough: {\n\t\t\tnavigate,\n\t\t\tprefetch,\n\t\t\tcancelPrefetch: cancel_prefetch,\n\t\t\ttoHref: to_href,\n\t\t\trevalidate: core.revalidate,\n\t\t\tgetRouteState: core.getRouteState,\n\t\t\tgetWorkState: core.getWorkState,\n\t\t\tworkIndicator: core.workIndicator,\n\t\t\tapiClient: api_client,\n\t\t},\n\t});\n\n\tfunction register_link_pattern(pattern: string): void {\n\t\tif (queued_link_patterns.has(pattern)) {\n\t\t\treturn;\n\t\t}\n\t\tqueued_link_patterns.add(pattern);\n\t\tlink_matcher?.register_pattern(pattern);\n\t}\n\n\tfunction href_to_link_candidate(href: string): LinkAttributeCandidate {\n\t\tconst url = new URL(href, window.location.href);\n\t\tconst match = link_matcher?.find_nested_matches(url.pathname);\n\t\treturn {\n\t\t\turl,\n\t\t\tmatched_patterns: match?.patterns ?? [],\n\t\t};\n\t}\n\n\tfunction exact_link_match(\n\t\ttarget: LinkAttributeCandidate,\n\t\tcandidate: LinkAttributeCandidate,\n\t\tmatch_rules: LinkPropsBase[\"attributeMatchRules\"],\n\t): boolean {\n\t\treturn (\n\t\t\ttarget.url.pathname === candidate.url.pathname &&\n\t\t\t(target.matched_patterns.length === 0 ||\n\t\t\t\tcandidate.matched_patterns.length === 0 ||\n\t\t\t\tjsonDeepEquals(target.matched_patterns, candidate.matched_patterns)) &&\n\t\t\t(match_rules?.includeSearch !== true ||\n\t\t\t\ttarget.url.search === candidate.url.search) &&\n\t\t\t(match_rules?.includeHash !== true || target.url.hash === candidate.url.hash)\n\t\t);\n\t}\n\n\tfunction ancestor_link_match(\n\t\ttarget: LinkAttributeCandidate,\n\t\tcandidate: LinkAttributeCandidate,\n\t): boolean {\n\t\tconst target_path = target.url.pathname === \"/\" ? \"/\" : `${target.url.pathname}/`;\n\t\treturn (\n\t\t\ttarget.matched_patterns.length > 0 &&\n\t\t\tcandidate.matched_patterns.length > target.matched_patterns.length &&\n\t\t\t(target_path === \"/\" || candidate.url.pathname.startsWith(target_path)) &&\n\t\t\ttarget.matched_patterns.every((pattern, i) => {\n\t\t\t\treturn candidate.matched_patterns[i] === pattern;\n\t\t\t})\n\t\t);\n\t}\n\n\tfunction get_link_attribute_state(\n\t\thref: string,\n\t\tmatch_rules: LinkPropsBase[\"attributeMatchRules\"],\n\t\troute_state: LinkRouteState | null,\n\t\twork_state: LinkWorkState,\n\t) {\n\t\tif (match_rules?.skip === true || !route_state) {\n\t\t\treturn {\n\t\t\t\tactive_exact: false,\n\t\t\t\tactive_ancestor: false,\n\t\t\t\tpending_exact: false,\n\t\t\t\tpending_ancestor: false,\n\t\t\t};\n\t\t}\n\n\t\tconst target = href_to_link_candidate(href);\n\t\tconst route_url = new URL(route_state.href, window.location.href);\n\t\tconst route = {\n\t\t\turl: route_url,\n\t\t\tmatched_patterns: route_state.matched_patterns,\n\t\t};\n\t\tconst pending = work_state.navigation_href\n\t\t\t? href_to_link_candidate(work_state.navigation_href)\n\t\t\t: null;\n\n\t\treturn {\n\t\t\tactive_exact: exact_link_match(target, route, match_rules),\n\t\t\tactive_ancestor: ancestor_link_match(target, route),\n\t\t\tpending_exact: pending\n\t\t\t\t? exact_link_match(target, pending, match_rules)\n\t\t\t\t: false,\n\t\t\tpending_ancestor: pending ? ancestor_link_match(target, pending) : false,\n\t\t};\n\t}\n}\n\nfunction stable<T>(prev: T, next: T): T {\n\treturn jsonDeepEquals(prev, next) ? prev : next;\n}\n\ntype HookReturn<T, Mode extends \"value\" | \"accessor\" | \"signal\"> = Mode extends \"accessor\"\n\t? () => T\n\t: Mode extends \"signal\"\n\t\t? ReadonlySignal<T>\n\t\t: T;\n\ntype StateSelector<State, Selected> = (state: State) => Selected;\n\nexport type VormaClient<\n\tA extends AppConfig,\n\tElement,\n\tAnchorProps extends object,\n\tHookReturnMode extends \"value\" | \"accessor\" | \"signal\" = \"value\",\n> = AdapterBase<A>[\"passthrough\"] & {\n\tboot: () => Promise<Result<void>>;\n\n\tdefineView: <P extends ToViewPattern<A>, T = any>(\n\t\tinput: ToDefineViewArgs<A, P, T, Element>,\n\t) => ViewDefinition;\n\n\tRootOutlet: (props: { idx?: number } & Record<string, unknown>) => Element | null;\n\n\tLink: <P extends ToViewPattern<A>>(\n\t\tprops: Omit<AnchorProps, \"href\"> & ToLinkProps<A, P>,\n\t) => Element;\n\n\tuseRouteSync: <P extends ToViewPattern<A>>(args: ToRouteSyncArgs<A, P>) => void;\n\n\tuseRouteState: {\n\t\t(): HookReturn<RouteState, HookReturnMode>;\n\t\t<T>(selector: StateSelector<RouteState, T>): HookReturn<T, HookReturnMode>;\n\t};\n\n\tuseWorkState: {\n\t\t(): HookReturn<WorkState, HookReturnMode>;\n\t\t<T>(selector: StateSelector<WorkState, T>): HookReturn<T, HookReturnMode>;\n\t};\n\n\tuseViewData: <P extends ToViewPattern<A>>(\n\t\targs: ToViewComponentProps<A, P>,\n\t) => HookReturn<ToViewOutput<A, P>, HookReturnMode>;\n\n\tusePatternViewData: <P extends ToViewPattern<A>>(\n\t\tpattern: P,\n\t) => HookReturn<ToViewOutput<A, P> | undefined, HookReturnMode>;\n\n\tuseClientLoaderData: <P extends ToViewPattern<A>, T>(\n\t\targs: ToViewComponentProps<A, P, T>,\n\t) => HookReturn<T, HookReturnMode>;\n\n\tusePatternClientLoaderData: <T>(\n\t\tpattern: ToViewPattern<A>,\n\t) => HookReturn<T | undefined, HookReturnMode>;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_index.js","names":[],"sources":["../../core/constants.ts","../../core/url.ts","../../core/api_client.ts","../../core/client_wasm/load.ts","../../core/client_wasm/matcher.ts","../../core/css.ts","../../core/head.ts","../../core/modules.ts","../../core/create_client_core.ts","../../core/make_link_props.ts","../../core/resolve_outlet_slot.ts","../../core/ui_adapter_core.ts"],"sourcesContent":["export const VORMA_JSON_KEY = \"vorma-json\";\nexport const DATA_SCRIPT_ID = \"vorma-data-json\";\nexport const BUILD_ID_HEADER = \"X-Vorma-Client-Build-Id\";\nexport const X_VORMA_BUILD_SKEW = \"X-Vorma-Build-Skew\";\nexport const X_CLIENT_REDIRECT = \"X-Client-Redirect\";\nexport const X_ACCEPTS_CLIENT_REDIRECT = \"X-Accepts-Client-Redirect\";\n\nexport const VERCEL_X_DEPLOYMENT_ID = \"x-deployment-id\";\nexport const VERCEL_DPL_QUERY_PARAM_KEY = \"dpl\";\n\nexport const SCROLL_STORAGE_KEY = \"vorma-scroll-state\";\nexport const SCROLL_STORAGE_RELOAD_KEY = \"vorma-scroll-state-reload\";\nexport const VORMA_ROOT_EL_ID = \"vorma-root\";\n\nexport const HISTORY_KEY_FIELD = \"vorma-history-key\";\nexport const HISTORY_USER_STATE_FIELD = \"vorma-user-state\";\n\nexport const API_IDENTITY_ARRAY_PREFIX = \"vorma-api\";\n\nexport const LINK_ACTIVE_EXACT_ATTR = \"data-vorma-active-exact\";\nexport const LINK_ACTIVE_ANCESTOR_ATTR = \"data-vorma-active-ancestor\";\nexport const LINK_PENDING_EXACT_ATTR = \"data-vorma-pending-exact\";\nexport const LINK_PENDING_ANCESTOR_ATTR = \"data-vorma-pending-ancestor\";\n\nexport const CSS_BUNDLE_ATTR = \"data-vorma-css-bundle\";\nexport const CSS_PRELOAD_ATTR = \"data-vorma-css-preload\";\nexport const CSS_PRELOAD_SETTLED_ATTR = \"data-vorma-css-settled\";\n","import { serializeToSearchParams } from \"vorma/kit/json\";\nimport type {\n\tAppConfig,\n\tToNavigateArgs,\n\tToNavigationTarget,\n\tToRouteDestination,\n\tToViewPattern,\n} from \"./types.ts\";\n\nconst DYNAMIC_RUNE = \":\";\nconst SPLAT_RUNE = \"*\";\nconst INDEX_SEGMENT = \"_index\";\n\nfunction strip_trailing_slash(path: string): string {\n\tif (path === \"/\") {\n\t\treturn path;\n\t}\n\treturn path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction resolve_pattern_path(\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n): string {\n\tconst p = params ?? {};\n\tconst segments = pattern.split(\"/\").filter((s) => {\n\t\treturn s.length > 0;\n\t});\n\tconst splat_encoded = (splat_values ?? [])\n\t\t.map((v) => {\n\t\t\treturn encodeURIComponent(v);\n\t\t})\n\t\t.join(\"/\");\n\n\tconst path_segments = segments.flatMap((seg) => {\n\t\tif (seg === SPLAT_RUNE) {\n\t\t\treturn splat_encoded.split(\"/\").filter((s) => {\n\t\t\t\treturn s.length > 0;\n\t\t\t});\n\t\t}\n\t\tif (seg.startsWith(DYNAMIC_RUNE)) {\n\t\t\treturn [encodeURIComponent(p[seg.slice(DYNAMIC_RUNE.length)] as string)];\n\t\t}\n\t\treturn [seg];\n\t});\n\n\tconst result = \"/\" + path_segments.join(\"/\");\n\treturn strip_trailing_slash(result.length === 0 ? \"/\" : result);\n}\n\nexport function resolve_path(\n\ttype: \"view\" | \"resource\",\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n): string {\n\tlet path = resolve_pattern_path(pattern, params, splat_values);\n\n\tif (type === \"view\") {\n\t\tconst suffix = `/${INDEX_SEGMENT}`;\n\t\tif (path.endsWith(suffix)) {\n\t\t\tpath = path.slice(0, -suffix.length) || \"/\";\n\t\t}\n\t}\n\n\treturn path;\n}\n\nexport function to_typed_href(\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n\tsearch?: unknown,\n\thash?: string,\n): string {\n\tconst base = resolve_path(\"view\", pattern, params, splat_values);\n\tconst url = new URL(base, window.location.origin);\n\tif (search !== undefined) {\n\t\turl.search = serializeToSearchParams(search).toString();\n\t}\n\tif (hash !== undefined) {\n\t\turl.hash = hash;\n\t}\n\treturn url.href;\n}\n\nexport function build_resource_url(\n\tapi_mount_root: string,\n\tpattern: string,\n\tparams?: Record<string, string>,\n\tsplat_values?: string[],\n\tinput?: unknown,\n): URL {\n\tconst pathname = resolve_path(\"resource\", pattern, params, splat_values);\n\tconst full =\n\t\tstrip_trailing_slash(api_mount_root) + (pathname === \"/\" ? \"\" : pathname);\n\tconst url = new URL(full, window.location.origin);\n\tif (input && typeof input === \"object\") {\n\t\turl.search = serializeToSearchParams(input).toString();\n\t}\n\treturn url;\n}\n\nexport function create_typed_to_href<A extends AppConfig>() {\n\treturn <P extends ToViewPattern<A>>(\n\t\tdestination: ToRouteDestination<A, P>,\n\t): string => {\n\t\tconst d = destination as any;\n\t\treturn to_typed_href(d.pattern, d.params, d.splatValues, d.search, d.hash);\n\t};\n}\n\nexport function resolve_body(input: unknown): BodyInit | null | undefined {\n\tif (\n\t\tinput === undefined ||\n\t\tinput === null ||\n\t\ttypeof input === \"string\" ||\n\t\tinput instanceof ReadableStream ||\n\t\tinput instanceof FormData ||\n\t\tinput instanceof URLSearchParams ||\n\t\tinput instanceof Blob ||\n\t\tinput instanceof ArrayBuffer\n\t) {\n\t\treturn input;\n\t}\n\tif (ArrayBuffer.isView(input)) {\n\t\treturn input as ArrayBufferView<ArrayBuffer>;\n\t}\n\treturn JSON.stringify(input);\n}\n\nexport function create_typed_navigate<A extends AppConfig>(\n\tnavigate_fn: (\n\t\thref: string | URL,\n\t\toptions?: {\n\t\t\treplace?: boolean;\n\t\t\tscrollToTop?: boolean;\n\t\t\tstate?: unknown;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t) => Promise<{ didNavigate: boolean }>,\n) {\n\tconst to_href = create_typed_to_href<A>();\n\treturn async <P extends ToViewPattern<A>>(\n\t\targs: ToNavigateArgs<A, P>,\n\t): Promise<{ didNavigate: boolean }> => {\n\t\tconst href = args.href ?? to_href(args as any);\n\t\treturn navigate_fn(href, {\n\t\t\treplace: args.replace,\n\t\t\tscrollToTop: args.scrollToTop,\n\t\t\tstate: args.state,\n\t\t\tskipWorkIndicator: args.skipWorkIndicator,\n\t\t});\n\t};\n}\n\nexport function create_typed_prefetch<A extends AppConfig>(\n\tprefetch_fn: (href: string) => void,\n) {\n\tconst to_href = create_typed_to_href<A>();\n\treturn <P extends ToViewPattern<A>>(target: ToNavigationTarget<A, P>): void => {\n\t\tprefetch_fn(target.href ?? to_href(target as any));\n\t};\n}\n","import { jsonStringifyStable } from \"vorma/kit/json\";\nimport { API_IDENTITY_ARRAY_PREFIX } from \"./constants.ts\";\nimport type {\n\tApiClientOutput,\n\tAppConfig,\n\tMutationResult,\n\tQueryResult,\n\tResourceKind,\n\tToApiClient,\n\tToApiDecorator,\n\tToApiDecoratorContext,\n\tToMutationArgs,\n\tToQueryArgs,\n} from \"./types.ts\";\nimport { build_resource_url, resolve_body } from \"./url.ts\";\n\ntype SubmitFn = <T>(\n\turl: string | URL,\n\trequest_init?: RequestInit,\n\toptions?: {\n\t\tresourceKind?: ResourceKind;\n\t\tdedupeKey?: string;\n\t\trevalidate?: boolean;\n\t\tskipWorkIndicator?: boolean;\n\t},\n) => Promise<QueryResult<T> | MutationResult<T>>;\n\nfunction normalize_api_method(raw_method: string | undefined): string {\n\treturn (raw_method ?? \"GET\").trim().toUpperCase();\n}\n\nfunction normalize_api_pattern(pattern: string): string {\n\treturn pattern.trim();\n}\n\nfunction stringify_identity_value(value: unknown): string {\n\tconst res = jsonStringifyStable(value);\n\tif (!res.ok) {\n\t\tthrow new Error(res.err);\n\t}\n\treturn res.val;\n}\n\nclass ApiErrorBase<T = never> extends Error {\n\tresult: Extract<QueryResult<T> | MutationResult<T>, { success: false }>;\n\n\tconstructor(result: Extract<QueryResult<T> | MutationResult<T>, { success: false }>) {\n\t\tsuper(result.error);\n\t\tthis.result = result;\n\t\tObject.setPrototypeOf(this, new.target.prototype);\n\t}\n}\n\nexport class QueryError<T = never> extends ApiErrorBase<T> {\n\tconstructor(result: Extract<QueryResult<T>, { success: false }>) {\n\t\tsuper(result);\n\t\tthis.name = \"QueryError\";\n\t}\n}\n\nexport class MutationError<T = never> extends ApiErrorBase<T> {\n\tconstructor(result: Extract<MutationResult<T>, { success: false }>) {\n\t\tsuper(result);\n\t\tthis.name = \"MutationError\";\n\t}\n}\n\nexport function create_typed_api_client<A extends AppConfig>(\n\tapi_mount_root: string,\n\tsubmit_fn: SubmitFn,\n\tdecorator?: ToApiDecorator<A>,\n): ToApiClient<A> {\n\tasync function submit<Args extends ToQueryArgs<A> | ToMutationArgs<A>>(\n\t\targs: Args,\n\t\tresource_kind: ResourceKind,\n\t): Promise<\n\t\tQueryResult<ApiClientOutput<A, Args>> | MutationResult<ApiClientOutput<A, Args>>\n\t> {\n\t\tconst {\n\t\t\tdedupeKey,\n\t\t\tinput,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tpattern,\n\t\t\trevalidate,\n\t\t\tskipWorkIndicator,\n\t\t\tsplatValues,\n\t\t\t...request_init\n\t\t} = args as any;\n\t\tconst normalized_method = normalize_api_method(method);\n\t\tconst api_pattern = normalize_api_pattern(pattern);\n\t\tconst is_get = normalized_method === \"GET\" || normalized_method === \"HEAD\";\n\t\tconst url = build_resource_url(\n\t\t\tapi_mount_root,\n\t\t\tapi_pattern,\n\t\t\tparams,\n\t\t\tsplatValues,\n\t\t\tis_get ? input : undefined,\n\t\t);\n\t\tconst ctx = {\n\t\t\tinput,\n\t\t\tmethod: normalized_method,\n\t\t\tpattern: api_pattern,\n\t\t\trequestInit: request_init,\n\t\t} as ToApiDecoratorContext<A>;\n\t\tconst decorated = decorator ? ((await (decorator as any)(ctx)) ?? {}) : {};\n\t\tconst init: RequestInit = { ...decorated, ...request_init };\n\t\tconst headers = new Headers(decorated.headers ?? undefined);\n\t\tnew Headers(request_init.headers ?? undefined).forEach((v, k) => {\n\t\t\theaders.set(k, v);\n\t\t});\n\t\tinit.headers = headers;\n\t\tinit.method = normalized_method;\n\t\tif (is_get) {\n\t\t\tdelete init.body;\n\t\t} else {\n\t\t\tinit.body = resolve_body(input);\n\t\t}\n\t\tconst options: {\n\t\t\tresourceKind?: ResourceKind;\n\t\t\tdedupeKey?: string;\n\t\t\trevalidate?: boolean;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t} = {\n\t\t\tresourceKind: resource_kind,\n\t\t};\n\t\tif (dedupeKey !== undefined) {\n\t\t\toptions.dedupeKey = dedupeKey;\n\t\t}\n\t\tif (revalidate !== undefined) {\n\t\t\toptions.revalidate = revalidate;\n\t\t}\n\t\tif (skipWorkIndicator !== undefined) {\n\t\t\toptions.skipWorkIndicator = skipWorkIndicator;\n\t\t}\n\t\treturn submit_fn<ApiClientOutput<A, Args>>(url, init, options);\n\t}\n\n\treturn {\n\t\ttoIdentityArray: <Args extends ToQueryArgs<A> | ToMutationArgs<A>>(\n\t\t\targs: Args,\n\t\t): unknown[] => {\n\t\t\tconst { input, method, params, pattern, splatValues } = args as any;\n\t\t\tconst normalized_method = normalize_api_method(method);\n\t\t\tconst api_pattern = normalize_api_pattern(pattern);\n\t\t\treturn [\n\t\t\t\tAPI_IDENTITY_ARRAY_PREFIX,\n\t\t\t\tapi_mount_root,\n\t\t\t\tnormalized_method,\n\t\t\t\tapi_pattern,\n\t\t\t\tstringify_identity_value(params ?? null),\n\t\t\t\tstringify_identity_value(splatValues ?? []),\n\t\t\t\tstringify_identity_value(input ?? null),\n\t\t\t];\n\t\t},\n\t\tmutate: <Args extends ToMutationArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<MutationResult<ApiClientOutput<A, Args>>> => {\n\t\t\treturn submit(args, \"mutation\") as Promise<\n\t\t\t\tMutationResult<ApiClientOutput<A, Args>>\n\t\t\t>;\n\t\t},\n\t\tmutateOrThrow: async <Args extends ToMutationArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<ApiClientOutput<A, Args>> => {\n\t\t\tconst result = (await submit(args, \"mutation\")) as MutationResult<\n\t\t\t\tApiClientOutput<A, Args>\n\t\t\t>;\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new MutationError(result);\n\t\t\t}\n\t\t\treturn result.data;\n\t\t},\n\t\tquery: <Args extends ToQueryArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<QueryResult<ApiClientOutput<A, Args>>> => {\n\t\t\treturn submit(args, \"query\") as Promise<\n\t\t\t\tQueryResult<ApiClientOutput<A, Args>>\n\t\t\t>;\n\t\t},\n\t\tqueryOrThrow: async <Args extends ToQueryArgs<A>>(\n\t\t\targs: Args,\n\t\t): Promise<ApiClientOutput<A, Args>> => {\n\t\t\tconst result = (await submit(args, \"query\")) as QueryResult<\n\t\t\t\tApiClientOutput<A, Args>\n\t\t\t>;\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new QueryError(result);\n\t\t\t}\n\t\t\treturn result.data;\n\t\t},\n\t};\n}\n","/// <reference types=\"vite/client\" />\n/// <reference types=\"node\" />\n\nexport type RawMatcherExports = {\n\tmemory: WebAssembly.Memory;\n\tvorma_client_matcher_alloc: (len: number) => number;\n\tvorma_client_matcher_dealloc: (ptr: number, len: number) => void;\n\tvorma_client_matcher_find_nested_matches: (\n\t\tmatcher_id: number,\n\t\tptr: number,\n\t\tlen: number,\n\t) => number;\n\tvorma_client_matcher_free: (matcher_id: number) => void;\n\tvorma_client_matcher_new: () => number;\n\tvorma_client_matcher_output_len: () => number;\n\tvorma_client_matcher_output_ptr: () => number;\n\tvorma_client_matcher_register_pattern: (\n\t\tmatcher_id: number,\n\t\tptr: number,\n\t\tlen: number,\n\t) => number;\n};\n\nlet init_promise: Promise<RawMatcherExports> | null = null;\n\nconst wasm_url = new URL(\"./vorma_client_wasm_bg.wasm\", import.meta.url);\nconst VITE_FS_URL_PREFIX = \"/@fs/\";\n\nasync function instantiate_wasm(): Promise<RawMatcherExports> {\n\tif (!import.meta.env || import.meta.env.MODE === \"test\") {\n\t\tconst fs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\tconst process = await import(/* @vite-ignore */ \"node:process\");\n\t\tlet file_url = wasm_url;\n\t\tif (wasm_url.protocol !== \"file:\") {\n\t\t\tconst pathname = wasm_url.pathname.startsWith(VITE_FS_URL_PREFIX)\n\t\t\t\t? wasm_url.pathname.slice(VITE_FS_URL_PREFIX.length - 1)\n\t\t\t\t: `.${wasm_url.pathname}`;\n\t\t\tfile_url = new URL(pathname, `file://${process.cwd()}/`);\n\t\t}\n\t\tconst bytes = await fs.readFile(file_url);\n\t\tconst result = await WebAssembly.instantiate(bytes as BufferSource, {});\n\t\treturn result.instance.exports as RawMatcherExports;\n\t}\n\tconst response = await fetch(wasm_url);\n\ttry {\n\t\tconst result = await WebAssembly.instantiateStreaming(\n\t\t\tPromise.resolve(response.clone()),\n\t\t\t{},\n\t\t);\n\t\treturn result.instance.exports as RawMatcherExports;\n\t} catch {\n\t\tconst result = await WebAssembly.instantiate(await response.arrayBuffer(), {});\n\t\treturn result.instance.exports as RawMatcherExports;\n\t}\n}\n\nexport function init_client_wasm(): Promise<RawMatcherExports> {\n\tif (!init_promise) {\n\t\tinit_promise = instantiate_wasm();\n\t}\n\treturn init_promise;\n}\n","import { init_client_wasm, type RawMatcherExports } from \"./load.ts\";\n\nconst STATUS_NO_MATCH = 0;\nconst STATUS_MATCH = 1;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport type ClientMatcherNestedMatch = {\n\tparams: Record<string, string>;\n\tsplat_values: string[];\n\tpatterns: string[];\n};\n\nexport type ClientMatcher = {\n\tregister_pattern: (pattern: string) => void;\n\tfind_nested_matches: (path: string) => ClientMatcherNestedMatch | null;\n\tfree: () => void;\n};\n\nfunction write_input(exports: RawMatcherExports, value: string): [number, number] {\n\tconst bytes = encoder.encode(value);\n\tconst ptr = exports.vorma_client_matcher_alloc(bytes.length);\n\tnew Uint8Array(exports.memory.buffer, ptr, bytes.length).set(bytes);\n\treturn [ptr, bytes.length];\n}\n\nfunction read_u32(view: DataView, offset: number): [number, number] {\n\treturn [view.getUint32(offset, true), offset + 4];\n}\n\nfunction read_string(bytes: Uint8Array, offset: number): [string, number] {\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tlet len: number;\n\t[len, offset] = read_u32(view, offset);\n\treturn [decoder.decode(bytes.subarray(offset, offset + len)), offset + len];\n}\n\nfunction read_output(exports: RawMatcherExports): Uint8Array {\n\tconst ptr = exports.vorma_client_matcher_output_ptr();\n\tconst len = exports.vorma_client_matcher_output_len();\n\tif (len === 0) {\n\t\treturn new Uint8Array();\n\t}\n\treturn new Uint8Array(exports.memory.buffer, ptr, len).slice();\n}\n\nfunction decode_match(bytes: Uint8Array): ClientMatcherNestedMatch | null {\n\tif (bytes.length === 0) {\n\t\treturn null;\n\t}\n\tconst view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\tlet offset = 0;\n\tlet param_count: number;\n\t[param_count, offset] = read_u32(view, offset);\n\tconst params: Record<string, string> = {};\n\tfor (let i = 0; i < param_count; i++) {\n\t\tlet key: string;\n\t\tlet value: string;\n\t\t[key, offset] = read_string(bytes, offset);\n\t\t[value, offset] = read_string(bytes, offset);\n\t\tparams[key] = value;\n\t}\n\tlet splat_count: number;\n\t[splat_count, offset] = read_u32(view, offset);\n\tconst splat_values: string[] = [];\n\tfor (let i = 0; i < splat_count; i++) {\n\t\tlet value: string;\n\t\t[value, offset] = read_string(bytes, offset);\n\t\tsplat_values.push(value);\n\t}\n\tlet pattern_count: number;\n\t[pattern_count, offset] = read_u32(view, offset);\n\tconst patterns: string[] = [];\n\tfor (let i = 0; i < pattern_count; i++) {\n\t\tlet pattern: string;\n\t\t[pattern, offset] = read_string(bytes, offset);\n\t\tpatterns.push(pattern);\n\t}\n\treturn { params, splat_values, patterns };\n}\n\nfunction matcher_error(operation: string, status: number): Error {\n\treturn new Error(`Vorma client matcher ${operation} failed with status ${status}`);\n}\n\nexport async function create_client_matcher(): Promise<ClientMatcher> {\n\tconst exports = await init_client_wasm();\n\tconst matcher_id = exports.vorma_client_matcher_new();\n\tif (matcher_id === 0) {\n\t\tthrow new Error(\"Failed to create Vorma client matcher\");\n\t}\n\tlet freed = false;\n\tconst with_input = <T>(value: string, fn: (ptr: number, len: number) => T): T => {\n\t\tconst [ptr, len] = write_input(exports, value);\n\t\ttry {\n\t\t\treturn fn(ptr, len);\n\t\t} finally {\n\t\t\texports.vorma_client_matcher_dealloc(ptr, len);\n\t\t}\n\t};\n\treturn {\n\t\tregister_pattern: (pattern) => {\n\t\t\tif (freed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst status = with_input(pattern, (ptr, len) => {\n\t\t\t\treturn exports.vorma_client_matcher_register_pattern(\n\t\t\t\t\tmatcher_id,\n\t\t\t\t\tptr,\n\t\t\t\t\tlen,\n\t\t\t\t);\n\t\t\t});\n\t\t\tif (status !== STATUS_MATCH) {\n\t\t\t\tthrow matcher_error(\"pattern registration\", status);\n\t\t\t}\n\t\t},\n\t\tfind_nested_matches: (path) => {\n\t\t\tif (freed) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst status = with_input(path, (ptr, len) => {\n\t\t\t\treturn exports.vorma_client_matcher_find_nested_matches(\n\t\t\t\t\tmatcher_id,\n\t\t\t\t\tptr,\n\t\t\t\t\tlen,\n\t\t\t\t);\n\t\t\t});\n\t\t\tif (status === STATUS_NO_MATCH) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (status !== STATUS_MATCH) {\n\t\t\t\tthrow matcher_error(\"path match\", status);\n\t\t\t}\n\t\t\treturn decode_match(read_output(exports));\n\t\t},\n\t\tfree: () => {\n\t\t\tif (freed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfreed = true;\n\t\t\texports.vorma_client_matcher_free(matcher_id);\n\t\t},\n\t};\n}\n","import {\n\tCSS_BUNDLE_ATTR,\n\tCSS_PRELOAD_ATTR,\n\tCSS_PRELOAD_SETTLED_ATTR,\n} from \"./constants.ts\";\n\nexport function preload_css(bundles: string[]): void {\n\tfor (const path of new Set(bundles)) {\n\t\tif (find_css_bundle(path)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (document.head.querySelector(`link[${CSS_PRELOAD_ATTR}=\"${path}\"]`)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst link = document.createElement(\"link\");\n\t\tlink.rel = \"preload\";\n\t\tlink.setAttribute(\"as\", \"style\");\n\t\tlink.setAttribute(CSS_PRELOAD_ATTR, path);\n\t\tlink.setAttribute(CSS_PRELOAD_SETTLED_ATTR, \"0\");\n\t\tconst mark = (): void => {\n\t\t\tlink.removeEventListener(\"load\", mark);\n\t\t\tlink.removeEventListener(\"error\", mark);\n\t\t\tlink.setAttribute(CSS_PRELOAD_SETTLED_ATTR, \"1\");\n\t\t};\n\t\tlink.addEventListener(\"load\", mark);\n\t\tlink.addEventListener(\"error\", mark);\n\t\tlink.href = path;\n\t\tdocument.head.appendChild(link);\n\t}\n}\n\nexport async function wait_for_css(\n\tbundles: string[],\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst pending_nodes: HTMLLinkElement[] = [];\n\n\tfor (const path of new Set(bundles)) {\n\t\tconst node = document.head.querySelector<HTMLLinkElement>(\n\t\t\t`link[${CSS_PRELOAD_ATTR}=\"${path}\"]`,\n\t\t);\n\t\tif (!node || node.getAttribute(CSS_PRELOAD_SETTLED_ATTR) === \"1\") {\n\t\t\tcontinue;\n\t\t}\n\t\tpending_nodes.push(node);\n\t}\n\n\tif (signal.aborted || pending_nodes.length === 0) {\n\t\treturn;\n\t}\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet remaining = pending_nodes.length;\n\t\tlet settled = false;\n\t\tconst cleanups: Array<() => void> = [];\n\n\t\tconst cleanup = (): void => {\n\t\t\tfor (const remove_listener of cleanups.splice(0)) {\n\t\t\t\tremove_listener();\n\t\t\t}\n\t\t};\n\n\t\tconst complete = (): void => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\n\t\tconst on_abort = (): void => {\n\t\t\tcomplete();\n\t\t};\n\t\tsignal.addEventListener(\"abort\", on_abort, { once: true });\n\t\tcleanups.push(() => {\n\t\t\tsignal.removeEventListener(\"abort\", on_abort);\n\t\t});\n\n\t\tfor (const node of pending_nodes) {\n\t\t\tconst done = (): void => {\n\t\t\t\tnode.setAttribute(CSS_PRELOAD_SETTLED_ATTR, \"1\");\n\t\t\t\tremaining -= 1;\n\t\t\t\tif (remaining === 0) {\n\t\t\t\t\tcomplete();\n\t\t\t\t}\n\t\t\t};\n\t\t\tnode.addEventListener(\"load\", done, { once: true });\n\t\t\tnode.addEventListener(\"error\", done, { once: true });\n\t\t\tcleanups.push(() => {\n\t\t\t\tnode.removeEventListener(\"load\", done);\n\t\t\t\tnode.removeEventListener(\"error\", done);\n\t\t\t});\n\t\t}\n\t});\n}\n\nexport function apply_css_bundles(bundles: string[]): void {\n\tfor (const path of new Set(bundles)) {\n\t\tif (find_css_bundle(path)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst link = document.createElement(\"link\");\n\t\tlink.rel = \"stylesheet\";\n\t\tlink.setAttribute(CSS_BUNDLE_ATTR, path);\n\t\tlink.href = path;\n\t\tdocument.head.appendChild(link);\n\t}\n}\n\nfunction find_css_bundle(path: string): HTMLLinkElement | null {\n\treturn document.head.querySelector<HTMLLinkElement>(\n\t\t`link[${CSS_BUNDLE_ATTR}=\"${path}\"]`,\n\t);\n}\n","import { R, type Result } from \"vorma/kit/result\";\n\nexport type HeadEl = {\n\ttag: string;\n\tattributes_known_safe: Record<string, string>;\n\tboolean_attributes?: string[] | null;\n\tdangerous_inner_html?: string;\n};\n\ntype HeadSection = \"meta\" | \"rest\";\n\nexport function apply_head_and_title(\n\ttitle: string | undefined,\n\tmeta_els: HeadEl[],\n\trest_els: HeadEl[],\n): Result<void> {\n\ttry {\n\t\tif (title !== undefined) {\n\t\t\tif (title !== \"\" || document.head.querySelector(\"title\")) {\n\t\t\t\tdocument.title = title;\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\treturn R.err(error instanceof Error ? error.message : String(error));\n\t}\n\n\tconst meta_res = reconcile_section(\"meta\", meta_els);\n\tif (!meta_res.ok) {\n\t\treturn R.err(meta_res.err);\n\t}\n\tconst res_res = reconcile_section(\"rest\", rest_els);\n\tif (!res_res.ok) {\n\t\treturn R.err(res_res.err);\n\t}\n\n\treturn R.ok(undefined);\n}\n\nfunction reconcile_section(section: HeadSection, els: HeadEl[]): Result<void> {\n\tconst boundary_res = find_boundary_comments(section);\n\tif (!boundary_res.ok) {\n\t\treturn R.err(boundary_res.err);\n\t}\n\tconst { start, end } = boundary_res.val;\n\tif (!end.parentNode) {\n\t\treturn R.err(`Invalid head section boundaries for section \"${section}\"`);\n\t}\n\tconst parent = end.parentNode;\n\tlet first_error: string | undefined;\n\n\ttry {\n\t\tconst current_elements: Element[] = [];\n\t\tlet node: Node | null = start.nextSibling;\n\t\twhile (node && node !== end) {\n\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tcurrent_elements.push(node as Element);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\n\t\tconst new_elements: Element[] = [];\n\t\tconst new_element_fingerprints = new Map<string, Element>();\n\n\t\tfor (const block of els) {\n\t\t\tif (!block.tag) {\n\t\t\t\tfirst_error ??= `Invalid head element tag for section \"${section}\"`;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst el = document.createElement(block.tag);\n\t\t\tif (block.attributes_known_safe) {\n\t\t\t\tfor (const [key, value] of Object.entries(block.attributes_known_safe)) {\n\t\t\t\t\tel.setAttribute(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (block.boolean_attributes) {\n\t\t\t\tfor (const key of block.boolean_attributes) {\n\t\t\t\t\tel.setAttribute(key, \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (block.dangerous_inner_html) {\n\t\t\t\tel.innerHTML = block.dangerous_inner_html;\n\t\t\t}\n\n\t\t\tconst fp = fingerprint_element(el);\n\n\t\t\tif (new_element_fingerprints.has(fp)) {\n\t\t\t\tconst prev = new_element_fingerprints.get(fp)!;\n\t\t\t\tconst idx = new_elements.indexOf(prev);\n\t\t\t\tif (idx > -1) {\n\t\t\t\t\tnew_elements.splice(idx, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnew_elements.push(el);\n\t\t\tnew_element_fingerprints.set(fp, el);\n\t\t}\n\n\t\tconst current_by_fp = new Map<string, Element[]>();\n\t\tfor (const el of current_elements) {\n\t\t\tconst fp = fingerprint_element(el);\n\t\t\tconst list = current_by_fp.get(fp);\n\t\t\tif (list) {\n\t\t\t\tlist.push(el);\n\t\t\t} else {\n\t\t\t\tcurrent_by_fp.set(fp, [el]);\n\t\t\t}\n\t\t}\n\n\t\tconst final_elements: Element[] = [];\n\t\tconst used = new Set<Element>();\n\n\t\tfor (const new_el of new_elements) {\n\t\t\tconst fp = fingerprint_element(new_el);\n\t\t\tconst candidates = current_by_fp.get(fp) ?? [];\n\t\t\tconst matched = candidates.find((el) => {\n\t\t\t\treturn !used.has(el);\n\t\t\t});\n\n\t\t\tif (matched) {\n\t\t\t\tused.add(matched);\n\t\t\t\tfinal_elements.push(matched);\n\t\t\t} else {\n\t\t\t\tfinal_elements.push(new_el);\n\t\t\t}\n\t\t}\n\n\t\tconst remaining = new Set(current_elements);\n\t\tfor (const el of current_elements) {\n\t\t\tif (!used.has(el)) {\n\t\t\t\tparent.removeChild(el);\n\t\t\t\tremaining.delete(el);\n\t\t\t}\n\t\t}\n\n\t\tnode = start.nextSibling;\n\t\twhile (node && node !== end) {\n\t\t\tconst next = node.nextSibling;\n\t\t\tif (node.nodeType !== Node.ELEMENT_NODE) {\n\t\t\t\tparent.removeChild(node);\n\t\t\t}\n\t\t\tnode = next;\n\t\t}\n\n\t\tlet last_processed: Element | null = null;\n\n\t\tfor (const element of final_elements) {\n\t\t\tconst is_existing = used.has(element);\n\n\t\t\tif (is_existing) {\n\t\t\t\tconst expected_next: Element | null = last_processed\n\t\t\t\t\t? last_processed.nextElementSibling\n\t\t\t\t\t: start.nextElementSibling;\n\n\t\t\t\tif (expected_next !== element) {\n\t\t\t\t\tparent.insertBefore(element, (expected_next as Node) ?? end);\n\t\t\t\t}\n\t\t\t\tremaining.delete(element);\n\t\t\t} else {\n\t\t\t\tconst insert_before = last_processed\n\t\t\t\t\t? last_processed.nextSibling\n\t\t\t\t\t: start.nextSibling;\n\t\t\t\tparent.insertBefore(element, insert_before ?? end);\n\t\t\t}\n\n\t\t\tlast_processed = element;\n\t\t}\n\n\t\tif (first_error) {\n\t\t\treturn R.err(first_error);\n\t\t}\n\t\treturn R.ok(undefined);\n\t} catch (error) {\n\t\treturn R.err(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nfunction find_boundary_comments(section: HeadSection): Result<{\n\tstart: Comment;\n\tend: Comment;\n}> {\n\tconst start_text = `vorma-${section}-start`;\n\tconst end_text = `vorma-${section}-end`;\n\tlet start: Comment | undefined;\n\tfor (const node of Array.from(document.head.childNodes)) {\n\t\tif (node.nodeType !== Node.COMMENT_NODE) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst val = (node as Comment).nodeValue?.trim();\n\t\tif (val === start_text) {\n\t\t\tstart = node as Comment;\n\t\t} else if (val === end_text && start) {\n\t\t\treturn R.ok({ start, end: node as Comment });\n\t\t}\n\t}\n\treturn R.err(`Could not find head boundary comments for section \"${section}\"`);\n}\n\nfunction fingerprint_element(element: Element): string {\n\tconst attrs: string[] = [];\n\tfor (let i = 0; i < element.attributes.length; i++) {\n\t\tconst attr = element.attributes[i]!;\n\t\tconst value =\n\t\t\telement.hasAttribute(attr.name) && attr.value === \"\" ? \"\" : attr.value;\n\t\tattrs.push(`${attr.name}=\"${value}\"`);\n\t}\n\tattrs.sort();\n\treturn `${element.tagName.toUpperCase()}|${attrs.join(\",\")}|${(element.innerHTML || \"\").trim()}`;\n}\n","/// <reference types=\"vite/client\" />\n\nexport function preload_modules(deps: string[]): void {\n\tif (import.meta.env.DEV) {\n\t\treturn;\n\t}\n\tfor (const dep of new Set(deps)) {\n\t\tif (document.head.querySelector(`link[rel=\"modulepreload\"][href=\"${dep}\"]`)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst link = document.createElement(\"link\");\n\t\tlink.rel = \"modulepreload\";\n\t\tlink.href = dep;\n\t\tdocument.head.appendChild(link);\n\t}\n}\n","/// <reference types=\"vite/client\" />\n\nimport { jsonDeepEquals, parseSearchParams } from \"vorma/kit/json\";\nimport { addOnWindowFocusListener } from \"vorma/kit/listeners\";\nimport { R, type Result } from \"vorma/kit/result\";\nimport {\n\tcreate_client_matcher,\n\ttype ClientMatcher,\n\ttype ClientMatcherNestedMatch,\n} from \"./client_wasm/matcher.ts\";\nimport {\n\tBUILD_ID_HEADER,\n\tDATA_SCRIPT_ID,\n\tHISTORY_KEY_FIELD,\n\tHISTORY_USER_STATE_FIELD,\n\tSCROLL_STORAGE_KEY,\n\tSCROLL_STORAGE_RELOAD_KEY,\n\tVERCEL_DPL_QUERY_PARAM_KEY,\n\tVERCEL_X_DEPLOYMENT_ID,\n\tVORMA_JSON_KEY,\n\tVORMA_ROOT_EL_ID,\n\tX_ACCEPTS_CLIENT_REDIRECT,\n\tX_CLIENT_REDIRECT,\n\tX_VORMA_BUILD_SKEW,\n} from \"./constants.ts\";\nimport { apply_css_bundles, preload_css, wait_for_css } from \"./css.ts\";\nimport { apply_head_and_title, type HeadEl } from \"./head.ts\";\nimport { preload_modules } from \"./modules.ts\";\nimport type {\n\tAppConfig,\n\tBeforeRouteCommitFn,\n\tBeforeRouteYieldFn,\n\tResourceKind,\n\tRevalidationResult,\n\tRouteErrorState,\n\tRouteState,\n\tRouteUpdateReason,\n} from \"./types.ts\";\n\n/////////////////////////////////////////////////////////////////////\n/////// Public Types\n/////////////////////////////////////////////////////////////////////\n\nexport type ScrollState = { x: number; y: number } | { hash: string };\n\nexport type ScrollIntent = {\n\tscroll: ScrollState;\n\ttarget_entry_id: string;\n};\n\nexport type RouteRenderEntry = {\n\tpattern: string;\n\tinput: unknown;\n\tmodule_url: string;\n\thmr_version: number;\n\tmodule: Record<string, unknown>;\n\tview_data: unknown;\n\tclient_loader_data: unknown;\n};\n\nexport type RouteRenderState = {\n\tentries: RouteRenderEntry[];\n\terror: RouteErrorState | null;\n\tparams: Record<string, string>;\n\tsplat_values: string[];\n\tclient_build_id: string;\n\thistory_state: unknown;\n};\n\nexport type WorkState = {\n\tnavigation: null | {\n\t\thref: string;\n\t\treplace: boolean;\n\t\tsource: \"navigate\" | \"popstate\" | \"redirect\";\n\t};\n\trevalidation: null | {\n\t\tstatus: \"debouncing\" | \"running\" | \"retrying\";\n\t\tattempt: number;\n\t};\n\tprefetch: null | {\n\t\thref: string;\n\t};\n\tapiRequests: Array<{\n\t\tkey: string;\n\t\tmethod: string;\n\t\thref: string;\n\t}>;\n};\n\nexport type RevalidationReason = \"manual\" | \"retry\" | \"apiRequest\" | \"windowFocus\";\n\nexport type BuildSkewDetectedEvent = {\n\tactiveClientBuildId: string;\n\tserverBuildId: string;\n\ttriggeringResponse:\n\t\t| {\n\t\t\t\tkind: \"route\";\n\t\t\t\ttrigger: \"navigation\" | \"popstate\" | \"prefetch\";\n\t\t\t\trequestedHref: string;\n\t\t\t\tstatus: number;\n\t\t\t\tok: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"route\";\n\t\t\t\ttrigger: \"revalidation\";\n\t\t\t\trevalidationReason: RevalidationReason;\n\t\t\t\trequestedHref: string;\n\t\t\t\tstatus: number;\n\t\t\t\tok: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"resource\";\n\t\t\t\tresourceKind: ResourceKind;\n\t\t\t\trequestedHref: string;\n\t\t\t\tmethod: string;\n\t\t\t\tstatus: number;\n\t\t\t\tok: boolean;\n\t\t };\n\tcurrentRouteState: RouteState;\n\tcurrentWorkState: WorkState;\n};\n\nexport type WorkIndicator = {\n\ttrack: <T>(promise: PromiseLike<T>) => Promise<T>;\n\tisActive: () => boolean;\n};\n\nexport type WorkIndicatorOptions = {\n\tstart: () => void;\n\tstop: () => void;\n\tstartDelayMs?: number;\n\tstopDelayMs?: number;\n\tskipNavigations?: boolean;\n\tskipApiRequests?: boolean;\n\tskipRevalidations?: boolean;\n};\n\nexport type ClientOptions = {\n\trender?: () => void | Promise<void>;\n\tworkIndicator?: WorkIndicatorOptions;\n\trevalidateOnWindowFocus?:\n\t\t| boolean\n\t\t| { staleTimeMs: number; skipWorkIndicator?: boolean };\n\tdefaultErrorBoundary?: (props: { error: unknown }) => any;\n\tuseViewTransitions?: boolean;\n\tonRouteUpdate?: (\n\t\troute: RouteState,\n\t\tpreviousRoute: RouteState | null,\n\t\treason: RouteUpdateReason,\n\t) => void;\n\tonWorkUpdate?: (work: WorkState) => void;\n\tonBuildSkewDetected?: (event: BuildSkewDetectedEvent) => void;\n};\n\nexport type ClientCommit = {\n\troute_render?: {\n\t\tstate: RouteRenderState;\n\t\tscroll_intent?: ScrollIntent;\n\t};\n\troute_update?: {\n\t\tprevious_route: RouteState | null;\n\t\treason: RouteUpdateReason;\n\t\troute: RouteState;\n\t};\n\twork?: WorkState;\n};\n\nexport type CommitFn = (commit: ClientCommit) => void;\n\nexport type ViewDefinition = {\n\tpattern: string;\n\tcomponent: (props: any) => any;\n\terror_boundary?: (props: { error: unknown }) => any;\n\tclient_loader?: ClientLoaderFn;\n\tbefore_route_commit?: BeforeRouteCommitFn;\n\tbefore_route_yield?: BeforeRouteYieldFn;\n};\n\ntype ClientLoaderFn = (args: {\n\ttrigger: \"boot\" | \"navigation\" | \"revalidation\" | \"prefetch\";\n\thref: string;\n\thistoryState: unknown;\n\tpattern: string;\n\tparams: Record<string, string>;\n\tsplatValues: string[];\n\tinput: unknown;\n\tknownMatches: ClientLoaderKnownMatch[];\n\tserverPromise: Promise<ClientLoaderServerState>;\n\tsignal: AbortSignal;\n}) => Promise<unknown>;\n\ntype ClientLoaderKnownMatch = {\n\tpattern: string;\n\tinput: unknown;\n};\n\ntype ClientLoaderServerState = {\n\tclientBuildId: string;\n\tmatches: Array<{\n\t\tpattern: string;\n\t\tinput: unknown;\n\t\tviewData: unknown;\n\t}>;\n\toutermostServerError: null | {\n\t\tidx: number;\n\t\terror: unknown;\n\t};\n\tviewData: unknown;\n};\n\ntype ApiResult<T> =\n\t| {\n\t\t\tsuccess: true;\n\t\t\tdata: T;\n\t\t\tresponse: Response;\n\t\t\trevalidationPromise: Promise<RevalidationResult>;\n\t }\n\t| {\n\t\t\tsuccess: false;\n\t\t\terror: string;\n\t\t\tresponse?: Response;\n\t\t\trevalidationPromise: Promise<RevalidationResult>;\n\t };\n\nexport type ClientCore = {\n\tboot: (options: ClientOptions) => Promise<Result<void>>;\n\tworkIndicator: WorkIndicator;\n\tnavigate: (\n\t\thref: string | URL,\n\t\toptions?: {\n\t\t\treplace?: boolean;\n\t\t\tscrollToTop?: boolean;\n\t\t\tstate?: unknown;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t) => Promise<{ didNavigate: boolean }>;\n\trevalidate: () => Promise<RevalidationResult>;\n\tsubmit_inner: <T = unknown>(\n\t\turl: string | URL,\n\t\trequestInit?: RequestInit,\n\t\toptions?: {\n\t\t\tresourceKind?: ResourceKind;\n\t\t\tdedupeKey?: string;\n\t\t\trevalidate?: boolean;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t) => Promise<ApiResult<T>>;\n\tgetRouteState: () => RouteState;\n\tgetWorkState: () => WorkState;\n\tgetClientBuildId: () => string;\n\tgetRootEl: () => HTMLElement;\n\tdefineView: <T = any>(input: {\n\t\tpattern: string;\n\t\tcomponent: (props: any) => any;\n\t\terrorBoundary?: (props: { error: unknown }) => any;\n\t\tclientLoader?: (props: any) => Promise<T>;\n\t\tbeforeRouteCommit?: BeforeRouteCommitFn;\n\t\tbeforeRouteYield?: BeforeRouteYieldFn;\n\t\trunClientLoaderOnHmr?: boolean;\n\t}) => ViewDefinition & { __phantom_client_loader_data?: T };\n\tstart_prefetch: (href: string) => void;\n\tstop_prefetch: (href: string) => void;\n\tsave_current_scroll: () => void;\n\tget_default_error_boundary: () => ((props: { error: unknown }) => any) | undefined;\n};\n\n/////////////////////////////////////////////////////////////////////\n/////// Constants\n/////////////////////////////////////////////////////////////////////\n\nexport const MAX_SCROLL_ENTRIES = 50;\nexport const REFRESH_MAX_AGE_MS = 3333;\nexport const MAX_REDIRECTS = 10;\nexport const REVALIDATION_DEBOUNCE_MS = 8;\nexport const MAX_REVALIDATION_RETRIES = 8;\nexport const REVALIDATION_BACKOFF_BASE_MS = 500;\nexport const REVALIDATION_BACKOFF_CAP_MS = 30000;\n\nconst REVALIDATION_OK: RevalidationResult = { ok: true };\nconst REVALIDATION_BUILD_SKEW: RevalidationResult = {\n\tok: false,\n\treason: \"build_skew\",\n};\nconst REVALIDATION_EXHAUSTED: RevalidationResult = {\n\tok: false,\n\treason: \"max_retries_exhausted\",\n};\nlet focus_revalidation_cleanup: (() => void) | null = null;\n\n/////////////////////////////////////////////////////////////////////\n/////// Module-Level Utilities\n/////////////////////////////////////////////////////////////////////\n\ntype TestOptions = {\n\treload?: () => void;\n\thard_redirect?: (url: string) => void;\n\tscroll_to?: (x: number, y: number) => void;\n};\n\nexport function apply_scroll(\n\tscroll: ScrollState | undefined,\n\ttest_options?: TestOptions,\n): void {\n\tif (!scroll) {\n\t\treturn;\n\t}\n\tif (\"hash\" in scroll) {\n\t\tconst raw = scroll.hash.startsWith(\"#\") ? scroll.hash.slice(1) : scroll.hash;\n\t\tlet id: string;\n\t\ttry {\n\t\t\tid = decodeURIComponent(raw);\n\t\t} catch {\n\t\t\tid = raw;\n\t\t}\n\t\tdocument.getElementById(id)?.scrollIntoView();\n\t\treturn;\n\t}\n\tconst scroll_to =\n\t\ttest_options?.scroll_to ??\n\t\t((x: number, y: number) => {\n\t\t\twindow.scrollTo(x, y);\n\t\t});\n\tscroll_to(scroll.x, scroll.y);\n}\n\nexport function make_entry_id(idx: number, pattern: string): string {\n\treturn `${idx}:${pattern}`;\n}\n\nfunction is_abort_error(e: unknown): boolean {\n\treturn e instanceof DOMException && e.name === \"AbortError\";\n}\n\nfunction new_abort_error(): DOMException {\n\treturn new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction to_error_string(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction normalize_module_url(url: string): string {\n\treturn new URL(url, window.location.href).pathname;\n}\n\ntype Deferred<T> = {\n\tpromise: Promise<T>;\n\tresolve: (value: T) => void;\n};\n\nfunction make_deferred<T>(): Deferred<T> {\n\tlet resolve!: (v: T) => void;\n\tconst promise = new Promise<T>((r) => {\n\t\tresolve = r;\n\t});\n\treturn { promise, resolve };\n}\n\ntype WorkIndicatorController = {\n\tindicator: WorkIndicator;\n\tconfigure: (options: WorkIndicatorOptions | undefined) => void;\n\tset_vorma_active: (active: boolean) => void;\n};\n\nfunction create_work_indicator(): WorkIndicatorController {\n\tlet options: WorkIndicatorOptions | undefined;\n\tlet visible = false;\n\tlet show_timer: number | undefined;\n\tlet hide_timer: number | undefined;\n\tconst active_tokens = new Set<symbol>();\n\tlet release_vorma_work: (() => void) | undefined;\n\n\tfunction clear_show_timer(): void {\n\t\tif (show_timer === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tclearTimeout(show_timer);\n\t\tshow_timer = undefined;\n\t}\n\n\tfunction clear_hide_timer(): void {\n\t\tif (hide_timer === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tclearTimeout(hide_timer);\n\t\thide_timer = undefined;\n\t}\n\n\tfunction sync(): void {\n\t\tconst current_options = options;\n\t\tif (!current_options) {\n\t\t\tclear_show_timer();\n\t\t\tclear_hide_timer();\n\t\t\treturn;\n\t\t}\n\n\t\tif (active_tokens.size > 0) {\n\t\t\tclear_hide_timer();\n\t\t\tif (visible || show_timer !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tshow_timer = window.setTimeout(() => {\n\t\t\t\tshow_timer = undefined;\n\t\t\t\tconst latest_options = options;\n\t\t\t\tif (!latest_options || active_tokens.size === 0 || visible) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlatest_options.start();\n\t\t\t\tvisible = true;\n\t\t\t}, current_options.startDelayMs ?? 12);\n\t\t\treturn;\n\t\t}\n\n\t\tclear_show_timer();\n\t\tif (!visible) {\n\t\t\treturn;\n\t\t}\n\t\tif (hide_timer !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\thide_timer = window.setTimeout(() => {\n\t\t\thide_timer = undefined;\n\t\t\tconst latest_options = options;\n\t\t\tif (!latest_options || active_tokens.size > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlatest_options.stop();\n\t\t\tvisible = false;\n\t\t}, current_options.stopDelayMs ?? 12);\n\t}\n\n\tfunction begin(): () => void {\n\t\tconst token = Symbol(\"v-work-indicator\");\n\t\tlet released = false;\n\t\tactive_tokens.add(token);\n\t\tsync();\n\t\treturn () => {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tactive_tokens.delete(token);\n\t\t\tsync();\n\t\t};\n\t}\n\n\tfunction configure(next_options: WorkIndicatorOptions | undefined): void {\n\t\tconst previous_options = options;\n\t\tclear_show_timer();\n\t\tclear_hide_timer();\n\t\tif (visible && previous_options && previous_options !== next_options) {\n\t\t\tprevious_options.stop();\n\t\t\tvisible = false;\n\t\t}\n\t\toptions = next_options;\n\t\tsync();\n\t}\n\n\tfunction set_vorma_active(active: boolean): void {\n\t\tif (active) {\n\t\t\tif (!release_vorma_work) {\n\t\t\t\trelease_vorma_work = begin();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (!release_vorma_work) {\n\t\t\tsync();\n\t\t\treturn;\n\t\t}\n\t\trelease_vorma_work();\n\t\trelease_vorma_work = undefined;\n\t}\n\n\treturn {\n\t\tindicator: {\n\t\t\ttrack: async <T>(promise: PromiseLike<T>): Promise<T> => {\n\t\t\t\tconst release = begin();\n\t\t\t\treturn Promise.resolve(promise).finally(() => {\n\t\t\t\t\trelease();\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (): boolean => {\n\t\t\t\treturn active_tokens.size > 0;\n\t\t\t},\n\t\t},\n\t\tconfigure,\n\t\tset_vorma_active,\n\t};\n}\n\n/////////////////////////////////////////////////////////////////////\n/////// Client Core\n/////////////////////////////////////////////////////////////////////\n\nexport function create_client_core(\n\t_: Omit<AppConfig, \"__vorma_views\" | \"__vorma_resources\">,\n\tcommit: CommitFn,\n\ttest_options?: TestOptions,\n): Result<ClientCore> {\n\t/////// Internal Types\n\n\ttype HistoryPosition = {\n\t\thref: string;\n\t\tkey: string;\n\t\tstate: unknown;\n\t};\n\n\ttype RouteSnapshot = {\n\t\tposition: HistoryPosition;\n\t\troute: RouteRecord;\n\t};\n\n\ttype RouteRecord = {\n\t\tparams: Record<string, string>;\n\t\tsplat_values: string[];\n\t\tmatches: RouteMatchRecord[];\n\t\terror: RouteErrorState | null;\n\t\tclient_build_id: string;\n\t};\n\n\ttype RouteMatchRecord = {\n\t\tpattern: string;\n\t\tinput: unknown;\n\t\tmodule_url: string;\n\t\thmr_version: number;\n\t\tmodule: Record<string, unknown>;\n\t\tview_data: unknown;\n\t\tclient_loader_data: unknown;\n\t};\n\n\ttype RouteRenderCommitReason =\n\t\t| \"initial\"\n\t\t| \"navigation\"\n\t\t| \"popstate\"\n\t\t| \"revalidation\"\n\t\t| \"hmr\";\n\n\ttype WorkProjection =\n\t\t| {\n\t\t\t\tkind: \"navigation\";\n\t\t\t\tskip_work_indicator?: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"revalidation\";\n\t\t\t\tskip_work_indicator?: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"apiRequest\";\n\t\t\t\tskip_work_indicator?: boolean;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"prefetch\";\n\t\t };\n\n\ttype NavOptions = {\n\t\treplace?: boolean;\n\t\tscroll_to_top?: boolean;\n\t\tstate?: unknown;\n\t\tis_popstate?: boolean;\n\t\tpopstate_scroll?: ScrollState;\n\t\tskip_work_indicator?: boolean;\n\t};\n\n\ttype NavResult = { didNavigate: boolean };\n\n\ttype RedirectResult = \"settled\" | \"transferred\";\n\n\ttype NavigationSource = \"navigate\" | \"popstate\" | \"redirect\";\n\n\ttype NavFetchIntent = {\n\t\tkind: \"nav\";\n\t\turl: URL;\n\t\toptions: NavOptions;\n\t\tsource: NavigationSource;\n\t\tredirect_count: number;\n\t\tdeferred: Deferred<NavResult>;\n\t};\n\n\ttype RevalidationFetchIntent = {\n\t\tkind: \"reval\";\n\t\tattempt: number;\n\t\treason: RevalidationReason;\n\t\tskip_work_indicator?: boolean;\n\t};\n\n\ttype ActiveFetchIntent = NavFetchIntent | RevalidationFetchIntent;\n\n\ttype PrefetchFetchIntent = { kind: \"prefetch\" };\n\n\ttype FetchIntent = ActiveFetchIntent | PrefetchFetchIntent;\n\n\ttype FetchBase = {\n\t\turl: URL; // what we asked the server for (minus hash sensitivity)\n\t\tac: AbortController;\n\t\tseq: number;\n\t\tdata_promise: Promise<FetchResult>;\n\t\tcl_prefetches: ClientLoaderPrefetch[];\n\t\tcl_prefetches_ready: Promise<void>;\n\t};\n\n\ttype ActiveFetch = FetchBase & {\n\t\t// Resolves when prefetch-phase preparation (modules, client-loader\n\t\t// prefetch seeding) is done after a prefetch is promoted.\n\t\tprepare_ready: Promise<void>;\n\t\tintent: ActiveFetchIntent;\n\t};\n\n\ttype PrefetchFetch = FetchBase & {\n\t\tis_pending: boolean;\n\t\tprepare_ready: Promise<void>;\n\t\tintent: PrefetchFetchIntent;\n\t};\n\n\ttype FetchResult =\n\t\t| { kind: \"data\"; data: unknown; response: Response }\n\t\t| { kind: \"build_skew\"; response: Response }\n\t\t| { kind: \"redirect\"; href: string; hard: boolean; response: Response }\n\t\t| {\n\t\t\t\tkind: \"error\";\n\t\t\t\tstatus: number;\n\t\t\t\tstatus_text: string;\n\t\t\t\tresponse?: Response;\n\t\t };\n\n\ttype ClientLoaderPrefetch = {\n\t\tpattern: string;\n\t\tresolve_server_state: (data: ClientLoaderServerState) => void;\n\t\tabort: () => void;\n\t\tresult_promise: Promise<unknown>;\n\t};\n\n\ttype DecodedRoute = {\n\t\tpattern: string;\n\t\tinput: unknown;\n\t\tmodule_url: string;\n\t\tview_data: unknown;\n\t\tserver_error: unknown;\n\t};\n\n\ttype DecodedPayload = {\n\t\troutes: DecodedRoute[];\n\t\tparams: Record<string, string>;\n\t\tsplat_values: string[];\n\t\ttitle: string | undefined;\n\t\tmeta_head_els: HeadEl[];\n\t\trest_head_els: HeadEl[];\n\t\tcss_bundles: string[];\n\t\tdeps: string[];\n\t};\n\n\ttype PreparedRoute = {\n\t\troute: RouteRecord;\n\t\tapply_dom_side_effects: () => void;\n\t};\n\n\ttype Submission = {\n\t\tac: AbortController;\n\t\tdeferred: Deferred<ApiResult<unknown>>;\n\t\tdid_dispatch: boolean;\n\t\tkey: string;\n\t\tmethod: string;\n\t\thref: string;\n\t\trevalidation_promise: Promise<RevalidationResult>;\n\t\tsettled: boolean;\n\t\tshould_revalidate: boolean;\n\t\tskip_work_indicator?: boolean;\n\t};\n\n\ttype RefreshWaiter = Deferred<RevalidationResult>;\n\n\ttype RefreshDemand = {\n\t\t// A fetch with seq > this value satisfies the demand.\n\t\tafter_seq: number;\n\t\treason: RevalidationReason;\n\t\tskip_work_indicator?: boolean;\n\t\twaiters: RefreshWaiter[];\n\t};\n\n\ttype RefreshState =\n\t\t| { kind: \"idle\" }\n\t\t| { kind: \"pending\"; demand: RefreshDemand; attempt: number }\n\t\t| {\n\t\t\t\tkind: \"debouncing\";\n\t\t\t\tdemand: RefreshDemand;\n\t\t\t\ttimer: ReturnType<typeof setTimeout>;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"retrying\";\n\t\t\t\tdemand: RefreshDemand;\n\t\t\t\tattempt: number;\n\t\t\t\ttimer: ReturnType<typeof setTimeout>;\n\t\t };\n\n\ttype StoredScrollEntry = [string, { x: number; y: number }];\n\n\t/*\n\tNine base facts:\n\n\t 1. phase: router lifecycle ('booting' | 'ready')\n\t 2. browser: the browser's current history entry\n\t 3. route_snapshot: current RouteState data available to Vorma APIs\n\t 4. active: the one in-flight nav or revalidation (at most one, ever)\n\t 5. prefetch: the at-most-one in-flight prefetch\n\t 6. refresh: outstanding view-data demand and its retry timing\n\t 7. apiRequests: concurrent API requests (independent of routes)\n\t 8. deferred_submit_redirect: submit redirect waiting for boot completion\n\t 9. seq: monotonic counter; refresh is ordered by seq, never wall clock\n\n\tAborting a fetch and publishing a route are each single operations.\n\n\tWorkProjection and WorkState are derived from these facts. RouteRenderState\n\tis derived only at the adapter commit boundary.\n\t*/\n\n\t/////// Base Facts\n\n\tlet phase: \"booting\" | \"ready\" = \"booting\";\n\tlet browser: HistoryPosition = { href: \"\", key: \"\", state: undefined };\n\tlet route_snapshot: RouteSnapshot | null = null;\n\tlet active: ActiveFetch | null = null;\n\tlet prefetch: PrefetchFetch | null = null;\n\tlet refresh: RefreshState = { kind: \"idle\" };\n\tconst submissions = new Map<string, Submission>();\n\tlet seq = 0;\n\n\t/////// Config And Listeners\n\n\tlet client_build_id = \"\";\n\tlet deployment_id = \"\";\n\tlet use_view_transitions = false;\n\tlet default_error_boundary: ((props: { error: unknown }) => any) | undefined;\n\tlet user_on_route_update:\n\t\t| ((\n\t\t\t\troute: RouteState,\n\t\t\t\tpreviousRoute: RouteState | null,\n\t\t\t\treason: RouteUpdateReason,\n\t\t ) => void)\n\t\t| undefined;\n\tlet user_on_work_update: ((work: WorkState) => void) | undefined;\n\tlet user_on_build_skew_detected:\n\t\t| ((event: BuildSkewDetectedEvent) => void)\n\t\t| undefined;\n\tlet deferred_submit_redirect: URL | null = null;\n\tlet last_activity_ts = Date.now();\n\tlet last_work_state: WorkState = empty_work_state();\n\tlet route_matcher: ClientMatcher | null = null;\n\tconst queued_route_patterns = new Set<string>();\n\tconst route_matcher_ready = create_client_matcher()\n\t\t.then((matcher) => {\n\t\t\troute_matcher = matcher;\n\t\t\tfor (const pattern of queued_route_patterns) {\n\t\t\t\tmatcher.register_pattern(pattern);\n\t\t\t}\n\t\t})\n\t\t.catch(() => {});\n\n\tconst work_indicator = create_work_indicator();\n\tlet work_indicator_options: WorkIndicatorOptions | undefined;\n\tlet work_indicator_sync_registered = false;\n\tconst work_update_listeners = new Set<(work: WorkState) => void>();\n\tconst client_loader_map: Record<string, ClientLoaderFn> = {};\n\tconst search_schema_map: Record<string, unknown> = {};\n\tconst hmr_rerun_patterns = new Set<string>();\n\tconst module_cache = new Map<string, Record<string, unknown>>();\n\tconst hmr_version_map = new Map<string, number>();\n\n\tconst reload_page =\n\t\ttest_options?.reload ??\n\t\t(() => {\n\t\t\twindow.location.reload();\n\t\t});\n\tconst hard_redirect =\n\t\ttest_options?.hard_redirect ??\n\t\t((url: string) => {\n\t\t\twindow.location.assign(url);\n\t\t});\n\n\t/////// Client Matcher\n\n\tfunction register_route_pattern(pattern: string): void {\n\t\tif (queued_route_patterns.has(pattern)) {\n\t\t\treturn;\n\t\t}\n\t\tqueued_route_patterns.add(pattern);\n\t\troute_matcher?.register_pattern(pattern);\n\t}\n\n\t// If the full path does not match, find_client_view_match tries progressively\n\t// shorter path prefixes: `/a/b/c`, then `/a/b`, then `/a`, then `/`. The reason\n\t// is that the client matcher only knows patterns for view modules that have\n\t// already been loaded and that have client loaders registered. So if the user\n\t// navigates to `/parent/child`, but the client currently only knows `/parent`,\n\t// exact matching would return null even though `/parent` is a real parent view\n\t// whose client loader can and must be started early.\n\tfunction find_client_view_match(path: string): ClientMatcherNestedMatch | null {\n\t\tconst matcher = route_matcher;\n\t\tif (!matcher) {\n\t\t\treturn null;\n\t\t}\n\t\tlet match = matcher.find_nested_matches(path);\n\t\tif (match) {\n\t\t\treturn match;\n\t\t}\n\t\tconst segments = path.split(\"/\").filter(Boolean);\n\t\tfor (let i = segments.length; i >= 0; i--) {\n\t\t\tconst partial = i === 0 ? \"/\" : \"/\" + segments.slice(0, i).join(\"/\");\n\t\t\tmatch = matcher.find_nested_matches(partial);\n\t\t\tif (match) {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/////// URL And History\n\n\tfunction current_url(): URL {\n\t\treturn new URL(window.location.href);\n\t}\n\n\tfunction next_seq(): number {\n\t\tseq++;\n\t\treturn seq;\n\t}\n\n\tfunction is_http(href: string): boolean {\n\t\ttry {\n\t\t\tconst p = new URL(href).protocol;\n\t\t\treturn p === \"http:\" || p === \"https:\";\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction is_same_origin(url: URL): boolean {\n\t\treturn url.origin === current_url().origin;\n\t}\n\n\tfunction is_same_origin_href(href: string): boolean {\n\t\ttry {\n\t\t\treturn new URL(href).origin === current_url().origin;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction matches_without_hash(a: URL, b: URL): boolean {\n\t\tconst x = new URL(a.href);\n\t\tx.hash = \"\";\n\t\tconst y = new URL(b.href);\n\t\ty.hash = \"\";\n\t\treturn x.href === y.href;\n\t}\n\n\tfunction route_snapshot_matches(url: URL): boolean {\n\t\treturn (\n\t\t\troute_snapshot !== null &&\n\t\t\tmatches_without_hash(url, new URL(route_snapshot.position.href))\n\t\t);\n\t}\n\n\tfunction normalize_hash(hash: string): string {\n\t\tconst s = hash.startsWith(\"#\") ? hash.slice(1) : hash;\n\t\tif (s.length === 0) {\n\t\t\treturn s;\n\t\t}\n\t\ttry {\n\t\t\treturn decodeURIComponent(s);\n\t\t} catch {\n\t\t\treturn s;\n\t\t}\n\t}\n\n\tfunction make_history_key(): string {\n\t\treturn Math.random().toString(36).slice(2, 10);\n\t}\n\n\tfunction read_browser_position(): HistoryPosition {\n\t\tconst state = window.history.state;\n\t\tconst key =\n\t\t\tstate && typeof state === \"object\" && HISTORY_KEY_FIELD in state\n\t\t\t\t? (state as Record<string, string>)[HISTORY_KEY_FIELD]!\n\t\t\t\t: \"\";\n\t\treturn {\n\t\t\thref: current_url().href,\n\t\t\tkey,\n\t\t\tstate: state?.[HISTORY_USER_STATE_FIELD],\n\t\t};\n\t}\n\n\tfunction commit_history(\n\t\turl: string,\n\t\treplace: boolean | undefined,\n\t\tuser_state: unknown,\n\t): HistoryPosition {\n\t\tconst key = make_history_key();\n\t\tconst next_state: Record<string, unknown> = {\n\t\t\t[HISTORY_KEY_FIELD]: key,\n\t\t\t[HISTORY_USER_STATE_FIELD]: user_state,\n\t\t};\n\n\t\tif (replace) {\n\t\t\tconst existing = window.history.state;\n\t\t\tconst base = existing && typeof existing === \"object\" ? existing : {};\n\t\t\twindow.history.replaceState({ ...(base as object), ...next_state }, \"\", url);\n\t\t} else {\n\t\t\twindow.history.pushState(next_state, \"\", url);\n\t\t}\n\n\t\tbrowser = { href: url, key, state: user_state };\n\t\treturn browser;\n\t}\n\n\tfunction route_snapshot_matches_browser(): boolean {\n\t\treturn (\n\t\t\troute_snapshot !== null &&\n\t\t\troute_snapshot.position.href === browser.href &&\n\t\t\troute_snapshot.position.key === browser.key\n\t\t);\n\t}\n\n\t/////// Scroll Storage\n\n\tfunction get_scroll_pos(): { x: number; y: number } {\n\t\treturn { x: window.scrollX, y: window.scrollY };\n\t}\n\n\tfunction read_scroll_entries(): StoredScrollEntry[] {\n\t\ttry {\n\t\t\tconst raw = sessionStorage.getItem(SCROLL_STORAGE_KEY);\n\t\t\tif (!raw) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst parsed = JSON.parse(raw);\n\t\t\tif (!Array.isArray(parsed)) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn parsed.filter((e: unknown): e is StoredScrollEntry => {\n\t\t\t\treturn (\n\t\t\t\t\tArray.isArray(e) &&\n\t\t\t\t\te.length === 2 &&\n\t\t\t\t\ttypeof e[0] === \"string\" &&\n\t\t\t\t\t!!e[1] &&\n\t\t\t\t\ttypeof e[1] === \"object\" &&\n\t\t\t\t\tNumber.isFinite((e[1] as any).x) &&\n\t\t\t\t\tNumber.isFinite((e[1] as any).y)\n\t\t\t\t);\n\t\t\t});\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tfunction save_scroll_for_key(key: string, pos: { x: number; y: number }): void {\n\t\tconst entries = read_scroll_entries().filter((e) => e[0] !== key);\n\t\tentries.push([key, pos]);\n\t\tif (entries.length > MAX_SCROLL_ENTRIES) {\n\t\t\tentries.splice(0, entries.length - MAX_SCROLL_ENTRIES);\n\t\t}\n\t\ttry {\n\t\t\tsessionStorage.setItem(SCROLL_STORAGE_KEY, JSON.stringify(entries));\n\t\t} catch {}\n\t}\n\n\tfunction get_scroll_for_key(key: string): { x: number; y: number } | undefined {\n\t\tfor (const [k, v] of read_scroll_entries()) {\n\t\t\tif (k === key) {\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tfunction save_current_scroll(): void {\n\t\tif (browser.key) {\n\t\t\tsave_scroll_for_key(browser.key, get_scroll_pos());\n\t\t}\n\t}\n\n\t/////// Payload Decoding\n\n\tfunction decode_payload(raw: unknown, url: URL): DecodedPayload {\n\t\tconst p = raw as Record<string, any>;\n\t\tconst patterns: string[] = p.matched_patterns ?? [];\n\t\tconst schemas: unknown[] = Array.isArray(p.search_schemas)\n\t\t\t? p.search_schemas\n\t\t\t: [];\n\t\tconst views_data: unknown[] = p.views_data ?? [];\n\t\tconst import_urls: string[] = p.import_urls ?? [];\n\t\tconst err_idx: number | null = p.outermost_server_err_idx ?? null;\n\t\tconst err_msg: string = p.outermost_server_err ?? \"\";\n\t\tconst search_params = url.searchParams;\n\n\t\tconst routes: DecodedRoute[] = patterns.map((pattern, i) => {\n\t\t\tconst schema = schemas[i];\n\t\t\tsearch_schema_map[pattern] = schema;\n\t\t\treturn {\n\t\t\t\tpattern,\n\t\t\t\tinput: parseSearchParams(schema, search_params),\n\t\t\t\tmodule_url: import_urls[i] ?? \"\",\n\t\t\t\tview_data: views_data[i],\n\t\t\t\tserver_error: err_idx !== null && i === err_idx ? err_msg : undefined,\n\t\t\t};\n\t\t});\n\n\t\tlet title: string | undefined;\n\t\tif (p.title?.dangerous_inner_html !== undefined) {\n\t\t\tconst el = document.createElement(\"textarea\");\n\t\t\tel.innerHTML = p.title.dangerous_inner_html;\n\t\t\ttitle = el.value;\n\t\t}\n\n\t\treturn {\n\t\t\troutes,\n\t\t\tparams: p.params ?? {},\n\t\t\tsplat_values: p.splat_values ?? [],\n\t\t\ttitle,\n\t\t\tmeta_head_els: p.meta_head_els ?? [],\n\t\t\trest_head_els: p.rest_head_els ?? [],\n\t\t\tcss_bundles: p.css_bundles ?? [],\n\t\t\tdeps: p.deps ?? [],\n\t\t};\n\t}\n\n\t/////// Modules And Client Loader Prefetches\n\n\tfunction make_cl_prefetch(input: {\n\t\thref: string;\n\t\thistory_state: unknown;\n\t\tknown_matches: ClientLoaderKnownMatch[];\n\t\tclient_loader: ClientLoaderFn;\n\t\tparams: Record<string, string>;\n\t\tpattern: string;\n\t\troute_input: unknown;\n\t\tsignal: AbortSignal;\n\t\tsplat_values: string[];\n\t\ttrigger: \"navigation\" | \"revalidation\" | \"prefetch\";\n\t}): ClientLoaderPrefetch {\n\t\tlet resolve_server_state!: (v: ClientLoaderServerState) => void;\n\t\tlet reject_server_state!: (err: unknown) => void;\n\t\tconst server_promise = new Promise<ClientLoaderServerState>((res, rej) => {\n\t\t\tresolve_server_state = res;\n\t\t\treject_server_state = rej;\n\t\t});\n\t\tserver_promise.catch(() => {});\n\n\t\tconst ac = new AbortController();\n\t\tif (input.signal.aborted) {\n\t\t\tac.abort();\n\t\t\treject_server_state(new_abort_error());\n\t\t} else {\n\t\t\tinput.signal.addEventListener(\n\t\t\t\t\"abort\",\n\t\t\t\t() => {\n\t\t\t\t\tac.abort();\n\t\t\t\t\treject_server_state(new_abort_error());\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t);\n\t\t}\n\n\t\tconst result_promise = input.client_loader({\n\t\t\ttrigger: input.trigger,\n\t\t\thref: input.href,\n\t\t\thistoryState: input.history_state,\n\t\t\tpattern: input.pattern,\n\t\t\tparams: input.params,\n\t\t\tsplatValues: input.splat_values,\n\t\t\tinput: input.route_input,\n\t\t\tknownMatches: input.known_matches,\n\t\t\tserverPromise: server_promise,\n\t\t\tsignal: ac.signal,\n\t\t});\n\t\tresult_promise.catch(() => {});\n\n\t\treturn {\n\t\t\tpattern: input.pattern,\n\t\t\tresolve_server_state,\n\t\t\tabort: () => {\n\t\t\t\tac.abort();\n\t\t\t\treject_server_state(new_abort_error());\n\t\t\t},\n\t\t\tresult_promise,\n\t\t};\n\t}\n\n\tfunction routes_to_known_matches(routes: DecodedRoute[]): ClientLoaderKnownMatch[] {\n\t\treturn routes.map((r) => {\n\t\t\treturn {\n\t\t\t\tpattern: r.pattern,\n\t\t\t\tinput: r.input,\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction build_server_state(\n\t\troutes: DecodedRoute[],\n\t\tidx: number,\n\t): ClientLoaderServerState {\n\t\tconst err_idx = routes.findIndex((r) => {\n\t\t\treturn r.server_error !== undefined;\n\t\t});\n\t\treturn {\n\t\t\tclientBuildId: client_build_id,\n\t\t\tmatches: routes.map((r) => {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: r.pattern,\n\t\t\t\t\tinput: r.input,\n\t\t\t\t\tviewData: r.view_data,\n\t\t\t\t};\n\t\t\t}),\n\t\t\toutermostServerError:\n\t\t\t\terr_idx === -1\n\t\t\t\t\t? null\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tidx: err_idx,\n\t\t\t\t\t\t\terror: routes[err_idx]!.server_error,\n\t\t\t\t\t\t},\n\t\t\tviewData: routes[idx]?.view_data,\n\t\t};\n\t}\n\n\tasync function run_client_loaders(\n\t\troutes: DecodedRoute[],\n\t\tpayload: DecodedPayload,\n\t\tcl_prefetches: ClientLoaderPrefetch[],\n\t\ttrigger: \"boot\" | \"navigation\" | \"revalidation\",\n\t\thref: string,\n\t\thistory_state: unknown,\n\t\tsignal: AbortSignal,\n\t): Promise<Array<{ data: unknown } | { error: unknown } | undefined>> {\n\t\tconst by_pattern = new Map<string, ClientLoaderPrefetch>();\n\t\tfor (const p of cl_prefetches) {\n\t\t\tby_pattern.set(p.pattern, p);\n\t\t}\n\t\tconst err_idx = routes.findIndex((r) => r.server_error !== undefined);\n\t\tconst known_matches = routes_to_known_matches(routes);\n\n\t\tconst abort_later: Array<(() => void) | null> = [];\n\t\tconst promises: Array<Promise<unknown>> = [];\n\t\tconst retained_prefetches = new Set<ClientLoaderPrefetch>();\n\n\t\tfor (let i = 0; i < routes.length; i++) {\n\t\t\tconst route = routes[i]!;\n\t\t\tconst existing = by_pattern.get(route.pattern);\n\t\t\tif (err_idx !== -1 && i >= err_idx) {\n\t\t\t\texisting?.abort();\n\t\t\t\tpromises.push(Promise.resolve(undefined));\n\t\t\t\tabort_later.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (existing) {\n\t\t\t\texisting.resolve_server_state(build_server_state(routes, i));\n\t\t\t\tretained_prefetches.add(existing);\n\t\t\t\tabort_later.push(existing.abort);\n\t\t\t\tpromises.push(existing.result_promise);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst client_loader = client_loader_map[route.pattern];\n\t\t\tif (!client_loader) {\n\t\t\t\tpromises.push(Promise.resolve(undefined));\n\t\t\t\tabort_later.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst ac = new AbortController();\n\t\t\tabort_later.push(() => {\n\t\t\t\tac.abort();\n\t\t\t});\n\t\t\tif (signal.aborted) {\n\t\t\t\tac.abort();\n\t\t\t} else {\n\t\t\t\tsignal.addEventListener(\"abort\", () => ac.abort(), {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tpromises.push(\n\t\t\t\tclient_loader({\n\t\t\t\t\ttrigger,\n\t\t\t\t\thref,\n\t\t\t\t\thistoryState: history_state,\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\tparams: payload.params,\n\t\t\t\t\tsplatValues: payload.splat_values,\n\t\t\t\t\tinput: route.input,\n\t\t\t\t\tknownMatches: known_matches,\n\t\t\t\t\tserverPromise: Promise.resolve(build_server_state(routes, i)),\n\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tfor (const p of cl_prefetches) {\n\t\t\tif (!retained_prefetches.has(p)) {\n\t\t\t\tp.abort();\n\t\t\t}\n\t\t}\n\n\t\tconst wrapped = promises.map(async (p, i) => {\n\t\t\treturn p.catch((err) => {\n\t\t\t\t// On non-abort failure, cascade abort to later routes to avoid\n\t\t\t\t// running client loaders that can never be used.\n\t\t\t\tif (!is_abort_error(err)) {\n\t\t\t\t\tfor (let j = i + 1; j < abort_later.length; j++) {\n\t\t\t\t\t\tabort_later[j]?.();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t});\n\n\t\tconst settled = await Promise.allSettled(wrapped);\n\t\tconst out: Array<{ data: unknown } | { error: unknown } | undefined> = [];\n\t\tfor (const r of settled) {\n\t\t\tif (r.status === \"fulfilled\") {\n\t\t\t\tout.push(r.value !== undefined ? { data: r.value } : undefined);\n\t\t\t} else if (!is_abort_error(r.reason)) {\n\t\t\t\tout.push({ error: to_error_string(r.reason) });\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tout.push(undefined);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\t/////// Route Preparation\n\n\tasync function prepare_modules(\n\t\tpayload: DecodedPayload,\n\t\tsignal: AbortSignal,\n\t): Promise<Map<string, Record<string, unknown>> | null> {\n\t\tpreload_css(payload.css_bundles);\n\t\tconst urls = payload.routes.map((r) => {\n\t\t\treturn r.module_url;\n\t\t});\n\t\tconst unique = [...new Set(urls.filter(Boolean))];\n\t\tconst pairs = await Promise.all(\n\t\t\tunique.map(async (url) => {\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconst key = normalize_module_url(url);\n\t\t\t\t\tconst cached = module_cache.get(key);\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\treturn [url, cached] as const;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst mod = (await import(/* @vite-ignore */ url)) as Record<\n\t\t\t\t\tstring,\n\t\t\t\t\tunknown\n\t\t\t\t>;\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tmodule_cache.set(normalize_module_url(url), mod);\n\t\t\t\t}\n\t\t\t\treturn [url, mod] as const;\n\t\t\t}),\n\t\t);\n\t\tconst modules = new Map(pairs);\n\t\tif (signal.aborted) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (const route of payload.routes) {\n\t\t\tconst mod = modules.get(route.module_url);\n\t\t\tif (!mod) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst def = mod.default as ViewDefinition | undefined;\n\t\t\tif (def?.client_loader) {\n\t\t\t\tclient_loader_map[route.pattern] = def.client_loader;\n\t\t\t\tregister_route_pattern(route.pattern);\n\t\t\t}\n\t\t}\n\t\treturn modules;\n\t}\n\n\tfunction build_route_record(\n\t\tpayload: DecodedPayload,\n\t\tmodules: Map<string, Record<string, unknown>>,\n\t\tcl_results: Array<{ data: unknown } | { error: unknown } | undefined>,\n\t): RouteRecord {\n\t\tconst matches: RouteMatchRecord[] = payload.routes.map((route, i) => {\n\t\t\tconst cl_res = cl_results[i];\n\t\t\treturn {\n\t\t\t\tpattern: route.pattern,\n\t\t\t\tinput: route.input,\n\t\t\t\tmodule_url: route.module_url,\n\t\t\t\thmr_version:\n\t\t\t\t\thmr_version_map.get(normalize_module_url(route.module_url)) ?? 0,\n\t\t\t\tmodule: modules.get(route.module_url) ?? {},\n\t\t\t\tview_data: route.view_data,\n\t\t\t\tclient_loader_data: cl_res && \"data\" in cl_res ? cl_res.data : undefined,\n\t\t\t};\n\t\t});\n\t\tlet error: RouteErrorState | null = null;\n\t\tconst server_error_idx = payload.routes.findIndex((route) => {\n\t\t\treturn route.server_error !== undefined;\n\t\t});\n\t\tif (server_error_idx !== -1) {\n\t\t\terror = {\n\t\t\t\tidx: server_error_idx,\n\t\t\t\terror: payload.routes[server_error_idx]!.server_error,\n\t\t\t\tsource: \"server\",\n\t\t\t};\n\t\t} else {\n\t\t\tconst client_loader_error_idx = cl_results.findIndex((cl_res) => {\n\t\t\t\treturn cl_res !== undefined && \"error\" in cl_res;\n\t\t\t});\n\t\t\tif (client_loader_error_idx !== -1) {\n\t\t\t\terror = {\n\t\t\t\t\tidx: client_loader_error_idx,\n\t\t\t\t\terror: (\n\t\t\t\t\t\tcl_results[client_loader_error_idx] as {\n\t\t\t\t\t\t\terror: unknown;\n\t\t\t\t\t\t}\n\t\t\t\t\t).error,\n\t\t\t\t\tsource: \"clientLoader\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tparams: payload.params,\n\t\t\tsplat_values: payload.splat_values,\n\t\t\tmatches,\n\t\t\terror,\n\t\t\tclient_build_id,\n\t\t};\n\t}\n\n\tasync function prepare_route(\n\t\tpayload: DecodedPayload,\n\t\tcl_prefetches: ClientLoaderPrefetch[],\n\t\ttrigger: \"navigation\" | \"revalidation\",\n\t\thref: string,\n\t\thistory_state: unknown,\n\t\tsignal: AbortSignal,\n\t): Promise<PreparedRoute | null> {\n\t\tconst modules = await prepare_modules(payload, signal);\n\t\tif (!modules) {\n\t\t\treturn null;\n\t\t}\n\t\tconst cl_results = await run_client_loaders(\n\t\t\tpayload.routes,\n\t\t\tpayload,\n\t\t\tcl_prefetches,\n\t\t\ttrigger,\n\t\t\thref,\n\t\t\thistory_state,\n\t\t\tsignal,\n\t\t);\n\t\tif (signal.aborted) {\n\t\t\treturn null;\n\t\t}\n\t\tawait wait_for_css(payload.css_bundles, signal);\n\t\tif (signal.aborted) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\troute: build_route_record(payload, modules, cl_results),\n\t\t\tapply_dom_side_effects: () => {\n\t\t\t\tapply_head_and_title(\n\t\t\t\t\tpayload.title,\n\t\t\t\t\tpayload.meta_head_els,\n\t\t\t\t\tpayload.rest_head_els,\n\t\t\t\t);\n\t\t\t\tapply_css_bundles(payload.css_bundles);\n\t\t\t\tpreload_modules(payload.deps);\n\t\t\t},\n\t\t};\n\t}\n\n\t/////// Fetch\n\n\tfunction detect_redirect(\n\t\tres: Response,\n\t\tbase: URL,\n\t): { href: string; hard: boolean } | null {\n\t\tconst soft = res.headers.get(X_CLIENT_REDIRECT);\n\t\tif (soft) {\n\t\t\treturn { href: new URL(soft, base).href, hard: false };\n\t\t}\n\t\tif (res.redirected && res.url && res.url !== base.href) {\n\t\t\treturn { href: new URL(res.url, base).href, hard: false };\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction report_build_skew(\n\t\tevent: Omit<\n\t\t\tBuildSkewDetectedEvent,\n\t\t\t| \"activeClientBuildId\"\n\t\t\t| \"currentRouteState\"\n\t\t\t| \"currentWorkState\"\n\t\t\t| \"serverBuildId\"\n\t\t> & {\n\t\t\tresponse: Response;\n\t\t},\n\t): boolean {\n\t\tconst server_build_id = event.response.headers.get(BUILD_ID_HEADER) ?? \"\";\n\t\tif (!server_build_id || server_build_id === client_build_id) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!route_snapshot) {\n\t\t\treturn false;\n\t\t}\n\t\tuser_on_build_skew_detected?.({\n\t\t\tactiveClientBuildId: client_build_id,\n\t\t\tserverBuildId: server_build_id,\n\t\t\ttriggeringResponse: event.triggeringResponse,\n\t\t\tcurrentRouteState: route_snapshot_to_state(route_snapshot),\n\t\t\tcurrentWorkState: derive_work_state(),\n\t\t});\n\t\treturn true;\n\t}\n\n\tfunction report_route_build_skew(\n\t\tf: FetchBase & { intent: FetchIntent },\n\t\tresponse: Response,\n\t): boolean {\n\t\tconst base = {\n\t\t\tkind: \"route\" as const,\n\t\t\trequestedHref: f.url.href,\n\t\t\tstatus: response.status,\n\t\t\tok: response.ok,\n\t\t};\n\t\tlet triggering_response: BuildSkewDetectedEvent[\"triggeringResponse\"];\n\t\tif (f.intent.kind === \"reval\") {\n\t\t\ttriggering_response = {\n\t\t\t\t...base,\n\t\t\t\ttrigger: \"revalidation\",\n\t\t\t\trevalidationReason: f.intent.reason,\n\t\t\t};\n\t\t} else if (f.intent.kind === \"prefetch\") {\n\t\t\ttriggering_response = {\n\t\t\t\t...base,\n\t\t\t\ttrigger: \"prefetch\",\n\t\t\t};\n\t\t} else {\n\t\t\ttriggering_response = {\n\t\t\t\t...base,\n\t\t\t\ttrigger: f.intent.source === \"popstate\" ? \"popstate\" : \"navigation\",\n\t\t\t};\n\t\t}\n\n\t\treturn report_build_skew({\n\t\t\tresponse,\n\t\t\ttriggeringResponse: triggering_response,\n\t\t});\n\t}\n\n\tfunction history_state_for_fetch(intent: FetchIntent): unknown {\n\t\tif (intent.kind === \"nav\") {\n\t\t\treturn intent.options.is_popstate ? browser.state : intent.options.state;\n\t\t}\n\t\tif (intent.kind === \"reval\") {\n\t\t\treturn browser.state;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/////// Fetch Lifecycle\n\n\tfunction start_fetch<T extends FetchIntent>(\n\t\turl: URL,\n\t\tintent: T,\n\t\tis_revalidation: boolean,\n\t\tprepare_ready?: Promise<void>,\n\t): FetchBase & { prepare_ready: Promise<void>; intent: T } {\n\t\tconst ac = new AbortController();\n\t\tconst cl_prefetches: ClientLoaderPrefetch[] = [];\n\t\tconst cl_prefetches_ready = route_matcher_ready\n\t\t\t.then(() => {\n\t\t\t\tif (ac.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst match = find_client_view_match(url.pathname);\n\t\t\t\tif (!match || ac.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst known_matches = match.patterns.map((pattern) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpattern,\n\t\t\t\t\t\tinput: parseSearchParams(\n\t\t\t\t\t\t\tsearch_schema_map[pattern],\n\t\t\t\t\t\t\turl.searchParams,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tconst input_by_pattern = new Map(\n\t\t\t\t\tknown_matches.map((m) => {\n\t\t\t\t\t\treturn [m.pattern, m.input] as const;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst history_state = history_state_for_fetch(intent);\n\t\t\t\tfor (const pattern of match.patterns) {\n\t\t\t\t\tconst client_loader = client_loader_map[pattern];\n\t\t\t\t\tif (client_loader) {\n\t\t\t\t\t\tcl_prefetches.push(\n\t\t\t\t\t\t\tmake_cl_prefetch({\n\t\t\t\t\t\t\t\thref: url.href,\n\t\t\t\t\t\t\t\thistory_state,\n\t\t\t\t\t\t\t\tknown_matches,\n\t\t\t\t\t\t\t\tclient_loader,\n\t\t\t\t\t\t\t\tparams: match.params,\n\t\t\t\t\t\t\t\tpattern,\n\t\t\t\t\t\t\t\troute_input: input_by_pattern.get(pattern),\n\t\t\t\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t\t\t\t\tsplat_values: match.splat_values,\n\t\t\t\t\t\t\t\ttrigger:\n\t\t\t\t\t\t\t\t\tintent.kind === \"prefetch\"\n\t\t\t\t\t\t\t\t\t\t? \"prefetch\"\n\t\t\t\t\t\t\t\t\t\t: intent.kind === \"reval\"\n\t\t\t\t\t\t\t\t\t\t\t? \"revalidation\"\n\t\t\t\t\t\t\t\t\t\t\t: \"navigation\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {});\n\t\treturn {\n\t\t\turl,\n\t\t\tac,\n\t\t\tseq: next_seq(),\n\t\t\tdata_promise: (async () => {\n\t\t\t\tconst modified = new URL(url.href);\n\t\t\t\tmodified.searchParams.set(VORMA_JSON_KEY, client_build_id);\n\t\t\t\tif (is_revalidation && deployment_id) {\n\t\t\t\t\tmodified.searchParams.set(VERCEL_DPL_QUERY_PARAM_KEY, deployment_id);\n\t\t\t\t}\n\t\t\t\tconst res = await fetch(modified, {\n\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t\theaders: { [X_ACCEPTS_CLIENT_REDIRECT]: \"1\" },\n\t\t\t\t});\n\n\t\t\t\tif (res.headers.get(X_VORMA_BUILD_SKEW) === \"1\") {\n\t\t\t\t\treturn { kind: \"build_skew\", response: res };\n\t\t\t\t}\n\t\t\t\tconst redirect = detect_redirect(res, modified);\n\t\t\t\tif (redirect) {\n\t\t\t\t\treturn { kind: \"redirect\", ...redirect, response: res };\n\t\t\t\t}\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"error\",\n\t\t\t\t\t\tstatus: res.status,\n\t\t\t\t\t\tstatus_text: res.statusText,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await res.json();\n\t\t\t\t\treturn { kind: \"data\", data, response: res };\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"error\",\n\t\t\t\t\t\tstatus: res.status,\n\t\t\t\t\t\tstatus_text: res.statusText,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t})(),\n\t\t\tcl_prefetches,\n\t\t\tcl_prefetches_ready,\n\t\t\tprepare_ready: prepare_ready ?? Promise.resolve(),\n\t\t\tintent,\n\t\t};\n\t}\n\n\tfunction resolve_nav(f: ActiveFetch, result: NavResult): void {\n\t\tif (f.intent.kind === \"nav\") {\n\t\t\tf.intent.deferred.resolve(result);\n\t\t}\n\t}\n\n\tfunction can_commit(f: ActiveFetch): boolean {\n\t\treturn active === f && !f.ac.signal.aborted;\n\t}\n\n\t// Core lifecycle for any fetch intent. The only place that drives\n\t// fetch-to-publish: resolve response, follow redirects, prepare, publish.\n\tasync function run_active(f: ActiveFetch): Promise<void> {\n\t\tactive = f;\n\t\tnotify_work_update();\n\n\t\tlet published = false;\n\t\tlet nav_transferred = false;\n\t\ttry {\n\t\t\tconst result = await f.data_promise;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.kind === \"build_skew\") {\n\t\t\t\treport_route_build_skew(f, result.response);\n\t\t\t\tif (f.intent.kind === \"reval\") {\n\t\t\t\t\tmark_refresh_build_skew();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\thard_redirect(f.url.href);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.response) {\n\t\t\t\tconst did_detect_skew = report_route_build_skew(f, result.response);\n\t\t\t\tif (\n\t\t\t\t\tdid_detect_skew &&\n\t\t\t\t\tresult.kind === \"redirect\" &&\n\t\t\t\t\tresult.hard &&\n\t\t\t\t\tf.intent.kind === \"reval\"\n\t\t\t\t) {\n\t\t\t\t\tmark_refresh_build_skew();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (result.kind === \"error\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.kind === \"redirect\") {\n\t\t\t\tnav_transferred = handle_redirect(f, result) === \"transferred\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst payload = decode_payload(result.data, f.url);\n\t\t\tpreload_modules(payload.deps);\n\n\t\t\tawait f.cl_prefetches_ready;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait f.prepare_ready;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prepared = await prepare_route(\n\t\t\t\tpayload,\n\t\t\t\tf.cl_prefetches,\n\t\t\t\tf.intent.kind === \"reval\" ? \"revalidation\" : \"navigation\",\n\t\t\t\tf.url.href,\n\t\t\t\thistory_state_for_fetch(f.intent),\n\t\t\t\tf.ac.signal,\n\t\t\t);\n\t\t\tif (!prepared || !can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst was_published = await publish(f, prepared);\n\t\t\tif (was_published) {\n\t\t\t\tpublished = true;\n\t\t\t\tlast_activity_ts = Date.now();\n\t\t\t\tmark_fresh(f);\n\t\t\t}\n\t\t} catch {\n\t\t\t// swallow\n\t\t} finally {\n\t\t\tif (f.intent.kind === \"nav\" && !nav_transferred) {\n\t\t\t\tresolve_nav(f, { didNavigate: published });\n\t\t\t}\n\t\t\tif (active === f) {\n\t\t\t\tactive = null;\n\t\t\t}\n\t\t\tnotify_work_update();\n\t\t\tmaybe_revalidate();\n\t\t}\n\t}\n\n\t// Publish a prepared route. Clears `active` as soon as the commit lands\n\t// inside the view transition so subsequent same-page navs can fire\n\t// while the transition animation is still running. Returns true if the\n\t// commit actually happened (it may be superseded mid-callback).\n\tasync function publish(f: ActiveFetch, prepared: PreparedRoute): Promise<boolean> {\n\t\tconst commit_reason: Exclude<RouteUpdateReason, \"boot\"> =\n\t\t\tf.intent.kind === \"reval\"\n\t\t\t\t? \"revalidation\"\n\t\t\t\t: f.intent.options.is_popstate\n\t\t\t\t\t? \"popstate\"\n\t\t\t\t\t: \"navigation\";\n\n\t\tconst prev_snapshot = route_snapshot;\n\t\tif (!prev_snapshot) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst next_href =\n\t\t\tf.intent.kind === \"nav\" ? f.intent.url.href : prev_snapshot.position.href;\n\t\tconst next_history_state =\n\t\t\tf.intent.kind === \"nav\"\n\t\t\t\t? f.intent.options.is_popstate\n\t\t\t\t\t? browser.state\n\t\t\t\t\t: f.intent.options.state\n\t\t\t\t: prev_snapshot.position.state;\n\t\tconst yield_hooks = prev_snapshot.route.matches\n\t\t\t.map((m) => {\n\t\t\t\treturn (m.module.default as ViewDefinition | undefined)\n\t\t\t\t\t?.before_route_yield;\n\t\t\t})\n\t\t\t.filter((h): h is BeforeRouteYieldFn => {\n\t\t\t\treturn typeof h === \"function\";\n\t\t\t});\n\t\tconst commit_hooks = prepared.route.matches\n\t\t\t.map((m) => {\n\t\t\t\treturn (m.module.default as ViewDefinition | undefined)\n\t\t\t\t\t?.before_route_commit;\n\t\t\t})\n\t\t\t.filter((h): h is BeforeRouteCommitFn => {\n\t\t\t\treturn typeof h === \"function\";\n\t\t\t});\n\t\tif (yield_hooks.length > 0 || commit_hooks.length > 0) {\n\t\t\tconst current = route_snapshot_to_state(prev_snapshot);\n\t\t\tconst next = route_record_to_state(\n\t\t\t\tprepared.route,\n\t\t\t\tnext_href,\n\t\t\t\tnext_history_state,\n\t\t\t);\n\t\t\tawait Promise.all(\n\t\t\t\tyield_hooks\n\t\t\t\t\t.map((h) => {\n\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\th({\n\t\t\t\t\t\t\t\ttrigger: commit_reason,\n\t\t\t\t\t\t\t\tsignal: f.ac.signal,\n\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t\t.concat(\n\t\t\t\t\t\tcommit_hooks.map((h) => {\n\t\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\t\th({\n\t\t\t\t\t\t\t\t\ttrigger: commit_reason,\n\t\t\t\t\t\t\t\t\tsignal: f.ac.signal,\n\t\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tlet did_publish = false;\n\n\t\tconst do_publish = () => {\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet position: HistoryPosition;\n\t\t\tif (f.intent.kind === \"nav\" && !f.intent.options.is_popstate) {\n\t\t\t\tsave_current_scroll();\n\t\t\t\tposition = commit_history(\n\t\t\t\t\tf.intent.url.href,\n\t\t\t\t\tf.intent.options.replace,\n\t\t\t\t\tf.intent.options.state,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// popstate: browser already at the new URL; revalidation: URL unchanged\n\t\t\t\tposition = browser;\n\t\t\t}\n\n\t\t\tconst prev = route_snapshot;\n\t\t\tprepared.apply_dom_side_effects();\n\t\t\troute_snapshot = { position, route: prepared.route };\n\n\t\t\tlet scroll_intent: ScrollIntent | undefined;\n\t\t\tif (f.intent.kind === \"nav\") {\n\t\t\t\tlet ss: ScrollState | undefined;\n\t\t\t\tif (f.intent.options.is_popstate) {\n\t\t\t\t\tif (normalize_hash(f.intent.url.hash).length > 0) {\n\t\t\t\t\t\tss = { hash: f.intent.url.hash };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tss = f.intent.options.popstate_scroll ?? { x: 0, y: 0 };\n\t\t\t\t\t}\n\t\t\t\t} else if (normalize_hash(f.intent.url.hash).length > 0) {\n\t\t\t\t\tss = { hash: f.intent.url.hash };\n\t\t\t\t} else if (f.intent.options.scroll_to_top !== false) {\n\t\t\t\t\tss = { x: 0, y: 0 };\n\t\t\t\t}\n\t\t\t\tif (ss) {\n\t\t\t\t\tscroll_intent = {\n\t\t\t\t\t\tscroll: ss,\n\t\t\t\t\t\ttarget_entry_id: make_entry_id(\n\t\t\t\t\t\t\tprepared.route.matches.length - 1,\n\t\t\t\t\t\t\tprepared.route.matches[prepared.route.matches.length - 1]\n\t\t\t\t\t\t\t\t?.pattern ?? \"\",\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tactive = null;\n\t\t\tcommit_route_snapshot(\n\t\t\t\tcommit_reason,\n\t\t\t\tprev,\n\t\t\t\troute_snapshot,\n\t\t\t\tscroll_intent,\n\t\t\t\ttake_work_update(),\n\t\t\t);\n\t\t\tdid_publish = true;\n\t\t};\n\n\t\tconst vt = (document as any).startViewTransition;\n\t\tif (f.intent.kind === \"nav\" && use_view_transitions && typeof vt === \"function\") {\n\t\t\tconst transition = vt.call(document, do_publish);\n\t\t\t// Prefer updateCallbackDone (modern API); fall back to finished.\n\t\t\tawait (transition.updateCallbackDone ?? transition.finished);\n\t\t\tif (transition.finished) {\n\t\t\t\tawait transition.finished;\n\t\t\t}\n\t\t} else {\n\t\t\tdo_publish();\n\t\t}\n\t\treturn did_publish;\n\t}\n\n\tfunction route_to_render_state(\n\t\troute: RouteRecord,\n\t\thistory_state: unknown,\n\t): RouteRenderState {\n\t\treturn {\n\t\t\tentries: route.matches.map((m) => {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: m.pattern,\n\t\t\t\t\tinput: m.input,\n\t\t\t\t\tmodule_url: m.module_url,\n\t\t\t\t\thmr_version: m.hmr_version,\n\t\t\t\t\tmodule: m.module,\n\t\t\t\t\tview_data: m.view_data,\n\t\t\t\t\tclient_loader_data: m.client_loader_data,\n\t\t\t\t};\n\t\t\t}),\n\t\t\terror: route.error,\n\t\t\tparams: route.params,\n\t\t\tsplat_values: route.splat_values,\n\t\t\tclient_build_id: route.client_build_id,\n\t\t\thistory_state,\n\t\t};\n\t}\n\n\tfunction route_snapshot_to_state(snapshot: RouteSnapshot): RouteState {\n\t\treturn route_record_to_state(\n\t\t\tsnapshot.route,\n\t\t\tsnapshot.position.href,\n\t\t\tsnapshot.position.state,\n\t\t);\n\t}\n\n\tfunction route_record_to_state(\n\t\troute: RouteRecord,\n\t\thref: string,\n\t\thistory_state: unknown,\n\t): RouteState {\n\t\treturn {\n\t\t\thref,\n\t\t\thistoryState: history_state,\n\t\t\tclientBuildId: route.client_build_id,\n\t\t\tparams: route.params,\n\t\t\tsplatValues: route.splat_values,\n\t\t\tmatches: route.matches.map((m) => {\n\t\t\t\treturn {\n\t\t\t\t\tpattern: m.pattern,\n\t\t\t\t\tinput: m.input,\n\t\t\t\t\tviewData: m.view_data,\n\t\t\t\t\tclientLoaderData: m.client_loader_data,\n\t\t\t\t};\n\t\t\t}),\n\t\t\terror: route.error,\n\t\t};\n\t}\n\n\tfunction to_route_update_reason(reason: RouteRenderCommitReason): RouteUpdateReason {\n\t\tif (reason === \"initial\") {\n\t\t\treturn \"boot\";\n\t\t}\n\t\tif (reason === \"hmr\") {\n\t\t\treturn \"revalidation\";\n\t\t}\n\t\treturn reason;\n\t}\n\n\tfunction commit_route_snapshot(\n\t\treason: RouteRenderCommitReason,\n\t\tprev: RouteSnapshot | null,\n\t\tnext: RouteSnapshot,\n\t\tscroll_intent?: ScrollIntent,\n\t\twork?: WorkState,\n\t): void {\n\t\tconst previous_route = prev ? route_snapshot_to_state(prev) : null;\n\t\tconst route = route_snapshot_to_state(next);\n\t\tconst client_commit: ClientCommit = {\n\t\t\troute_render: {\n\t\t\t\tstate: route_to_render_state(next.route, next.position.state),\n\t\t\t\tscroll_intent,\n\t\t\t},\n\t\t\twork,\n\t\t};\n\t\tif (!previous_route || !jsonDeepEquals(previous_route, route)) {\n\t\t\tclient_commit.route_update = {\n\t\t\t\tprevious_route,\n\t\t\t\treason: to_route_update_reason(reason),\n\t\t\t\troute,\n\t\t\t};\n\t\t}\n\t\temit_client_commit(client_commit);\n\t}\n\n\tfunction handle_redirect(\n\t\tf: ActiveFetch,\n\t\tredirect: Extract<FetchResult, { kind: \"redirect\" }>,\n\t): RedirectResult {\n\t\tconst nav_intent = f.intent.kind === \"nav\" ? f.intent : null;\n\n\t\t// Invalid scheme: treat as failure for nav, no-op otherwise.\n\t\tif (!is_http(redirect.href)) {\n\t\t\tif (nav_intent) {\n\t\t\t\tnav_intent.deferred.resolve({ didNavigate: false });\n\t\t\t}\n\t\t\tactive = null;\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\t// Hard redirect or cross-origin: leave the page.\n\t\tif (redirect.hard || !is_same_origin_href(redirect.href)) {\n\t\t\thard_redirect(redirect.href);\n\t\t\tif (nav_intent) {\n\t\t\t\tnav_intent.deferred.resolve({ didNavigate: false });\n\t\t\t}\n\t\t\tactive = null;\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\t// Redirect loop guard (only meaningful for nav, which tracks count).\n\t\tif (nav_intent && nav_intent.redirect_count >= MAX_REDIRECTS) {\n\t\t\tnav_intent.deferred.resolve({ didNavigate: false });\n\t\t\tactive = null;\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\tconst target = new URL(redirect.href);\n\t\tactive = null;\n\n\t\t// Same-page redirect (same path, maybe different hash): no re-fetch,\n\t\t// just handle as same-page nav.\n\t\tif (route_snapshot_matches(target)) {\n\t\t\tconst result = handle_same_page_nav(target, nav_intent?.options ?? {});\n\t\t\tif (nav_intent) {\n\t\t\t\tnav_intent.deferred.resolve(result);\n\t\t\t}\n\t\t\treturn \"settled\";\n\t\t}\n\n\t\t// Continue nav chain at redirect target.\n\t\tif (nav_intent) {\n\t\t\tvoid start_nav_inner(\n\t\t\t\ttarget,\n\t\t\t\tnav_intent.options,\n\t\t\t\tnav_intent.redirect_count + 1,\n\t\t\t\t{\n\t\t\t\t\treuse_deferred: nav_intent.deferred,\n\t\t\t\t\tsource: \"redirect\",\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn \"transferred\";\n\t\t} else {\n\t\t\t// Revalidation redirect becomes a replace navigation.\n\t\t\tvoid start_nav_inner(target, { replace: true }, 0, {\n\t\t\t\tsource: \"redirect\",\n\t\t\t});\n\t\t\treturn \"settled\";\n\t\t}\n\t}\n\n\t/////// Navigation Entry\n\n\tfunction try_merge_active_nav(\n\t\turl: URL,\n\t\toptions: NavOptions,\n\t\tsource: NavigationSource,\n\t\tdeferred: Deferred<NavResult>,\n\t): boolean {\n\t\tif (\n\t\t\t!active ||\n\t\t\tactive.intent.kind !== \"nav\" ||\n\t\t\t!matches_without_hash(active.url, url)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Identical intent: share the result promise.\n\t\tconst cur = active.intent;\n\t\tif (\n\t\t\tcur.url.href === url.href &&\n\t\t\tcur.options.replace === options.replace &&\n\t\t\tcur.options.scroll_to_top === options.scroll_to_top &&\n\t\t\tcur.options.state === options.state &&\n\t\t\tcur.options.is_popstate === options.is_popstate &&\n\t\t\tcur.options.popstate_scroll === options.popstate_scroll &&\n\t\t\tcur.options.skip_work_indicator === options.skip_work_indicator &&\n\t\t\tcur.source === source\n\t\t) {\n\t\t\tcur.deferred.promise.then(deferred.resolve, () =>\n\t\t\t\tdeferred.resolve({ didNavigate: false }),\n\t\t\t);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Same path, different hash or options: swap the request.\n\t\tcur.deferred.resolve({ didNavigate: false });\n\t\tactive.intent = {\n\t\t\tkind: \"nav\",\n\t\t\turl,\n\t\t\toptions,\n\t\t\tsource,\n\t\t\tredirect_count: cur.redirect_count,\n\t\t\tdeferred,\n\t\t};\n\t\tnotify_work_update();\n\t\treturn true;\n\t}\n\n\tfunction cancel_prefetch(): void {\n\t\tif (prefetch) {\n\t\t\tconst p = prefetch;\n\t\t\tprefetch = null;\n\t\t\tp.ac.abort();\n\t\t\tnotify_work_update();\n\t\t}\n\t}\n\n\tfunction handle_same_page_nav(url: URL, options: NavOptions): NavResult {\n\t\tif (!route_snapshot) {\n\t\t\treturn { didNavigate: false };\n\t\t}\n\t\tconst cur_url = new URL(route_snapshot.position.href);\n\t\tconst target_hash = normalize_hash(url.hash);\n\t\tconst current_hash = normalize_hash(cur_url.hash);\n\n\t\tif (target_hash !== current_hash) {\n\t\t\tsave_current_scroll();\n\t\t\tconst position = commit_history(url.href, options.replace, options.state);\n\t\t\tconst prev = route_snapshot;\n\t\t\troute_snapshot = { position, route: route_snapshot.route };\n\t\t\tcommit_route_snapshot(\"navigation\", prev, route_snapshot);\n\t\t\tapply_scroll(\n\t\t\t\ttarget_hash.length > 0 ? { hash: url.hash } : { x: 0, y: 0 },\n\t\t\t\ttest_options,\n\t\t\t);\n\t\t\treturn { didNavigate: true };\n\t\t}\n\n\t\tif (options.replace) {\n\t\t\tconst position = commit_history(url.href, true, options.state);\n\t\t\tconst prev = route_snapshot;\n\t\t\troute_snapshot = { position, route: route_snapshot.route };\n\t\t\tcommit_route_snapshot(\"navigation\", prev, route_snapshot);\n\t\t}\n\t\tapply_scroll({ x: 0, y: 0 }, test_options);\n\t\treturn { didNavigate: false };\n\t}\n\n\tfunction start_nav_inner(\n\t\turl: URL,\n\t\toptions: NavOptions,\n\t\tredirect_count: number,\n\t\treuse?: {\n\t\t\treuse_deferred?: Deferred<NavResult>;\n\t\t\tsource?: NavigationSource;\n\t\t},\n\t): Promise<NavResult> {\n\t\tconst deferred = reuse?.reuse_deferred ?? make_deferred<NavResult>();\n\t\tconst source = reuse?.source ?? (options.is_popstate ? \"popstate\" : \"navigate\");\n\n\t\t// Same-page short-circuit (not for popstate, which always owns the commit).\n\t\tif (!options.is_popstate && route_snapshot_matches(url)) {\n\t\t\tconst result = handle_same_page_nav(url, options);\n\t\t\tdeferred.resolve(result);\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\t// Merge into active nav if URLs match by path.\n\t\tif (try_merge_active_nav(url, options, source, deferred)) {\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\t// Supersede any other active work.\n\t\tif (active) {\n\t\t\tconst prev = active;\n\t\t\tactive = null;\n\t\t\tresolve_nav(prev, { didNavigate: false });\n\t\t\tprev.ac.abort();\n\t\t}\n\n\t\t// Promote matching prefetch if present.\n\t\tlet promoted: PrefetchFetch | null = null;\n\t\tif (prefetch && matches_without_hash(prefetch.url, url)) {\n\t\t\tpromoted = prefetch;\n\t\t\tprefetch = null;\n\t\t}\n\t\tconst fetch_record: ActiveFetch = promoted\n\t\t\t? {\n\t\t\t\t\t...promoted,\n\t\t\t\t\tintent: {\n\t\t\t\t\t\tkind: \"nav\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tredirect_count,\n\t\t\t\t\t\tdeferred,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: (cancel_prefetch(),\n\t\t\t\tstart_fetch(\n\t\t\t\t\turl,\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"nav\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tredirect_count,\n\t\t\t\t\t\tdeferred,\n\t\t\t\t\t},\n\t\t\t\t\tfalse,\n\t\t\t\t));\n\n\t\tvoid run_active(fetch_record);\n\t\treturn deferred.promise;\n\t}\n\n\t/////// Refresh\n\n\tfunction mark_fresh(f: ActiveFetch): void {\n\t\tconst demand = refresh_demand();\n\t\tif (!demand) {\n\t\t\treturn;\n\t\t}\n\t\tif (f.seq <= demand.after_seq) {\n\t\t\treturn;\n\t\t}\n\t\tconst waiters = demand.waiters;\n\t\tclear_refresh();\n\t\tfor (const w of waiters) {\n\t\t\tw.resolve(REVALIDATION_OK);\n\t\t}\n\t}\n\n\tfunction mark_refresh_build_skew(): void {\n\t\tconst demand = refresh_demand();\n\t\tif (!demand) {\n\t\t\treturn;\n\t\t}\n\t\tconst waiters = demand.waiters;\n\t\tclear_refresh();\n\t\tfor (const w of waiters) {\n\t\t\tw.resolve(REVALIDATION_BUILD_SKEW);\n\t\t}\n\t}\n\n\tfunction refresh_demand(): RefreshDemand | null {\n\t\tif (refresh.kind === \"idle\") {\n\t\t\treturn null;\n\t\t}\n\t\treturn refresh.demand;\n\t}\n\n\tfunction clear_refresh(): void {\n\t\tif (refresh.kind === \"debouncing\" || refresh.kind === \"retrying\") {\n\t\t\tclearTimeout(refresh.timer);\n\t\t}\n\t\trefresh = { kind: \"idle\" };\n\t}\n\n\tfunction require_refresh(\n\t\treason: RevalidationReason,\n\t\twaiter?: RefreshWaiter,\n\t\tdebounce?: boolean,\n\t\tskip_work_indicator?: boolean,\n\t): void {\n\t\tconst previous_demand = refresh_demand();\n\t\tconst waiters = previous_demand?.waiters ?? [];\n\t\tclear_refresh();\n\t\tif (waiter) {\n\t\t\twaiters.push(waiter);\n\t\t}\n\t\tconst demand: RefreshDemand = {\n\t\t\tafter_seq: next_seq(),\n\t\t\treason,\n\t\t\tskip_work_indicator:\n\t\t\t\t(previous_demand?.skip_work_indicator ?? true) &&\n\t\t\t\tskip_work_indicator === true,\n\t\t\twaiters,\n\t\t};\n\n\t\tif (debounce) {\n\t\t\tlet next_refresh!: Extract<RefreshState, { kind: \"debouncing\" }>;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tif (refresh !== next_refresh) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trefresh = { kind: \"pending\", demand, attempt: 0 };\n\t\t\t\tmaybe_revalidate();\n\t\t\t}, REVALIDATION_DEBOUNCE_MS);\n\t\t\tnext_refresh = { kind: \"debouncing\", demand, timer };\n\t\t\trefresh = next_refresh;\n\t\t} else {\n\t\t\trefresh = { kind: \"pending\", demand, attempt: 0 };\n\t\t}\n\t}\n\n\tfunction active_will_refresh(): boolean {\n\t\tconst demand = refresh_demand();\n\t\treturn active !== null && demand !== null && active.seq > demand.after_seq;\n\t}\n\n\tfunction maybe_revalidate(): void {\n\t\tif (phase !== \"ready\") {\n\t\t\treturn;\n\t\t}\n\t\tif (refresh.kind === \"idle\") {\n\t\t\treturn;\n\t\t}\n\t\tif (refresh.kind === \"debouncing\") {\n\t\t\treturn;\n\t\t}\n\t\tif (active_will_refresh() || active) {\n\t\t\treturn;\n\t\t}\n\t\tif (refresh.kind === \"retrying\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst demand = refresh.demand;\n\t\tconst attempt = refresh.attempt;\n\t\tif (attempt >= MAX_REVALIDATION_RETRIES) {\n\t\t\tclear_refresh();\n\t\t\tfor (const w of demand.waiters) {\n\t\t\t\tw.resolve(REVALIDATION_EXHAUSTED);\n\t\t\t}\n\t\t\tnotify_work_update();\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay =\n\t\t\tattempt === 0\n\t\t\t\t? 0\n\t\t\t\t: Math.min(\n\t\t\t\t\t\tREVALIDATION_BACKOFF_BASE_MS * Math.pow(2, attempt - 1),\n\t\t\t\t\t\tREVALIDATION_BACKOFF_CAP_MS,\n\t\t\t\t\t);\n\n\t\tif (delay === 0) {\n\t\t\trefresh = { kind: \"pending\", demand, attempt: attempt + 1 };\n\t\t\tvoid run_revalidation().catch(() => {});\n\t\t} else {\n\t\t\tconst retry_demand: RefreshDemand = {\n\t\t\t\t...demand,\n\t\t\t\treason: \"retry\",\n\t\t\t};\n\t\t\tlet next_refresh!: Extract<RefreshState, { kind: \"retrying\" }>;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tif (refresh !== next_refresh) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trefresh = {\n\t\t\t\t\tkind: \"pending\",\n\t\t\t\t\tdemand: retry_demand,\n\t\t\t\t\tattempt: attempt + 1,\n\t\t\t\t};\n\t\t\t\tif (active) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoid run_revalidation().catch(() => {});\n\t\t\t}, delay);\n\t\t\tnext_refresh = {\n\t\t\t\tkind: \"retrying\",\n\t\t\t\tdemand: retry_demand,\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\ttimer,\n\t\t\t};\n\t\t\trefresh = next_refresh;\n\t\t\tnotify_work_update();\n\t\t}\n\t}\n\n\tasync function run_revalidation(): Promise<void> {\n\t\tconst url = new URL(browser.href || window.location.href);\n\t\tconst attempt = refresh.kind === \"pending\" ? refresh.attempt : 0;\n\t\tconst reason = refresh.kind === \"pending\" ? refresh.demand.reason : \"manual\";\n\t\tconst skip_work_indicator =\n\t\t\trefresh.kind === \"pending\" ? refresh.demand.skip_work_indicator : undefined;\n\t\tconst f = start_fetch(\n\t\t\turl,\n\t\t\t{ kind: \"reval\", attempt, reason, skip_work_indicator },\n\t\t\ttrue,\n\t\t);\n\n\t\t// Guard: discard if URL path changes during flight (hash-only changes\n\t\t// are OK; matches_without_hash on publish time handles it).\n\t\tawait run_active_with_url_guard(f, url);\n\t}\n\n\tasync function run_active_with_url_guard(\n\t\tf: ActiveFetch,\n\t\texpected: URL,\n\t): Promise<void> {\n\t\tactive = f;\n\t\tnotify_work_update();\n\n\t\ttry {\n\t\t\tconst result = await f.data_promise;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!matches_without_hash(new URL(browser.href), expected)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.kind === \"build_skew\") {\n\t\t\t\treport_route_build_skew(f, result.response);\n\t\t\t\tmark_refresh_build_skew();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.response) {\n\t\t\t\tconst did_detect_skew = report_route_build_skew(f, result.response);\n\t\t\t\tif (did_detect_skew && result.kind === \"redirect\" && result.hard) {\n\t\t\t\t\tmark_refresh_build_skew();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (result.kind === \"error\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.kind === \"redirect\") {\n\t\t\t\thandle_redirect(f, result);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst payload = decode_payload(result.data, f.url);\n\t\t\tpreload_modules(payload.deps);\n\n\t\t\tawait f.cl_prefetches_ready;\n\t\t\tif (!can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prepared = await prepare_route(\n\t\t\t\tpayload,\n\t\t\t\tf.cl_prefetches,\n\t\t\t\t\"revalidation\",\n\t\t\t\tf.url.href,\n\t\t\t\thistory_state_for_fetch(f.intent),\n\t\t\t\tf.ac.signal,\n\t\t\t);\n\t\t\tif (!prepared || !can_commit(f)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!matches_without_hash(new URL(browser.href), expected)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst did_publish = await publish(f, prepared);\n\t\t\tif (did_publish) {\n\t\t\t\tlast_activity_ts = Date.now();\n\t\t\t\tmark_fresh(f);\n\t\t\t}\n\t\t} catch {\n\t\t\t// swallow\n\t\t} finally {\n\t\t\tif (active === f) {\n\t\t\t\tactive = null;\n\t\t\t}\n\t\t\tnotify_work_update();\n\t\t\tmaybe_revalidate();\n\t\t}\n\t}\n\n\t/////// Prefetch\n\n\tasync function prepare_prefetch(f: PrefetchFetch): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await f.data_promise;\n\t\t\tif (f.ac.signal.aborted) {\n\t\t\t\tif (prefetch === f) {\n\t\t\t\t\tprefetch = null;\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.response) {\n\t\t\t\treport_route_build_skew(f, result.response);\n\t\t\t}\n\t\t\tif (result.kind !== \"data\") {\n\t\t\t\tif (prefetch === f) {\n\t\t\t\t\tprefetch = null;\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst payload = decode_payload(result.data, f.url);\n\t\t\tpreload_modules(payload.deps);\n\t\t\tconst modules = await prepare_modules(payload, f.ac.signal);\n\t\t\tawait f.cl_prefetches_ready;\n\t\t\tif (!modules || f.ac.signal.aborted) {\n\t\t\t\tif (prefetch === f) {\n\t\t\t\t\tprefetch = null;\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst by_pattern = new Map<string, ClientLoaderPrefetch>();\n\t\t\tfor (const p of f.cl_prefetches) {\n\t\t\t\tby_pattern.set(p.pattern, p);\n\t\t\t}\n\t\t\tconst err_idx = payload.routes.findIndex((r) => {\n\t\t\t\treturn r.server_error !== undefined;\n\t\t\t});\n\t\t\tconst known_matches = routes_to_known_matches(payload.routes);\n\t\t\tconst next_cl_prefetches: ClientLoaderPrefetch[] = [];\n\t\t\tconst retained_prefetches = new Set<ClientLoaderPrefetch>();\n\t\t\tfor (let i = 0; i < payload.routes.length; i++) {\n\t\t\t\tconst route = payload.routes[i]!;\n\t\t\t\tconst existing = by_pattern.get(route.pattern);\n\t\t\t\tif (err_idx !== -1 && i >= err_idx) {\n\t\t\t\t\texisting?.abort();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (existing) {\n\t\t\t\t\texisting.resolve_server_state(build_server_state(payload.routes, i));\n\t\t\t\t\tnext_cl_prefetches.push(existing);\n\t\t\t\t\tretained_prefetches.add(existing);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst client_loader = client_loader_map[route.pattern];\n\t\t\t\tif (!client_loader) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst p = make_cl_prefetch({\n\t\t\t\t\thref: f.url.href,\n\t\t\t\t\thistory_state: undefined,\n\t\t\t\t\tknown_matches,\n\t\t\t\t\tclient_loader,\n\t\t\t\t\tparams: payload.params,\n\t\t\t\t\tpattern: route.pattern,\n\t\t\t\t\troute_input: route.input,\n\t\t\t\t\tsignal: f.ac.signal,\n\t\t\t\t\tsplat_values: payload.splat_values,\n\t\t\t\t\ttrigger: \"prefetch\",\n\t\t\t\t});\n\t\t\t\tp.resolve_server_state(build_server_state(payload.routes, i));\n\t\t\t\tnext_cl_prefetches.push(p);\n\t\t\t\tretained_prefetches.add(p);\n\t\t\t}\n\t\t\tfor (const p of f.cl_prefetches) {\n\t\t\t\tif (!retained_prefetches.has(p)) {\n\t\t\t\t\tp.abort();\n\t\t\t\t}\n\t\t\t}\n\t\t\tf.cl_prefetches = next_cl_prefetches;\n\t\t} catch {\n\t\t\tif (prefetch === f) {\n\t\t\t\tprefetch = null;\n\t\t\t\tnotify_work_update();\n\t\t\t}\n\t\t} finally {\n\t\t\tif (f.is_pending) {\n\t\t\t\tf.is_pending = false;\n\t\t\t\tnotify_work_update();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction start_prefetch(href: string): void {\n\t\tif (phase !== \"ready\") {\n\t\t\treturn;\n\t\t}\n\t\tconst url = new URL(href, window.location.href);\n\t\tif (!is_same_origin(url) || route_snapshot_matches(url)) {\n\t\t\treturn;\n\t\t}\n\t\tif (active?.intent.kind === \"nav\" && matches_without_hash(active.url, url)) {\n\t\t\treturn;\n\t\t}\n\t\tif (prefetch && matches_without_hash(prefetch.url, url)) {\n\t\t\treturn;\n\t\t}\n\t\tcancel_prefetch();\n\n\t\t// Prefetch's prepare_ready resolves when modules + CL seeding are done.\n\t\tlet resolve_prepare!: () => void;\n\t\tconst prepare_ready = new Promise<void>((r) => {\n\t\t\tresolve_prepare = r;\n\t\t});\n\n\t\tconst f: PrefetchFetch = {\n\t\t\t...start_fetch(url, { kind: \"prefetch\" }, false, prepare_ready),\n\t\t\tis_pending: true,\n\t\t};\n\t\tprefetch = f;\n\t\tnotify_work_update();\n\t\tvoid prepare_prefetch(f).finally(() => resolve_prepare());\n\t}\n\n\tfunction stop_prefetch(href: string): void {\n\t\tconst url = new URL(href, window.location.href);\n\t\tif (prefetch && matches_without_hash(prefetch.url, url)) {\n\t\t\tcancel_prefetch();\n\t\t}\n\t}\n\n\t/////// Submit\n\n\tfunction schedule_submission_revalidation(\n\t\tsub: Submission,\n\t\tstart = true,\n\t): Promise<RevalidationResult> {\n\t\tif (!sub.should_revalidate) {\n\t\t\treturn Promise.resolve(REVALIDATION_OK);\n\t\t}\n\t\tif (phase === \"ready\") {\n\t\t\tconst waiter = make_deferred<RevalidationResult>();\n\t\t\trequire_refresh(\"apiRequest\", waiter, undefined, sub.skip_work_indicator);\n\t\t\tif (start) {\n\t\t\t\tmaybe_revalidate();\n\t\t\t}\n\t\t\treturn waiter.promise;\n\t\t}\n\t\trequire_refresh(\"apiRequest\", undefined, undefined, sub.skip_work_indicator);\n\t\treturn Promise.resolve(REVALIDATION_OK);\n\t}\n\n\tfunction settle_submission(\n\t\tsub: Submission,\n\t\tresult: ApiResult<unknown>,\n\t\tnotify = true,\n\t): void {\n\t\tif (sub.settled) {\n\t\t\treturn;\n\t\t}\n\t\tsub.settled = true;\n\t\tif (submissions.get(sub.key)?.ac === sub.ac) {\n\t\t\tsubmissions.delete(sub.key);\n\t\t}\n\t\tsub.deferred.resolve(result);\n\t\tif (notify) {\n\t\t\tnotify_work_update();\n\t\t}\n\t}\n\n\tfunction replace_submission(sub: Submission): boolean {\n\t\tsub.ac.abort();\n\t\tlet scheduled_revalidation = false;\n\t\tif (sub.did_dispatch) {\n\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub, false);\n\t\t\tscheduled_revalidation = sub.should_revalidate;\n\t\t}\n\t\tsettle_submission(\n\t\t\tsub,\n\t\t\t{\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Aborted\",\n\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\t\treturn scheduled_revalidation;\n\t}\n\n\tfunction submit_inner<T = unknown>(\n\t\turl: string | URL,\n\t\trequest_init?: RequestInit,\n\t\toptions?: {\n\t\t\tresourceKind?: ResourceKind;\n\t\t\tdedupeKey?: string;\n\t\t\trevalidate?: boolean;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t): Promise<ApiResult<T>> {\n\t\tif (!route_snapshot) {\n\t\t\treturn Promise.reject(new Error(\"Vorma not booted\"));\n\t\t}\n\t\tconst resolved = new URL(String(url), window.location.href);\n\n\t\tif (!is_same_origin(resolved)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `submit only supports same-origin targets. Received: \"${resolved.href}\".`,\n\t\t\t\trevalidationPromise: Promise.resolve(REVALIDATION_OK),\n\t\t\t});\n\t\t}\n\n\t\tconst method = request_init?.method\n\t\t\t? request_init.method.toUpperCase().trim()\n\t\t\t: \"GET\";\n\t\tconst resource_kind =\n\t\t\toptions?.resourceKind ??\n\t\t\t(method === \"GET\" || method === \"HEAD\" ? \"query\" : \"mutation\");\n\t\tlet should_revalidate = resource_kind === \"mutation\";\n\t\tif (options?.revalidate !== undefined) {\n\t\t\tshould_revalidate = options.revalidate;\n\t\t}\n\n\t\tlet dedupe_key = options?.dedupeKey;\n\t\tlet start_replaced_revalidation = false;\n\t\tif (dedupe_key) {\n\t\t\tconst previous = submissions.get(dedupe_key);\n\t\t\tif (previous) {\n\t\t\t\tstart_replaced_revalidation = replace_submission(previous);\n\t\t\t}\n\t\t} else {\n\t\t\tdedupe_key = crypto.randomUUID();\n\t\t}\n\n\t\tconst ac = new AbortController();\n\t\tconst deferred = make_deferred<ApiResult<unknown>>();\n\t\tconst sub: Submission = {\n\t\t\tac,\n\t\t\tdeferred,\n\t\t\tdid_dispatch: false,\n\t\t\tkey: dedupe_key,\n\t\t\tmethod,\n\t\t\thref: resolved.href,\n\t\t\trevalidation_promise: Promise.resolve(REVALIDATION_OK),\n\t\t\tsettled: false,\n\t\t\tshould_revalidate,\n\t\t\tskip_work_indicator: options?.skipWorkIndicator,\n\t\t};\n\t\tsubmissions.set(dedupe_key, sub);\n\t\tnotify_work_update();\n\n\t\tvoid run_submission(sub, resolved, request_init, resource_kind);\n\t\tif (start_replaced_revalidation) {\n\t\t\tmaybe_revalidate();\n\t\t}\n\t\treturn deferred.promise as Promise<ApiResult<T>>;\n\t}\n\n\tasync function run_submission<T = unknown>(\n\t\tsub: Submission,\n\t\tresolved: URL,\n\t\trequest_init: RequestInit | undefined,\n\t\tresource_kind: ResourceKind,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst is_get = sub.method === \"GET\" || sub.method === \"HEAD\";\n\n\t\t\tconst headers = new Headers();\n\t\t\tif (deployment_id) {\n\t\t\t\theaders.set(VERCEL_X_DEPLOYMENT_ID, deployment_id);\n\t\t\t}\n\t\t\tnew Headers(request_init?.headers ?? undefined).forEach((v, k) => {\n\t\t\t\theaders.set(k, v);\n\t\t\t});\n\t\t\theaders.set(X_ACCEPTS_CLIENT_REDIRECT, \"1\");\n\n\t\t\tconst body = request_init?.body;\n\t\t\tconst should_json =\n\t\t\t\t!is_get &&\n\t\t\t\tbody &&\n\t\t\t\ttypeof body === \"object\" &&\n\t\t\t\t!(body instanceof ReadableStream) &&\n\t\t\t\t!(body instanceof FormData) &&\n\t\t\t\t!(body instanceof URLSearchParams) &&\n\t\t\t\t!(body instanceof Blob) &&\n\t\t\t\t!(body instanceof ArrayBuffer) &&\n\t\t\t\t!ArrayBuffer.isView(body);\n\n\t\t\tconst final_init: RequestInit = {\n\t\t\t\t...request_init,\n\t\t\t\tmethod: sub.method,\n\t\t\t\theaders,\n\t\t\t\tsignal: sub.ac.signal,\n\t\t\t};\n\t\t\tif (is_get) {\n\t\t\t\tdelete final_init.body;\n\t\t\t} else if (should_json) {\n\t\t\t\tfinal_init.body = JSON.stringify(body);\n\t\t\t\tif (!headers.has(\"Content-Type\")) {\n\t\t\t\t\theaders.set(\"Content-Type\", \"application/json\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsub.did_dispatch = true;\n\t\t\tconst res = await fetch(resolved, final_init);\n\t\t\tif (sub.settled || sub.ac.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst redirect = detect_redirect(res, resolved);\n\t\t\treport_build_skew({\n\t\t\t\tresponse: res,\n\t\t\t\ttriggeringResponse: {\n\t\t\t\t\tkind: \"resource\",\n\t\t\t\t\tresourceKind: resource_kind,\n\t\t\t\t\trequestedHref: resolved.href,\n\t\t\t\t\tmethod: sub.method,\n\t\t\t\t\tstatus: res.status,\n\t\t\t\t\tok: res.ok,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (redirect) {\n\t\t\t\tif (!is_http(redirect.href)) {\n\t\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: `Redirect target must use an HTTP(S) scheme. Received: \"${redirect.href}\".`,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (redirect.hard || !is_same_origin_href(redirect.href)) {\n\t\t\t\t\thard_redirect(redirect.href);\n\t\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tdata: undefined as T,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (phase !== \"ready\") {\n\t\t\t\t\tdeferred_submit_redirect = new URL(redirect.href);\n\t\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tdata: undefined as T,\n\t\t\t\t\t\tresponse: res,\n\t\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoid start_nav_inner(new URL(redirect.href), { replace: true }, 0, {\n\t\t\t\t\tsource: \"redirect\",\n\t\t\t\t});\n\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: undefined as T,\n\t\t\t\t\tresponse: res,\n\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!res.ok) {\n\t\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: res.statusText,\n\t\t\t\t\tresponse: res,\n\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet data: unknown;\n\t\t\tif (res.status !== 204) {\n\t\t\t\tconst ct = res.headers.get(\"Content-Type\");\n\t\t\t\tif (ct?.toLowerCase().includes(\"json\")) {\n\t\t\t\t\tdata = await res.json();\n\t\t\t\t} else {\n\t\t\t\t\tconst t = await res.text();\n\t\t\t\t\tdata = t.length > 0 ? t : undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\tsettle_submission(sub, {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: data as T,\n\t\t\t\tresponse: res,\n\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (sub.settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (is_abort_error(e)) {\n\t\t\t\tif (sub.did_dispatch) {\n\t\t\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\t\t}\n\t\t\t\tsettle_submission(sub, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"Aborted\",\n\t\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sub.did_dispatch) {\n\t\t\t\tsub.revalidation_promise = schedule_submission_revalidation(sub);\n\t\t\t}\n\t\t\tsettle_submission(sub, {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: String(e instanceof Error ? e.message : e),\n\t\t\t\trevalidationPromise: sub.revalidation_promise,\n\t\t\t});\n\t\t}\n\t}\n\n\t/////// Popstate\n\n\tasync function handle_popstate(): Promise<void> {\n\t\tconst prev = browser;\n\t\tconst next = read_browser_position();\n\t\tif (next.key === prev.key && next.href === prev.href) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prev.key && prev.key !== next.key) {\n\t\t\tsave_scroll_for_key(prev.key, get_scroll_pos());\n\t\t}\n\t\tbrowser = next;\n\n\t\tconst prev_url = new URL(prev.href);\n\t\tconst next_url = new URL(next.href);\n\n\t\t// Hash-only popstate on same path: scroll, no fetch.\n\t\tif (matches_without_hash(prev_url, next_url)) {\n\t\t\tif (route_snapshot) {\n\t\t\t\tconst prev_snapshot = route_snapshot;\n\t\t\t\troute_snapshot = {\n\t\t\t\t\tposition: browser,\n\t\t\t\t\troute: route_snapshot.route,\n\t\t\t\t};\n\t\t\t\tcommit_route_snapshot(\"popstate\", prev_snapshot, route_snapshot);\n\t\t\t}\n\t\t\tconst hash = normalize_hash(next_url.hash);\n\t\t\tapply_scroll(\n\t\t\t\thash.length > 0\n\t\t\t\t\t? { hash: next_url.hash }\n\t\t\t\t\t: (get_scroll_for_key(next.key) ?? { x: 0, y: 0 }),\n\t\t\t\ttest_options,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst restored_scroll = get_scroll_for_key(next.key);\n\n\t\ttry {\n\t\t\tconst result = await start_nav_inner(\n\t\t\t\tnext_url,\n\t\t\t\t{ is_popstate: true, popstate_scroll: restored_scroll },\n\t\t\t\t0,\n\t\t\t);\n\t\t\tif (!result.didNavigate && !active && !route_snapshot_matches_browser()) {\n\t\t\t\treload_page();\n\t\t\t}\n\t\t} catch {\n\t\t\tif (!active && !route_snapshot_matches_browser()) {\n\t\t\t\treload_page();\n\t\t\t}\n\t\t}\n\t}\n\n\t/////// Status\n\n\tfunction derive_work_projection(): WorkProjection[] {\n\t\tconst work: WorkProjection[] = [];\n\n\t\tconst active_fetch = active;\n\t\tif (active_fetch?.intent.kind === \"nav\") {\n\t\t\twork.push({\n\t\t\t\tkind: \"navigation\",\n\t\t\t\tskip_work_indicator: active_fetch.intent.options.skip_work_indicator,\n\t\t\t});\n\t\t}\n\n\t\tconst pending_revalidation =\n\t\t\trefresh.kind !== \"idle\" &&\n\t\t\t(refresh.kind === \"debouncing\" ||\n\t\t\t\trefresh.kind === \"retrying\" ||\n\t\t\t\t(!active_will_refresh() && !active));\n\t\tif (active_fetch?.intent.kind === \"reval\" || pending_revalidation) {\n\t\t\tconst revalidation_demand = refresh_demand();\n\t\t\twork.push({\n\t\t\t\tkind: \"revalidation\",\n\t\t\t\tskip_work_indicator:\n\t\t\t\t\tactive_fetch?.intent.kind === \"reval\"\n\t\t\t\t\t\t? active_fetch.intent.skip_work_indicator\n\t\t\t\t\t\t: revalidation_demand?.skip_work_indicator,\n\t\t\t});\n\t\t}\n\n\t\tfor (const s of submissions.values()) {\n\t\t\twork.push({\n\t\t\t\tkind: \"apiRequest\",\n\t\t\t\tskip_work_indicator: s.skip_work_indicator,\n\t\t\t});\n\t\t}\n\n\t\tif (prefetch?.is_pending) {\n\t\t\twork.push({\n\t\t\t\tkind: \"prefetch\",\n\t\t\t});\n\t\t}\n\n\t\treturn work;\n\t}\n\n\tfunction empty_work_state(): WorkState {\n\t\treturn {\n\t\t\tnavigation: null,\n\t\t\trevalidation: null,\n\t\t\tprefetch: null,\n\t\t\tapiRequests: [],\n\t\t};\n\t}\n\n\tfunction derive_work_state(): WorkState {\n\t\tconst active_fetch = active;\n\t\tlet revalidation: WorkState[\"revalidation\"] = null;\n\t\tif (active_fetch?.intent.kind === \"reval\") {\n\t\t\trevalidation = {\n\t\t\t\tstatus: \"running\",\n\t\t\t\tattempt: active_fetch.intent.attempt,\n\t\t\t};\n\t\t} else if (refresh.kind === \"debouncing\") {\n\t\t\trevalidation = { status: \"debouncing\", attempt: 0 };\n\t\t} else if (refresh.kind === \"retrying\") {\n\t\t\trevalidation = {\n\t\t\t\tstatus: \"retrying\",\n\t\t\t\tattempt: refresh.attempt,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tnavigation:\n\t\t\t\tactive_fetch?.intent.kind === \"nav\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\thref: active_fetch.intent.url.href,\n\t\t\t\t\t\t\treplace: active_fetch.intent.options.replace === true,\n\t\t\t\t\t\t\tsource: active_fetch.intent.source,\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\trevalidation,\n\t\t\tprefetch: prefetch?.is_pending ? { href: prefetch.url.href } : null,\n\t\t\tapiRequests: Array.from(submissions.values(), (s) => {\n\t\t\t\treturn {\n\t\t\t\t\tkey: s.key,\n\t\t\t\t\tmethod: s.method,\n\t\t\t\t\thref: s.href,\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t}\n\n\tfunction take_work_update(): WorkState | undefined {\n\t\tconst next = derive_work_state();\n\t\tif (jsonDeepEquals(last_work_state, next)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tlast_work_state = next;\n\t\treturn next;\n\t}\n\n\tfunction emit_client_commit(client_commit: ClientCommit): void {\n\t\tcommit(client_commit);\n\t\tif (client_commit.route_update && user_on_route_update) {\n\t\t\tuser_on_route_update(\n\t\t\t\tclient_commit.route_update.route,\n\t\t\t\tclient_commit.route_update.previous_route,\n\t\t\t\tclient_commit.route_update.reason,\n\t\t\t);\n\t\t}\n\t\tif (client_commit.work) {\n\t\t\tfor (const fn of work_update_listeners) {\n\t\t\t\tfn(client_commit.work);\n\t\t\t}\n\t\t\tuser_on_work_update?.(client_commit.work);\n\t\t}\n\t}\n\n\tfunction notify_work_update(): void {\n\t\tconst work = take_work_update();\n\t\tif (!work) {\n\t\t\tsync_work_indicator();\n\t\t\treturn;\n\t\t}\n\t\temit_client_commit({ work });\n\t}\n\n\t/////// HMR\n\n\tfunction register_hmr(): void {\n\t\tif (!import.meta.env.DEV || !import.meta.hot) {\n\t\t\treturn;\n\t\t}\n\t\twindow.__vorma_hmr_view_update = async (raw_url, mod) => {\n\t\t\tif (!route_snapshot) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst url = normalize_module_url(raw_url);\n\t\t\tmodule_cache.set(url, mod);\n\t\t\tconst hmr_version = (hmr_version_map.get(url) ?? 0) + 1;\n\t\t\thmr_version_map.set(url, hmr_version);\n\t\t\tconst idx = route_snapshot.route.matches.findIndex(\n\t\t\t\t(m) => normalize_module_url(m.module_url) === url,\n\t\t\t);\n\t\t\tif (idx === -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst match = route_snapshot.route.matches[idx]!;\n\t\t\tconst def = mod.default as ViewDefinition | undefined;\n\t\t\tif (def?.client_loader) {\n\t\t\t\tclient_loader_map[match.pattern] = def.client_loader;\n\t\t\t\tregister_route_pattern(match.pattern);\n\t\t\t} else {\n\t\t\t\tdelete client_loader_map[match.pattern];\n\t\t\t}\n\n\t\t\tlet client_loader_data = match.client_loader_data;\n\t\t\tif (hmr_rerun_patterns.has(match.pattern)) {\n\t\t\t\tconst client_loader = client_loader_map[match.pattern];\n\t\t\t\tif (client_loader) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst current_route = route_snapshot.route;\n\t\t\t\t\t\tconst routes = current_route.matches.map((m, i) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tpattern: m.pattern,\n\t\t\t\t\t\t\t\tinput: m.input,\n\t\t\t\t\t\t\t\tmodule_url: m.module_url,\n\t\t\t\t\t\t\t\tview_data: m.view_data,\n\t\t\t\t\t\t\t\tserver_error:\n\t\t\t\t\t\t\t\t\tcurrent_route.error?.source === \"server\" &&\n\t\t\t\t\t\t\t\t\tcurrent_route.error.idx === i\n\t\t\t\t\t\t\t\t\t\t? current_route.error.error\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t\tclient_loader_data = await client_loader({\n\t\t\t\t\t\t\ttrigger: \"revalidation\",\n\t\t\t\t\t\t\thref: route_snapshot.position.href,\n\t\t\t\t\t\t\thistoryState: route_snapshot.position.state,\n\t\t\t\t\t\t\tpattern: match.pattern,\n\t\t\t\t\t\t\tparams: route_snapshot.route.params,\n\t\t\t\t\t\t\tsplatValues: route_snapshot.route.splat_values,\n\t\t\t\t\t\t\tinput: match.input,\n\t\t\t\t\t\t\tknownMatches: routes_to_known_matches(routes),\n\t\t\t\t\t\t\tserverPromise: Promise.resolve(\n\t\t\t\t\t\t\t\tbuild_server_state(routes, idx),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tsignal: new AbortController().signal,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(\"Vorma: HMR client loader re-run failed\", err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!route_snapshot) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst prev = route_snapshot;\n\t\t\tconst matches = route_snapshot.route.matches.map((m, i) =>\n\t\t\t\ti === idx ? { ...m, hmr_version, module: mod, client_loader_data } : m,\n\t\t\t);\n\t\t\troute_snapshot = {\n\t\t\t\tposition: route_snapshot.position,\n\t\t\t\troute: { ...route_snapshot.route, matches },\n\t\t\t};\n\t\t\tcommit_route_snapshot(\"hmr\", prev, route_snapshot);\n\t\t};\n\t}\n\n\t/////// Work Indicator\n\n\tfunction setup_work_indicator(options: WorkIndicatorOptions | undefined): void {\n\t\twork_indicator_options = options;\n\t\twork_indicator.configure(options);\n\t\tif (!work_indicator_sync_registered) {\n\t\t\twork_update_listeners.add(sync_work_indicator);\n\t\t\twork_indicator_sync_registered = true;\n\t\t}\n\t\tsync_work_indicator();\n\t}\n\n\tfunction sync_work_indicator(_work?: WorkState): void {\n\t\tconst options = work_indicator_options;\n\t\tif (!options) {\n\t\t\twork_indicator.set_vorma_active(false);\n\t\t\treturn;\n\t\t}\n\n\t\tlet active_for_vorma = false;\n\t\tfor (const work of derive_work_projection()) {\n\t\t\tif (\n\t\t\t\twork.kind === \"navigation\" &&\n\t\t\t\toptions.skipNavigations !== true &&\n\t\t\t\t!work.skip_work_indicator\n\t\t\t) {\n\t\t\t\tactive_for_vorma = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (\n\t\t\t\twork.kind === \"revalidation\" &&\n\t\t\t\toptions.skipRevalidations !== true &&\n\t\t\t\t!work.skip_work_indicator\n\t\t\t) {\n\t\t\t\tactive_for_vorma = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (\n\t\t\t\twork.kind === \"apiRequest\" &&\n\t\t\t\toptions.skipApiRequests !== true &&\n\t\t\t\t!work.skip_work_indicator\n\t\t\t) {\n\t\t\t\tactive_for_vorma = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\twork_indicator.set_vorma_active(active_for_vorma);\n\t}\n\n\t/////// Boot\n\n\tasync function boot(options: ClientOptions): Promise<Result<void>> {\n\t\tconst payload_el = document.getElementById(DATA_SCRIPT_ID);\n\t\tif (!payload_el) {\n\t\t\treturn R.err(`Missing element: #${DATA_SCRIPT_ID}`);\n\t\t}\n\t\tlet raw_payload: Record<string, any>;\n\t\ttry {\n\t\t\traw_payload = JSON.parse(payload_el.textContent ?? \"{}\");\n\t\t} catch (err) {\n\t\t\treturn R.err(`Failed to parse #${DATA_SCRIPT_ID}: ${to_error_string(err)}`);\n\t\t}\n\t\tif (raw_payload.client_build_id) {\n\t\t\tclient_build_id = raw_payload.client_build_id;\n\t\t}\n\t\tif (raw_payload.deployment_id) {\n\t\t\tdeployment_id = raw_payload.deployment_id;\n\t\t}\n\t\tconst payload = decode_payload(raw_payload, current_url());\n\n\t\tuser_on_route_update = options.onRouteUpdate;\n\t\tuser_on_work_update = options.onWorkUpdate;\n\t\tuser_on_build_skew_detected = options.onBuildSkewDetected;\n\t\tdefault_error_boundary = options.defaultErrorBoundary;\n\t\tuse_view_transitions = options.useViewTransitions ?? false;\n\n\t\tconst history_state = window.history.state;\n\t\tconst has_history_key =\n\t\t\thistory_state &&\n\t\t\ttypeof history_state === \"object\" &&\n\t\t\tHISTORY_KEY_FIELD in (history_state as Record<string, unknown>);\n\t\tif (!has_history_key) {\n\t\t\tconst base =\n\t\t\t\thistory_state && typeof history_state === \"object\" ? history_state : {};\n\t\t\twindow.history.replaceState(\n\t\t\t\t{\n\t\t\t\t\t...(base as object),\n\t\t\t\t\t[HISTORY_KEY_FIELD]: make_history_key(),\n\t\t\t\t},\n\t\t\t\t\"\",\n\t\t\t\tcurrent_url().href,\n\t\t\t);\n\t\t}\n\t\tbrowser = read_browser_position();\n\t\ttry {\n\t\t\twindow.history.scrollRestoration = \"manual\";\n\t\t} catch {}\n\n\t\tconst initial_ac = new AbortController();\n\t\tconst modules = await prepare_modules(payload, initial_ac.signal);\n\t\tif (!modules) {\n\t\t\treturn R.err(\"Initial navigation produced no state\");\n\t\t}\n\n\t\t// Install a provisional snapshot so router APIs (getRouteState, submit)\n\t\t// work during initial client-loader execution.\n\t\troute_snapshot = {\n\t\t\tposition: browser,\n\t\t\troute: build_route_record(payload, modules, []),\n\t\t};\n\n\t\tconst cl_results = await run_client_loaders(\n\t\t\tpayload.routes,\n\t\t\tpayload,\n\t\t\t[],\n\t\t\t\"boot\",\n\t\t\tbrowser.href,\n\t\t\tbrowser.state,\n\t\t\tinitial_ac.signal,\n\t\t);\n\t\tif (initial_ac.signal.aborted) {\n\t\t\treturn R.err(\"Initial navigation produced no state\");\n\t\t}\n\n\t\tawait wait_for_css(payload.css_bundles, initial_ac.signal);\n\t\tif (initial_ac.signal.aborted) {\n\t\t\treturn R.err(\"Initial navigation produced no state\");\n\t\t}\n\n\t\tconst route = build_route_record(payload, modules, cl_results);\n\t\troute_snapshot = { position: browser, route };\n\n\t\tapply_head_and_title(payload.title, payload.meta_head_els, payload.rest_head_els);\n\t\tapply_css_bundles(payload.css_bundles);\n\t\tpreload_modules(payload.deps);\n\n\t\tlet scroll_intent: ScrollIntent | undefined;\n\t\tconst make_scroll_intent = (scroll: ScrollState): ScrollIntent => {\n\t\t\treturn {\n\t\t\t\tscroll,\n\t\t\t\ttarget_entry_id: make_entry_id(\n\t\t\t\t\troute.matches.length - 1,\n\t\t\t\t\troute.matches[route.matches.length - 1]?.pattern ?? \"\",\n\t\t\t\t),\n\t\t\t};\n\t\t};\n\t\tlet refresh_scroll_raw: string | null;\n\t\ttry {\n\t\t\trefresh_scroll_raw = sessionStorage.getItem(SCROLL_STORAGE_RELOAD_KEY);\n\t\t} catch {\n\t\t\trefresh_scroll_raw = null;\n\t\t}\n\t\tif (refresh_scroll_raw) {\n\t\t\ttry {\n\t\t\t\tsessionStorage.removeItem(SCROLL_STORAGE_RELOAD_KEY);\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tconst s = JSON.parse(refresh_scroll_raw);\n\t\t\t\tif (\n\t\t\t\t\ttypeof s?.x === \"number\" &&\n\t\t\t\t\ttypeof s?.y === \"number\" &&\n\t\t\t\t\ttypeof s?.unix === \"number\" &&\n\t\t\t\t\ttypeof s?.href === \"string\" &&\n\t\t\t\t\tDate.now() - s.unix <= REFRESH_MAX_AGE_MS &&\n\t\t\t\t\tmatches_without_hash(new URL(s.href), current_url())\n\t\t\t\t) {\n\t\t\t\t\tscroll_intent = make_scroll_intent({ x: s.x, y: s.y });\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t\tif (!scroll_intent) {\n\t\t\tconst hash = normalize_hash(current_url().hash);\n\t\t\tif (hash.length > 0) {\n\t\t\t\tscroll_intent = make_scroll_intent({\n\t\t\t\t\thash: current_url().hash,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tcommit_route_snapshot(\"initial\", null, route_snapshot, scroll_intent);\n\n\t\tsetup_work_indicator(options.workIndicator);\n\t\tif (focus_revalidation_cleanup) {\n\t\t\tfocus_revalidation_cleanup();\n\t\t\tfocus_revalidation_cleanup = null;\n\t\t}\n\t\tif (options.revalidateOnWindowFocus) {\n\t\t\tconst focus_revalidation_options =\n\t\t\t\ttypeof options.revalidateOnWindowFocus === \"object\"\n\t\t\t\t\t? options.revalidateOnWindowFocus\n\t\t\t\t\t: null;\n\t\t\tconst stale_ms = focus_revalidation_options?.staleTimeMs ?? 5_000;\n\t\t\tconst skip_work_indicator =\n\t\t\t\tfocus_revalidation_options?.skipWorkIndicator === true;\n\t\t\tfocus_revalidation_cleanup = addOnWindowFocusListener(() => {\n\t\t\t\tconst work = derive_work_state();\n\t\t\t\tif (work.navigation || work.revalidation || work.apiRequests.length > 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (Date.now() - last_activity_ts >= stale_ms) {\n\t\t\t\t\trequire_refresh(\"windowFocus\", undefined, true, skip_work_indicator);\n\t\t\t\t\tnotify_work_update();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (options.render) {\n\t\t\tawait options.render();\n\t\t}\n\n\t\twindow.addEventListener(\"popstate\", () => {\n\t\t\tvoid handle_popstate();\n\t\t});\n\t\twindow.addEventListener(\"beforeunload\", () => {\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem(\n\t\t\t\t\tSCROLL_STORAGE_RELOAD_KEY,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t...get_scroll_pos(),\n\t\t\t\t\t\tunix: Date.now(),\n\t\t\t\t\t\thref: current_url().href,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t});\n\t\tregister_hmr();\n\n\t\tphase = \"ready\";\n\t\tif (deferred_submit_redirect) {\n\t\t\tconst redirect = deferred_submit_redirect;\n\t\t\tdeferred_submit_redirect = null;\n\t\t\tvoid start_nav_inner(redirect, { replace: true }, 0, {\n\t\t\t\tsource: \"redirect\",\n\t\t\t});\n\t\t}\n\t\tmaybe_revalidate();\n\t\treturn R.ok(undefined);\n\t}\n\n\t/////// Public API\n\n\tasync function navigate(\n\t\thref: string | URL,\n\t\toptions?: {\n\t\t\treplace?: boolean;\n\t\t\tscrollToTop?: boolean;\n\t\t\tstate?: unknown;\n\t\t\tskipWorkIndicator?: boolean;\n\t\t},\n\t): Promise<NavResult> {\n\t\tif (phase !== \"ready\") {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\tconst url = new URL(String(href), window.location.href);\n\t\tif (!is_same_origin(url)) {\n\t\t\thard_redirect(url.href);\n\t\t\treturn { didNavigate: false };\n\t\t}\n\t\treturn start_nav_inner(\n\t\t\turl,\n\t\t\t{\n\t\t\t\treplace: options?.replace,\n\t\t\t\tscroll_to_top: options?.scrollToTop,\n\t\t\t\tstate: options?.state,\n\t\t\t\tskip_work_indicator: options?.skipWorkIndicator,\n\t\t\t},\n\t\t\t0,\n\t\t);\n\t}\n\n\tasync function revalidate(): Promise<RevalidationResult> {\n\t\tif (phase !== \"ready\") {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\tconst waiter = make_deferred<RevalidationResult>();\n\t\trequire_refresh(\"manual\", waiter, true);\n\t\tnotify_work_update();\n\t\treturn waiter.promise;\n\t}\n\n\tfunction get_route_state(): RouteState {\n\t\tconst snapshot = route_snapshot;\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\treturn route_snapshot_to_state(snapshot);\n\t}\n\n\tfunction get_work_state(): WorkState {\n\t\tif (!route_snapshot) {\n\t\t\tthrow new Error(\"Vorma not booted\");\n\t\t}\n\t\treturn derive_work_state();\n\t}\n\n\tfunction get_root_el(): HTMLElement {\n\t\tconst el = document.getElementById(VORMA_ROOT_EL_ID);\n\t\tif (el) {\n\t\t\treturn el;\n\t\t}\n\t\tconst fresh = document.createElement(\"div\");\n\t\tfresh.id = VORMA_ROOT_EL_ID;\n\t\tdocument.body.insertBefore(fresh, document.body.firstChild);\n\t\treturn fresh;\n\t}\n\n\tfunction define_view<T = any>(input: {\n\t\tpattern: string;\n\t\tcomponent: (props: any) => any;\n\t\terrorBoundary?: (props: { error: unknown }) => any;\n\t\tclientLoader?: (props: any) => Promise<T>;\n\t\tbeforeRouteCommit?: BeforeRouteCommitFn;\n\t\tbeforeRouteYield?: BeforeRouteYieldFn;\n\t\trunClientLoaderOnHmr?: boolean;\n\t}): ViewDefinition & { __phantom_client_loader_data?: T } {\n\t\tif (import.meta.env.DEV) {\n\t\t\tif (input.runClientLoaderOnHmr) {\n\t\t\t\thmr_rerun_patterns.add(input.pattern);\n\t\t\t} else {\n\t\t\t\thmr_rerun_patterns.delete(input.pattern);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tpattern: input.pattern,\n\t\t\tcomponent: input.component,\n\t\t\terror_boundary: input.errorBoundary,\n\t\t\tclient_loader: input.clientLoader,\n\t\t\tbefore_route_commit: input.beforeRouteCommit,\n\t\t\tbefore_route_yield: input.beforeRouteYield,\n\t\t};\n\t}\n\n\t(window as any)[Symbol.for(\"vorma-data-revalidate-fn\")] = revalidate;\n\n\treturn R.ok({\n\t\tboot,\n\t\tworkIndicator: work_indicator.indicator,\n\t\tnavigate,\n\t\trevalidate,\n\t\tsubmit_inner,\n\t\tgetRouteState: get_route_state,\n\t\tgetWorkState: get_work_state,\n\t\tgetClientBuildId: () => client_build_id,\n\t\tgetRootEl: get_root_el,\n\t\tdefineView: define_view,\n\t\tstart_prefetch,\n\t\tstop_prefetch,\n\t\tsave_current_scroll,\n\t\tget_default_error_boundary: () => default_error_boundary,\n\t});\n}\n\ndeclare global {\n\tinterface Window {\n\t\t__vorma_hmr_view_update?: (\n\t\t\traw_url: string,\n\t\t\tmod: Record<string, unknown>,\n\t\t) => Promise<void>;\n\t}\n}\n","import {\n\tLINK_ACTIVE_ANCESTOR_ATTR,\n\tLINK_ACTIVE_EXACT_ATTR,\n\tLINK_PENDING_ANCESTOR_ATTR,\n\tLINK_PENDING_EXACT_ATTR,\n} from \"./constants.ts\";\nimport type { WorkState } from \"./create_client_core.ts\";\nimport type { LinkPropsBase, RouteState } from \"./types.ts\";\n\nexport type LinkRouteState = {\n\thref: string;\n\tmatched_patterns: string[];\n};\n\nexport type LinkWorkState = {\n\tnavigation_href: string | null;\n};\n\nexport type LinkPropsResult = {\n\tis_external: boolean;\n\tanchor_props: Record<string, unknown>;\n\tonClick?: (e: unknown) => void;\n\tonPointerDown?: (e: unknown) => void;\n\tonPointerEnter?: (e: unknown) => void;\n\tonFocus?: (e: unknown) => void;\n\tonPointerLeave?: (e: unknown) => void;\n\tonBlur?: (e: unknown) => void;\n\tonTouchCancel?: (e: unknown) => void;\n};\n\nexport type LinkNavFns = {\n\tnavigate: (args: {\n\t\thref: string;\n\t\treplace?: boolean;\n\t\tscrollToTop?: boolean;\n\t\tskipWorkIndicator?: boolean;\n\t\tstate?: unknown;\n\t}) => Promise<{ didNavigate: boolean }>;\n\tstart_prefetch: (href: string) => void;\n\tstop_prefetch: (href: string) => void;\n\tsave_current_scroll: () => void;\n\tregister_link_pattern: (pattern: string) => void;\n\tget_link_state_version: () => number;\n\tsubscribe_link_state: (listener: () => void) => () => void;\n\tget_link_attribute_state: (\n\t\thref: string,\n\t\tmatch_rules: LinkPropsBase[\"attributeMatchRules\"],\n\t\troute_state: LinkRouteState | null,\n\t\twork_state: LinkWorkState,\n\t) => {\n\t\tactive_exact: boolean;\n\t\tactive_ancestor: boolean;\n\t\tpending_exact: boolean;\n\t\tpending_ancestor: boolean;\n\t};\n};\n\nexport const skip_work_indicator_link_prop = \"skipWorkIndicator\";\n\nconst VORMA_KEYS = new Set([\n\t\"attributeMatchRules\",\n\t\"pattern\",\n\t\"prefetch\",\n\t\"prefetchDelayMs\",\n\t\"replace\",\n\t\"scrollToTop\",\n\tskip_work_indicator_link_prop,\n\t\"state\",\n\t\"visitOnPointerDown\",\n]);\n\nconst COMPOSED_EVENT_KEYS = new Set([\n\t\"onClick\",\n\t\"onPointerDown\",\n\t\"onPointerEnter\",\n\t\"onFocus\",\n\t\"onPointerLeave\",\n\t\"onBlur\",\n\t\"onTouchCancel\",\n]);\n\nlet is_touch_active = false;\nlet input_modality_registered = false;\n\nfunction register_input_modality(): void {\n\tif (input_modality_registered) {\n\t\treturn;\n\t}\n\tinput_modality_registered = true;\n\n\twindow.addEventListener(\"touchstart\", () => {\n\t\tis_touch_active = true;\n\t});\n\n\tconst on_pointer = (e: PointerEvent): void => {\n\t\tconst pt = e.pointerType;\n\t\tif (pt === \"touch\") {\n\t\t\tis_touch_active = true;\n\t\t} else if (pt === \"mouse\" || pt === \"pen\") {\n\t\t\tis_touch_active = false;\n\t\t}\n\t};\n\n\twindow.addEventListener(\"pointerdown\", on_pointer);\n\twindow.addEventListener(\"pointermove\", on_pointer);\n}\n\nexport function select_link_route_state(route: RouteState): LinkRouteState {\n\treturn {\n\t\thref: route.href,\n\t\tmatched_patterns: route.matches.map((m) => {\n\t\t\treturn m.pattern;\n\t\t}),\n\t};\n}\n\nexport function select_link_work_state(work: WorkState): LinkWorkState {\n\treturn {\n\t\tnavigation_href: work.navigation?.href ?? null,\n\t};\n}\n\nfunction strip_keys(\n\tprops: Record<string, unknown>,\n\tkeys: Set<string>,\n): Record<string, unknown> {\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(props)) {\n\t\tif (!keys.has(k)) {\n\t\t\tout[k] = v;\n\t\t}\n\t}\n\treturn out;\n}\n\nexport function make_link_props(\n\tprops: Record<string, unknown>,\n\tnav: LinkNavFns,\n\troute_state: LinkRouteState | null = null,\n\twork_state?: LinkWorkState,\n): LinkPropsResult {\n\tregister_input_modality();\n\n\tconst href = (props.href as string) ?? \"\";\n\tconst pattern = props.pattern as string | undefined;\n\tif (pattern) {\n\t\tnav.register_link_pattern(pattern);\n\t}\n\n\tconst details = get_href_details(href);\n\tconst is_external = details.is_http ? details.is_external : true;\n\tconst consumer_click = props.onClick as ((e: unknown) => void) | undefined;\n\n\tif (is_external) {\n\t\treturn {\n\t\t\tis_external: true,\n\t\t\tanchor_props: strip_keys(props, VORMA_KEYS),\n\t\t\tonClick: consumer_click,\n\t\t};\n\t}\n\n\tconst anchor_props = strip_keys(strip_keys(props, VORMA_KEYS), COMPOSED_EVENT_KEYS);\n\tconst attribute_match_rules =\n\t\tprops.attributeMatchRules as LinkPropsBase[\"attributeMatchRules\"];\n\tconst link_state =\n\t\tattribute_match_rules?.skip === true || !route_state || !work_state\n\t\t\t? null\n\t\t\t: nav.get_link_attribute_state(\n\t\t\t\t\thref,\n\t\t\t\t\tattribute_match_rules,\n\t\t\t\t\troute_state,\n\t\t\t\t\twork_state,\n\t\t\t\t);\n\tif (link_state?.active_exact) {\n\t\tanchor_props[LINK_ACTIVE_EXACT_ATTR] = \"\";\n\t}\n\tif (link_state?.active_ancestor) {\n\t\tanchor_props[LINK_ACTIVE_ANCESTOR_ATTR] = \"\";\n\t}\n\tif (link_state?.pending_exact) {\n\t\tanchor_props[LINK_PENDING_EXACT_ATTR] = \"\";\n\t}\n\tif (link_state?.pending_ancestor) {\n\t\tanchor_props[LINK_PENDING_ANCESTOR_ATTR] = \"\";\n\t}\n\tif (link_state?.active_exact && anchor_props[\"aria-current\"] === undefined) {\n\t\tanchor_props[\"aria-current\"] = \"page\";\n\t}\n\n\tconst prefetch_mode = props.prefetch as string | undefined;\n\tconst prefetch_delay = (props.prefetchDelayMs as number | undefined) ?? 100;\n\tconst replace = props.replace as boolean | undefined;\n\tconst scroll_to_top = props.scrollToTop as boolean | undefined;\n\tconst skip_work_indicator = props[skip_work_indicator_link_prop] as\n\t\t| boolean\n\t\t| undefined;\n\tconst state = props.state as unknown;\n\tconst target_attr = props.target as string | undefined;\n\tconst visit_on_pointer_down = props.visitOnPointerDown as boolean | undefined;\n\tconst consumer_pointer_down = props.onPointerDown as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\tconst consumer_pointer_enter = props.onPointerEnter as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\tconst consumer_focus = props.onFocus as ((e: unknown) => void) | undefined;\n\tconst consumer_pointer_leave = props.onPointerLeave as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\tconst consumer_blur = props.onBlur as ((e: unknown) => void) | undefined;\n\tconst consumer_touch_cancel = props.onTouchCancel as\n\t\t| ((e: unknown) => void)\n\t\t| undefined;\n\n\tlet prefetch_timer: number | undefined;\n\tconst wants_prefetch = prefetch_mode === \"intent\";\n\n\tconst start_pf = (): void => {\n\t\tif (prefetch_timer !== undefined) {\n\t\t\tclearTimeout(prefetch_timer);\n\t\t}\n\t\tprefetch_timer = window.setTimeout(() => {\n\t\t\tprefetch_timer = undefined;\n\t\t\tnav.start_prefetch(href);\n\t\t}, prefetch_delay);\n\t};\n\n\tconst stop_pf = (): void => {\n\t\tif (prefetch_timer !== undefined) {\n\t\t\tclearTimeout(prefetch_timer);\n\t\t\tprefetch_timer = undefined;\n\t\t}\n\t\tnav.stop_prefetch(href);\n\t};\n\n\treturn {\n\t\tis_external: false,\n\t\tanchor_props,\n\n\t\tonClick: async (e: unknown) => {\n\t\t\tconst ev = e as any;\n\t\t\tconsumer_click?.(e);\n\n\t\t\tif (ev.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (get_is_modified_navigation_click(ev)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!get_is_primary_navigation_click(ev)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target_attr && target_attr !== \"\" && target_attr !== \"_self\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tev.preventDefault?.();\n\n\t\t\ttry {\n\t\t\t\tawait nav.navigate({\n\t\t\t\t\thref,\n\t\t\t\t\treplace,\n\t\t\t\t\tscrollToTop: scroll_to_top,\n\t\t\t\t\t...(skip_work_indicator === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { skipWorkIndicator: skip_work_indicator }),\n\t\t\t\t\tstate,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"Vorma: Link click failed\", err);\n\t\t\t}\n\t\t},\n\n\t\tonPointerDown:\n\t\t\tvisit_on_pointer_down || consumer_pointer_down\n\t\t\t\t? async (e: unknown) => {\n\t\t\t\t\t\tconst ev = e as any;\n\t\t\t\t\t\tconsumer_pointer_down?.(e);\n\t\t\t\t\t\tif (!visit_on_pointer_down) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ev.defaultPrevented) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst pt = ev.pointerType;\n\t\t\t\t\t\tif (pt !== \"mouse\" && pt !== \"pen\") {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (get_is_modified_navigation_click(ev)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!get_is_primary_navigation_click(ev)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttarget_attr &&\n\t\t\t\t\t\t\ttarget_attr !== \"\" &&\n\t\t\t\t\t\t\ttarget_attr !== \"_self\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tev.preventDefault?.();\n\n\t\t\t\t\t\tconst el = ev.currentTarget as HTMLElement;\n\t\t\t\t\t\tel.addEventListener(\n\t\t\t\t\t\t\t\"click\",\n\t\t\t\t\t\t\t(ce: Event) => {\n\t\t\t\t\t\t\t\tce.preventDefault();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ once: true },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait nav.navigate({\n\t\t\t\t\t\t\t\thref,\n\t\t\t\t\t\t\t\treplace,\n\t\t\t\t\t\t\t\tscrollToTop: scroll_to_top,\n\t\t\t\t\t\t\t\t...(skip_work_indicator === undefined\n\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\tskipWorkIndicator: skip_work_indicator,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\"Vorma: Link pointerdown navigation failed\",\n\t\t\t\t\t\t\t\terr,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonPointerEnter:\n\t\t\twants_prefetch || consumer_pointer_enter\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstart_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_pointer_enter?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonFocus:\n\t\t\twants_prefetch || consumer_focus\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstart_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_focus?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonPointerLeave:\n\t\t\twants_prefetch || consumer_pointer_leave\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch && !is_touch_active) {\n\t\t\t\t\t\t\tstop_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_pointer_leave?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonBlur:\n\t\t\twants_prefetch || consumer_blur\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstop_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_blur?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\n\t\tonTouchCancel:\n\t\t\twants_prefetch || consumer_touch_cancel\n\t\t\t\t? (e: unknown) => {\n\t\t\t\t\t\tif (wants_prefetch) {\n\t\t\t\t\t\t\tstop_pf();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsumer_touch_cancel?.(e);\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction get_is_modified_navigation_click(event: {\n\tmetaKey?: boolean;\n\taltKey?: boolean;\n\tctrlKey?: boolean;\n\tshiftKey?: boolean;\n}): boolean {\n\treturn (\n\t\tBoolean(event.metaKey) ||\n\t\tBoolean(event.altKey) ||\n\t\tBoolean(event.ctrlKey) ||\n\t\tBoolean(event.shiftKey)\n\t);\n}\n\nfunction get_is_primary_navigation_click(event: { button?: number }): boolean {\n\treturn event.button === undefined || event.button === 0;\n}\n\ntype HrefDetails =\n\t| {\n\t\t\turl: URL;\n\t\t\tis_http: true;\n\t\t\tabsoluteUrl: string;\n\t\t\trelativeUrl: string;\n\t\t\tis_external: boolean;\n\t\t\tis_internal: boolean;\n\t }\n\t| {\n\t\t\tis_http: false;\n\t };\n\nexport function get_href_details(href: string): HrefDetails {\n\tif (!href) {\n\t\treturn { is_http: false };\n\t}\n\n\tlet url: URL;\n\n\ttry {\n\t\turl = new URL(href, window.location.href);\n\t} catch {\n\t\treturn { is_http: false };\n\t}\n\n\tconst is_external = url.origin !== window.location.origin;\n\tconst is_internal = !is_external;\n\n\t// Filter out things like \"#\", \"tel:\", \"mailto:\", or custom schemes.\n\tconst is_http = url.protocol === \"http:\" || url.protocol === \"https:\";\n\tif (!is_http) {\n\t\treturn { is_http: false };\n\t}\n\n\tif (is_external) {\n\t\treturn {\n\t\t\turl,\n\t\t\tis_http: true,\n\t\t\tabsoluteUrl: url.href,\n\t\t\trelativeUrl: \"\",\n\t\t\tis_external,\n\t\t\tis_internal,\n\t\t};\n\t}\n\n\treturn {\n\t\turl,\n\t\tis_http: true,\n\t\tabsoluteUrl: url.href,\n\t\trelativeUrl: url.href.replace(url.origin, \"\"),\n\t\tis_external,\n\t\tis_internal,\n\t};\n}\n","import type { RouteRenderEntry, ViewDefinition } from \"./create_client_core.ts\";\nimport type { RouteErrorState } from \"./types.ts\";\n\nexport type OutletSlot =\n\t| { kind: \"component\"; component: (props: any) => any }\n\t| {\n\t\t\tkind: \"error\";\n\t\t\terror: unknown;\n\t\t\tboundary: (props: { error: unknown }) => any;\n\t }\n\t| { kind: \"pass_through\" }\n\t| { kind: \"empty\" };\n\nconst component_refs = new Map<\n\tstring,\n\t{\n\t\timpl: (props: any) => any;\n\t\twrapper: (props: any) => any;\n\t\tholder: { current: (props: any) => any };\n\t}\n>();\n\nconst error_refs = new Map<\n\tstring,\n\t{\n\t\timpl: (props: { error: unknown }) => any;\n\t\twrapper: (props: { error: unknown }) => any;\n\t\tholder: { current: (props: { error: unknown }) => any };\n\t}\n>();\n\nfunction get_stable_component(\n\tkey: string,\n\timpl: (props: any) => any,\n): (props: any) => any {\n\tlet entry = component_refs.get(key);\n\tif (!entry) {\n\t\tconst holder = { current: impl };\n\t\tconst wrapper = (props: any) => {\n\t\t\treturn holder.current(props);\n\t\t};\n\t\tentry = { impl, wrapper, holder };\n\t\tcomponent_refs.set(key, entry);\n\t}\n\tentry.holder.current = impl;\n\treturn entry.wrapper;\n}\n\nfunction get_stable_error_boundary(\n\tkey: string,\n\timpl: (props: { error: unknown }) => any,\n): (props: { error: unknown }) => any {\n\tlet entry = error_refs.get(key);\n\tif (!entry) {\n\t\tconst holder = { current: impl };\n\t\tconst wrapper = (props: { error: unknown }) => {\n\t\t\treturn holder.current(props);\n\t\t};\n\t\tentry = { impl, wrapper, holder };\n\t\terror_refs.set(key, entry);\n\t}\n\tentry.holder.current = impl;\n\treturn entry.wrapper;\n}\n\nexport function resolve_outlet_slot(\n\tentries: RouteRenderEntry[],\n\terror: RouteErrorState | null,\n\tidx: number,\n\tdefault_error_boundary: ((props: { error: unknown }) => any) | undefined,\n): OutletSlot {\n\tif (idx >= entries.length) {\n\t\treturn { kind: \"empty\" };\n\t}\n\n\tif (error !== null && idx >= error.idx) {\n\t\tconst error_entry = entries[error.idx]!;\n\t\tconst def = error_entry.module.default as ViewDefinition | undefined;\n\t\tconst raw_boundary =\n\t\t\tdef?.error_boundary ?? default_error_boundary ?? fallback_error_boundary;\n\t\tconst boundary = get_stable_error_boundary(error_entry.pattern, raw_boundary);\n\t\treturn { kind: \"error\", error: error.error, boundary };\n\t}\n\n\tconst entry = entries[idx]!;\n\tconst def = entry.module.default as ViewDefinition | undefined;\n\n\tif (!def?.component) {\n\t\tif (idx + 1 < entries.length) {\n\t\t\treturn { kind: \"pass_through\" };\n\t\t}\n\t\treturn { kind: \"empty\" };\n\t}\n\n\tconst component = get_stable_component(entry.pattern, def.component);\n\treturn { kind: \"component\", component };\n}\n\nexport function get_entry_key(entry: RouteRenderEntry): string {\n\treturn `${entry.pattern}::${entry.module_url}`;\n}\n\nfunction fallback_error_boundary(props: { error: unknown }): string {\n\tif (props.error instanceof Error) {\n\t\treturn `Error: ${props.error.message}`;\n\t}\n\tif (typeof props.error === \"string\") {\n\t\treturn `Error: ${props.error}`;\n\t}\n\treturn \"An unexpected error occurred.\";\n}\n","import type { ReadonlySignal } from \"@preact/signals\";\nimport { jsonDeepEquals } from \"vorma/kit/json\";\nimport { R, type Result } from \"vorma/kit/result\";\nimport { create_typed_api_client } from \"./api_client.ts\";\nimport { create_client_matcher, type ClientMatcher } from \"./client_wasm/matcher.ts\";\nimport type {\n\tClientCore,\n\tClientOptions as CoreClientOptions,\n\tViewDefinition,\n} from \"./create_client_core\";\nimport {\n\tcreate_client_core,\n\ttype ClientCommit,\n\ttype RouteRenderEntry,\n\ttype RouteRenderState,\n\ttype ScrollIntent,\n\ttype WorkState,\n} from \"./create_client_core.ts\";\nimport {\n\ttype LinkNavFns,\n\ttype LinkRouteState,\n\ttype LinkWorkState,\n} from \"./make_link_props.ts\";\nimport { get_entry_key } from \"./resolve_outlet_slot.ts\";\nimport type {\n\tAppConfig,\n\tLinkPropsBase,\n\tRouteErrorState,\n\tRouteState,\n\tRouteUpdateReason,\n\tToApiClient,\n\tToApiDecorator,\n\tToDefineViewArgs,\n\tToLinkProps,\n\tToNavigateArgs,\n\tToNavigationTarget,\n\tToRouteDestination,\n\tToRouteSyncArgs,\n\tToViewComponentProps,\n\tToViewOutput,\n\tToViewPattern,\n} from \"./types\";\nimport {\n\tcreate_typed_navigate,\n\tcreate_typed_prefetch,\n\tcreate_typed_to_href,\n} from \"./url.ts\";\n\ntype ClientMatcherFactory = () => Promise<ClientMatcher>;\n\nexport type DecomposedState = {\n\t// Always a new reference\n\tentries: RouteRenderEntry[];\n\terror: RouteErrorState | null;\n\n\t// Stable per channel\n\tviews_data: unknown[];\n\tclient_loaders_data: unknown[];\n\tmatched_patterns: string[];\n\timport_urls: string[];\n\tentry_keys: string[];\n\tparams: Record<string, string>;\n\tsplat_values: string[];\n\tclient_build_id: string;\n\thistory_state: unknown;\n};\n\nexport type DecomposedCommit = {\n\tlink_state_version?: number;\n\troute?: RouteState;\n\troute_reason?: RouteUpdateReason;\n\tscroll_intent?: ScrollIntent;\n\tstate?: DecomposedState;\n\twork?: WorkState;\n};\n\nexport type DecomposedCommitFn = (commit: DecomposedCommit) => void;\n\ntype LinkAttributeCandidate = {\n\turl: URL;\n\tmatched_patterns: string[];\n};\n\nlet client_matcher_factory_for_test: ClientMatcherFactory | null = null;\n\nexport function set_client_matcher_factory_for_test(\n\tfactory: ClientMatcherFactory | null,\n): () => void {\n\tconst prev_factory = client_matcher_factory_for_test;\n\tclient_matcher_factory_for_test = factory;\n\treturn () => {\n\t\tclient_matcher_factory_for_test = prev_factory;\n\t};\n}\n\n// __TODO why is this generic called \"App\"? Shouldn't it be \"Component\" or something?\nexport type AdapterRenderArgs<App> = {\n\tRootOutlet: App;\n\trootEl: HTMLElement;\n};\n\nexport type AdapterClientOptions<App> = Omit<CoreClientOptions, \"render\"> & {\n\trender?: (args: AdapterRenderArgs<App>) => void | Promise<void>;\n};\n\ntype AdapterBase<A extends AppConfig> = {\n\tcore: ClientCore;\n\n\tnav_fns: LinkNavFns;\n\n\tpassthrough: Pick<\n\t\tClientCore,\n\t\t\"revalidate\" | \"getRouteState\" | \"getWorkState\" | \"workIndicator\"\n\t> & {\n\t\tnavigate: <P extends ToViewPattern<A>>(\n\t\t\targs: ToNavigateArgs<A, P>,\n\t\t) => Promise<{ didNavigate: boolean }>;\n\n\t\tprefetch: <P extends ToViewPattern<A>>(target: ToNavigationTarget<A, P>) => void;\n\n\t\tcancelPrefetch: <P extends ToViewPattern<A>>(\n\t\t\ttarget: ToNavigationTarget<A, P>,\n\t\t) => void;\n\n\t\ttoHref: <P extends ToViewPattern<A>>(\n\t\t\tdestination: ToRouteDestination<A, P>,\n\t\t) => string;\n\n\t\tapiClient: ToApiClient<A>;\n\t};\n};\n\nexport function create_adapter_base<A extends AppConfig>(\n\tapp_config: A,\n\ton_commit: DecomposedCommitFn,\n\tapi_decorator?: ToApiDecorator<A>,\n): Result<AdapterBase<A>> {\n\tlet prev: DecomposedState = {\n\t\tentries: [],\n\t\terror: null,\n\t\tviews_data: [],\n\t\tclient_loaders_data: [],\n\t\tmatched_patterns: [],\n\t\timport_urls: [],\n\t\tentry_keys: [],\n\t\tparams: {},\n\t\tsplat_values: [],\n\t\tclient_build_id: \"\",\n\t\thistory_state: undefined,\n\t};\n\tlet link_matcher: ClientMatcher | null = null;\n\tlet link_matcher_loading = false;\n\tlet link_state_version = 0;\n\tconst link_state_listeners = new Set<() => void>();\n\tconst queued_link_patterns = new Set<string>();\n\n\tfunction decomposed_commit(client_commit: ClientCommit): void {\n\t\tconst adapter_commit: DecomposedCommit = {};\n\t\tconst route_render = client_commit.route_render;\n\t\tif (route_render) {\n\t\t\tadapter_commit.state = decompose_route_render_state(route_render.state);\n\t\t\tadapter_commit.scroll_intent = route_render.scroll_intent;\n\t\t}\n\t\tif (client_commit.route_update) {\n\t\t\tadapter_commit.route = client_commit.route_update.route;\n\t\t\tadapter_commit.route_reason = client_commit.route_update.reason;\n\t\t}\n\t\tif (client_commit.work) {\n\t\t\tadapter_commit.work = client_commit.work;\n\t\t}\n\t\ton_commit(adapter_commit);\n\t}\n\n\tfunction emit_link_state_update(): void {\n\t\tlink_state_version++;\n\t\ton_commit({ link_state_version });\n\t\tfor (const listener of link_state_listeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\tfunction start_link_matcher_load(): void {\n\t\tif (link_matcher || link_matcher_loading) {\n\t\t\treturn;\n\t\t}\n\t\tlink_matcher_loading = true;\n\t\tvoid (client_matcher_factory_for_test ?? create_client_matcher)()\n\t\t\t.then((matcher) => {\n\t\t\t\tlink_matcher = matcher;\n\t\t\t\tfor (const pattern of queued_link_patterns) {\n\t\t\t\t\tmatcher.register_pattern(pattern);\n\t\t\t\t}\n\t\t\t\temit_link_state_update();\n\t\t\t})\n\t\t\t.catch(() => {});\n\t}\n\n\tfunction decompose_route_render_state(\n\t\troute_state: RouteRenderState,\n\t): DecomposedState {\n\t\tfor (const entry of route_state.entries) {\n\t\t\tregister_link_pattern(entry.pattern);\n\t\t}\n\n\t\tconst next: DecomposedState = {\n\t\t\tentries: route_state.entries,\n\t\t\terror: route_state.error,\n\t\t\tviews_data: stable(\n\t\t\t\tprev.views_data,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.view_data;\n\t\t\t\t}),\n\t\t\t),\n\t\t\tclient_loaders_data: stable(\n\t\t\t\tprev.client_loaders_data,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.client_loader_data;\n\t\t\t\t}),\n\t\t\t),\n\t\t\tmatched_patterns: stable(\n\t\t\t\tprev.matched_patterns,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.pattern;\n\t\t\t\t}),\n\t\t\t),\n\t\t\timport_urls: stable(\n\t\t\t\tprev.import_urls,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn e.module_url;\n\t\t\t\t}),\n\t\t\t),\n\t\t\tentry_keys: stable(\n\t\t\t\tprev.entry_keys,\n\t\t\t\troute_state.entries.map((e) => {\n\t\t\t\t\treturn get_entry_key(e);\n\t\t\t\t}),\n\t\t\t),\n\t\t\tparams: stable(prev.params, route_state.params),\n\t\t\tsplat_values: stable(prev.splat_values, route_state.splat_values),\n\t\t\tclient_build_id: stable(prev.client_build_id, route_state.client_build_id),\n\t\t\thistory_state: stable(prev.history_state, route_state.history_state),\n\t\t};\n\n\t\tprev = next;\n\t\treturn next;\n\t}\n\n\tconst core_res = create_client_core(app_config, decomposed_commit);\n\tif (!core_res.ok) {\n\t\treturn R.err(core_res.err);\n\t}\n\tconst core = core_res.val;\n\n\tconst nav_fns: LinkNavFns = {\n\t\tnavigate: (args) => {\n\t\t\treturn core.navigate(args.href, {\n\t\t\t\treplace: args.replace,\n\t\t\t\tscrollToTop: args.scrollToTop,\n\t\t\t\tskipWorkIndicator: args.skipWorkIndicator,\n\t\t\t\tstate: args.state,\n\t\t\t});\n\t\t},\n\t\tstart_prefetch: core.start_prefetch,\n\t\tstop_prefetch: core.stop_prefetch,\n\t\tsave_current_scroll: core.save_current_scroll,\n\t\tregister_link_pattern,\n\t\tget_link_attribute_state,\n\t\tget_link_state_version: () => {\n\t\t\treturn link_state_version;\n\t\t},\n\t\tsubscribe_link_state: (listener) => {\n\t\t\tlink_state_listeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlink_state_listeners.delete(listener);\n\t\t\t};\n\t\t},\n\t};\n\tstart_link_matcher_load();\n\n\tconst navigate = create_typed_navigate<A>(core.navigate);\n\tconst prefetch = create_typed_prefetch<A>(core.start_prefetch);\n\tconst cancel_prefetch = create_typed_prefetch<A>(core.stop_prefetch);\n\tconst to_href = create_typed_to_href<A>();\n\n\tconst api_client = create_typed_api_client<A>(\n\t\tapp_config.apiMountRoot,\n\t\tcore.submit_inner,\n\t\tapi_decorator,\n\t);\n\n\treturn R.ok({\n\t\tcore,\n\t\tnav_fns,\n\t\tpassthrough: {\n\t\t\tnavigate,\n\t\t\tprefetch,\n\t\t\tcancelPrefetch: cancel_prefetch,\n\t\t\ttoHref: to_href,\n\t\t\trevalidate: core.revalidate,\n\t\t\tgetRouteState: core.getRouteState,\n\t\t\tgetWorkState: core.getWorkState,\n\t\t\tworkIndicator: core.workIndicator,\n\t\t\tapiClient: api_client,\n\t\t},\n\t});\n\n\tfunction register_link_pattern(pattern: string): void {\n\t\tif (queued_link_patterns.has(pattern)) {\n\t\t\treturn;\n\t\t}\n\t\tqueued_link_patterns.add(pattern);\n\t\tlink_matcher?.register_pattern(pattern);\n\t}\n\n\tfunction href_to_link_candidate(href: string): LinkAttributeCandidate {\n\t\tconst url = new URL(href, window.location.href);\n\t\tconst match = link_matcher?.find_nested_matches(url.pathname);\n\t\treturn {\n\t\t\turl,\n\t\t\tmatched_patterns: match?.patterns ?? [],\n\t\t};\n\t}\n\n\tfunction exact_link_match(\n\t\ttarget: LinkAttributeCandidate,\n\t\tcandidate: LinkAttributeCandidate,\n\t\tmatch_rules: LinkPropsBase[\"attributeMatchRules\"],\n\t): boolean {\n\t\treturn (\n\t\t\ttarget.url.pathname === candidate.url.pathname &&\n\t\t\t(target.matched_patterns.length === 0 ||\n\t\t\t\tcandidate.matched_patterns.length === 0 ||\n\t\t\t\tjsonDeepEquals(target.matched_patterns, candidate.matched_patterns)) &&\n\t\t\t(match_rules?.includeSearch !== true ||\n\t\t\t\ttarget.url.search === candidate.url.search) &&\n\t\t\t(match_rules?.includeHash !== true || target.url.hash === candidate.url.hash)\n\t\t);\n\t}\n\n\tfunction ancestor_link_match(\n\t\ttarget: LinkAttributeCandidate,\n\t\tcandidate: LinkAttributeCandidate,\n\t): boolean {\n\t\tconst target_path = target.url.pathname === \"/\" ? \"/\" : `${target.url.pathname}/`;\n\t\treturn (\n\t\t\ttarget.matched_patterns.length > 0 &&\n\t\t\tcandidate.matched_patterns.length > target.matched_patterns.length &&\n\t\t\t(target_path === \"/\" || candidate.url.pathname.startsWith(target_path)) &&\n\t\t\ttarget.matched_patterns.every((pattern, i) => {\n\t\t\t\treturn candidate.matched_patterns[i] === pattern;\n\t\t\t})\n\t\t);\n\t}\n\n\tfunction get_link_attribute_state(\n\t\thref: string,\n\t\tmatch_rules: LinkPropsBase[\"attributeMatchRules\"],\n\t\troute_state: LinkRouteState | null,\n\t\twork_state: LinkWorkState,\n\t) {\n\t\tif (match_rules?.skip === true || !route_state) {\n\t\t\treturn {\n\t\t\t\tactive_exact: false,\n\t\t\t\tactive_ancestor: false,\n\t\t\t\tpending_exact: false,\n\t\t\t\tpending_ancestor: false,\n\t\t\t};\n\t\t}\n\n\t\tconst target = href_to_link_candidate(href);\n\t\tconst route_url = new URL(route_state.href, window.location.href);\n\t\tconst route = {\n\t\t\turl: route_url,\n\t\t\tmatched_patterns: route_state.matched_patterns,\n\t\t};\n\t\tconst pending = work_state.navigation_href\n\t\t\t? href_to_link_candidate(work_state.navigation_href)\n\t\t\t: null;\n\n\t\treturn {\n\t\t\tactive_exact: exact_link_match(target, route, match_rules),\n\t\t\tactive_ancestor: ancestor_link_match(target, route),\n\t\t\tpending_exact: pending\n\t\t\t\t? exact_link_match(target, pending, match_rules)\n\t\t\t\t: false,\n\t\t\tpending_ancestor: pending ? ancestor_link_match(target, pending) : false,\n\t\t};\n\t}\n}\n\nfunction stable<T>(prev: T, next: T): T {\n\treturn jsonDeepEquals(prev, next) ? prev : next;\n}\n\ntype HookReturn<T, Mode extends \"value\" | \"accessor\" | \"signal\"> = Mode extends \"accessor\"\n\t? () => T\n\t: Mode extends \"signal\"\n\t\t? ReadonlySignal<T>\n\t\t: T;\n\ntype StateSelector<State, Selected> = (state: State) => Selected;\n\nexport type VormaClient<\n\tA extends AppConfig,\n\tElement,\n\tAnchorProps extends object,\n\tHookReturnMode extends \"value\" | \"accessor\" | \"signal\" = \"value\",\n> = AdapterBase<A>[\"passthrough\"] & {\n\tboot: () => Promise<Result<void>>;\n\n\tdefineView: <P extends ToViewPattern<A>, T = any>(\n\t\tinput: ToDefineViewArgs<A, P, T, Element>,\n\t) => ViewDefinition;\n\n\tRootOutlet: (props: { idx?: number } & Record<string, unknown>) => Element | null;\n\n\tLink: <P extends ToViewPattern<A>>(\n\t\tprops: Omit<AnchorProps, \"href\"> & ToLinkProps<A, P>,\n\t) => Element;\n\n\tuseRouteSync: <P extends ToViewPattern<A>>(args: ToRouteSyncArgs<A, P>) => void;\n\n\tuseRouteState: {\n\t\t(): HookReturn<RouteState, HookReturnMode>;\n\t\t<T>(selector: StateSelector<RouteState, T>): HookReturn<T, HookReturnMode>;\n\t};\n\n\tuseWorkState: {\n\t\t(): HookReturn<WorkState, HookReturnMode>;\n\t\t<T>(selector: StateSelector<WorkState, T>): HookReturn<T, HookReturnMode>;\n\t};\n\n\tuseViewData: <P extends ToViewPattern<A>>(\n\t\targs: ToViewComponentProps<A, P>,\n\t) => HookReturn<ToViewOutput<A, P>, HookReturnMode>;\n\n\tusePatternViewData: <P extends ToViewPattern<A>>(\n\t\tpattern: P,\n\t) => HookReturn<ToViewOutput<A, P> | undefined, HookReturnMode>;\n\n\tuseClientLoaderData: <P extends ToViewPattern<A>, T>(\n\t\targs: ToViewComponentProps<A, P, T>,\n\t) => HookReturn<T, HookReturnMode>;\n\n\tusePatternClientLoaderData: <T>(\n\t\tpattern: ToViewPattern<A>,\n\t) => HookReturn<T | undefined, HookReturnMode>;\n};\n"],"mappings":"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"}
|