@domphy/app 0.4.0 → 0.5.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/global.ts","../src/index.ts","../src/matcher.ts","../src/navigation.ts","../src/api.ts","../../core/src/types/EventProperties.ts","../../core/src/constants/HtmlTags.ts","../../core/src/classes/Notifier.ts","../../core/src/classes/State.ts","../../core/src/utils.ts","../../core/src/helpers.ts","../../core/src/constants/VoidTags.ts","../../core/src/constants/SvgTags.ts","../../core/src/constants/BooleanAttributes.ts","../../core/src/constants/PrefixCSS.ts","../../core/src/constants/CamelAttributes.ts","../../core/src/classes/ElementAttribute.ts","../../core/src/classes/AttributeList.ts","../../core/src/classes/TextNode.ts","../../core/src/classes/ElementList.ts","../../core/src/classes/StyleProperty.ts","../../core/src/classes/StyleRule.ts","../../core/src/classes/StyleList.ts","../../core/src/classes/ElementNode.ts","../../core/src/classes/RecordState.ts","../src/metadata.ts","../src/dataCache.ts","../src/history.ts","../src/tree.ts","../src/router.ts","../src/app.ts","../src/image.ts","../src/link.ts","../src/script.ts","../src/types.ts"],"sourcesContent":["export * as app from \"./index.js\";\n","export * from \"./api.js\";\nexport * from \"./app.js\";\nexport * from \"./dataCache.js\";\nexport * from \"./history.js\";\nexport * from \"./image.js\";\nexport * from \"./link.js\";\nexport * from \"./matcher.js\";\nexport * from \"./metadata.js\";\nexport * from \"./navigation.js\";\nexport * from \"./router.js\";\nexport * from \"./script.js\";\nexport * from \"./tree.js\";\nexport * from \"./types.js\";\n","import type { Params, Route } from \"./types.js\";\n\nexport type SegmentKind =\n | \"static\"\n | \"dynamic\"\n | \"catchall\"\n | \"optional-catchall\"\n | \"group\";\n\nexport interface PatternSegment {\n kind: SegmentKind;\n /** Literal value for static segments, param name otherwise. */\n value: string;\n}\n\n/** One routable endpoint: the chain of route nodes from root to the segment that owns the page. */\nexport interface CompiledRoute {\n /** Stable id, the full pattern path including groups, e.g. \"/(shop)/products/[id]\". */\n id: string;\n /** URL pattern segments, groups excluded. */\n segments: PatternSegment[];\n /** Route nodes from root to leaf. */\n chain: Route[];\n /** Segment id for each chain node, used as data cache key and diff key. */\n chainIds: string[];\n}\n\nexport interface RouteMatch {\n route: CompiledRoute;\n params: Params;\n pathname: string;\n}\n\nexport function parseSegment(part: string): PatternSegment {\n if (part.startsWith(\"(\") && part.endsWith(\")\")) {\n return { kind: \"group\", value: part.slice(1, -1) };\n }\n if (part.startsWith(\"[[...\") && part.endsWith(\"]]\")) {\n return { kind: \"optional-catchall\", value: part.slice(5, -2) };\n }\n if (part.startsWith(\"[...\") && part.endsWith(\"]\")) {\n return { kind: \"catchall\", value: part.slice(4, -1) };\n }\n if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\n return { kind: \"dynamic\", value: part.slice(1, -1) };\n }\n return { kind: \"static\", value: part };\n}\n\nexport function splitPath(path: string): string[] {\n return path.split(\"/\").filter((part) => part.length > 0);\n}\n\n/** Flattens a route tree into a list of routable endpoints. */\nexport function compileRoutes(routes: Route[]): CompiledRoute[] {\n const compiled: CompiledRoute[] = [];\n\n function walk(\n nodes: Route[],\n parentSegments: PatternSegment[],\n parentChain: Route[],\n parentChainIds: string[],\n parentId: string,\n ): void {\n for (const node of nodes) {\n const parts = splitPath(node.path);\n const ownSegments = parts.map(parseSegment);\n const urlSegments = [\n ...parentSegments,\n ...ownSegments.filter((segment) => segment.kind !== \"group\"),\n ];\n const id = `${parentId}/${parts.join(\"/\")}`.replace(/\\/+/g, \"/\");\n const chain = [...parentChain, node];\n const chainIds = [...parentChainIds, id === \"\" ? \"/\" : id];\n\n if (node.page || node.redirect) {\n compiled.push({\n id: id === \"\" ? \"/\" : id,\n segments: urlSegments,\n chain,\n chainIds,\n });\n }\n if (node.children) {\n walk(node.children, urlSegments, chain, chainIds, id);\n }\n }\n }\n\n walk(routes, [], [], [], \"\");\n compiled.sort(compareSpecificity);\n return compiled;\n}\n\nconst KIND_RANK: Record<SegmentKind, number> = {\n static: 0,\n dynamic: 1,\n catchall: 2,\n \"optional-catchall\": 3,\n group: 0,\n};\n\n/** Static segments win over dynamic, dynamic over catch-all — same priority order as Next.js. */\nexport function compareSpecificity(a: CompiledRoute, b: CompiledRoute): number {\n const length = Math.max(a.segments.length, b.segments.length);\n for (let i = 0; i < length; i++) {\n const segmentA = a.segments[i];\n const segmentB = b.segments[i];\n if (!segmentA) return -1;\n if (!segmentB) return 1;\n const rankDifference = KIND_RANK[segmentA.kind] - KIND_RANK[segmentB.kind];\n if (rankDifference !== 0) return rankDifference;\n }\n return 0;\n}\n\nexport function matchPath(\n segments: PatternSegment[],\n pathname: string,\n): Params | null {\n const parts = splitPath(pathname).map((part) => decodeURIComponent(part));\n const params: Params = {};\n let partIndex = 0;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n\n if (segment.kind === \"static\") {\n if (parts[partIndex] !== segment.value) return null;\n partIndex++;\n continue;\n }\n if (segment.kind === \"dynamic\") {\n if (partIndex >= parts.length) return null;\n params[segment.value] = parts[partIndex];\n partIndex++;\n continue;\n }\n if (segment.kind === \"catchall\") {\n if (!isLast || partIndex >= parts.length) return null;\n params[segment.value] = parts.slice(partIndex);\n return params;\n }\n if (segment.kind === \"optional-catchall\") {\n if (!isLast) return null;\n params[segment.value] = parts.slice(partIndex);\n return params;\n }\n }\n\n if (partIndex !== parts.length) return null;\n return params;\n}\n\nexport function matchRoute(\n compiled: CompiledRoute[],\n pathname: string,\n): RouteMatch | null {\n for (const route of compiled) {\n const params = matchPath(route.segments, pathname);\n if (params) {\n return { route, params, pathname };\n }\n }\n return null;\n}\n\n/** Replaces pattern placeholders with params, the inverse of `matchPath`. */\nexport function buildHref(pattern: string, params: Params = {}): string {\n const parts = splitPath(pattern)\n .map(parseSegment)\n .filter((segment) => segment.kind !== \"group\")\n .flatMap((segment) => {\n if (segment.kind === \"static\") return [segment.value];\n const value = params[segment.value];\n if (value === undefined) {\n if (segment.kind === \"optional-catchall\") return [];\n throw new Error(\n `Missing param \"${segment.value}\" for pattern \"${pattern}\".`,\n );\n }\n const list = Array.isArray(value) ? value : [value];\n return list.map((part) => encodeURIComponent(part));\n });\n return `/${parts.join(\"/\")}`;\n}\n","import type { RewriteResult } from \"./types.js\";\n\n/**\n * Control-flow signals, the equivalents of `redirect()`, `permanentRedirect()` and\n * `notFound()` from `next/navigation`. They throw and are caught by the router\n * (or by `renderToString` on the server), so they can be called from loaders,\n * metadata functions and middleware.\n */\n\nexport class RedirectSignal extends Error {\n readonly to: string;\n readonly permanent: boolean;\n\n constructor(to: string, permanent: boolean) {\n super(`Redirect to ${to}`);\n this.name = \"RedirectSignal\";\n this.to = to;\n this.permanent = permanent;\n }\n}\n\nexport class NotFoundSignal extends Error {\n constructor() {\n super(\"Not found\");\n this.name = \"NotFoundSignal\";\n }\n}\n\nexport function redirect(to: string): never {\n throw new RedirectSignal(to, false);\n}\n\nexport function permanentRedirect(to: string): never {\n throw new RedirectSignal(to, true);\n}\n\nexport function notFound(): never {\n throw new NotFoundSignal();\n}\n\n/** Returned from middleware to render another route while keeping the URL. */\nexport function rewrite(to: string): RewriteResult {\n return { __domphyRewrite: to };\n}\n\nexport function isRewrite(value: unknown): value is RewriteResult {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as RewriteResult).__domphyRewrite === \"string\"\n );\n}\n","import { compileRoutes, matchRoute } from \"./matcher.js\";\nimport { NotFoundSignal, RedirectSignal } from \"./navigation.js\";\nimport type { Params, Route } from \"./types.js\";\n\n/**\n * API route handlers on web-standard Request/Response, the equivalent of\n * `route.ts` files. Works in Node 18+, Bun, Deno, and edge runtimes; adapt to\n * `http.createServer` with any Request/Response bridge.\n */\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"HEAD\"\n | \"OPTIONS\";\n\nexport interface ApiContext {\n params: Params;\n}\n\nexport type ApiMethodHandler = (\n request: Request,\n context: ApiContext,\n) => Response | Promise<Response>;\n\nexport interface ApiRoute {\n /** Same pattern syntax as page routes: `\"/api/users/[id]\"`. */\n path: string;\n GET?: ApiMethodHandler;\n POST?: ApiMethodHandler;\n PUT?: ApiMethodHandler;\n PATCH?: ApiMethodHandler;\n DELETE?: ApiMethodHandler;\n HEAD?: ApiMethodHandler;\n OPTIONS?: ApiMethodHandler;\n}\n\nconst METHODS: HttpMethod[] = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n];\n\n/** Shorthand for JSON responses, the equivalent of `NextResponse.json()`. */\nexport function json(data: unknown, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json; charset=utf-8\");\n }\n return new Response(JSON.stringify(data), { ...init, headers });\n}\n\nexport function createApiHandler(\n routes: ApiRoute[],\n): (request: Request) => Promise<Response> {\n const pairs = routes.map((apiRoute) => ({\n apiRoute,\n routeNode: { path: apiRoute.path, page: () => ({ div: \"\" }) } as Route,\n }));\n const compiled = compileRoutes(pairs.map((pair) => pair.routeNode));\n const byNode = new Map(pairs.map((pair) => [pair.routeNode, pair.apiRoute]));\n\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const match = matchRoute(compiled, url.pathname);\n if (!match) {\n return json({ error: \"Not Found\" }, { status: 404 });\n }\n\n const route = byNode.get(\n match.route.chain[match.route.chain.length - 1],\n ) as ApiRoute;\n const allowed = METHODS.filter((method) => route[method]);\n const method = request.method.toUpperCase() as HttpMethod;\n let handler = route[method];\n\n if (!handler && method === \"HEAD\" && route.GET) {\n handler = route.GET;\n }\n if (!handler && method === \"OPTIONS\") {\n return new Response(null, {\n status: 204,\n headers: { allow: allowed.join(\", \") },\n });\n }\n if (!handler) {\n return json(\n { error: \"Method Not Allowed\" },\n { status: 405, headers: { allow: allowed.join(\", \") } },\n );\n }\n\n try {\n const response = await handler(request, { params: match.params });\n if (method === \"HEAD\") {\n return new Response(null, {\n status: response.status,\n headers: response.headers,\n });\n }\n return response;\n } catch (error) {\n if (error instanceof RedirectSignal) {\n return new Response(null, {\n status: error.permanent ? 308 : 307,\n headers: { location: error.to },\n });\n }\n if (error instanceof NotFoundSignal) {\n return json({ error: \"Not Found\" }, { status: 404 });\n }\n return json({ error: \"Internal Server Error\" }, { status: 500 });\n }\n };\n}\n","export const EventProperties = [\r\n \"onAbort\",\r\n \"onAuxClick\",\r\n \"onBeforeMatch\",\r\n \"onBeforeToggle\",\r\n \"onBlur\",\r\n \"onCancel\",\r\n \"onCanPlay\",\r\n \"onCanPlayThrough\",\r\n \"onChange\",\r\n \"onClick\",\r\n \"onClose\",\r\n \"onContextLost\",\r\n \"onContextMenu\",\r\n \"onContextRestored\",\r\n \"onCopy\",\r\n \"onCueChange\",\r\n \"onCut\",\r\n \"onDblClick\",\r\n \"onDrag\",\r\n \"onDragEnd\",\r\n \"onDragEnter\",\r\n \"onDragLeave\",\r\n \"onDragOver\",\r\n \"onDragStart\",\r\n \"onDrop\",\r\n \"onDurationChange\",\r\n \"onEmptied\",\r\n \"onEnded\",\r\n \"onError\",\r\n \"onFocus\",\r\n \"onFormData\",\r\n \"onInput\",\r\n \"onInvalid\",\r\n \"onKeyDown\",\r\n \"onKeyPress\",\r\n \"onKeyUp\",\r\n \"onLoad\",\r\n \"onLoadedData\",\r\n \"onLoadedMetadata\",\r\n \"onLoadStart\",\r\n \"onMouseDown\",\r\n \"onMouseEnter\",\r\n \"onMouseLeave\",\r\n \"onMouseMove\",\r\n \"onMouseOut\",\r\n \"onMouseOver\",\r\n \"onMouseUp\",\r\n \"onPaste\",\r\n \"onPause\",\r\n \"onPlay\",\r\n \"onPlaying\",\r\n \"onProgress\",\r\n \"onRateChange\",\r\n \"onReset\",\r\n \"onResize\",\r\n \"onScroll\",\r\n \"onScrollEnd\",\r\n \"onSecurityPolicyViolation\",\r\n \"onSeeked\",\r\n \"onSeeking\",\r\n \"onSelect\",\r\n \"onSlotChange\",\r\n \"onStalled\",\r\n \"onSubmit\",\r\n \"onSuspend\",\r\n \"onTimeUpdate\",\r\n \"onToggle\",\r\n \"onVolumeChange\",\r\n \"onWaiting\",\r\n \"onWheel\",\r\n \"onTouchStart\",\r\n \"onTouchMove\",\r\n \"onTouchEnd\",\r\n \"onTouchCancel\",\r\n \"onPointerDown\",\r\n \"onPointerMove\",\r\n \"onPointerUp\",\r\n \"onPointerCancel\",\r\n \"onPointerEnter\",\r\n \"onPointerLeave\",\r\n \"onPointerOver\",\r\n \"onPointerOut\",\r\n \"onGotPointerCapture\",\r\n \"onLostPointerCapture\",\r\n \"onCompositionStart\",\r\n \"onCompositionUpdate\",\r\n \"onCompositionEnd\",\r\n \"onTransitionEnd\",\r\n \"onTransitionStart\",\r\n \"onAnimationStart\",\r\n \"onAnimationEnd\",\r\n \"onAnimationIteration\",\r\n \"onFullscreenChange\",\r\n \"onFullscreenError\",\r\n \"onFocusIn\",\r\n \"onFocusOut\",\r\n] as const\r\n\r\nexport const eventNameMap = EventProperties.reduce((acc, ev) => {\r\n const key = ev.slice(2).toLowerCase() as keyof HTMLElementEventMap\r\n acc[key] = ev;\r\n return acc;\r\n}, {} as Partial<Record<keyof HTMLElementEventMap, (typeof EventProperties)[number]>>);\r\n","export const HtmlTags = [\r\n \"a\",\r\n \"abbr\",\r\n \"address\",\r\n \"article\",\r\n \"aside\",\r\n \"audio\",\r\n \"b\",\r\n \"base\",\r\n \"blockquote\",\r\n \"br\",\r\n \"button\",\r\n \"canvas\",\r\n \"caption\",\r\n \"cite\",\r\n \"code\",\r\n \"col\",\r\n \"colgroup\",\r\n \"data\",\r\n \"datalist\",\r\n \"dd\",\r\n \"del\",\r\n \"details\",\r\n \"dfn\",\r\n \"dialog\",\r\n \"div\",\r\n \"dl\",\r\n \"dt\",\r\n \"em\",\r\n \"fieldset\",\r\n \"figcaption\",\r\n \"figure\",\r\n \"footer\",\r\n \"form\",\r\n \"h1\",\r\n \"h2\",\r\n \"h3\",\r\n \"h4\",\r\n \"h5\",\r\n \"h6\",\r\n \"header\",\r\n \"hgroup\",\r\n \"i\",\r\n \"iframe\",\r\n \"img\",\r\n \"input\",\r\n \"ins\",\r\n \"kbd\",\r\n \"label\",\r\n \"legend\",\r\n \"li\",\r\n \"main\",\r\n \"map\",\r\n \"mark\",\r\n \"meta\",\r\n \"meter\",\r\n \"nav\",\r\n \"noscript\",\r\n \"object\",\r\n \"ol\",\r\n \"optgroup\",\r\n \"option\",\r\n \"output\",\r\n \"p\",\r\n \"param\",\r\n \"picture\",\r\n \"pre\",\r\n \"progress\",\r\n \"q\",\r\n \"rp\",\r\n \"rt\",\r\n \"ruby\",\r\n \"s\",\r\n \"samp\",\r\n \"section\",\r\n \"select\",\r\n \"slot\",\r\n \"small\",\r\n \"source\",\r\n \"span\",\r\n \"strong\",\r\n \"sub\",\r\n \"summary\",\r\n \"sup\",\r\n \"table\",\r\n \"tbody\",\r\n \"td\",\r\n \"template\",\r\n \"textarea\",\r\n \"tfoot\",\r\n \"th\",\r\n \"thead\",\r\n \"time\",\r\n \"title\",\r\n \"tr\",\r\n \"track\",\r\n \"u\",\r\n \"ul\",\r\n \"var\",\r\n \"video\",\r\n \"wbr\",\r\n \"bdi\",\r\n \"bdo\",\r\n \"math\",\r\n \"menu\",\r\n \"search\",\r\n \"area\",\r\n \"embed\",\r\n \"hr\",\r\n \"animate\",\r\n \"animateMotion\",\r\n \"animateTransform\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"cursor\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"mpath\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"prefetch\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"set\",\r\n \"solidColor\",\r\n \"stop\",\r\n \"svg\",\r\n \"switch\",\r\n \"symbol\",\r\n \"tbreak\",\r\n \"text\",\r\n \"textPath\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n];","import { Handler } from \"../types.js\"\n\ntype ChainEntry = [notifier: Notifier, event: string]\n\n// Shared across all instances to track the flush chain for circular detection.\nlet _chain: ChainEntry[] = []\n\n// Microtask scheduler. Older embedded Chromium runtimes (SketchUp 2020 /\n// 2021.0 ship CEF 64) predate `queueMicrotask` (added in Chrome 71). A\n// resolved Promise's `.then` runs as a microtask in the same checkpoint, so\n// it is the standard fallback. The `.catch` mimics `queueMicrotask`'s\n// behaviour of surfacing thrown errors to the global error handler rather\n// than silently becoming an unhandled-rejection.\nconst _microtask: (cb: () => void) => void =\n typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : (cb) => {\n Promise.resolve().then(cb).catch((e) => {\n setTimeout(() => { throw e }, 0)\n })\n }\n\n// Cap on self-re-notifications within one settle burst. A converging update\n// (clamp/normalize) reaches a fixpoint in a pass or two; anything beyond this is\n// a genuinely diverging self-feedback loop and is stopped like a cycle.\nconst SELF_NOTIFY_CAP = 100\n\nexport class Notifier {\n private _listeners: Record<string, Set<Handler>> | null = {}\n private _pending: Map<string, { args: unknown[], chain: ChainEntry[] }> = new Map()\n private _scheduled = false\n // Args currently being delivered per event (used to detect a self-update fixpoint).\n private _flushing: Map<string, unknown[]> = new Map()\n // Self-re-notification depth in the current settle burst (runaway guard).\n private _selfDepth = 0\n\n _dispose(): void {\n if (this._listeners) {\n for (const event in this._listeners) {\n this._listeners[event].clear()\n }\n }\n this._listeners = null\n }\n\n addListener(event: string, listener: Handler): () => void {\n if (!this._listeners) return () => {}\n\n if (typeof event !== \"string\" || typeof listener !== \"function\") {\n throw new Error(\"Event name must be a string, listener must be a function\")\n }\n\n if (!this._listeners[event]) {\n this._listeners[event] = new Set()\n }\n\n const release = () => this.removeListener(event, listener)\n\n if (this._listeners[event].has(listener)) return release\n\n this._listeners[event].add(listener)\n if (typeof listener.onSubscribe === \"function\") {\n listener.onSubscribe(release)\n }\n\n return release\n }\n\n removeListener(event: string, listener: Handler): void {\n if (!this._listeners) return\n\n const listeners = this._listeners[event]\n if (listeners && listeners.has(listener)) {\n listeners.delete(listener)\n if (listeners.size === 0) {\n delete this._listeners[event]\n }\n }\n }\n\n notify(event: string, ...args: unknown[]): void {\n if (!this._listeners) return\n if (!this._listeners[event]) return\n\n // A listener that re-sets its OWN state mid-flush shows up as [this,event] at\n // the TOP of the chain. That is a converging self-update (clamp/normalize),\n // not a cross-state cycle — let it re-propagate with a fresh chain. A deeper\n // match (intervening notifiers) is a real cycle and is still rejected.\n const top = _chain.length ? _chain[_chain.length - 1] : null\n const selfReentry = !!top && top[0] === this && top[1] === event\n\n if (selfReentry) {\n const inflight = this._flushing.get(event)\n // Same value as the one being delivered → fixpoint reached, stop quietly.\n if (inflight && inflight[0] === args[0]) return\n if (this._selfDepth >= SELF_NOTIFY_CAP) {\n console.error(`[Domphy] Runaway self-update on \"${event}\" — stopped after ${SELF_NOTIFY_CAP} iterations`)\n return\n }\n this._selfDepth++\n this._pending.set(event, { args, chain: [] })\n } else {\n if (this._isCircular(event)) return\n this._pending.set(event, { args, chain: [..._chain] })\n }\n\n if (!this._scheduled) {\n this._scheduled = true\n _microtask(() => this._flushAll())\n }\n }\n\n private _isCircular(event: string): boolean {\n const idx = _chain.findIndex(([n, e]) => n === this && e === event)\n if (idx === -1) return false\n\n const names = [..._chain.slice(idx).map(([, e]) => e), event]\n console.error(`[Domphy] Circular dependency detected:\\n ${names.join(\" → \")}`)\n return true\n }\n\n private _flushAll(): void {\n this._scheduled = false\n const pending = this._pending\n this._pending = new Map()\n\n for (const [event, { args, chain }] of pending) {\n _chain = chain\n this._flush(event, args)\n }\n _chain = []\n // Burst settled (no self-update re-queued anything) → reset the runaway guard.\n if (this._pending.size === 0) this._selfDepth = 0\n }\n\n private _flush(event: string, args: unknown[]): void {\n if (!this._listeners) return\n const listeners = this._listeners[event]\n if (!listeners) return\n\n _chain.push([this, event])\n this._flushing.set(event, args)\n\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue\n try {\n listener(...args)\n } catch (e) {\n console.error(e)\n }\n }\n\n this._flushing.delete(event)\n _chain.pop()\n }\n}\n","import { Notifier } from \"./Notifier.js\";\r\nimport { Handler } from \"../types.js\"\r\n\r\nexport type ValueListener<T> = ((_value: T) => void) & Handler\r\nexport type ValueOrState<T> = T | State<T>\r\n\r\nexport class State<T> {\r\n readonly _isState = true;\r\n private _value: T;\r\n readonly initialValue: T;\r\n private _notifier: Notifier | null = new Notifier();\r\n\r\n constructor(initialValue: T, readonly name: string = typeof initialValue) {\r\n this.initialValue = initialValue;\r\n this._value = initialValue;\r\n }\r\n\r\n get(listener?: ValueListener<T>): T {\r\n if (listener) this.addListener(listener);\r\n return this._value;\r\n }\r\n\r\n set(newValue: T): void {\r\n if (!this._notifier) return;\r\n this._value = newValue;\r\n this._notifier.notify(this.name, newValue);\r\n }\r\n\r\n reset(): void {\r\n this.set(this.initialValue);\r\n }\r\n\r\n addListener(listener: ValueListener<T>): () => void {\r\n if (!this._notifier) return () => { };\r\n return this._notifier.addListener(this.name, listener);\r\n }\r\n\r\n removeListener(listener: ValueListener<T>): void {\r\n if (!this._notifier) return;\r\n this._notifier.removeListener(this.name, listener);\r\n }\r\n\r\n _dispose(): void {\r\n if (this._notifier) {\r\n this._notifier._dispose();\r\n this._notifier = null;\r\n }\r\n }\r\n}\r\n","import { DomphyElement, HookMap, EventName, Handler, Listener } from \"./types.js\";\r\nimport { State } from \"./classes/State.js\"\r\n\r\nimport { deepClone, addEvent, addHook } from \"./helpers.js\"\r\n\r\nexport function merge(source: Record<string, any> = {}, target: Record<string, any> = {}): Record<string, any> {\r\n const comma = [\"animation\", \"transition\", \"boxShadow\", \"textShadow\", \"background\", \"fontFamily\"]\r\n const space = [\"class\", \"rel\", \"transform\", \"acceptCharset\", \"sandbox\"]\r\n const adjacent = [\"content\"]\r\n if (Object.prototype.toString.call(target) === \"[object Object]\" && Object.getPrototypeOf(target) === Object.prototype) { // plainjs not class instance\r\n target = deepClone(target)\r\n }\r\n\r\n for (const key in target) {\r\n\r\n const value = target[key];\r\n if (value === undefined || value === null || value === \"\") continue;\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n if (typeof source[key] === \"object\") {\r\n source[key] = merge(source[key], value);\r\n } else {\r\n source[key] = value;\r\n }\r\n\r\n } else {\r\n if (comma.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\", \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\", \")\r\n }\r\n\r\n } else if (adjacent.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\"\")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\"\")\r\n }\r\n } else if (space.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\" \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\" \")\r\n }\r\n } else if (key.startsWith(\"on\")) {\r\n let name = key.replace(\"on\", \"\").toLowerCase() as EventName\r\n addEvent(source as DomphyElement, name, value)\r\n } else if (key.startsWith(\"_on\")) {\r\n let name = key.replace(\"_on\", \"\") as keyof HookMap\r\n addHook(source as DomphyElement, name, value)\r\n } else {\r\n source[key] = value;\r\n }\r\n }\r\n }\r\n return source;\r\n}\r\n\r\nexport function hashString(str: string = \"\"): string {\r\n let hash = 0x811c9dc5; // FNV-1a 32-bit offset basis\r\n for (let i = 0; i < str.length; i++) {\r\n hash ^= str.charCodeAt(i);\r\n hash = (hash * 0x01000193) >>> 0; // FNV prime, keep 32-bit unsigned\r\n }\r\n return String.fromCharCode(97 + (hash % 26)) + hash.toString(16);\r\n}\r\n\r\nexport function toState<T>(val: T | State<T>, name?: string): State<T> {\r\n return (val instanceof State || (val as any)?._isState) ? val as State<T> : new State<T>(val, name);\r\n}\r\n\r\nexport function r<T>(fn: (listener: Listener) => T): (listener: Listener) => T {\r\n return fn;\r\n}\r\n\r\n","import { DomphyElement, PartialElement, HookMap, EventName, Handler, TagName } from \"./types.js\";\r\nimport { ElementNode } from \"./classes/ElementNode.js\"\r\nimport { State } from \"./classes/State.js\"\r\nimport { eventNameMap } from \"./types/EventProperties.js\"\r\nimport { HtmlTags } from \"./constants/HtmlTags.js\"\r\nimport {merge} from \"./utils.js\"\r\n\r\nexport function addHook<K extends keyof HookMap>(partial: PartialElement, hookName: K, handler: HookMap[K]): void {\r\n const hookProperty = `_on${hookName}` as keyof PartialElement;\r\n let current = partial[hookProperty];\r\n\r\n if (typeof current === \"function\") {\r\n (partial as any)[hookProperty] = (...args: any[]) => {\r\n (current as Function)(...args);\r\n (handler as Function)(...args);\r\n };\r\n } else {\r\n (partial as any)[hookProperty] = handler;\r\n }\r\n}\r\n\r\nexport function addEvent<K extends keyof HTMLElementEventMap>(\r\n attributes: PartialElement,\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K], node: ElementNode) => void\r\n): void {\r\n const eventProperty = eventNameMap[eventName];\r\n if (!eventProperty) {\r\n throw Error(`invalid event name \"${eventName}\"`);\r\n }\r\n const current = (attributes as any)[eventProperty]\r\n\r\n if (typeof current == \"function\") {\r\n (attributes as any)[eventProperty] = (event: HTMLElementEventMap[K], node: ElementNode) => {\r\n current(event, node)\r\n handler(event, node);\r\n };\r\n } else {\r\n (attributes as any)[eventProperty] = handler\r\n }\r\n}\r\n\r\nexport function deepClone(value: any, seen = new WeakMap()): any {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (typeof value === \"function\") return value;\r\n if (seen.has(value)) return seen.get(value);\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto !== Object.prototype && !Array.isArray(value)) return value; // ignore class instance\r\n\r\n let clone: any;\r\n\r\n if (Array.isArray(value)) {\r\n clone = [];\r\n seen.set(value, clone);\r\n for (const v of value) clone.push(deepClone(v, seen));\r\n return clone;\r\n }\r\n\r\n if (value instanceof Date) return new Date(value);\r\n if (value instanceof RegExp) return new RegExp(value);\r\n if (value instanceof Map) {\r\n clone = new Map();\r\n seen.set(value, clone);\r\n for (const [k, v] of value) clone.set(deepClone(k, seen), deepClone(v, seen));\r\n return clone;\r\n }\r\n if (value instanceof Set) {\r\n clone = new Set();\r\n seen.set(value, clone);\r\n for (const v of value) clone.add(deepClone(v, seen));\r\n return clone;\r\n }\r\n if (ArrayBuffer.isView(value)) {\r\n return new (value as any).constructor(value);\r\n }\r\n if (value instanceof ArrayBuffer) {\r\n return value.slice(0);\r\n }\r\n\r\n clone = Object.create(proto);\r\n seen.set(value, clone);\r\n\r\n for (const key of Reflect.ownKeys(value)) {\r\n clone[key] = deepClone(value[key], seen);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nexport function validate(element: DomphyElement | PartialElement, asPartial = false): boolean {\r\n if (Object.prototype.toString.call(element) !== \"[object Object]\") {\r\n throw Error(`typeof ${element} is invalid DomphyElement`);\r\n }\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element]\r\n if (i == 0 && !HtmlTags.includes(key) && !key.includes(\"-\") && !asPartial) { // web-component\r\n throw Error(`key ${key} is not valid HTML tag name`);\r\n } else if (key == \"style\" && val && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"style\" must be a object`);\r\n } else if (key == \"$\") {\r\n element.$!.forEach(v => validate(v as PartialElement, true))\r\n } else if (key.startsWith(\"_on\") && typeof val != \"function\") {\r\n throw Error(`hook ${key} value \"${val}\" must be a function `)\r\n } else if (key.startsWith(\"on\") && typeof val != \"function\") {\r\n throw Error(`event ${key} value \"${val}\" must be a function `);\r\n } else if (key == \"_portal\" && typeof val !== \"function\") {\r\n throw Error(`\"_portal\" must be a function return HTMLElement`);\r\n } else if (key == \"_context\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_context\" must be a object`);\r\n } else if (key == \"_metadata\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_metadata\" must be a object`);\r\n } else if (key == \"_key\" && (typeof val !== \"string\" && typeof val !== \"number\")) {\r\n throw Error(`\"_key\" must be a string or number`);\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function isValid(element: DomphyElement): boolean {\r\n\r\n if (Array.isArray(element)) return false;\r\n if (!element || typeof element !== \"object\") return false;\r\n\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element];\r\n if (i == 0 && !HtmlTags.includes(key)) return false\r\n if (key === \"style\" && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n if (key.startsWith(\"_on\") && typeof val !== \"function\") return false;\r\n if (key.startsWith(\"on\") && typeof val !== \"function\") return false;\r\n if (key === \"_portalChildren\" && !Array.isArray(val)) return false;\r\n if ((key === \"_context\" || key === \"_metadata\") && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function isHTML(str: string): boolean {\r\n return /<([a-z][\\w-]*)(\\s[^>]*)?>.*<\\/\\1>|<([a-z][\\w-]*)(\\s[^>]*)?\\/>/i.test(str.trim());\r\n}\r\n\r\nexport function escapeHTML(str: string): string {\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\");\r\n}\r\n\r\nexport function addClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => String(reactive(listener)) + \" \" + className\r\n } else {\r\n let current = element.class || \"\"\r\n let split = String(current).split(\" \")\r\n split.push(className)\r\n element.class = split.filter(e => e).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function removeClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.filter(e => e != className).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.filter(e => e != className).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function toggleClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function getTagName(element: DomphyElement): TagName | undefined {\r\n return Object.keys(element).find(e => HtmlTags.includes(e)) as TagName | undefined\r\n}\r\n\r\n\r\nexport function camelToKebab(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\n\r\nexport function selectorSplitter(selectors: string) {\r\n if (selectors.indexOf('@') === 0) {\r\n return [selectors];\r\n }\r\n var splitted = [];\r\n var parens = 0;\r\n var angulars = 0;\r\n var soFar = '';\r\n for (var i = 0, len = selectors.length; i < len; i++) {\r\n var char = selectors[i];\r\n if (char === '(') {\r\n parens += 1;\r\n } else if (char === ')') {\r\n parens -= 1;\r\n } else if (char === '[') {\r\n angulars += 1;\r\n } else if (char === ']') {\r\n angulars -= 1;\r\n } else if (char === ',') {\r\n if (!parens && !angulars) {\r\n splitted.push(soFar.trim());\r\n soFar = '';\r\n continue;\r\n }\r\n }\r\n soFar += char;\r\n }\r\n splitted.push(soFar.trim());\r\n return splitted;\r\n};\r\n\r\nexport function normalizeSelectorKey(selectorText: string): string {\r\n const text = selectorText.trim();\r\n // At-rule headers (@media, @keyframes, @supports...) are matched\r\n // whitespace-insensitive because CSSOM reformats them unpredictably.\r\n if (text.startsWith(\"@\")) return text.replace(/\\s+/g, \"\");\r\n return text\r\n .replace(/\\s*([>+~,])\\s*/g, \"$1\") // tighten combinators and selector lists\r\n .replace(/\\s+/g, \" \") // collapse descendant-combinator whitespace\r\n .replace(/\\(\\s*odd\\s*\\)/g, \"(2n+1)\") // CSSOM serializes :nth-child(odd) as (2n+1)\r\n .replace(/\\(\\s*even\\s*\\)/g, \"(2n)\")\r\n .trim();\r\n}\r\n\r\nexport function collectCSSRules(rules: CSSRuleList, map: Map<string, CSSRule>): Map<string, CSSRule> {\r\n for (let i = 0; i < rules.length; i++) {\r\n const rule = rules[i] as any;\r\n let key: string | null = null;\r\n if (typeof rule.selectorText === \"string\") {\r\n key = normalizeSelectorKey(rule.selectorText);\r\n } else if (typeof rule.cssText === \"string\" && rule.cssText.startsWith(\"@\")) {\r\n key = normalizeSelectorKey(rule.cssText.split(\"{\")[0]);\r\n }\r\n if (key && !map.has(key)) map.set(key, rule as CSSRule);\r\n }\r\n return map;\r\n}\r\n\r\nexport function ensureDomStyle(styleParent: HTMLHeadElement | ShadowRoot): HTMLStyleElement {\r\n let domStyle = styleParent.querySelector(\"#domphy-style\") as HTMLStyleElement | null;\r\n\r\n if (!domStyle) {\r\n domStyle = document.createElement(\"style\");\r\n domStyle.id = \"domphy-style\";\r\n styleParent.appendChild(domStyle);\r\n }\r\n\r\n if (domStyle.dataset.domphyBase !== \"true\") {\r\n domStyle.sheet?.insertRule(\"[hidden] { display: none !important; }\", 0);\r\n domStyle.dataset.domphyBase = \"true\";\r\n }\r\n\r\n return domStyle;\r\n}\r\n\r\nexport const mergePartial = (partial: PartialElement | DomphyElement): typeof partial => {\r\n\r\n if (Array.isArray(partial.$)) {\r\n let part: typeof partial = {}\r\n partial.$.forEach(p => merge(part, mergePartial(p)))\r\n delete partial.$\r\n merge(part, partial) // native win\r\n\r\n return part\r\n } else {\r\n return partial\r\n }\r\n}\r\n","export const VoidTags = [\r\n \"area\",\r\n \"base\",\r\n \"br\",\r\n \"col\",\r\n \"embed\",\r\n \"hr\",\r\n \"img\",\r\n \"input\",\r\n \"link\",\r\n \"meta\",\r\n \"source\",\r\n \"track\",\r\n \"wbr\",\r\n] as const;\r\n\r\nexport type VoidTagName = (typeof VoidTags)[number];\r\n\r\n","export const SvgTags = [\"svg\", \"circle\", \"path\", \"rect\", \"ellipse\",\r\n \"line\", \"polyline\", \"polygon\", \"g\", \"defs\",\r\n \"use\", \"symbol\", \"linearGradient\", \"radialGradient\",\r\n \"stop\", \"clipPath\", \"mask\", \"filter\", \"text\",\r\n \"tspan\", \"textPath\", \"image\", \"pattern\", \"marker\",\r\n \"animate\", \"animateTransform\", \"animateMotion\",\r\n \"feGaussianBlur\", \"feComposite\", \"feColorMatrix\",\r\n \"feMerge\", \"feMergeNode\", \"feOffset\", \"feFlood\",\r\n \"feBlend\", \"foreignObject\"]","export const BooleanAttributes = [\r\n \"allowFullScreen\",\r\n \"async\",\r\n \"autoFocus\",\r\n \"autoPlay\",\r\n \"checked\",\r\n \"compact\",\r\n \"contentEditable\",\r\n \"controls\",\r\n \"declare\",\r\n \"default\",\r\n \"defer\",\r\n \"disabled\",\r\n \"formNoValidate\",\r\n \"hidden\",\r\n \"isMap\",\r\n \"itemScope\",\r\n \"loop\",\r\n \"multiple\",\r\n \"muted\",\r\n \"noHref\",\r\n \"noShade\",\r\n \"noValidate\",\r\n \"open\",\r\n \"playsInline\",\r\n \"readonly\",\r\n \"required\",\r\n \"reversed\",\r\n \"scoped\",\r\n \"selected\",\r\n \"sortable\",\r\n \"trueSpeed\",\r\n \"typeMustMatch\",\r\n \"wmode\",\r\n \"autoCapitalize\",\r\n \"translate\",\r\n \"spellCheck\",\r\n \"inert\",\r\n \"download\",\r\n \"noModule\",\r\n \"paused\",\r\n \"autoPictureInPicture\",\r\n] as const;","//browserslist query \"> 0.1%, not dead\"\r\nexport const PrefixCSS: Record<string, string[]> = {\r\n transform: [\"webkit\", \"ms\"],\r\n transition: [\"webkit\", \"ms\"],\r\n animation: [\"webkit\"],\r\n userSelect: [\"webkit\", \"ms\"],\r\n flexDirection: [\"webkit\", \"ms\"],\r\n flexWrap: [\"webkit\", \"ms\"],\r\n justifyContent: [\"webkit\", \"ms\"],\r\n alignItems: [\"webkit\", \"ms\"],\r\n alignSelf: [\"webkit\", \"ms\"],\r\n order: [\"webkit\", \"ms\"],\r\n flexGrow: [\"webkit\", \"ms\"],\r\n flexShrink: [\"webkit\", \"ms\"],\r\n flexBasis: [\"webkit\", \"ms\"],\r\n columns: [\"webkit\"],\r\n columnCount: [\"webkit\"],\r\n columnGap: [\"webkit\"],\r\n columnRule: [\"webkit\"],\r\n columnWidth: [\"webkit\"],\r\n boxSizing: [\"webkit\"],\r\n appearance: [\"webkit\", \"moz\"],\r\n filter: [\"webkit\"],\r\n backdropFilter: [\"webkit\"],\r\n clipPath: [\"webkit\"],\r\n mask: [\"webkit\"],\r\n maskImage: [\"webkit\"],\r\n textSizeAdjust: [\"webkit\", \"ms\"],\r\n hyphens: [\"webkit\", \"ms\"],\r\n writingMode: [\"webkit\", \"ms\"],\r\n gridTemplateColumns: [\"ms\"],\r\n gridTemplateRows: [\"ms\"],\r\n gridAutoColumns: [\"ms\"],\r\n gridAutoRows: [\"ms\"],\r\n gridColumn: [\"ms\"],\r\n gridRow: [\"ms\"],\r\n marginInlineStart: [\"webkit\"],\r\n marginInlineEnd: [\"webkit\"],\r\n paddingInlineStart: [\"webkit\"],\r\n paddingInlineEnd: [\"webkit\"],\r\n minInlineSize: [\"webkit\"],\r\n maxInlineSize: [\"webkit\"],\r\n minBlockSize: [\"webkit\"],\r\n maxBlockSize: [\"webkit\"],\r\n inlineSize: [\"webkit\"],\r\n blockSize: [\"webkit\"],\r\n tabSize: [\"moz\"],\r\n overscrollBehavior: [\"webkit\", \"ms\"],\r\n touchAction: [\"ms\"],\r\n resize: [\"webkit\"],\r\n printColorAdjust: [\"webkit\"],\r\n backgroundClip: [\"webkit\"],\r\n boxDecorationBreak: [\"webkit\"],\r\n overflowScrolling: [\"webkit\"],\r\n};\r\n","export const CamelAttributes: string[] = [\r\n \"viewBox\",\r\n \"preserveAspectRatio\",\r\n \"gradientTransform\",\r\n \"gradientUnits\",\r\n \"spreadMethod\",\r\n \"markerStart\",\r\n \"markerMid\",\r\n \"markerEnd\",\r\n \"markerHeight\",\r\n \"markerWidth\",\r\n \"markerUnits\",\r\n \"refX\",\r\n \"refY\",\r\n \"patternContentUnits\",\r\n \"patternTransform\",\r\n \"patternUnits\",\r\n \"filterUnits\",\r\n \"primitiveUnits\",\r\n \"kernelUnitLength\",\r\n \"clipPathUnits\",\r\n \"maskContentUnits\",\r\n \"maskUnits\"\r\n] as const\r\n","import { escapeHTML, camelToKebab } from \"../helpers.js\";\nimport { BooleanAttributes, CamelAttributes } from \"../constants.js\";\nimport type { ElementNode } from \"./ElementNode.js\"\nimport { type AttributeValue } from \"../types.js\"\nimport { Notifier } from \"./Notifier.js\"\n\nexport class ElementAttribute {\n readonly name: string;\n readonly isBoolean: boolean;\n value: any;\n parent: ElementNode;\n _notifier = new Notifier();\n // Release handles for the reactive listener's state subscriptions, so a\n // re-set (e.g. patch() replacing a reactive value) can drop the old listener\n // instead of leaking it on the long-lived State until node removal.\n private _releases: (() => void)[] = [];\n\n constructor(name: string, value: any, parent: any) {\n this.parent = parent;\n this.isBoolean = (BooleanAttributes as readonly string[]).includes(name);\n if (CamelAttributes.includes(name)) {\n this.name = name\n } else {\n this.name = camelToKebab(name)\n }\n this.value = undefined;\n this.set(value);\n }\n\n render(): void {\n if (!this.parent || !this.parent.domElement) return;\n const domElement = this.parent.domElement;\n\n const mutateAttrs = [\"value\"];\n if (this.isBoolean) {\n if (this.value === false || this.value == null) {\n domElement.removeAttribute(this.name)\n } else {\n domElement.setAttribute(this.name, this.value === true ? \"\" : this.value)\n }\n } else if (this.value == null) {\n domElement.removeAttribute(this.name);\n } else if (mutateAttrs.includes(this.name)) {\n (domElement as any)[this.name] = this.value;\n } else {\n domElement.setAttribute(this.name, this.value);\n }\n }\n\n set(value: AttributeValue): void {\n let prev = this.value;\n\n // Drop any previous reactive subscription before (re)binding.\n if (this._releases.length) {\n for (const release of this._releases) release();\n this._releases = [];\n }\n\n if (value == null) {\n this.value = null;\n } else if (typeof value == \"function\") {\n let listener: any = () => {\n if (!this.parent || this.parent._disposed) return;\n let p = this.value;\n // Re-pass `listener` so states read only on a later run (conditional\n // dependencies) get subscribed too — matching children/style paths.\n this.value = this.isBoolean ? Boolean((value as Function)(listener)) : (value as Function)(listener);\n this.render();\n if (p !== this.value) this._notifier.notify(this.name, this.value);\n };\n\n listener.elementNode = this.parent!;\n listener.debug = `class:${this.parent?.tagName}_${this.parent?.nodeId} attribute:${this.name}`;\n\n listener.onSubscribe = (release: () => void) => {\n this._releases.push(release);\n if (this.parent) {\n this.parent.addHook(\"BeforeRemove\", () => {\n release();\n listener = null;\n });\n }\n };\n\n this.value = this.isBoolean ? Boolean(value(listener)) : value(listener);\n } else {\n this.value = this.isBoolean ? Boolean(value) : value;\n }\n\n this.render();\n if (prev !== this.value) this._notifier.notify(this.name, this.value);\n }\n\n addListener(callback: (value: any) => void): void {\n const handler = callback as any\n handler.onSubscribe = (release: () => void) => this.parent?.addHook(\"BeforeRemove\", release);\n this._notifier.addListener(this.name, handler)\n }\n\n remove(): void {\n if (this.parent && this.parent.attributes) {\n this.parent.attributes.remove(this.name);\n }\n this._dispose();\n }\n\n _dispose(): void {\n this._notifier._dispose();\n this.value = null;\n this.parent = null as any\n }\n\n generateHTML(): string {\n const { name, value } = this;\n if (this.isBoolean) {\n return value ? `${name}` : \"\";\n } else {\n const val = Array.isArray(value) ? JSON.stringify(value) : value;\n return `${name}=\"${escapeHTML(String(val))}\"`;\n }\n }\n}\n","import type { ElementNode } from \"./ElementNode.js\";\nimport { ElementAttribute } from \"./ElementAttribute.js\";\nimport { BooleanAttributes } from \"../constants.js\";\nimport { AttributeValue } from \"../types.js\"\n\nexport class AttributeList {\n items: Record<string, ElementAttribute> | null = {};\n parent: ElementNode | null;\n\n constructor(parent: ElementNode) {\n this.parent = parent;\n }\n\n generateHTML(): string {\n if (!this.items) return \"\";\n const str = Object.values(this.items)\n .map((attr) => attr.generateHTML())\n .join(\" \");\n return str ? ` ${str}` : \"\";\n }\n\n get(name: string): any {\n if (!this.items) return undefined;\n return this.items[name]?.value;\n }\n\n set(name: string, value: AttributeValue): void {\n if (!this.items || !this.parent) return;\n if (this.items[name]) {\n this.items[name].set(value);\n } else {\n this.items[name] = new ElementAttribute(name, value, this.parent);\n }\n }\n\n addListener(name: string, callback: (value: string | number) => void): void {\n if (this.has(name)) {\n this.items![name].addListener(callback);\n }\n }\n\n has(name: string): boolean {\n if (!this.items) return false;\n return Object.prototype.hasOwnProperty.call(this.items, name);\n }\n\n remove(name: string): void {\n if (!this.items) return;\n\n if (this.items[name]) {\n this.items[name]._dispose();\n delete this.items[name];\n }\n\n if (this.parent && this.parent.domElement && this.parent.domElement instanceof Element) {\n this.parent.domElement.removeAttribute(name);\n }\n }\n\n _dispose(): void {\n if (this.items) {\n for (const key in this.items) {\n this.items[key]._dispose();\n }\n }\n this.items = null;\n this.parent = null;\n }\n\n toggle(name: string, force?: boolean): void {\n if (\n !BooleanAttributes.includes(name as (typeof BooleanAttributes)[number])\n ) {\n throw Error(`${name} is not a boolean attribute`);\n }\n if (force === true) {\n this.set(name, true);\n } else if (force === false) {\n this.remove(name);\n } else {\n this.has(name) ? this.remove(name) : this.set(name, true);\n }\n }\n\n addClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n\n const add = (classes: string, newClass: string) => {\n const list = (classes || \"\").split(\" \").filter((e: string) => e);\n !list.includes(newClass) && list.push(className)\n return list.join(\" \")\n }\n\n let current = this.get(\"class\");\n\n if (typeof current === \"function\") {\n this.set(\"class\", () => add(current(), className));\n } else {\n this.set(\"class\", add(current, className))\n }\n }\n\n hasClass(className: string): boolean {\n if (!className || typeof className !== \"string\") return false;\n const current = this.get(\"class\") || \"\";\n const list = current.split(\" \").filter((e: string) => e);\n return list.includes(className);\n }\n\n toggleClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n this.hasClass(className)\n ? this.removeClass(className)\n : this.addClass(className);\n }\n\n removeClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n const current = this.get(\"class\") || \"\";\n const list: string[] = current.split(\" \").filter((e: string) => e);\n const updated = list.filter((cls) => cls !== className);\n updated.length > 0\n ? this.set(\"class\", updated.join(\" \"))\n : this.remove(\"class\");\n }\n\n replaceClass(oldClass: string, newClass: string): void {\n if (\n !oldClass ||\n !newClass ||\n typeof oldClass !== \"string\" ||\n typeof newClass !== \"string\"\n )\n return;\n if (this.hasClass(oldClass)) {\n this.removeClass(oldClass);\n this.addClass(newClass);\n }\n }\n}\n","import { ElementNode } from \"./ElementNode.js\";\r\nimport { isHTML, escapeHTML } from \"../helpers.js\";\r\n\r\nexport class TextNode {\r\n type = \"TextNode\"\r\n parent: ElementNode;\r\n text: string;\r\n domText?: ChildNode;\r\n\r\n constructor(textContent: string | number, parent: ElementNode) {\r\n this.parent = parent;\r\n this.text = textContent === \"\" ? \"\\u200B\" : String(textContent);\r\n }\r\n _createDOMNode() {\r\n let newNode: ChildNode;\r\n if (isHTML(this.text)) {\r\n const tpl = document.createElement(\"template\");\r\n tpl.innerHTML = this.text.trim();\r\n newNode = tpl.content.firstChild || document.createTextNode(\"\");\r\n } else {\r\n newNode = document.createTextNode(this.text);\r\n }\r\n this.domText = newNode;\r\n return newNode;\r\n }\r\n\r\n _dispose(): void {\r\n this.domText = undefined;\r\n this.text = \"\";\r\n }\r\n\r\n generateHTML(): string {\r\n if (this.text === \"\\u200B\") return \"&#8203;\";\r\n // Mirror _createDOMNode: a single-root HTML string is intentional inline\r\n // HTML, anything else is plain text and must be escaped so the server\r\n // output is XSS-safe and parses back to the same text node the client\r\n // builds (otherwise hydration child alignment drifts).\r\n return isHTML(this.text) ? this.text : escapeHTML(this.text);\r\n }\r\n\r\n render(domText: ChildNode | DocumentFragment | HTMLElement): void {\r\n const newNode = this._createDOMNode();\r\n domText.appendChild(newNode);\r\n }\r\n}","import { TextNode } from \"./TextNode.js\";\r\nimport { ElementNode } from \"./ElementNode.js\";\r\nimport type { DomphyElement } from \"../types.js\";\r\nimport { ensureDomStyle, getTagName } from \"../helpers.js\";\r\n\r\ntype ElementInput = DomphyElement | null | undefined | number | string\r\ntype NodeItem = ElementNode | TextNode;\r\n\r\nexport class ElementList {\r\n items: NodeItem[] = [];\r\n owner: ElementNode;\r\n _nextKey: number = 0;\r\n\r\n constructor(parent: ElementNode) {\r\n this.owner = parent;\r\n }\r\n\r\n _createNode(element: ElementInput | DomphyElement): NodeItem {\r\n return (typeof element === \"object\" && element !== null)\r\n ? new ElementNode(element, this.owner, this._nextKey++)\r\n : new TextNode(element == null ? \"\" : String(element), this.owner);\r\n }\r\n\r\n _moveDomElement(node: NodeItem, index: number) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const dom = this.owner.domElement;\r\n\r\n const el = node instanceof ElementNode ? node.domElement : node.domText;\r\n if (el) {\r\n const currentRef = dom.childNodes[index] || null;\r\n if (el !== currentRef) {\r\n dom.insertBefore(el, currentRef);\r\n }\r\n }\r\n }\r\n\r\n _swapDomElement(aNode: NodeItem, bNode: NodeItem) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const parent = this.owner.domElement;\r\n\r\n const a = aNode instanceof ElementNode ? aNode.domElement : aNode.domText;\r\n const b = bNode instanceof ElementNode ? bNode.domElement : bNode.domText;\r\n if (!a || !b) return;\r\n\r\n const aNext = a.nextSibling;\r\n const bNext = b.nextSibling;\r\n\r\n parent.insertBefore(a, bNext);\r\n parent.insertBefore(b, aNext);\r\n }\r\n\r\n update(inputs: ElementInput[], updateDom = true, silent = false): void {\r\n\r\n const oldItems = this.items.slice(); // snapshot for cleanup\r\n\r\n // keyed lookup from old list\r\n const keyed = new Map<string | number, NodeItem>();\r\n for (const item of oldItems) {\r\n if (item instanceof ElementNode && item.key !== null && item.key !== undefined) {\r\n keyed.set(item.key, item);\r\n }\r\n }\r\n\r\n if (!silent && this.owner.domElement) this.owner._hooks?.BeforeUpdate?.(this.owner, inputs);\r\n\r\n const oldSet = new Set<NodeItem>(oldItems);\r\n const claimed = new Set<NodeItem>();\r\n\r\n // build target order using existing ops (mutating this.items)\r\n for (let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n const isObj = typeof input === \"object\" && input !== null;\r\n const key = isObj ? (input as any)._key : undefined;\r\n const tag = isObj ? getTagName(input as DomphyElement) : undefined;\r\n\r\n // Keyed reuse: same key + same tag → reuse the node and patch it in place\r\n // (preserves DOM identity/state while reflecting new data).\r\n if (key !== undefined) {\r\n const reused = keyed.get(key);\r\n if (reused instanceof ElementNode && reused.tagName === tag) {\r\n keyed.delete(key);\r\n const cur = this.items.indexOf(reused);\r\n if (cur !== i && cur >= 0) {\r\n const isPortal = !!reused._portal;\r\n this.move(cur, i, isPortal ? false : updateDom, true);\r\n }\r\n reused.parent = this.owner as any;\r\n reused.patch(input as DomphyElement);\r\n claimed.add(reused);\r\n continue;\r\n }\r\n // key present but no tag-compatible match → fall through to insert; any\r\n // stale keyed node keeps its slot in `keyed` and is removed below.\r\n } else if (isObj) {\r\n // Unkeyed positional reuse: reuse the old unkeyed element already sitting\r\n // at this slot if its tag matches — this is what preserves focus, scroll,\r\n // selection, IME and uncontrolled input values across plain list updates.\r\n const at = this.items[i];\r\n if (at instanceof ElementNode && at.key == null && at.tagName === tag\r\n && oldSet.has(at) && !claimed.has(at)) {\r\n at.parent = this.owner as any;\r\n at.patch(input as DomphyElement);\r\n claimed.add(at);\r\n continue;\r\n }\r\n }\r\n\r\n claimed.add(this.insert(input, i, updateDom, true));\r\n }\r\n\r\n // Remove leftover nodes beyond the new length. Iterate a SNAPSHOT (not a\r\n // `while length > inputs.length` loop): a removal may defer (async exit\r\n // animation), leaving the node in `items`, so a length-based loop would spin.\r\n const extras = this.items.slice(inputs.length);\r\n for (const node of extras) this.remove(node, updateDom, true);\r\n keyed.forEach((node) => this.remove(node, updateDom, true));\r\n if (!silent) this.owner._hooks?.Update?.(this.owner);\r\n }\r\n\r\n insert(input: ElementInput, index?: number, updateDom = true, silent = false): NodeItem {\r\n\r\n let length = this.items.length;\r\n const finalIndex = (typeof index !== \"number\" || isNaN(index) || index < 0 || index > length)\r\n ? length\r\n : index;\r\n const item = this._createNode(input);\r\n this.items.splice(finalIndex, 0, item);\r\n\r\n if (item instanceof ElementNode) {\r\n //Parent always insert/mount before children\r\n item._hooks.Insert && item._hooks.Insert(item)\r\n\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n\r\n\r\n if (item._portal) {\r\n let domElement = item._portal!(this.owner.getRoot())\r\n domElement && item.render(domElement)\r\n } else {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n let domStyle = ensureDomStyle(styleParent)\r\n item.styles.render(domStyle as HTMLStyleElement)\r\n item._hooks.Mount && item._hooks.Mount(item)\r\n item.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(child.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(domNode)\r\n }\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n } else {\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n }\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n return item;\r\n }\r\n\r\n remove(item: NodeItem, updateDom = true, silent = false): void {\r\n\r\n const index = this.items.indexOf(item);\r\n if (index < 0) return;\r\n\r\n if (item instanceof ElementNode) {\r\n // Guard against re-entrant removal of a node whose (deferred) removal is\r\n // already in flight — otherwise update()'s extras + keyed passes could\r\n // fire its BeforeRemove/animation twice. Synchronous removals are already\r\n // guarded by the indexOf check above (the node is spliced before re-entry).\r\n if (item._beforeRemoveFired) return;\r\n const done = () => {\r\n const el = item.domElement\r\n // Re-resolve position at completion time — a deferred (animated) removal\r\n // may run after other inserts/removes have shifted indices.\r\n const i = this.items.indexOf(item);\r\n if (i >= 0) this.items.splice(i, 1);\r\n updateDom && el && el.remove()\r\n item._dispose(); // _dispose fires Remove + releases subscriptions for the whole subtree\r\n }\r\n if (item._hooks.BeforeRemove && item.domElement) {\r\n let doneCalled = false;\r\n const onceDone = () => { if (!doneCalled) { doneCalled = true; done(); } };\r\n item._beforeRemoveFired = true; // prevent _dispose from re-firing BeforeRemove\r\n item._hooks.BeforeRemove(item, onceDone);\r\n // Auto-complete only for sync cleanup hooks. A hook that declares `done`\r\n // (arity >= 2, e.g. an exit animation) owns completion and defers removal.\r\n if ((item._hooks.BeforeRemove as Function).length < 2 && !doneCalled) onceDone();\r\n } else {\r\n done()\r\n }\r\n\r\n } else {\r\n const el = item.domText\r\n this.items.splice(index, 1);\r\n updateDom && el && el.remove()\r\n item._dispose();\r\n }\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n clear(updateDom = true, silent = false): void {\r\n if (this.items.length === 0) return;\r\n const snapshot = this.items.slice();\r\n\r\n for (const item of snapshot) {\r\n this.remove(item, updateDom, true);\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n _dispose(): void {\r\n this.items.forEach(child => child._dispose())\r\n this.items = [];\r\n }\r\n\r\n swap(aIndex: number, bIndex: number, updateDom = true, silent = false) {\r\n if (aIndex < 0 || bIndex < 0 ||\r\n aIndex >= this.items.length || bIndex >= this.items.length ||\r\n aIndex === bIndex) return;\r\n\r\n const itemA = this.items[aIndex];\r\n const itemB = this.items[bIndex];\r\n\r\n this.items[aIndex] = itemB;\r\n this.items[bIndex] = itemA;\r\n\r\n if (updateDom) this._swapDomElement(itemA, itemB);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n move(fromIndex: number, toIndex: number, updateDom = true, silent = false): void {\r\n if (fromIndex < 0 || fromIndex >= this.items.length ||\r\n toIndex < 0 || toIndex >= this.items.length || fromIndex === toIndex) return;\r\n\r\n const item = this.items[fromIndex];\r\n\r\n this.items.splice(fromIndex, 1);\r\n this.items.splice(toIndex, 0, item);\r\n\r\n if (updateDom) this._moveDomElement(item, toIndex);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n generateHTML(): string {\r\n let html = \"\";\r\n for (const item of this.items) html += item.generateHTML();\r\n return html;\r\n }\r\n}\r\n","import type { StyleRule } from \"./StyleRule.js\";\r\nimport type { StyleValue } from \"../types.js\";\r\nimport { camelToKebab } from \"../helpers.js\";\r\nimport { PrefixCSS } from \"../constants.js\";\r\nimport { Listener } from \"../types.js\"\r\n\r\nexport class StyleProperty {\r\n name: string;\r\n cssName: string;\r\n value: StyleValue = \"\";\r\n parentRule: StyleRule;\r\n\r\n constructor(name: string, value: StyleValue, parentRule: StyleRule) {\r\n this.name = name;\r\n this.cssName = camelToKebab(name);\r\n this.parentRule = parentRule;\r\n this.set(value);\r\n }\r\n\r\n _domUpdate(): void {\r\n if (!this.parentRule) return;\r\n const domRule = this.parentRule.domRule;\r\n\r\n if (domRule && (domRule as CSSStyleRule).style) {\r\n let style: CSSStyleDeclaration = (domRule as CSSStyleRule).style;\r\n style.setProperty(this.cssName, String(this.value));\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n style.setProperty(`-${prefix}-${this.cssName}`, String(this.value));\r\n });\r\n }\r\n }\r\n }\r\n _dispose(): void {\r\n this.value = \"\";\r\n this.parentRule = null as any;\r\n }\r\n\r\n set(value: StyleValue): void {\r\n\r\n if (typeof value === \"function\") {\r\n let listener = (() => {\r\n if (!this.parentRule || this.parentRule.parentNode?._disposed) return;\r\n this.value = value(listener);\r\n this._domUpdate();\r\n }) as unknown as Listener;\r\n\r\n listener.onSubscribe = (release: () => void) => {\r\n this.parentRule.parentNode?.addHook(\"BeforeRemove\", () => {\r\n release();\r\n listener = null!;\r\n });\r\n };\r\n\r\n listener.elementNode = this.parentRule!.root!;\r\n listener.debug = `class:${this.parentRule?.root?.tagName}_${this.parentRule?.root?.nodeId} style:${this.name}`;\r\n this.value = value(listener);\r\n } else {\r\n this.value = value;\r\n }\r\n\r\n this._domUpdate();\r\n }\r\n\r\n remove(): void {\r\n if (!this.parentRule) return;\r\n\r\n if (this.parentRule.domRule instanceof CSSStyleRule) {\r\n const domStyle = this.parentRule.domRule.style;\r\n domStyle.removeProperty(this.cssName);\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n domStyle.removeProperty(`-${prefix}-${this.cssName}`);\r\n });\r\n }\r\n }\r\n delete this.parentRule.styleBlock![this.name];\r\n this._dispose();\r\n }\r\n\r\n cssText(): string {\r\n let str = `${this.cssName}: ${this.value}`;\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n str += `; -${prefix}-${this.cssName}: ${this.value}`;\r\n });\r\n }\r\n return str;\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { StyleProperty } from \"./StyleProperty.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\n\r\nexport class StyleRule {\r\n selectorText: string;\r\n domRule: CSSRule | CSSMediaRule | CSSKeyframesRule | null = null;\r\n styleList: StyleList | null;\r\n styleBlock: Record<string, StyleProperty> | null = {};\r\n parent: StyleRule | ElementNode | null;\r\n\r\n constructor(selectorText: string, parent: StyleRule | ElementNode) {\r\n this.selectorText = selectorText;\r\n this.styleList = new StyleList(this);\r\n this.parent = parent;\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.styleBlock) {\r\n for (const prop of Object.values(this.styleBlock)) {\r\n prop._dispose();\r\n }\r\n }\r\n\r\n if (this.styleList) {\r\n this.styleList._dispose();\r\n }\r\n\r\n this.styleBlock = null;\r\n this.styleList = null;\r\n this.domRule = null;\r\n this.parent = null;\r\n }\r\n\r\n get root() {\r\n let node = this.parent;\r\n while (node instanceof StyleRule) {\r\n node = node.parent;\r\n }\r\n return node;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n \r\n insertStyle(name: string, val: any): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].set(val);\r\n } else {\r\n this.styleBlock[name] = new StyleProperty(name, val, this);\r\n }\r\n }\r\n\r\n removeStyle(name: string): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].remove();\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.styleBlock || !this.styleList) return \"\";\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n const nested = this.styleList.cssText();\r\n return `${this.selectorText} { ${styleStr} ${nested} } `;\r\n }\r\n\r\n mount(domRule: CSSRule | CSSKeyframesRule): void {\r\n if (!domRule || !this.styleList) return;\r\n this.domRule = domRule;\r\n if (\"cssRules\" in domRule) {\r\n this.styleList.mount(domRule.cssRules as CSSRuleList);\r\n }\r\n }\r\n\r\n remove(): void {\r\n\r\n if (this.domRule && this.domRule.parentStyleSheet) {\r\n const sheet = this.domRule.parentStyleSheet;\r\n const rules = sheet.cssRules;\r\n for (let i = 0; i < rules.length; i++) {\r\n if (rules[i] === this.domRule) {\r\n sheet.deleteRule(i);\r\n break;\r\n }\r\n }\r\n }\r\n this._dispose();\r\n }\r\n\r\n render(domSheet: CSSStyleSheet | CSSGroupingRule) {\r\n if (!this.styleBlock || !this.styleList) return;\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n try {\r\n if (!this.selectorText.startsWith(\"@\")) {\r\n const css = `${this.selectorText} { ${styleStr} }`;\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (domRule && \"selectorText\" in domRule) {\r\n this.mount(domRule);\r\n }\r\n } else if (/^@(media|supports|container|layer)\\b/.test(this.selectorText)) {\r\n const index = domSheet.insertRule(`${this.selectorText} {}`, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (\"cssRules\" in domRule) {\r\n this.mount(domRule as CSSGroupingRule);\r\n this.styleList.render(domRule as CSSGroupingRule);\r\n }\r\n } else if (this.selectorText.startsWith(\"@keyframes\") || this.selectorText.startsWith(\"@font-face\")) {\r\n const css = this.cssText();\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n this.mount(domRule);\r\n }\r\n } catch (err) {\r\n console.warn(\"Failed to insert rule:\", this.selectorText, err);\r\n }\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { selectorSplitter, normalizeSelectorKey } from \"../helpers.js\";\r\nimport { StyleRule } from \"./StyleRule.js\";\r\n\r\nexport class StyleList {\r\n parent: StyleRule | ElementNode | null;\r\n items: StyleRule[] = [];\r\n domStyle: HTMLStyleElement | null = null;\r\n\r\n constructor(parent: StyleRule | ElementNode) {\r\n this.parent = parent;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n\r\n addCSS(obj: Record<string, any>, parentSelector: string = \"\"): void {\r\n if (!this.items || !this.parent) return;\r\n const basic: Record<string, any> = {};\r\n\r\n function getSelector(selector: string, prev: string): string {\r\n return selector.startsWith(\"&\")\r\n ? `${prev}${selector.slice(1)}`\r\n : `${prev} ${selector}`;\r\n }\r\n\r\n for (const selector in obj) {\r\n const value = obj[selector];\r\n let splitKeys = selectorSplitter(selector);\r\n for (let key of splitKeys) {\r\n const currentSelector = getSelector(key, parentSelector);\r\n if (/^@(container|layer|supports|media)\\b/.test(key)) {\r\n if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, parentSelector);\r\n this.items.push(rule);\r\n }\r\n } else if (key.startsWith(\"@keyframes\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, \"\");\r\n this.items.push(rule);\r\n } else if (key.startsWith(\"@font-face\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n for (const k in value) rule.insertStyle(k, value[k]);\r\n this.items.push(rule);\r\n } else if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(currentSelector, this.parent);\r\n this.items.push(rule);\r\n for (const [k, v] of Object.entries(value)) {\r\n if (typeof v === \"object\" && v != null) {\r\n let newSelector = getSelector(k, currentSelector);\r\n if (k.startsWith(\"&\")) {\r\n this.addCSS(v, newSelector);\r\n } else {\r\n const r = rule.styleList!.insertRule(newSelector);\r\n r.styleList!.addCSS(v, newSelector);\r\n }\r\n } else {\r\n rule.insertStyle(k, v);\r\n }\r\n }\r\n } else {\r\n basic[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if (Object.keys(basic).length) {\r\n const rule = new StyleRule(parentSelector, this.parent);\r\n for (const key in basic) rule.insertStyle(key, basic[key]);\r\n this.items.push(rule);\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.items) return \"\";\r\n return this.items.map((rule) => rule.cssText()).join(\"\");\r\n }\r\n\r\n insertRule(selector: string): StyleRule {\r\n if (!this.items || !this.parent) return null as any;\r\n let rule = this.items.find((rule) => rule.selectorText === selector);\r\n if (!rule) {\r\n rule = new StyleRule(selector, this.parent);\r\n this.items.push(rule);\r\n }\r\n return rule;\r\n }\r\n\r\n hydrate(domRuleMap: Map<string, CSSRule>): void {\r\n if (!this.items) return;\r\n for (const rule of this.items) {\r\n const domRule = domRuleMap.get(normalizeSelectorKey(rule.selectorText));\r\n if (domRule) rule.mount(domRule as CSSRule);\r\n }\r\n }\r\n\r\n mount(domRuleList: CSSRuleList): void {\r\n if (!this.items) return;\r\n if (!domRuleList) throw Error(\"Require domRuleList argument\");\r\n let wrongCount = 0;\r\n const fixOddEven = (css: string) => css.replace(\"(odd)\", \"(2n+1)\").replace(\"(even)\", \"(2n)\");\r\n\r\n this.items.forEach((rule, i) => {\r\n const index = i - wrongCount;\r\n const domRule = domRuleList[index];\r\n if (!domRule) return;\r\n if (rule.selectorText.startsWith(\"@\") && domRule instanceof CSSKeyframesRule) {\r\n rule.mount(domRule);\r\n } else if (\"keyText\" in domRule) {\r\n rule.mount(domRule);\r\n } else if (\"selectorText\" in domRule) {\r\n if (domRule.selectorText !== fixOddEven(rule.selectorText)) {\r\n wrongCount += 1;\r\n } else {\r\n rule.mount(domRule);\r\n }\r\n } else if (\"cssRules\" in domRule) {\r\n rule.mount(domRule as CSSMediaRule);\r\n }\r\n });\r\n }\r\n\r\n render(dom: HTMLStyleElement | CSSGroupingRule) {\r\n if (dom instanceof HTMLStyleElement) {\r\n this.domStyle = dom\r\n this.items.forEach((rule) => rule.render(dom.sheet!));\r\n } else if (dom instanceof CSSGroupingRule) {\r\n this.items.forEach((rule) => rule.render(dom));\r\n }\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.items) {\r\n for (let i = 0; i < this.items.length; i++) {\r\n this.items[i]._dispose();\r\n }\r\n }\r\n\r\n this.items = [];\r\n this.parent = null;\r\n this.domStyle = null;\r\n }\r\n}\r\n","import type { DomphyElement, EventName, HookMap, TagName, PartialElement } from \"../types.js\";\r\nimport { AttributeList } from \"./AttributeList.js\";\r\nimport { ElementList } from \"./ElementList.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\nimport { validate, mergePartial, getTagName, deepClone, ensureDomStyle, collectCSSRules } from \"../helpers.js\";\r\nimport { merge, hashString } from \"../utils.js\";\r\nimport { SvgTags, VoidTags } from \"../constants.js\"\r\n\r\nexport class ElementNode {\r\n _disposed = false\r\n _beforeRemoveFired = false\r\n type = \"ElementNode\"\r\n parent: ElementNode | null = null;\r\n _portal?: (root: ElementNode) => HTMLElement;\r\n tagName: TagName;\r\n children = new ElementList(this);\r\n styles = new StyleList(this);\r\n attributes = new AttributeList(this);\r\n domElement?: HTMLElement | null = null;\r\n _hooks: HookMap = {};\r\n _events?: { [K in EventName]?: (event: Event, node: ElementNode) => void } | null = null;\r\n _boundEvents = new Set<EventName>();\r\n _context?: Record<string, any> = {};\r\n _metadata?: Record<string, any> = {};\r\n key?: string | number | null = null;\r\n nodeId: string\r\n\r\n constructor(domphyElement: DomphyElement, _parent: ElementNode | null = null, index = 0) {\r\n domphyElement = deepClone(domphyElement)\r\n validate(domphyElement)\r\n domphyElement.style = domphyElement.style || {}\r\n this.parent = _parent;\r\n this.tagName = getTagName(domphyElement) as TagName;\r\n domphyElement = mergePartial(domphyElement) as DomphyElement\r\n\r\n this.key = (domphyElement as any)._key ?? null;\r\n this._context = domphyElement._context || {}\r\n this._metadata = domphyElement._metadata || {}\r\n\r\n let tempPath = `${this.parent?.nodeId}.${index}`\r\n const str = JSON.stringify(domphyElement.style || {}, (k, v) => typeof v === \"function\" ? tempPath : v,);\r\n this.nodeId = hashString(tempPath + str)\r\n\r\n this.attributes!.addClass(`${this.tagName}_${this.nodeId}`);\r\n if (domphyElement._onSchedule) domphyElement._onSchedule(this, domphyElement)\r\n\r\n this.merge(domphyElement)\r\n\r\n const children = (domphyElement as any)[this.tagName];\r\n\r\n if (children != null && children != undefined) {\r\n if (typeof children === \"function\") {\r\n\r\n let listener: any = () => {\r\n if (this._disposed) return\r\n let input = children(listener)\r\n this.children!.update(Array.isArray(input) ? input : [input])\r\n }\r\n\r\n listener!.elementNode = this;\r\n listener!.debug = `class:${this.tagName}_${this.nodeId} children`;\r\n listener!.onSubscribe = (release: () => void) => this.addHook(\"BeforeRemove\", () => {\r\n release()\r\n listener = null\r\n });\r\n listener && listener();\r\n } else {\r\n this.children!.update(Array.isArray(children) ? children : [children])\r\n }\r\n }\r\n this._hooks.Init && this._hooks.Init(this)\r\n }\r\n\r\n _createDOMNode() {\r\n const svgNamespace = \"http://www.w3.org/2000/svg\"\r\n let node = SvgTags.includes(this.tagName)\r\n ? document.createElementNS(svgNamespace, this.tagName)\r\n : document.createElement(this.tagName)\r\n\r\n this.domElement = node as HTMLElement\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n\r\n if (this.attributes) {\r\n Object.values(this.attributes.items!).forEach(attr => attr.render())\r\n }\r\n return node\r\n }\r\n\r\n // Bind a DOM listener that dispatches LIVE from this._events, so patch() can\r\n // swap the handler (e.g. a list item's onClick closure after its data changes)\r\n // without detaching/reattaching the DOM listener.\r\n _bindEvent(eventName: EventName): void {\r\n if (!this.domElement || this._boundEvents.has(eventName)) return\r\n this._boundEvents.add(eventName)\r\n let fn: any = (event: Event) => this._events?.[eventName]?.(event, this)\r\n this.domElement.addEventListener(eventName, fn)\r\n this.addHook(\"BeforeRemove\", (n) => {\r\n n.domElement?.removeEventListener(eventName, fn)\r\n fn = null\r\n })\r\n }\r\n\r\n _dispose(): void {\r\n if (this._disposed) return\r\n this._disposed = true\r\n\r\n // Fire BeforeRemove so reactive-listener releases (registered as BeforeRemove\r\n // hooks via onSubscribe) actually run for this node. Descendants are torn\r\n // down through this recursive _dispose — not through ElementList.remove — so\r\n // without this their subscriptions to long-lived State/RecordState leak.\r\n // Skip if the async-removal path in ElementList already fired it.\r\n if (!this._beforeRemoveFired) {\r\n this._beforeRemoveFired = true\r\n this._hooks.BeforeRemove?.(this, () => { })\r\n }\r\n\r\n if (this.children) {\r\n this.children._dispose();\r\n }\r\n\r\n if (this.styles) {\r\n this.styles.items!.forEach((rule) => rule.remove());\r\n this.styles._dispose();\r\n }\r\n\r\n if (this.attributes) {\r\n this.attributes._dispose();\r\n }\r\n\r\n // _onRemove fires for every node in the subtree, not just the directly-removed one.\r\n this._hooks.Remove?.(this)\r\n\r\n this.domElement = null;\r\n this._hooks = {};\r\n this._events = null;\r\n this._context = {};\r\n this._metadata = {};\r\n this.parent = null;\r\n }\r\n merge(part: PartialElement) {\r\n merge(this._context, part._context)\r\n merge(this._metadata, part._metadata)\r\n\r\n const keys = Object.keys(part)\r\n for (let i = 0; i < keys.length; i++) {\r\n const originalKey = keys[i];\r\n const value = (part as any)[originalKey];\r\n if ([\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName].includes(originalKey)) {\r\n continue\r\n } else if ([\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"].includes(originalKey)) {\r\n this.addHook(originalKey.substring(3) as keyof HookMap, value);\r\n } else if (originalKey.startsWith(\"on\")) {\r\n this.addEvent(originalKey.substring(2).toLowerCase() as EventName, value);\r\n } else if (originalKey == \"_portal\") {\r\n this._portal = value\r\n } else if (originalKey == \"class\" && typeof value === \"string\") {\r\n this.attributes!.addClass(value);\r\n } else {\r\n this.attributes!.set(originalKey, value);\r\n }\r\n }\r\n if (part.style) {\r\n this.styles.addCSS(part.style || {}, `.${`${this.tagName}_${this.nodeId}`}`);\r\n }\r\n\r\n }\r\n\r\n // Update this live node IN PLACE from a fresh element description, preserving\r\n // its DOM element (and thus focus/scroll/selection/uncontrolled value) and its\r\n // children's identity. Used by list reconciliation to reuse a node by key\r\n // (keyed) or position (unkeyed) while reflecting new data, instead of\r\n // destroying and recreating the DOM. Styles and lifecycle hooks are NOT\r\n // re-applied (reused items share structure; hooks already ran). Reactive\r\n // content (a function child) keeps its own listener and is left untouched.\r\n patch(rawElement: DomphyElement): void {\r\n let element: any = deepClone(rawElement)\r\n element.style = element.style || {}\r\n element = mergePartial(element)\r\n\r\n // Children / content — recurse so grandchildren are reused/patched too.\r\n const content = element[this.tagName]\r\n if (typeof content !== \"function\") {\r\n const next = content == null ? [] : Array.isArray(content) ? content : [content]\r\n this.children.update(next, !!this.domElement, true)\r\n }\r\n\r\n if (element._context) merge(this._context, element._context)\r\n if (element._metadata) merge(this._metadata, element._metadata)\r\n\r\n // Rebuild attributes and events. Events are replaced (live dispatch in\r\n // _bindEvent reads this._events, so swapping the map is enough); attributes\r\n // present before but absent now are removed; the auto scope class is kept.\r\n const autoClass = `${this.tagName}_${this.nodeId}`\r\n const reserved = [\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName]\r\n const hookKeys = [\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"]\r\n const keep = new Set<string>([\"class\"])\r\n let userClass: string | null = null\r\n\r\n this._events = {}\r\n for (const key of Object.keys(element)) {\r\n if (reserved.includes(key) || hookKeys.includes(key) || key === \"_portal\") continue\r\n const value = element[key]\r\n if (key.startsWith(\"on\") && typeof value === \"function\") {\r\n this.addEvent(key.substring(2).toLowerCase() as EventName, value)\r\n } else if (key === \"class\" && typeof value === \"string\") {\r\n userClass = value\r\n } else {\r\n this.attributes!.set(key, value)\r\n keep.add(key)\r\n }\r\n }\r\n\r\n this.attributes!.set(\"class\", userClass ? `${autoClass} ${userClass}` : autoClass)\r\n\r\n if (this.attributes!.items) {\r\n for (const name of Object.keys(this.attributes!.items)) {\r\n if (!keep.has(name)) this.attributes!.remove(name)\r\n }\r\n }\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n }\r\n\r\n addEvent(name: EventName, callback: (event: Event, node: ElementNode) => void): void {\r\n\r\n this._events = this._events || {}\r\n\r\n let current = this._events[name]\r\n if (typeof current == \"function\") {\r\n this._events[name] = (event: Event, node: ElementNode) => {\r\n current!(event, node)\r\n callback(event, node)\r\n }\r\n } else {\r\n this._events[name] = callback\r\n }\r\n }\r\n\r\n addHook<K extends keyof HookMap>(name: K, callback: HookMap[K]): void {\r\n const current = this._hooks[name];\r\n\r\n if (typeof current === \"function\") {\r\n const composed = ((...args: any[]) => {\r\n (current as Function)(...args);\r\n (callback as Function)(...args);\r\n }) as HookMap[K];\r\n // Preserve the maximum declared arity across composed hooks. Removal logic\r\n // inspects BeforeRemove.length (>= 2 means the hook owns `done()`, e.g. an\r\n // exit animation); a naive (...args) wrapper would report 0 and break that.\r\n try {\r\n Object.defineProperty(composed, \"length\", {\r\n value: Math.max((current as Function).length, (callback as Function).length),\r\n configurable: true,\r\n });\r\n } catch { /* length non-configurable on some engines — best effort */ }\r\n this._hooks[name] = composed;\r\n } else {\r\n this._hooks[name] = callback;\r\n }\r\n }\r\n getRoot(): ElementNode {\r\n let root: ElementNode = this;\r\n while (root && root instanceof ElementNode && root.parent) {\r\n root = root.parent;\r\n }\r\n return root\r\n }\r\n\r\n getContext(name: string): any {\r\n let node: ElementNode | null = this;\r\n while (node && (!node._context || !Object.prototype.hasOwnProperty.call(node._context, name))) {\r\n node = node.parent;\r\n }\r\n return node && node._context ? node._context[name] : undefined;\r\n }\r\n\r\n setContext(name: string, value: any) {\r\n this._context = this._context || {}\r\n this._context[name] = value;\r\n }\r\n\r\n getMetadata(name: string): any {\r\n return this._metadata ? this._metadata[name] : undefined;\r\n }\r\n\r\n setMetadata(key: string, value: any) {\r\n this._metadata = this._metadata || {}\r\n this._metadata[key] = value;\r\n\r\n }\r\n\r\n generateCSS(): string {\r\n if (!this.styles || !this.children) return \"\";\r\n let css = this.styles.cssText()\r\n css += this.children.items.map(child => child instanceof ElementNode ? child.generateCSS() : \"\").join(\"\")\r\n return css\r\n }\r\n\r\n generateHTML(): string {\r\n if (!this.children || !this.attributes) return \"\";\r\n const attributes = this.attributes.generateHTML();\r\n // Void elements must not emit a closing tag — `<br></br>` is parsed by the\r\n // HTML tokenizer as two <br>, which corrupts hydration child alignment.\r\n if ((VoidTags as readonly string[]).includes(this.tagName)) {\r\n return `<${this.tagName}${attributes}>`;\r\n }\r\n const content = this.children.generateHTML();\r\n return `<${this.tagName}${attributes}>${content}</${this.tagName}>`;\r\n }\r\n\r\n mount(domElement: HTMLElement, domStyle?: HTMLStyleElement): void {\r\n if (!domElement) throw new Error(\"Missing dom node on bind\");\r\n this.domElement = domElement;\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n\r\n if (this.children) {\r\n this.children.items.forEach((child, i) => {\r\n const childNode = domElement.childNodes[i];\r\n if (!childNode) return;\r\n if (child instanceof ElementNode) {\r\n child.mount(childNode as HTMLElement);\r\n } else {\r\n // Bind the server-rendered text/inline-HTML node so that reactive\r\n // child updates after hydration can locate and replace it.\r\n child.domText = childNode;\r\n }\r\n });\r\n }\r\n\r\n // Attach reactive style declarations to the server-rendered stylesheet so\r\n // post-hydration updates mutate the existing CSSOM rules instead of being\r\n // silently dropped (StyleProperty._domUpdate needs a bound domRule). Done\r\n // once from the call that received the style element, walking the whole\r\n // subtree because per-node selectors are globally unique.\r\n if (domStyle) {\r\n const sheet = domStyle.sheet;\r\n if (sheet) this._hydrateStyles(collectCSSRules(sheet.cssRules, new Map()));\r\n }\r\n\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n }\r\n\r\n _hydrateStyles(domRuleMap: Map<string, CSSRule>): void {\r\n this.styles?.hydrate(domRuleMap);\r\n if (this.children) {\r\n for (const child of this.children.items) {\r\n if (child instanceof ElementNode) child._hydrateStyles(domRuleMap);\r\n }\r\n }\r\n }\r\n\r\n render(domElement: HTMLElement | SVGElement | DocumentFragment): HTMLElement | SVGElement {\r\n const newNode = this._createDOMNode();\r\n domElement.appendChild(newNode)\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n let domStyle = this.getRoot().styles.domStyle\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n domStyle ||= ensureDomStyle(styleParent)\r\n this.styles.render(domStyle as HTMLStyleElement)\r\n this.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(this.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(newNode)\r\n }\r\n })\r\n return newNode;\r\n }\r\n\r\n remove() {\r\n if (this.parent) {\r\n this.parent.children.remove(this)\r\n } else {\r\n // Root removal must also run BeforeRemove/Remove (and release reactive\r\n // subscriptions across the whole tree via _dispose), honoring async done().\r\n const done = () => {\r\n this.domElement?.remove()\r\n this._dispose()\r\n }\r\n if (this._hooks.BeforeRemove && this.domElement) {\r\n let called = false\r\n const once = () => { if (!called) { called = true; done() } }\r\n this._beforeRemoveFired = true\r\n this._hooks.BeforeRemove(this, once)\r\n if ((this._hooks.BeforeRemove as Function).length < 2 && !called) once()\r\n } else {\r\n done()\r\n }\r\n }\r\n }\r\n}\r\n","import { Notifier } from \"./Notifier.js\"\r\n\r\ntype Listener = (...args: any[]) => void\r\n\r\nexport class RecordState<T extends Record<string, any> = Record<string, any>> {\r\n private _notifier = new Notifier()\r\n private _record: T\r\n readonly initialRecord: T\r\n\r\n constructor(record: T) {\r\n this.initialRecord = { ...record }\r\n this._record = { ...record }\r\n }\r\n\r\n get<K extends keyof T>(key: K, l?: Listener): T[K] {\r\n if (l) this._notifier.addListener(key as string, l)\r\n return this._record[key]\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n this._record[key] = value\r\n this._notifier.notify(key as string)\r\n }\r\n\r\n addListener<K extends keyof T>(key: K, fn: Listener): () => void {\r\n return this._notifier.addListener(key as string, fn)\r\n }\r\n\r\n removeListener<K extends keyof T>(key: K, fn: Listener): void {\r\n this._notifier.removeListener(key as string, fn)\r\n }\r\n\r\n reset<K extends keyof T>(key: K): void {\r\n this.set(key, this.initialRecord[key])\r\n }\r\n\r\n _dispose(): void {\r\n this._notifier._dispose()\r\n }\r\n}\r\n","import type { LoaderContext, MetadataValue } from \"./types.js\";\n\n/**\n * Port of the Next.js Metadata API. Static objects merge from root layout to\n * page; later segments override earlier ones. `title.template` applies to the\n * titles of child segments, exactly like Next.js.\n */\n\nexport interface MetadataTitle {\n default?: string;\n template?: string;\n absolute?: string;\n}\n\nexport interface OpenGraphImage {\n url: string;\n width?: number;\n height?: number;\n alt?: string;\n}\n\nexport interface OpenGraphMetadata {\n title?: string;\n description?: string;\n url?: string;\n siteName?: string;\n type?: string;\n locale?: string;\n images?: (string | OpenGraphImage)[];\n}\n\nexport interface TwitterMetadata {\n card?: \"summary\" | \"summary_large_image\" | \"app\" | \"player\";\n title?: string;\n description?: string;\n site?: string;\n creator?: string;\n images?: string[];\n}\n\nexport interface RobotsMetadata {\n index?: boolean;\n follow?: boolean;\n noarchive?: boolean;\n nosnippet?: boolean;\n noimageindex?: boolean;\n}\n\nexport interface IconsMetadata {\n icon?: string;\n shortcut?: string;\n apple?: string;\n}\n\nexport interface AlternatesMetadata {\n canonical?: string;\n languages?: Record<string, string>;\n}\n\nexport interface Metadata {\n title?: string | MetadataTitle;\n description?: string;\n applicationName?: string;\n generator?: string;\n keywords?: string[];\n authors?: { name: string; url?: string }[];\n referrer?: string;\n themeColor?: string;\n colorScheme?: string;\n viewport?: string;\n robots?: string | RobotsMetadata;\n icons?: string | IconsMetadata;\n openGraph?: OpenGraphMetadata;\n twitter?: TwitterMetadata;\n alternates?: AlternatesMetadata;\n metadataBase?: string;\n /** Arbitrary extra meta tags: name -> content. */\n other?: Record<string, string>;\n}\n\nexport interface ResolvedMetadata extends Omit<Metadata, \"title\"> {\n title?: string;\n}\n\nexport interface HeadTag {\n tag: \"title\" | \"meta\" | \"link\";\n attributes: Record<string, string>;\n content?: string;\n}\n\n/** Resolves the metadata chain of all matched segments into one flat object. */\nexport async function resolveMetadata(\n values: (MetadataValue | undefined)[],\n context: LoaderContext,\n): Promise<ResolvedMetadata> {\n const resolved: ResolvedMetadata = {};\n let template: string | null = null;\n\n for (const value of values) {\n if (!value) continue;\n const metadata = typeof value === \"function\" ? await value(context) : value;\n\n for (const key of Object.keys(metadata) as (keyof Metadata)[]) {\n if (key === \"title\") continue;\n const entry = metadata[key];\n if (entry !== undefined) {\n (resolved as Record<string, unknown>)[key] = entry;\n }\n }\n\n const title = metadata.title;\n if (title === undefined) continue;\n if (typeof title === \"string\") {\n resolved.title = template ? template.replace(\"%s\", title) : title;\n continue;\n }\n if (title.absolute !== undefined) {\n resolved.title = title.absolute;\n } else if (title.default !== undefined) {\n resolved.title = template\n ? template.replace(\"%s\", title.default)\n : title.default;\n }\n if (title.template !== undefined) {\n template = title.template;\n }\n }\n\n return resolved;\n}\n\nfunction absoluteUrl(url: string, base: string | undefined): string {\n if (!base || /^[a-z][a-z0-9+.-]*:/i.test(url)) return url;\n return new URL(url, base).toString();\n}\n\nfunction robotsContent(robots: string | RobotsMetadata): string {\n if (typeof robots === \"string\") return robots;\n const directives: string[] = [];\n directives.push(robots.index === false ? \"noindex\" : \"index\");\n directives.push(robots.follow === false ? \"nofollow\" : \"follow\");\n if (robots.noarchive) directives.push(\"noarchive\");\n if (robots.nosnippet) directives.push(\"nosnippet\");\n if (robots.noimageindex) directives.push(\"noimageindex\");\n return directives.join(\", \");\n}\n\n/** Converts resolved metadata into a flat list of head tag descriptions. */\nexport function metadataToHeadTags(metadata: ResolvedMetadata): HeadTag[] {\n const tags: HeadTag[] = [];\n const base = metadata.metadataBase;\n const meta = (name: string, content: string | undefined) => {\n if (content !== undefined)\n tags.push({ tag: \"meta\", attributes: { name, content } });\n };\n const property = (name: string, content: string | undefined) => {\n if (content !== undefined) {\n tags.push({ tag: \"meta\", attributes: { property: name, content } });\n }\n };\n\n if (metadata.title !== undefined) {\n tags.push({ tag: \"title\", attributes: {}, content: metadata.title });\n }\n meta(\"description\", metadata.description);\n meta(\"application-name\", metadata.applicationName);\n meta(\"generator\", metadata.generator);\n meta(\"keywords\", metadata.keywords?.join(\", \"));\n meta(\"referrer\", metadata.referrer);\n meta(\"theme-color\", metadata.themeColor);\n meta(\"color-scheme\", metadata.colorScheme);\n meta(\"viewport\", metadata.viewport);\n if (metadata.robots !== undefined)\n meta(\"robots\", robotsContent(metadata.robots));\n for (const author of metadata.authors ?? []) {\n meta(\"author\", author.name);\n if (author.url) {\n tags.push({\n tag: \"link\",\n attributes: { rel: \"author\", href: author.url },\n });\n }\n }\n\n if (metadata.icons !== undefined) {\n const icons =\n typeof metadata.icons === \"string\"\n ? { icon: metadata.icons }\n : metadata.icons;\n if (icons.icon)\n tags.push({ tag: \"link\", attributes: { rel: \"icon\", href: icons.icon } });\n if (icons.shortcut) {\n tags.push({\n tag: \"link\",\n attributes: { rel: \"shortcut icon\", href: icons.shortcut },\n });\n }\n if (icons.apple) {\n tags.push({\n tag: \"link\",\n attributes: { rel: \"apple-touch-icon\", href: icons.apple },\n });\n }\n }\n\n const openGraph = metadata.openGraph;\n if (openGraph) {\n property(\"og:title\", openGraph.title ?? metadata.title);\n property(\"og:description\", openGraph.description ?? metadata.description);\n property(\n \"og:url\",\n openGraph.url ? absoluteUrl(openGraph.url, base) : undefined,\n );\n property(\"og:site_name\", openGraph.siteName);\n property(\"og:type\", openGraph.type);\n property(\"og:locale\", openGraph.locale);\n for (const image of openGraph.images ?? []) {\n const value = typeof image === \"string\" ? { url: image } : image;\n property(\"og:image\", absoluteUrl(value.url, base));\n if (value.width !== undefined)\n property(\"og:image:width\", String(value.width));\n if (value.height !== undefined)\n property(\"og:image:height\", String(value.height));\n if (value.alt !== undefined) property(\"og:image:alt\", value.alt);\n }\n }\n\n const twitter = metadata.twitter;\n if (twitter) {\n meta(\"twitter:card\", twitter.card ?? \"summary\");\n meta(\"twitter:title\", twitter.title ?? metadata.title);\n meta(\"twitter:description\", twitter.description ?? metadata.description);\n meta(\"twitter:site\", twitter.site);\n meta(\"twitter:creator\", twitter.creator);\n for (const image of twitter.images ?? []) {\n meta(\"twitter:image\", absoluteUrl(image, base));\n }\n }\n\n const alternates = metadata.alternates;\n if (alternates) {\n if (alternates.canonical) {\n tags.push({\n tag: \"link\",\n attributes: {\n rel: \"canonical\",\n href: absoluteUrl(alternates.canonical, base),\n },\n });\n }\n for (const language of Object.keys(alternates.languages ?? {})) {\n tags.push({\n tag: \"link\",\n attributes: {\n rel: \"alternate\",\n hreflang: language,\n href: absoluteUrl(\n (alternates.languages as Record<string, string>)[language],\n base,\n ),\n },\n });\n }\n }\n\n for (const name of Object.keys(metadata.other ?? {})) {\n meta(name, (metadata.other as Record<string, string>)[name]);\n }\n\n return tags;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\");\n}\n\n/** Serializes head tags for server rendering. */\nexport function renderHeadTags(tags: HeadTag[]): string {\n return tags\n .map((tag) => {\n const attributes = Object.keys(tag.attributes)\n .map((name) => ` ${name}=\"${escapeAttribute(tag.attributes[name])}\"`)\n .join(\"\");\n if (tag.tag === \"title\") {\n return `<title>${escapeText(tag.content ?? \"\")}</title>`;\n }\n return `<${tag.tag}${attributes}>`;\n })\n .join(\"\\n\");\n}\n\nconst MANAGED_ATTRIBUTE = \"data-domphy-head\";\n\n/** Applies head tags to `document.head`, replacing tags from the previous navigation. */\nexport function applyHeadTags(tags: HeadTag[]): void {\n if (typeof document === \"undefined\") return;\n\n for (const element of Array.from(\n document.head.querySelectorAll(`[${MANAGED_ATTRIBUTE}]`),\n )) {\n element.remove();\n }\n\n for (const tag of tags) {\n if (tag.tag === \"title\") {\n document.title = tag.content ?? \"\";\n continue;\n }\n const element = document.createElement(tag.tag);\n for (const name of Object.keys(tag.attributes)) {\n element.setAttribute(name, tag.attributes[name]);\n }\n element.setAttribute(MANAGED_ATTRIBUTE, \"\");\n document.head.appendChild(element);\n }\n}\n","import type { Loader, LoaderContext } from \"./types.js\";\n\ninterface CacheEntry {\n data: unknown;\n timestamp: number;\n /** Entries seeded from SSR or prefetch are consumed once even by uncached loaders. */\n consumable: boolean;\n}\n\n/** How long a prefetched entry stays usable, mirrors the Next.js client router cache. */\nexport const PREFETCH_LIFETIME = 30_000;\n\n/**\n * Loader result cache. The `revalidate` option of a route controls the entry\n * lifetime, the equivalent of fetch caching / ISR in Next.js.\n */\nexport class DataCache {\n private entries = new Map<string, CacheEntry>();\n private inflight = new Map<string, Promise<unknown>>();\n\n /** Seeds entries (from SSR payloads) that satisfy the next load exactly once. */\n seed(record: Record<string, unknown>): void {\n for (const key of Object.keys(record)) {\n this.entries.set(key, {\n data: record[key],\n timestamp: Date.now(),\n consumable: true,\n });\n }\n }\n\n snapshot(keys: string[]): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n for (const key of keys) {\n const entry = this.entries.get(key);\n if (entry) record[key] = entry.data;\n }\n return record;\n }\n\n invalidate(prefix?: string): void {\n if (prefix === undefined) {\n this.entries.clear();\n return;\n }\n for (const key of this.entries.keys()) {\n if (key.startsWith(prefix)) this.entries.delete(key);\n }\n }\n\n async load(\n key: string,\n loader: Loader,\n context: LoaderContext,\n revalidate: number | undefined,\n ): Promise<unknown> {\n const entry = this.entries.get(key);\n if (entry) {\n const lifetime = revalidate !== undefined ? revalidate * 1000 : 0;\n const fresh = Date.now() - entry.timestamp <= lifetime;\n const usableSeed =\n entry.consumable && Date.now() - entry.timestamp <= PREFETCH_LIFETIME;\n if (fresh || usableSeed) {\n if (entry.consumable && !fresh) this.entries.delete(key);\n return entry.data;\n }\n this.entries.delete(key);\n }\n\n const pending = this.inflight.get(key);\n if (pending) return pending;\n\n const promise = Promise.resolve(loader(context)).then(\n (data) => {\n this.inflight.delete(key);\n if (revalidate !== undefined && revalidate > 0) {\n this.entries.set(key, {\n data,\n timestamp: Date.now(),\n consumable: false,\n });\n }\n return data;\n },\n (error) => {\n this.inflight.delete(key);\n throw error;\n },\n );\n this.inflight.set(key, promise);\n return promise;\n }\n\n /** Runs the loader ahead of navigation and stores the result as a one-shot entry. */\n async prefetch(\n key: string,\n loader: Loader,\n context: LoaderContext,\n revalidate: number | undefined,\n ): Promise<void> {\n if (revalidate !== undefined) {\n await this.load(key, loader, context, revalidate);\n return;\n }\n const existing = this.entries.get(key);\n if (existing && Date.now() - existing.timestamp <= PREFETCH_LIFETIME)\n return;\n if (this.inflight.has(key)) return;\n const data = await loader(context);\n this.entries.set(key, { data, timestamp: Date.now(), consumable: true });\n }\n}\n","/**\n * Minimal history abstraction so the router runs against the real browser\n * history, an in-memory stack (tests, embedded demos) or nothing at all (SSR).\n */\n\nexport interface HistoryAdapter {\n url(): URL;\n push(url: string): void;\n replace(url: string): void;\n go(delta: number): void;\n /** Subscribes to external navigation (popstate / memory go). Returns a release function. */\n listen(callback: (url: URL) => void): () => void;\n /** Saves and restores scroll positions per history entry. */\n saveScroll?(position: { x: number; y: number }): void;\n readScroll?(): { x: number; y: number } | null;\n}\n\ninterface BrowserHistoryState {\n __domphyIndex: number;\n}\n\nexport function createBrowserHistory(): HistoryAdapter {\n const scrollPositions = new Map<number, { x: number; y: number }>();\n let index =\n (window.history.state as BrowserHistoryState | null)?.__domphyIndex ?? 0;\n if (window.history.state?.__domphyIndex === undefined) {\n window.history.replaceState({ __domphyIndex: index }, \"\");\n }\n if (\"scrollRestoration\" in window.history) {\n window.history.scrollRestoration = \"manual\";\n }\n\n return {\n url: () => new URL(window.location.href),\n push: (url) => {\n index++;\n window.history.pushState({ __domphyIndex: index }, \"\", url);\n },\n replace: (url) => {\n window.history.replaceState({ __domphyIndex: index }, \"\", url);\n },\n go: (delta) => window.history.go(delta),\n listen: (callback) => {\n const handler = () => {\n index =\n (window.history.state as BrowserHistoryState | null)?.__domphyIndex ??\n 0;\n callback(new URL(window.location.href));\n };\n window.addEventListener(\"popstate\", handler);\n return () => window.removeEventListener(\"popstate\", handler);\n },\n saveScroll: (position) => scrollPositions.set(index, position),\n readScroll: () => scrollPositions.get(index) ?? null,\n };\n}\n\nconst MEMORY_ORIGIN = \"http://localhost\";\n\nexport function createMemoryHistory(initial = \"/\"): HistoryAdapter {\n const stack: string[] = [initial];\n let index = 0;\n const listeners = new Set<(url: URL) => void>();\n\n return {\n url: () => new URL(stack[index], MEMORY_ORIGIN),\n push: (url) => {\n stack.splice(index + 1);\n stack.push(url);\n index++;\n },\n replace: (url) => {\n stack[index] = url;\n },\n go: (delta) => {\n const next = Math.min(Math.max(index + delta, 0), stack.length - 1);\n if (next === index) return;\n index = next;\n const url = new URL(stack[index], MEMORY_ORIGIN);\n for (const listener of listeners) listener(url);\n },\n listen: (callback) => {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n}\n","import type { DomphyElement } from \"@domphy/core\";\nimport type { RouteMatch } from \"./matcher.js\";\nimport type {\n ErrorBlock,\n NotFoundBlock,\n RouteContext,\n RouterStatus,\n} from \"./types.js\";\n\nexport type SegmentStatus = \"success\" | \"pending\" | \"error\" | \"notfound\";\n\nexport interface SegmentResult {\n status: SegmentStatus;\n data?: unknown;\n error?: Error;\n}\n\nexport interface BuildTreeInput {\n match: RouteMatch;\n baseContext: Omit<RouteContext, \"data\" | \"segmentData\">;\n results: SegmentResult[];\n retry: () => void;\n defaultError: ErrorBlock;\n defaultNotFound: NotFoundBlock;\n}\n\nexport interface BuiltTree {\n element: DomphyElement;\n status: RouterStatus;\n}\n\nexport function defaultErrorBlock(error: Error): DomphyElement {\n return {\n div: [{ h2: \"Application error\" }, { p: error.message }],\n };\n}\n\nexport function defaultNotFoundBlock(): DomphyElement {\n return {\n div: [{ h2: \"404\" }, { p: \"This page could not be found.\" }],\n };\n}\n\nfunction findBoundary(results: SegmentResult[], status: SegmentStatus): number {\n return results.findIndex((result) => result.status === status);\n}\n\n/**\n * Composes the matched chain into one element: page wrapped by every layout,\n * exactly like nested `layout.tsx` files. When a segment failed, is pending or\n * raised `notFound()`, the subtree below the nearest boundary block (`error`,\n * `loading`, `notFound`) is replaced by that block while ancestor layouts keep\n * rendering — the same boundary model as the Next.js App Router.\n */\nexport function buildTree(input: BuildTreeInput): BuiltTree {\n const { match, baseContext, results, retry, defaultError, defaultNotFound } =\n input;\n const { chain, chainIds } = match.route;\n\n const segmentData: Record<string, unknown> = {};\n for (let i = 0; i < chain.length; i++) {\n segmentData[chainIds[i]] = results[i]?.data;\n }\n const contexts: RouteContext[] = chain.map((_, i) => ({\n ...baseContext,\n data: results[i]?.data,\n segmentData,\n }));\n\n const errorIndex = findBoundary(results, \"error\");\n const notFoundIndex = findBoundary(results, \"notfound\");\n const pendingIndex = findBoundary(results, \"pending\");\n\n let inner: DomphyElement;\n let wrapLimit: number;\n let status: RouterStatus;\n\n if (errorIndex !== -1) {\n const blockIndex = nearestBlockIndex(chain, errorIndex, (route) =>\n Boolean(route.error),\n );\n const block =\n blockIndex === -1\n ? defaultError\n : (chain[blockIndex].error as ErrorBlock);\n inner = block(results[errorIndex].error as Error, retry);\n inner._key = `${chainIds[Math.max(blockIndex, 0)]}:error`;\n wrapLimit = Math.min(blockIndex, errorIndex - 1);\n status = \"error\";\n } else if (notFoundIndex !== -1) {\n const blockIndex = nearestBlockIndex(chain, notFoundIndex, (route) =>\n Boolean(route.notFound),\n );\n const block =\n blockIndex === -1\n ? defaultNotFound\n : (chain[blockIndex].notFound as NotFoundBlock);\n inner = block();\n inner._key = `${chainIds[Math.max(blockIndex, 0)]}:notfound`;\n wrapLimit = Math.min(blockIndex, notFoundIndex - 1);\n status = \"notfound\";\n } else if (pendingIndex !== -1) {\n const blockIndex = nearestBlockIndex(chain, pendingIndex, (route) =>\n Boolean(route.loading),\n );\n if (blockIndex === -1) {\n // No loading block anywhere: caller keeps the previous tree on screen.\n return { element: { div: \"\" }, status: \"loading\" };\n }\n inner = chain[blockIndex].loading!(contexts[blockIndex]);\n inner._key = `${chainIds[blockIndex]}:loading`;\n wrapLimit = Math.min(blockIndex, pendingIndex - 1);\n status = \"loading\";\n } else {\n const leaf = chain[chain.length - 1];\n inner = leaf.page!(contexts[chain.length - 1]);\n inner._key = `${match.route.id}:page`;\n wrapLimit = chain.length - 1;\n status = \"idle\";\n }\n\n let element = inner;\n for (let i = wrapLimit; i >= 0; i--) {\n const layout = chain[i].layout;\n if (!layout) continue;\n element = layout(element, contexts[i]);\n if (element._key === undefined) element._key = `${chainIds[i]}:layout`;\n }\n\n return { element, status };\n}\n\nfunction nearestBlockIndex(\n chain: BuildTreeInput[\"match\"][\"route\"][\"chain\"],\n fromIndex: number,\n predicate: (\n route: BuildTreeInput[\"match\"][\"route\"][\"chain\"][number],\n ) => boolean,\n): number {\n for (let i = fromIndex; i >= 0; i--) {\n if (predicate(chain[i])) return i;\n }\n return -1;\n}\n\n/** Wraps a bare not-found block with the root layouts of a match-less render. */\nexport function buildNotFoundTree(block: NotFoundBlock): BuiltTree {\n const element = block();\n if (element._key === undefined) element._key = \"app:notfound\";\n return { element, status: \"notfound\" };\n}\n","import {\n type DomphyElement,\n Notifier,\n RecordState,\n type State,\n toState,\n} from \"@domphy/core\";\nimport { DataCache } from \"./dataCache.js\";\nimport { createBrowserHistory, type HistoryAdapter } from \"./history.js\";\nimport {\n type CompiledRoute,\n compileRoutes,\n matchRoute,\n type RouteMatch,\n} from \"./matcher.js\";\nimport {\n applyHeadTags,\n metadataToHeadTags,\n type ResolvedMetadata,\n resolveMetadata,\n} from \"./metadata.js\";\nimport { isRewrite, NotFoundSignal, RedirectSignal } from \"./navigation.js\";\nimport {\n buildNotFoundTree,\n buildTree,\n defaultErrorBlock,\n defaultNotFoundBlock,\n type SegmentResult,\n} from \"./tree.js\";\nimport type {\n ErrorBlock,\n LoaderContext,\n Middleware,\n NavigateOptions,\n NotFoundBlock,\n Route,\n RouterEventName,\n RouterStateRecord,\n} from \"./types.js\";\n\nexport interface RouterOptions {\n /** Defaults to the browser history in a DOM environment, otherwise none (SSR). */\n history?: HistoryAdapter | null;\n /** Global middleware, the equivalent of `middleware.ts`. */\n middleware?: Middleware[];\n /** App-level not-found block, the equivalent of the root `not-found.tsx`. */\n notFound?: NotFoundBlock;\n /** App-level error block, the equivalent of `global-error.tsx`. */\n error?: ErrorBlock;\n /** Request headers, forwarded to loaders and middleware during server rendering. */\n headers?: Headers;\n}\n\ninterface TransitionOptions {\n replace?: boolean;\n scroll?: boolean;\n fromHistory?: boolean;\n initial?: boolean;\n}\n\nlet defaultRouter: AppRouter | null = null;\n\n/** The most recently created router, used by `navLink` when no router is passed explicitly. */\nexport function getRouter(): AppRouter {\n if (!defaultRouter) {\n throw new Error(\n \"No router created yet. Call createApp() or new AppRouter() first.\",\n );\n }\n return defaultRouter;\n}\n\nexport class AppRouter {\n readonly routes: CompiledRoute[];\n readonly state: RecordState<RouterStateRecord>;\n readonly tree: State<DomphyElement>;\n readonly events = new Notifier();\n readonly cache = new DataCache();\n\n private history: HistoryAdapter | null;\n private middleware: Middleware[];\n private notFoundBlock: NotFoundBlock;\n private errorBlock: ErrorBlock;\n private headers?: Headers;\n private navigationToken = 0;\n private releaseHistory: (() => void) | null = null;\n private currentMatch: RouteMatch | null = null;\n /** Metadata resolved for the current route, exposed for server rendering. */\n metadata: ResolvedMetadata = {};\n /** The last redirect followed during a transition, exposed for server rendering. */\n lastRedirect: { to: string; permanent: boolean } | null = null;\n /** Loader data of the latest render keyed by cache key, used for SSR payloads. */\n lastData: Record<string, unknown> = {};\n\n constructor(routes: Route[], options: RouterOptions = {}) {\n this.routes = compileRoutes(routes);\n this.middleware = options.middleware ?? [];\n this.notFoundBlock = options.notFound ?? defaultNotFoundBlock;\n this.errorBlock = options.error ?? ((error) => defaultErrorBlock(error));\n this.headers = options.headers;\n this.history =\n options.history !== undefined\n ? options.history\n : typeof window !== \"undefined\"\n ? createBrowserHistory()\n : null;\n\n this.state = new RecordState<RouterStateRecord>({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n params: {},\n status: \"idle\",\n error: null,\n });\n this.tree = toState<DomphyElement>({ div: \"\" });\n defaultRouter = this;\n }\n\n /** Renders the current URL and starts listening to history navigation. */\n async start(): Promise<void> {\n if (this.history && !this.releaseHistory) {\n this.releaseHistory = this.history.listen((url) => {\n void this.transition(url, { fromHistory: true });\n });\n }\n const url = this.history\n ? this.history.url()\n : new URL(\"/\", \"http://localhost\");\n await this.transition(url, { initial: true });\n }\n\n destroy(): void {\n this.releaseHistory?.();\n this.releaseHistory = null;\n if (defaultRouter === this) defaultRouter = null;\n }\n\n currentUrl(): URL {\n if (this.history) return this.history.url();\n const search = this.state.get(\"search\");\n return new URL(\n `${this.state.get(\"pathname\")}${search}`,\n \"http://localhost\",\n );\n }\n\n resolve(href: string): URL {\n return new URL(href, this.currentUrl());\n }\n\n async navigate(href: string, options: NavigateOptions = {}): Promise<void> {\n const url = this.resolve(href);\n if (\n typeof window !== \"undefined\" &&\n url.origin !== this.currentUrl().origin\n ) {\n window.location.assign(url.href);\n return;\n }\n await this.transition(url, options);\n }\n\n push(\n href: string,\n options: Omit<NavigateOptions, \"replace\"> = {},\n ): Promise<void> {\n return this.navigate(href, options);\n }\n\n replace(\n href: string,\n options: Omit<NavigateOptions, \"replace\"> = {},\n ): Promise<void> {\n return this.navigate(href, { ...options, replace: true });\n }\n\n back(): void {\n this.history?.go(-1);\n }\n\n forward(): void {\n this.history?.go(1);\n }\n\n /** Clears the loader cache and re-renders the current URL, like `router.refresh()`. */\n async refresh(): Promise<void> {\n this.cache.invalidate();\n await this.transition(this.currentUrl(), { replace: true, scroll: false });\n }\n\n /** Runs the loaders of a route ahead of navigation, like `router.prefetch()`. */\n async prefetch(href: string): Promise<void> {\n try {\n const url = this.resolve(href);\n const match = matchRoute(this.routes, url.pathname);\n if (!match) return;\n const context = this.loaderContext(url, match);\n await Promise.all(\n match.route.chain.map((route, index) => {\n if (!route.loader) return Promise.resolve();\n const key = this.cacheKey(match.route.chainIds[index], url);\n return this.cache.prefetch(\n key,\n route.loader,\n context,\n route.revalidate,\n );\n }),\n );\n } catch {\n // Prefetch failures are silent; the real navigation reports errors.\n }\n }\n\n searchParams(\n listener?: Parameters<RecordState<RouterStateRecord>[\"get\"]>[1],\n ): URLSearchParams {\n return new URLSearchParams(this.state.get(\"search\", listener) as string);\n }\n\n addEventListener(\n event: RouterEventName,\n callback: (...args: unknown[]) => void,\n ): () => void {\n return this.events.addListener(event, callback);\n }\n\n /** The match rendered by the latest completed transition, null when no route matched. */\n getMatch(): RouteMatch | null {\n return this.currentMatch;\n }\n\n private cacheKey(segmentId: string, url: URL): string {\n return `${segmentId}|${url.pathname}${url.search}`;\n }\n\n private loaderContext(url: URL, match: RouteMatch): LoaderContext {\n return {\n pathname: match.pathname,\n url: url.pathname + url.search,\n params: match.params,\n searchParams: url.searchParams,\n headers: this.headers,\n };\n }\n\n /** Core navigation pipeline: middleware -> match -> loaders -> tree -> history/scroll. */\n async transition(url: URL, options: TransitionOptions = {}): Promise<void> {\n const token = ++this.navigationToken;\n const href = url.pathname + url.search + url.hash;\n if (!options.fromHistory) this.lastRedirect = null;\n this.events.notify(\"routeChangeStart\", href);\n this.saveScroll();\n\n try {\n let renderPathname = url.pathname;\n const middlewareContext = {\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n headers: this.headers,\n };\n for (const middleware of this.middleware) {\n const result = await middleware(middlewareContext);\n if (isRewrite(result)) renderPathname = result.__domphyRewrite;\n }\n if (token !== this.navigationToken) return;\n\n const match = matchRoute(this.routes, renderPathname);\n\n if (match) {\n const leaf = match.route.chain[match.route.chain.length - 1];\n if (leaf.redirect) {\n throw new RedirectSignal(leaf.redirect, leaf.permanent ?? false);\n }\n for (const route of match.route.chain) {\n for (const middleware of route.middleware ?? []) {\n const result = await middleware(middlewareContext);\n if (isRewrite(result)) {\n await this.transition(\n new URL(result.__domphyRewrite, url),\n options,\n );\n return;\n }\n }\n }\n if (token !== this.navigationToken) return;\n await this.renderMatch(url, match, token, options);\n } else {\n await this.renderNotFound(url, token, options);\n }\n } catch (error) {\n if (token !== this.navigationToken) return;\n if (error instanceof RedirectSignal) {\n await this.transition(this.resolve(error.to), {\n ...options,\n replace: true,\n });\n // Set after the inner transition so its entry reset does not erase this.\n this.lastRedirect = { to: error.to, permanent: error.permanent };\n return;\n }\n if (error instanceof NotFoundSignal) {\n await this.renderNotFound(url, token, options);\n return;\n }\n const failure = error instanceof Error ? error : new Error(String(error));\n this.tree.set(this.errorBlock(failure, () => void this.refresh()));\n this.state.set(\"status\", \"error\");\n this.state.set(\"error\", failure);\n this.events.notify(\"routeChangeError\", failure, href);\n return;\n }\n\n if (token === this.navigationToken) {\n this.events.notify(\"routeChangeComplete\", href);\n }\n }\n\n private async renderMatch(\n url: URL,\n match: RouteMatch,\n token: number,\n options: TransitionOptions,\n ): Promise<void> {\n const { chain, chainIds } = match.route;\n const context = this.loaderContext(url, match);\n const results: SegmentResult[] = chain.map(() => ({ status: \"pending\" }));\n let redirectSignal: RedirectSignal | null = null;\n\n const promises = chain.map((route, index) => {\n if (!route.loader) {\n results[index] = { status: \"success\", data: undefined };\n return Promise.resolve();\n }\n const key = this.cacheKey(chainIds[index], url);\n return this.cache.load(key, route.loader, context, route.revalidate).then(\n (data) => {\n results[index] = { status: \"success\", data };\n },\n (error) => {\n if (error instanceof RedirectSignal) {\n redirectSignal = redirectSignal ?? error;\n } else if (error instanceof NotFoundSignal) {\n results[index] = { status: \"notfound\" };\n } else {\n results[index] = {\n status: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n );\n });\n\n let settled = false;\n const allSettled = Promise.all(promises).then(() => {\n settled = true;\n });\n\n // Give already-resolved (cached) loaders a chance to finish before showing loading UI.\n await new Promise((resolve) => setTimeout(resolve, 0));\n if (!settled && chain.some((route) => route.loading)) {\n const interim = buildTree({\n match,\n baseContext: this.baseContext(url, match),\n results: results.map((result) => ({ ...result })),\n retry: () => void this.refresh(),\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n });\n if (token === this.navigationToken && interim.status === \"loading\") {\n this.state.set(\"status\", \"loading\");\n this.tree.set(interim.element);\n }\n }\n\n await allSettled;\n if (token !== this.navigationToken) return;\n if (redirectSignal) throw redirectSignal;\n\n const built = buildTree({\n match,\n baseContext: this.baseContext(url, match),\n results,\n retry: () => void this.refresh(),\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n });\n\n const dataRecord: Record<string, unknown> = {};\n chain.forEach((route, index) => {\n if (route.loader && results[index].status === \"success\") {\n dataRecord[this.cacheKey(chainIds[index], url)] = results[index].data;\n }\n });\n this.lastData = dataRecord;\n\n this.currentMatch = match;\n await this.applyMetadata(match, context);\n if (token !== this.navigationToken) return;\n\n this.commit(url, match, built.element, built.status, options);\n }\n\n private async renderNotFound(\n url: URL,\n token: number,\n options: TransitionOptions,\n ): Promise<void> {\n const built = buildNotFoundTree(this.notFoundBlock);\n this.currentMatch = null;\n this.metadata = {};\n applyHeadTags([]);\n if (token !== this.navigationToken) return;\n this.commit(url, null, built.element, \"notfound\", options);\n }\n\n private baseContext(url: URL, match: RouteMatch) {\n return {\n pathname: match.pathname,\n url: url.pathname + url.search,\n params: match.params,\n searchParams: url.searchParams,\n hash: url.hash,\n headers: this.headers,\n };\n }\n\n private async applyMetadata(\n match: RouteMatch,\n context: LoaderContext,\n ): Promise<void> {\n try {\n this.metadata = await resolveMetadata(\n match.route.chain.map((route) => route.metadata),\n context,\n );\n } catch {\n this.metadata = {};\n }\n applyHeadTags(metadataToHeadTags(this.metadata));\n }\n\n private commit(\n url: URL,\n match: RouteMatch | null,\n element: DomphyElement,\n status: RouterStateRecord[\"status\"],\n options: TransitionOptions,\n ): void {\n if (this.history && !options.fromHistory && !options.initial) {\n const href = url.pathname + url.search + url.hash;\n if (options.replace) {\n this.history.replace(href);\n } else {\n this.history.push(href);\n }\n }\n\n this.state.set(\"pathname\", url.pathname);\n this.state.set(\"search\", url.search);\n this.state.set(\"hash\", url.hash);\n this.state.set(\"params\", match?.params ?? {});\n this.state.set(\"error\", null);\n this.state.set(\"status\", status);\n this.tree.set(element);\n\n this.restoreScroll(url, options);\n }\n\n private saveScroll(): void {\n if (typeof window === \"undefined\") return;\n this.history?.saveScroll?.({ x: window.scrollX, y: window.scrollY });\n }\n\n private restoreScroll(url: URL, options: TransitionOptions): void {\n if (\n typeof window === \"undefined\" ||\n options.scroll === false ||\n options.initial\n )\n return;\n if (options.fromHistory) {\n const position = this.history?.readScroll?.();\n window.scrollTo(position?.x ?? 0, position?.y ?? 0);\n return;\n }\n if (url.hash) {\n const target = document.getElementById(url.hash.slice(1));\n if (target) {\n target.scrollIntoView();\n return;\n }\n }\n window.scrollTo(0, 0);\n }\n}\n","import { type DomphyElement, ElementNode } from \"@domphy/core\";\nimport type { HistoryAdapter } from \"./history.js\";\nimport { metadataToHeadTags, renderHeadTags } from \"./metadata.js\";\nimport { AppRouter, type RouterOptions } from \"./router.js\";\nimport type { Route } from \"./types.js\";\n\nexport interface AppOptions extends Omit<RouterOptions, \"history\" | \"headers\"> {\n history?: HistoryAdapter | null;\n}\n\nexport interface RenderToStringOptions {\n headers?: Headers;\n}\n\nexport interface SSRResult {\n /** Body markup of the app root, ready to place inside the mount element. */\n html: string;\n /** Scoped CSS of the rendered tree, place inside `<style id=\"domphy-style\">`. */\n css: string;\n /** Serialized `<title>`, `<meta>` and `<link>` tags for the document head. */\n head: string;\n /** 200, 404, or the redirect status. */\n status: number;\n /** Set when a loader or middleware redirected. */\n redirect?: string;\n /** Loader data to embed for hydration, see `bootstrapScript`. */\n data: Record<string, unknown>;\n /** Inline script that exposes loader data to `hydrate()` on the client. */\n bootstrapScript: string;\n}\n\nconst HYDRATION_GLOBAL = \"__DOMPHY_APP_DATA__\";\n\n/**\n * The app shell: routing, rendering and server rendering in one object, the\n * Domphy equivalent of a Next.js application instance.\n */\nexport class DomphyApp {\n readonly routes: Route[];\n readonly options: AppOptions;\n readonly router: AppRouter;\n private node: ElementNode | null = null;\n\n constructor(routes: Route[], options: AppOptions = {}) {\n this.routes = routes;\n this.options = options;\n this.router = new AppRouter(routes, options);\n }\n\n /** The root element; the whole route tree re-renders through one reactive child. */\n element(): DomphyElement {\n const router = this.router;\n return {\n div: (listener) => [router.tree.get(listener)],\n style: { display: \"contents\" },\n };\n }\n\n /** Client-side render from scratch. */\n async render(target: HTMLElement): Promise<ElementNode> {\n await this.router.start();\n this.node = new ElementNode(this.element());\n this.node.render(target);\n return this.node;\n }\n\n /**\n * Hydrates server-rendered markup. Reads the loader data embedded by\n * `bootstrapScript` so loaders are not re-run and the tree matches the HTML.\n */\n async hydrate(\n target: HTMLElement,\n style?: HTMLStyleElement,\n ): Promise<ElementNode> {\n const seeded = (globalThis as Record<string, unknown>)[HYDRATION_GLOBAL];\n if (seeded && typeof seeded === \"object\") {\n this.router.cache.seed(seeded as Record<string, unknown>);\n }\n await this.router.start();\n this.node = new ElementNode(this.element());\n this.node.mount(target, style);\n return this.node;\n }\n\n destroy(): void {\n this.node?.remove();\n this.node = null;\n this.router.destroy();\n }\n\n /** Server rendering: runs middleware and loaders for `url`, returns markup + CSS + head. */\n async renderToString(\n url: string | URL,\n options: RenderToStringOptions = {},\n ): Promise<SSRResult> {\n const requestUrl =\n typeof url === \"string\" ? new URL(url, \"http://localhost\") : url;\n const serverRouter = new AppRouter(this.routes, {\n ...this.options,\n history: null,\n headers: options.headers,\n });\n\n await serverRouter.transition(requestUrl, { initial: true });\n\n const status = serverRouter.state.get(\"status\");\n const redirect = serverRouter.lastRedirect;\n const node = new ElementNode({\n div: [serverRouter.tree.get()],\n style: { display: \"contents\" },\n });\n\n const data = serverRouter.lastData;\n\n const result: SSRResult = {\n html: node.generateHTML(),\n css: node.generateCSS(),\n head: renderHeadTags(metadataToHeadTags(serverRouter.metadata)),\n status: redirect\n ? redirect.permanent\n ? 308\n : 307\n : status === \"notfound\"\n ? 404\n : 200,\n redirect: redirect?.to,\n data,\n bootstrapScript: `<script>window.${HYDRATION_GLOBAL} = ${serializeData(data)};</script>`,\n };\n serverRouter.destroy();\n return result;\n }\n}\n\n/** JSON with `</script>`-safe escaping so the payload can be inlined. */\nfunction serializeData(data: Record<string, unknown>): string {\n return JSON.stringify(data).replace(/</g, \"\\\\u003c\");\n}\n\nexport function createApp(routes: Route[], options: AppOptions = {}): DomphyApp {\n return new DomphyApp(routes, options);\n}\n","import type { PartialElement } from \"@domphy/core\";\n\nexport interface ImageLoaderInput {\n src: string;\n width: number;\n quality: number;\n}\n\nexport type ImageLoader = (input: ImageLoaderInput) => string;\n\nexport interface OptimizedImageProps {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n /** Stretch over the positioned parent, like the `fill` prop of `next/image`. */\n fill?: boolean;\n sizes?: string;\n quality?: number;\n /** Load eagerly with high fetch priority — use for the LCP image. */\n priority?: boolean;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n /** Maps `src` + width to an optimized URL; enables `srcset` generation. */\n loader?: ImageLoader;\n deviceSizes?: number[];\n}\n\nconst DEFAULT_DEVICE_SIZES = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\n\n/**\n * Patch for `img` elements, the equivalent of `next/image`: lazy loading,\n * async decoding, fetch priority, `srcset` through a custom loader, fill\n * layout and blur placeholders. URL optimization itself is the loader's job —\n * point it at any image CDN.\n */\nexport function optimizedImage(props: OptimizedImageProps): PartialElement<\"img\"> {\n const {\n src,\n alt = \"\",\n width,\n height,\n fill = false,\n sizes,\n quality = 75,\n priority = false,\n placeholder = \"empty\",\n blurDataURL,\n loader,\n deviceSizes = DEFAULT_DEVICE_SIZES,\n } = props;\n\n const part: PartialElement<\"img\"> = {\n src: loader\n ? loader({\n src,\n width: width ?? deviceSizes[deviceSizes.length - 1],\n quality,\n })\n : src,\n alt,\n loading: priority ? \"eager\" : \"lazy\",\n decoding: \"async\",\n fetchPriority: priority ? \"high\" : \"auto\",\n style: {},\n };\n\n if (loader) {\n part.srcSet = deviceSizes\n .map((size) => `${loader({ src, width: size, quality })} ${size}w`)\n .join(\", \");\n if (sizes) part.sizes = sizes;\n }\n\n if (width !== undefined) part.width = width;\n if (height !== undefined) part.height = height;\n\n if (fill) {\n part.style = {\n ...part.style,\n position: \"absolute\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n };\n }\n\n if (placeholder === \"blur\" && blurDataURL) {\n part.style = {\n ...part.style,\n backgroundImage: `url(\"${blurDataURL}\")`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n };\n part.onLoad = (event) => {\n const image = event.target as HTMLImageElement;\n image.style.backgroundImage = \"\";\n };\n }\n\n return part;\n}\n","import type { PartialElement } from \"@domphy/core\";\nimport { type AppRouter, getRouter } from \"./router.js\";\n\nexport interface NavLinkProps {\n href: string;\n /** Replace the current history entry instead of pushing. */\n replace?: boolean;\n /** Scroll after navigation, defaults to true. */\n scroll?: boolean;\n /**\n * Prefetch strategy, like the `prefetch` prop of `next/link`:\n * `\"visible\"` when the link enters the viewport, `\"hover\"` on pointer/focus,\n * `false` never. Defaults to `\"hover\"`.\n */\n prefetch?: \"visible\" | \"hover\" | false;\n /** Mark active only on an exact pathname match, not on descendants. */\n exact?: boolean;\n /** Explicit router; defaults to the app router. */\n router?: AppRouter;\n}\n\nfunction isModifiedClick(event: MouseEvent): boolean {\n return (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n );\n}\n\n/**\n * Patch for `a` elements, the equivalent of `next/link`: client-side\n * navigation, prefetching and active state (`aria-current` + `data-active`).\n */\nexport function navLink(props: NavLinkProps): PartialElement<\"a\"> {\n const {\n href,\n replace = false,\n scroll = true,\n prefetch = \"hover\",\n exact = false,\n } = props;\n const router = () => props.router ?? getRouter();\n\n const isActive = (pathname: string): boolean => {\n const target = new URL(href, \"http://localhost\").pathname;\n if (exact || target === \"/\") return pathname === target;\n return pathname === target || pathname.startsWith(`${target}/`);\n };\n\n let prefetched = false;\n const prefetchOnce = () => {\n if (prefetched) return;\n prefetched = true;\n void router().prefetch(href);\n };\n\n return {\n href,\n ariaCurrent: (listener) =>\n isActive(router().state.get(\"pathname\", listener) as string)\n ? \"page\"\n : null,\n dataActive: (listener) =>\n isActive(router().state.get(\"pathname\", listener) as string) ? \"\" : null,\n onClick: (event) => {\n const mouseEvent = event as MouseEvent;\n const anchor = mouseEvent.currentTarget as HTMLAnchorElement;\n if (isModifiedClick(mouseEvent)) return;\n if (anchor.target && anchor.target !== \"_self\") return;\n if (anchor.hasAttribute(\"download\")) return;\n if (\n new URL(anchor.href, window.location.href).origin !==\n window.location.origin\n )\n return;\n mouseEvent.preventDefault();\n void router().navigate(href, { replace, scroll });\n },\n onMouseEnter: () => {\n if (prefetch === \"hover\") prefetchOnce();\n },\n onFocus: () => {\n if (prefetch === \"hover\") prefetchOnce();\n },\n _onMount: (node) => {\n if (prefetch !== \"visible\") return;\n if (typeof IntersectionObserver === \"undefined\") {\n prefetchOnce();\n return;\n }\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n prefetchOnce();\n observer.disconnect();\n }\n });\n observer.observe(node.domElement as Element);\n node.setMetadata(\"navLinkObserver\", observer);\n },\n _onRemove: (node) => {\n const observer = node.getMetadata(\"navLinkObserver\") as\n | IntersectionObserver\n | undefined;\n observer?.disconnect();\n },\n };\n}\n","import type { DomphyElement } from \"@domphy/core\";\n\nexport interface ScriptProps {\n src: string;\n /**\n * Loading strategy, like `next/script`:\n * `\"afterInteractive\"` loads as soon as the element mounts (default),\n * `\"lazyOnload\"` waits for the window `load` event plus idle time.\n */\n strategy?: \"afterInteractive\" | \"lazyOnload\";\n id?: string;\n async?: boolean;\n onLoad?: () => void;\n onError?: () => void;\n}\n\nconst loadedScripts = new Set<string>();\n\n/** Resets script dedupe between tests. */\nexport function resetScripts(): void {\n loadedScripts.clear();\n}\n\nfunction whenIdle(callback: () => void): void {\n const idle = (\n globalThis as { requestIdleCallback?: (cb: () => void) => void }\n ).requestIdleCallback;\n if (idle) {\n idle(callback);\n } else {\n setTimeout(callback, 0);\n }\n}\n\n/**\n * Block that loads an external script once, the equivalent of `next/script`.\n * Place it anywhere in the tree; duplicate sources are loaded only once.\n */\nexport function script(props: ScriptProps): DomphyElement<\"script\"> {\n const {\n src,\n strategy = \"afterInteractive\",\n id,\n async = true,\n onLoad,\n onError,\n } = props;\n const dedupeKey = id ?? src;\n\n const start = (element: HTMLScriptElement) => {\n if (loadedScripts.has(dedupeKey)) return;\n loadedScripts.add(dedupeKey);\n element.src = src;\n };\n\n const part: DomphyElement<\"script\"> = {\n script: \"\",\n async,\n onLoad: () => onLoad?.(),\n onError: () => onError?.(),\n _onMount: (node) => {\n const element = node.domElement as HTMLScriptElement;\n if (strategy === \"afterInteractive\") {\n start(element);\n return;\n }\n if (document.readyState === \"complete\") {\n whenIdle(() => start(element));\n } else {\n window.addEventListener(\"load\", () => whenIdle(() => start(element)), {\n once: true,\n });\n }\n },\n };\n if (id !== undefined) part.id = id;\n return part;\n}\n","import type { DomphyElement } from \"@domphy/core\";\nimport type { Metadata } from \"./metadata.js\";\n\n/** Route params. Dynamic segments map to strings, catch-all segments to string arrays. */\nexport type Params = Record<string, string | string[]>;\n\n/** Shared context given to pages, layouts, loaders, metadata functions and middleware. */\nexport interface RouteContext<TData = unknown> {\n /** Pathname actually rendered (after middleware rewrites). */\n pathname: string;\n /** Pathname shown in the address bar (before rewrites). */\n url: string;\n params: Params;\n searchParams: URLSearchParams;\n hash: string;\n /** Resolved loader data of the owning segment. */\n data: TData;\n /** Resolved loader data of every matched segment, keyed by segment id. */\n segmentData: Record<string, unknown>;\n /** Request headers, only present during server rendering. */\n headers?: Headers;\n}\n\nexport type PageBlock<TData = unknown> = (\n context: RouteContext<TData>,\n) => DomphyElement;\n\nexport type LayoutBlock<TData = unknown> = (\n children: DomphyElement,\n context: RouteContext<TData>,\n) => DomphyElement;\n\nexport type LoadingBlock = (context: RouteContext) => DomphyElement;\n\nexport type ErrorBlock = (error: Error, retry: () => void) => DomphyElement;\n\nexport type NotFoundBlock = () => DomphyElement;\n\nexport interface LoaderContext {\n pathname: string;\n url: string;\n params: Params;\n searchParams: URLSearchParams;\n headers?: Headers;\n}\n\nexport type Loader<TData = unknown> = (\n context: LoaderContext,\n) => TData | Promise<TData>;\n\nexport type MetadataValue =\n | Metadata\n | ((context: LoaderContext) => Metadata | Promise<Metadata>);\n\nexport interface MiddlewareContext {\n url: URL;\n pathname: string;\n searchParams: URLSearchParams;\n headers?: Headers;\n}\n\n/** A rewrite instruction returned from middleware. Create with `rewrite()`. */\nexport interface RewriteResult {\n __domphyRewrite: string;\n}\n\n/**\n * Middleware runs before every navigation and server render.\n * Return `rewrite(path)` to render another route under the same URL,\n * call `redirect(path)` / `notFound()` to interrupt, or return nothing to continue.\n */\nexport type Middleware = (\n context: MiddlewareContext,\n) =>\n | RewriteResult\n | undefined\n | void\n | Promise<RewriteResult | undefined | void>;\n\n/**\n * One route segment, the equivalent of one folder in the Next.js `app` directory.\n *\n * `path` uses Next.js conventions:\n * - `\"about\"` static segment (may contain several parts: `\"docs/getting-started\"`)\n * - `\"[slug]\"` dynamic segment\n * - `\"[...slug]\"` catch-all segment\n * - `\"[[...slug]]\"` optional catch-all segment\n * - `\"(marketing)\"` route group, organizes the tree without affecting the URL\n *\n * A segment is routable when it declares `page` or `redirect`.\n */\nexport interface Route {\n path: string;\n page?: PageBlock<any>;\n layout?: LayoutBlock<any>;\n loading?: LoadingBlock;\n error?: ErrorBlock;\n notFound?: NotFoundBlock;\n metadata?: MetadataValue;\n loader?: Loader<any>;\n /**\n * Loader cache lifetime in seconds, the equivalent of Next.js `revalidate`.\n * `undefined` re-runs the loader on every navigation, `Infinity` caches forever.\n */\n revalidate?: number;\n middleware?: Middleware[];\n /** Static redirect: navigating to this route immediately redirects to the target. */\n redirect?: string;\n /** Use a 308 redirect on the server when `redirect` is set. */\n permanent?: boolean;\n children?: Route[];\n}\n\nexport type RouterStatus = \"idle\" | \"loading\" | \"error\" | \"notfound\";\n\nexport interface RouterStateRecord {\n pathname: string;\n search: string;\n hash: string;\n params: Params;\n status: RouterStatus;\n error: Error | null;\n\n [key: string]: unknown;\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n /** Scroll to the top (or the URL hash) after navigation. Defaults to true. */\n scroll?: boolean;\n}\n\nexport type RouterEventName =\n | \"routeChangeStart\"\n | \"routeChangeComplete\"\n | \"routeChangeError\";\n\n/** Identity helper that keeps route literals fully typed. */\nexport function defineRoutes(routes: Route[]): Route[] {\n return routes;\n}\n"],"mappings":"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A,gBACA,gBACA,gBACA,cACA,kBACA,iBACA,iBACA,gBACA,eACA,sBACA,uBACA,qBACA,sBACA,mBACA,kBACA,oBACA,mBACA,iBACA,uBACA,qBACA,oBACA,YACA,YACF,EAEaC,GAAeD,GAAgB,OAAO,CAACE,EAAKC,IAAO,CAC9D,IAAMC,EAAMD,EAAG,MAAM,CAAC,EAAE,YAAY,EACpC,OAAAD,EAAIE,CAAG,EAAID,EACJD,CACT,EAAG,CAAC,CAAiF,ECvGxEG,GAAW,CACtB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,OACA,aACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,MACA,MACA,MACA,OACA,OACA,SACA,OACA,QACA,KACA,UACA,gBACA,mBACA,SACA,WACA,SACA,OACA,OACA,UACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,eACA,SACA,gBACA,IACA,QACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,UACA,UACA,WACA,WACA,iBACA,OACA,MACA,aACA,OACA,MACA,SACA,SACA,SACA,OACA,WACA,QACA,MACA,MACF,ECvKIC,EAAuB,CAAC,EAQtBC,GACJ,OAAO,gBA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","names":["global_exports","__export","src_exports","src_exports","__export","AppRouter","DataCache","DomphyApp","NotFoundSignal","PREFETCH_LIFETIME","RedirectSignal","applyHeadTags","buildHref","buildNotFoundTree","buildTree","compareSpecificity","compileRoutes","createApiHandler","createApp","createBrowserHistory","createMemoryHistory","defaultErrorBlock","defaultNotFoundBlock","defineRoutes","getRouter","isRewrite","json","matchPath","matchRoute","metadataToHeadTags","navLink","notFound","optimizedImage","parseSegment","permanentRedirect","redirect","renderHeadTags","resetScripts","resolveMetadata","rewrite","script","splitPath","parseSegment","part","splitPath","path","compileRoutes","routes","compiled","walk","nodes","parentSegments","parentChain","parentChainIds","parentId","node","parts","ownSegments","urlSegments","segment","id","chain","chainIds","compareSpecificity","KIND_RANK","a","b","length","i","segmentA","segmentB","rankDifference","matchPath","segments","pathname","params","partIndex","isLast","matchRoute","route","buildHref","pattern","value","RedirectSignal","to","permanent","NotFoundSignal","redirect","permanentRedirect","notFound","rewrite","isRewrite","value","METHODS","json","data","init","headers","__spreadProps","__spreadValues","createApiHandler","routes","pairs","apiRoute","compiled","compileRoutes","pair","byNode","request","__async","url","match","matchRoute","route","allowed","method","handler","response","error","RedirectSignal","NotFoundSignal","EventProperties","eventNameMap","acc","ev","key","HtmlTags","_chain","_microtask","cb","e","SELF_NOTIFY_CAP","Notifier","event","listener","release","listeners","args","top","inflight","idx","n","names","pending","chain","State","initialValue","name","newValue","merge","source","target","comma","space","adjacent","deepClone","value","old","val1","val2","addEvent","addHook","hashString","str","hash","i","toState","val","addHook","partial","hookName","handler","hookProperty","current","args","addEvent","attributes","eventName","eventProperty","eventNameMap","event","node","deepClone","value","seen","proto","clone","v","k","key","validate","element","asPartial","keys","i","val","HtmlTags","isHTML","str","escapeHTML","getTagName","e","camelToKebab","selectorSplitter","selectors","splitted","parens","angulars","soFar","len","char","normalizeSelectorKey","selectorText","text","collectCSSRules","rules","map","rule","ensureDomStyle","styleParent","_a","domStyle","mergePartial","part","p","merge","VoidTags","SvgTags","BooleanAttributes","PrefixCSS","CamelAttributes","ElementAttribute","name","parent","Notifier","domElement","mutateAttrs","_b","prev","release","listener","callback","AttributeList","attr","force","className","add","classes","newClass","list","updated","cls","oldClass","TextNode","textContent","newNode","tpl","domText","ElementList","ElementNode","index","dom","el","currentRef","aNode","bNode","a","b","aNext","bNext","inputs","updateDom","silent","_c","_d","oldItems","keyed","item","oldSet","claimed","input","isObj","tag","reused","cur","isPortal","at","extras","length","finalIndex","domNode","ref","root","child","done","doneCalled","onceDone","snapshot","aIndex","bIndex","itemA","itemB","fromIndex","toIndex","html","StyleProperty","parentRule","domRule","style","prefix","StyleRule","_StyleRule","StyleList","prop","styleStr","decl","nested","sheet","domSheet","css","err","obj","parentSelector","basic","getSelector","selector","splitKeys","currentSelector","newSelector","domRuleMap","domRuleList","wrongCount","fixOddEven","_ElementNode","domphyElement","_parent","tempPath","hashString","children","fn","n","originalKey","rawElement","content","next","autoClass","reserved","hookKeys","keep","userClass","composed","childNode","called","once","RecordState","record","__spreadValues","l","resolveMetadata","values","context","__async","resolved","template","value","metadata","key","entry","title","absoluteUrl","url","base","robotsContent","robots","directives","metadataToHeadTags","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","tags","meta","name","content","property","author","icons","openGraph","image","twitter","alternates","language","escapeAttribute","escapeText","renderHeadTags","tag","attributes","MANAGED_ATTRIBUTE","applyHeadTags","element","PREFETCH_LIFETIME","DataCache","record","key","keys","entry","prefix","loader","context","revalidate","__async","lifetime","fresh","usableSeed","pending","promise","data","error","existing","createBrowserHistory","_a","_b","_c","scrollPositions","index","url","delta","callback","handler","position","MEMORY_ORIGIN","createMemoryHistory","initial","stack","listeners","next","listener","defaultErrorBlock","error","defaultNotFoundBlock","findBoundary","results","status","result","buildTree","input","_a","match","baseContext","retry","defaultError","defaultNotFound","chain","chainIds","segmentData","i","contexts","_","__spreadProps","__spreadValues","errorIndex","notFoundIndex","pendingIndex","inner","wrapLimit","blockIndex","nearestBlockIndex","route","element","layout","fromIndex","predicate","buildNotFoundTree","block","defaultRouter","getRouter","AppRouter","routes","options","k","DataCache","_a","_b","_c","compileRoutes","defaultNotFoundBlock","error","defaultErrorBlock","createBrowserHistory","ie","_e","__async","url","search","href","_0","__spreadProps","__spreadValues","match","matchRoute","context","route","index","key","e","listener","event","callback","segmentId","token","renderPathname","middlewareContext","middleware","result","isRewrite","leaf","RedirectSignal","NotFoundSignal","failure","chain","chainIds","results","redirectSignal","promises","data","settled","allSettled","resolve","interim","buildTree","built","dataRecord","buildNotFoundTree","applyHeadTags","resolveMetadata","metadataToHeadTags","element","status","_d","position","target","HYDRATION_GLOBAL","DomphyApp","routes","options","AppRouter","router","listener","target","__async","m","style","seeded","_a","_0","url","requestUrl","serverRouter","__spreadProps","__spreadValues","status","redirect","node","data","result","renderHeadTags","metadataToHeadTags","serializeData","createApp","DEFAULT_DEVICE_SIZES","optimizedImage","props","src","alt","width","height","fill","sizes","quality","priority","placeholder","blurDataURL","loader","deviceSizes","part","size","__spreadProps","__spreadValues","event","image","isModifiedClick","event","navLink","props","href","replace","scroll","prefetch","exact","router","_a","getRouter","isActive","pathname","target","prefetched","prefetchOnce","listener","mouseEvent","anchor","node","observer","entries","entry","loadedScripts","resetScripts","whenIdle","callback","idle","script","props","src","strategy","id","async","onLoad","onError","dedupeKey","start","element","part","node","defineRoutes","routes"]}
1
+ {"version":3,"sources":["../src/global.ts","../src/index.ts","../src/matcher.ts","../src/navigation.ts","../src/api.ts","../../core/src/types/EventProperties.ts","../../core/src/constants/HtmlTags.ts","../../core/src/classes/Notifier.ts","../../core/src/classes/State.ts","../../core/src/utils.ts","../../core/src/helpers.ts","../../core/src/constants/VoidTags.ts","../../core/src/constants/SvgTags.ts","../../core/src/constants/BooleanAttributes.ts","../../core/src/constants/PrefixCSS.ts","../../core/src/constants/CamelAttributes.ts","../../core/src/classes/ElementAttribute.ts","../../core/src/classes/AttributeList.ts","../../core/src/classes/TextNode.ts","../../core/src/classes/ElementList.ts","../../core/src/classes/StyleProperty.ts","../../core/src/classes/StyleRule.ts","../../core/src/classes/StyleList.ts","../../core/src/classes/ElementNode.ts","../../core/src/classes/RecordState.ts","../src/metadata.ts","../src/dataCache.ts","../src/history.ts","../src/tree.ts","../src/router.ts","../src/app.ts","../src/image.ts","../src/link.ts","../src/script.ts","../src/types.ts"],"sourcesContent":["export * as app from \"./index.js\";\n","export * from \"./api.js\";\nexport * from \"./app.js\";\nexport * from \"./dataCache.js\";\nexport * from \"./history.js\";\nexport * from \"./image.js\";\nexport * from \"./link.js\";\nexport * from \"./matcher.js\";\nexport * from \"./metadata.js\";\nexport * from \"./navigation.js\";\nexport * from \"./router.js\";\nexport * from \"./script.js\";\nexport * from \"./tree.js\";\nexport * from \"./types.js\";\n","import type { Params, Route } from \"./types.js\";\n\nexport type SegmentKind =\n | \"static\"\n | \"dynamic\"\n | \"catchall\"\n | \"optional-catchall\"\n | \"group\";\n\nexport interface PatternSegment {\n kind: SegmentKind;\n /** Literal value for static segments, param name otherwise. */\n value: string;\n}\n\n/** One routable endpoint: the chain of route nodes from root to the segment that owns the page. */\nexport interface CompiledRoute {\n /** Stable id, the full pattern path including groups, e.g. \"/(shop)/products/[id]\". */\n id: string;\n /** URL pattern segments, groups excluded. */\n segments: PatternSegment[];\n /** Route nodes from root to leaf. */\n chain: Route[];\n /** Segment id for each chain node, used as data cache key and diff key. */\n chainIds: string[];\n}\n\nexport interface RouteMatch {\n route: CompiledRoute;\n params: Params;\n pathname: string;\n}\n\nexport function parseSegment(part: string): PatternSegment {\n if (part.startsWith(\"(\") && part.endsWith(\")\")) {\n return { kind: \"group\", value: part.slice(1, -1) };\n }\n if (part.startsWith(\"[[...\") && part.endsWith(\"]]\")) {\n return { kind: \"optional-catchall\", value: part.slice(5, -2) };\n }\n if (part.startsWith(\"[...\") && part.endsWith(\"]\")) {\n return { kind: \"catchall\", value: part.slice(4, -1) };\n }\n if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\n return { kind: \"dynamic\", value: part.slice(1, -1) };\n }\n return { kind: \"static\", value: part };\n}\n\nexport function splitPath(path: string): string[] {\n return path.split(\"/\").filter((part) => part.length > 0);\n}\n\n/** Number of URL parts a route path contributes (route groups don't count). */\nexport function urlPartCount(path: string): number {\n return splitPath(path)\n .map(parseSegment)\n .filter((segment) => segment.kind !== \"group\").length;\n}\n\n/** Matches `pathname` after dropping the first `prefixParts` URL parts (slot/intercept matching). */\nexport function matchRouteSuffix(\n compiled: CompiledRoute[],\n pathname: string,\n prefixParts: number,\n): RouteMatch | null {\n const suffix = `/${splitPath(pathname).slice(prefixParts).join(\"/\")}`;\n return matchRoute(compiled, suffix);\n}\n\n/** Flattens a route tree into a list of routable endpoints. */\nexport function compileRoutes(routes: Route[]): CompiledRoute[] {\n const compiled: CompiledRoute[] = [];\n\n function walk(\n nodes: Route[],\n parentSegments: PatternSegment[],\n parentChain: Route[],\n parentChainIds: string[],\n parentId: string,\n ): void {\n for (const node of nodes) {\n const parts = splitPath(node.path);\n const ownSegments = parts.map(parseSegment);\n const urlSegments = [\n ...parentSegments,\n ...ownSegments.filter((segment) => segment.kind !== \"group\"),\n ];\n const id = `${parentId}/${parts.join(\"/\")}`.replace(/\\/+/g, \"/\");\n const chain = [...parentChain, node];\n const chainIds = [...parentChainIds, id === \"\" ? \"/\" : id];\n\n if (node.page || node.redirect) {\n compiled.push({\n id: id === \"\" ? \"/\" : id,\n segments: urlSegments,\n chain,\n chainIds,\n });\n }\n if (node.children) {\n walk(node.children, urlSegments, chain, chainIds, id);\n }\n }\n }\n\n walk(routes, [], [], [], \"\");\n compiled.sort(compareSpecificity);\n return compiled;\n}\n\nconst KIND_RANK: Record<SegmentKind, number> = {\n static: 0,\n dynamic: 1,\n catchall: 2,\n \"optional-catchall\": 3,\n group: 0,\n};\n\n/** Static segments win over dynamic, dynamic over catch-all — same priority order as Next.js. */\nexport function compareSpecificity(a: CompiledRoute, b: CompiledRoute): number {\n const length = Math.max(a.segments.length, b.segments.length);\n for (let i = 0; i < length; i++) {\n const segmentA = a.segments[i];\n const segmentB = b.segments[i];\n if (!segmentA) return -1;\n if (!segmentB) return 1;\n const rankDifference = KIND_RANK[segmentA.kind] - KIND_RANK[segmentB.kind];\n if (rankDifference !== 0) return rankDifference;\n }\n return 0;\n}\n\nexport function matchPath(\n segments: PatternSegment[],\n pathname: string,\n): Params | null {\n const parts = splitPath(pathname).map((part) => decodeURIComponent(part));\n const params: Params = {};\n let partIndex = 0;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n\n if (segment.kind === \"static\") {\n if (parts[partIndex] !== segment.value) return null;\n partIndex++;\n continue;\n }\n if (segment.kind === \"dynamic\") {\n if (partIndex >= parts.length) return null;\n params[segment.value] = parts[partIndex];\n partIndex++;\n continue;\n }\n if (segment.kind === \"catchall\") {\n if (!isLast || partIndex >= parts.length) return null;\n params[segment.value] = parts.slice(partIndex);\n return params;\n }\n if (segment.kind === \"optional-catchall\") {\n if (!isLast) return null;\n params[segment.value] = parts.slice(partIndex);\n return params;\n }\n }\n\n if (partIndex !== parts.length) return null;\n return params;\n}\n\nexport function matchRoute(\n compiled: CompiledRoute[],\n pathname: string,\n): RouteMatch | null {\n for (const route of compiled) {\n const params = matchPath(route.segments, pathname);\n if (params) {\n return { route, params, pathname };\n }\n }\n return null;\n}\n\n/** Replaces pattern placeholders with params, the inverse of `matchPath`. */\nexport function buildHref(pattern: string, params: Params = {}): string {\n const parts = splitPath(pattern)\n .map(parseSegment)\n .filter((segment) => segment.kind !== \"group\")\n .flatMap((segment) => {\n if (segment.kind === \"static\") return [segment.value];\n const value = params[segment.value];\n if (value === undefined) {\n if (segment.kind === \"optional-catchall\") return [];\n throw new Error(\n `Missing param \"${segment.value}\" for pattern \"${pattern}\".`,\n );\n }\n const list = Array.isArray(value) ? value : [value];\n return list.map((part) => encodeURIComponent(part));\n });\n return `/${parts.join(\"/\")}`;\n}\n","import type { RewriteResult } from \"./types.js\";\n\n/**\n * Control-flow signals, the equivalents of `redirect()`, `permanentRedirect()` and\n * `notFound()` from `next/navigation`. They throw and are caught by the router\n * (or by `renderToString` on the server), so they can be called from loaders,\n * metadata functions and middleware.\n */\n\nexport class RedirectSignal extends Error {\n readonly to: string;\n readonly permanent: boolean;\n\n constructor(to: string, permanent: boolean) {\n super(`Redirect to ${to}`);\n this.name = \"RedirectSignal\";\n this.to = to;\n this.permanent = permanent;\n }\n}\n\nexport class NotFoundSignal extends Error {\n constructor() {\n super(\"Not found\");\n this.name = \"NotFoundSignal\";\n }\n}\n\nexport function redirect(to: string): never {\n throw new RedirectSignal(to, false);\n}\n\nexport function permanentRedirect(to: string): never {\n throw new RedirectSignal(to, true);\n}\n\nexport function notFound(): never {\n throw new NotFoundSignal();\n}\n\n/** Returned from middleware to render another route while keeping the URL. */\nexport function rewrite(to: string): RewriteResult {\n return { __domphyRewrite: to };\n}\n\nexport function isRewrite(value: unknown): value is RewriteResult {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as RewriteResult).__domphyRewrite === \"string\"\n );\n}\n","import { compileRoutes, matchRoute } from \"./matcher.js\";\nimport { NotFoundSignal, RedirectSignal } from \"./navigation.js\";\nimport type { Params, Route } from \"./types.js\";\n\n/**\n * API route handlers on web-standard Request/Response, the equivalent of\n * `route.ts` files. Works in Node 18+, Bun, Deno, and edge runtimes; adapt to\n * `http.createServer` with any Request/Response bridge.\n */\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"HEAD\"\n | \"OPTIONS\";\n\nexport interface ApiContext {\n params: Params;\n}\n\nexport type ApiMethodHandler = (\n request: Request,\n context: ApiContext,\n) => Response | Promise<Response>;\n\nexport interface ApiRoute {\n /** Same pattern syntax as page routes: `\"/api/users/[id]\"`. */\n path: string;\n GET?: ApiMethodHandler;\n POST?: ApiMethodHandler;\n PUT?: ApiMethodHandler;\n PATCH?: ApiMethodHandler;\n DELETE?: ApiMethodHandler;\n HEAD?: ApiMethodHandler;\n OPTIONS?: ApiMethodHandler;\n}\n\nconst METHODS: HttpMethod[] = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n];\n\n/** Shorthand for JSON responses, the equivalent of `NextResponse.json()`. */\nexport function json(data: unknown, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json; charset=utf-8\");\n }\n return new Response(JSON.stringify(data), { ...init, headers });\n}\n\nexport function createApiHandler(\n routes: ApiRoute[],\n): (request: Request) => Promise<Response> {\n const pairs = routes.map((apiRoute) => ({\n apiRoute,\n routeNode: { path: apiRoute.path, page: () => ({ div: \"\" }) } as Route,\n }));\n const compiled = compileRoutes(pairs.map((pair) => pair.routeNode));\n const byNode = new Map(pairs.map((pair) => [pair.routeNode, pair.apiRoute]));\n\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const match = matchRoute(compiled, url.pathname);\n if (!match) {\n return json({ error: \"Not Found\" }, { status: 404 });\n }\n\n const route = byNode.get(\n match.route.chain[match.route.chain.length - 1],\n ) as ApiRoute;\n const allowed = METHODS.filter((method) => route[method]);\n const method = request.method.toUpperCase() as HttpMethod;\n let handler = route[method];\n\n if (!handler && method === \"HEAD\" && route.GET) {\n handler = route.GET;\n }\n if (!handler && method === \"OPTIONS\") {\n return new Response(null, {\n status: 204,\n headers: { allow: allowed.join(\", \") },\n });\n }\n if (!handler) {\n return json(\n { error: \"Method Not Allowed\" },\n { status: 405, headers: { allow: allowed.join(\", \") } },\n );\n }\n\n try {\n const response = await handler(request, { params: match.params });\n if (method === \"HEAD\") {\n return new Response(null, {\n status: response.status,\n headers: response.headers,\n });\n }\n return response;\n } catch (error) {\n if (error instanceof RedirectSignal) {\n return new Response(null, {\n status: error.permanent ? 308 : 307,\n headers: { location: error.to },\n });\n }\n if (error instanceof NotFoundSignal) {\n return json({ error: \"Not Found\" }, { status: 404 });\n }\n return json({ error: \"Internal Server Error\" }, { status: 500 });\n }\n };\n}\n","export const EventProperties = [\r\n \"onAbort\",\r\n \"onAuxClick\",\r\n \"onBeforeMatch\",\r\n \"onBeforeToggle\",\r\n \"onBlur\",\r\n \"onCancel\",\r\n \"onCanPlay\",\r\n \"onCanPlayThrough\",\r\n \"onChange\",\r\n \"onClick\",\r\n \"onClose\",\r\n \"onContextLost\",\r\n \"onContextMenu\",\r\n \"onContextRestored\",\r\n \"onCopy\",\r\n \"onCueChange\",\r\n \"onCut\",\r\n \"onDblClick\",\r\n \"onDrag\",\r\n \"onDragEnd\",\r\n \"onDragEnter\",\r\n \"onDragLeave\",\r\n \"onDragOver\",\r\n \"onDragStart\",\r\n \"onDrop\",\r\n \"onDurationChange\",\r\n \"onEmptied\",\r\n \"onEnded\",\r\n \"onError\",\r\n \"onFocus\",\r\n \"onFormData\",\r\n \"onInput\",\r\n \"onInvalid\",\r\n \"onKeyDown\",\r\n \"onKeyPress\",\r\n \"onKeyUp\",\r\n \"onLoad\",\r\n \"onLoadedData\",\r\n \"onLoadedMetadata\",\r\n \"onLoadStart\",\r\n \"onMouseDown\",\r\n \"onMouseEnter\",\r\n \"onMouseLeave\",\r\n \"onMouseMove\",\r\n \"onMouseOut\",\r\n \"onMouseOver\",\r\n \"onMouseUp\",\r\n \"onPaste\",\r\n \"onPause\",\r\n \"onPlay\",\r\n \"onPlaying\",\r\n \"onProgress\",\r\n \"onRateChange\",\r\n \"onReset\",\r\n \"onResize\",\r\n \"onScroll\",\r\n \"onScrollEnd\",\r\n \"onSecurityPolicyViolation\",\r\n \"onSeeked\",\r\n \"onSeeking\",\r\n \"onSelect\",\r\n \"onSlotChange\",\r\n \"onStalled\",\r\n \"onSubmit\",\r\n \"onSuspend\",\r\n \"onTimeUpdate\",\r\n \"onToggle\",\r\n \"onVolumeChange\",\r\n \"onWaiting\",\r\n \"onWheel\",\r\n \"onTouchStart\",\r\n \"onTouchMove\",\r\n \"onTouchEnd\",\r\n \"onTouchCancel\",\r\n \"onPointerDown\",\r\n \"onPointerMove\",\r\n \"onPointerUp\",\r\n \"onPointerCancel\",\r\n \"onPointerEnter\",\r\n \"onPointerLeave\",\r\n \"onPointerOver\",\r\n \"onPointerOut\",\r\n \"onGotPointerCapture\",\r\n \"onLostPointerCapture\",\r\n \"onCompositionStart\",\r\n \"onCompositionUpdate\",\r\n \"onCompositionEnd\",\r\n \"onTransitionEnd\",\r\n \"onTransitionStart\",\r\n \"onAnimationStart\",\r\n \"onAnimationEnd\",\r\n \"onAnimationIteration\",\r\n \"onFullscreenChange\",\r\n \"onFullscreenError\",\r\n \"onFocusIn\",\r\n \"onFocusOut\",\r\n] as const\r\n\r\nexport const eventNameMap = EventProperties.reduce((acc, ev) => {\r\n const key = ev.slice(2).toLowerCase() as keyof HTMLElementEventMap\r\n acc[key] = ev;\r\n return acc;\r\n}, {} as Partial<Record<keyof HTMLElementEventMap, (typeof EventProperties)[number]>>);\r\n","export const HtmlTags = [\r\n \"a\",\r\n \"abbr\",\r\n \"address\",\r\n \"article\",\r\n \"aside\",\r\n \"audio\",\r\n \"b\",\r\n \"base\",\r\n \"blockquote\",\r\n \"br\",\r\n \"button\",\r\n \"canvas\",\r\n \"caption\",\r\n \"cite\",\r\n \"code\",\r\n \"col\",\r\n \"colgroup\",\r\n \"data\",\r\n \"datalist\",\r\n \"dd\",\r\n \"del\",\r\n \"details\",\r\n \"dfn\",\r\n \"dialog\",\r\n \"div\",\r\n \"dl\",\r\n \"dt\",\r\n \"em\",\r\n \"fieldset\",\r\n \"figcaption\",\r\n \"figure\",\r\n \"footer\",\r\n \"form\",\r\n \"h1\",\r\n \"h2\",\r\n \"h3\",\r\n \"h4\",\r\n \"h5\",\r\n \"h6\",\r\n \"header\",\r\n \"hgroup\",\r\n \"i\",\r\n \"iframe\",\r\n \"img\",\r\n \"input\",\r\n \"ins\",\r\n \"kbd\",\r\n \"label\",\r\n \"legend\",\r\n \"li\",\r\n \"main\",\r\n \"map\",\r\n \"mark\",\r\n \"meta\",\r\n \"meter\",\r\n \"nav\",\r\n \"noscript\",\r\n \"object\",\r\n \"ol\",\r\n \"optgroup\",\r\n \"option\",\r\n \"output\",\r\n \"p\",\r\n \"param\",\r\n \"picture\",\r\n \"pre\",\r\n \"progress\",\r\n \"q\",\r\n \"rp\",\r\n \"rt\",\r\n \"ruby\",\r\n \"s\",\r\n \"samp\",\r\n \"section\",\r\n \"select\",\r\n \"slot\",\r\n \"small\",\r\n \"source\",\r\n \"span\",\r\n \"strong\",\r\n \"sub\",\r\n \"summary\",\r\n \"sup\",\r\n \"table\",\r\n \"tbody\",\r\n \"td\",\r\n \"template\",\r\n \"textarea\",\r\n \"tfoot\",\r\n \"th\",\r\n \"thead\",\r\n \"time\",\r\n \"title\",\r\n \"tr\",\r\n \"track\",\r\n \"u\",\r\n \"ul\",\r\n \"var\",\r\n \"video\",\r\n \"wbr\",\r\n \"bdi\",\r\n \"bdo\",\r\n \"math\",\r\n \"menu\",\r\n \"search\",\r\n \"area\",\r\n \"embed\",\r\n \"hr\",\r\n \"animate\",\r\n \"animateMotion\",\r\n \"animateTransform\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"cursor\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"mpath\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"prefetch\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"set\",\r\n \"solidColor\",\r\n \"stop\",\r\n \"svg\",\r\n \"switch\",\r\n \"symbol\",\r\n \"tbreak\",\r\n \"text\",\r\n \"textPath\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n];","import { Handler } from \"../types.js\"\n\ntype ChainEntry = [notifier: Notifier, event: string]\n\n// Shared across all instances to track the flush chain for circular detection.\nlet _chain: ChainEntry[] = []\n\n// Microtask scheduler. Older embedded Chromium runtimes (SketchUp 2020 /\n// 2021.0 ship CEF 64) predate `queueMicrotask` (added in Chrome 71). A\n// resolved Promise's `.then` runs as a microtask in the same checkpoint, so\n// it is the standard fallback. The `.catch` mimics `queueMicrotask`'s\n// behaviour of surfacing thrown errors to the global error handler rather\n// than silently becoming an unhandled-rejection.\nconst _microtask: (cb: () => void) => void =\n typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : (cb) => {\n Promise.resolve().then(cb).catch((e) => {\n setTimeout(() => { throw e }, 0)\n })\n }\n\n// Cap on self-re-notifications within one settle burst. A converging update\n// (clamp/normalize) reaches a fixpoint in a pass or two; anything beyond this is\n// a genuinely diverging self-feedback loop and is stopped like a cycle.\nconst SELF_NOTIFY_CAP = 100\n\nexport class Notifier {\n private _listeners: Record<string, Set<Handler>> | null = {}\n private _pending: Map<string, { args: unknown[], chain: ChainEntry[] }> = new Map()\n private _scheduled = false\n // Args currently being delivered per event (used to detect a self-update fixpoint).\n private _flushing: Map<string, unknown[]> = new Map()\n // Self-re-notification depth in the current settle burst (runaway guard).\n private _selfDepth = 0\n\n _dispose(): void {\n if (this._listeners) {\n for (const event in this._listeners) {\n this._listeners[event].clear()\n }\n }\n this._listeners = null\n }\n\n addListener(event: string, listener: Handler): () => void {\n if (!this._listeners) return () => {}\n\n if (typeof event !== \"string\" || typeof listener !== \"function\") {\n throw new Error(\"Event name must be a string, listener must be a function\")\n }\n\n if (!this._listeners[event]) {\n this._listeners[event] = new Set()\n }\n\n const release = () => this.removeListener(event, listener)\n\n if (this._listeners[event].has(listener)) return release\n\n this._listeners[event].add(listener)\n if (typeof listener.onSubscribe === \"function\") {\n listener.onSubscribe(release)\n }\n\n return release\n }\n\n removeListener(event: string, listener: Handler): void {\n if (!this._listeners) return\n\n const listeners = this._listeners[event]\n if (listeners && listeners.has(listener)) {\n listeners.delete(listener)\n if (listeners.size === 0) {\n delete this._listeners[event]\n }\n }\n }\n\n notify(event: string, ...args: unknown[]): void {\n if (!this._listeners) return\n if (!this._listeners[event]) return\n\n // A listener that re-sets its OWN state mid-flush shows up as [this,event] at\n // the TOP of the chain. That is a converging self-update (clamp/normalize),\n // not a cross-state cycle — let it re-propagate with a fresh chain. A deeper\n // match (intervening notifiers) is a real cycle and is still rejected.\n const top = _chain.length ? _chain[_chain.length - 1] : null\n const selfReentry = !!top && top[0] === this && top[1] === event\n\n if (selfReentry) {\n const inflight = this._flushing.get(event)\n // Same value as the one being delivered → fixpoint reached, stop quietly.\n if (inflight && inflight[0] === args[0]) return\n if (this._selfDepth >= SELF_NOTIFY_CAP) {\n console.error(`[Domphy] Runaway self-update on \"${event}\" — stopped after ${SELF_NOTIFY_CAP} iterations`)\n return\n }\n this._selfDepth++\n this._pending.set(event, { args, chain: [] })\n } else {\n if (this._isCircular(event)) return\n this._pending.set(event, { args, chain: [..._chain] })\n }\n\n if (!this._scheduled) {\n this._scheduled = true\n _microtask(() => this._flushAll())\n }\n }\n\n private _isCircular(event: string): boolean {\n const idx = _chain.findIndex(([n, e]) => n === this && e === event)\n if (idx === -1) return false\n\n const names = [..._chain.slice(idx).map(([, e]) => e), event]\n console.error(`[Domphy] Circular dependency detected:\\n ${names.join(\" → \")}`)\n return true\n }\n\n private _flushAll(): void {\n this._scheduled = false\n const pending = this._pending\n this._pending = new Map()\n\n for (const [event, { args, chain }] of pending) {\n _chain = chain\n this._flush(event, args)\n }\n _chain = []\n // Burst settled (no self-update re-queued anything) → reset the runaway guard.\n if (this._pending.size === 0) this._selfDepth = 0\n }\n\n private _flush(event: string, args: unknown[]): void {\n if (!this._listeners) return\n const listeners = this._listeners[event]\n if (!listeners) return\n\n _chain.push([this, event])\n this._flushing.set(event, args)\n\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue\n try {\n listener(...args)\n } catch (e) {\n console.error(e)\n }\n }\n\n this._flushing.delete(event)\n _chain.pop()\n }\n}\n","import { Notifier } from \"./Notifier.js\";\r\nimport { Handler } from \"../types.js\"\r\n\r\nexport type ValueListener<T> = ((_value: T) => void) & Handler\r\nexport type ValueOrState<T> = T | State<T>\r\n\r\nexport class State<T> {\r\n readonly _isState = true;\r\n private _value: T;\r\n readonly initialValue: T;\r\n private _notifier: Notifier | null = new Notifier();\r\n\r\n constructor(initialValue: T, readonly name: string = typeof initialValue) {\r\n this.initialValue = initialValue;\r\n this._value = initialValue;\r\n }\r\n\r\n get(listener?: ValueListener<T>): T {\r\n if (listener) this.addListener(listener);\r\n return this._value;\r\n }\r\n\r\n set(newValue: T): void {\r\n if (!this._notifier) return;\r\n this._value = newValue;\r\n this._notifier.notify(this.name, newValue);\r\n }\r\n\r\n reset(): void {\r\n this.set(this.initialValue);\r\n }\r\n\r\n addListener(listener: ValueListener<T>): () => void {\r\n if (!this._notifier) return () => { };\r\n return this._notifier.addListener(this.name, listener);\r\n }\r\n\r\n removeListener(listener: ValueListener<T>): void {\r\n if (!this._notifier) return;\r\n this._notifier.removeListener(this.name, listener);\r\n }\r\n\r\n _dispose(): void {\r\n if (this._notifier) {\r\n this._notifier._dispose();\r\n this._notifier = null;\r\n }\r\n }\r\n}\r\n","import { DomphyElement, HookMap, EventName, Handler, Listener } from \"./types.js\";\r\nimport { State } from \"./classes/State.js\"\r\n\r\nimport { deepClone, addEvent, addHook } from \"./helpers.js\"\r\n\r\nexport function merge(source: Record<string, any> = {}, target: Record<string, any> = {}): Record<string, any> {\r\n const comma = [\"animation\", \"transition\", \"boxShadow\", \"textShadow\", \"background\", \"fontFamily\"]\r\n const space = [\"class\", \"rel\", \"transform\", \"acceptCharset\", \"sandbox\"]\r\n const adjacent = [\"content\"]\r\n if (Object.prototype.toString.call(target) === \"[object Object]\" && Object.getPrototypeOf(target) === Object.prototype) { // plainjs not class instance\r\n target = deepClone(target)\r\n }\r\n\r\n for (const key in target) {\r\n\r\n const value = target[key];\r\n if (value === undefined || value === null || value === \"\") continue;\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n if (typeof source[key] === \"object\") {\r\n source[key] = merge(source[key], value);\r\n } else {\r\n source[key] = value;\r\n }\r\n\r\n } else {\r\n if (comma.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\", \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\", \")\r\n }\r\n\r\n } else if (adjacent.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\"\")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\"\")\r\n }\r\n } else if (space.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\" \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\" \")\r\n }\r\n } else if (key.startsWith(\"on\")) {\r\n let name = key.replace(\"on\", \"\").toLowerCase() as EventName\r\n addEvent(source as DomphyElement, name, value)\r\n } else if (key.startsWith(\"_on\")) {\r\n let name = key.replace(\"_on\", \"\") as keyof HookMap\r\n addHook(source as DomphyElement, name, value)\r\n } else {\r\n source[key] = value;\r\n }\r\n }\r\n }\r\n return source;\r\n}\r\n\r\nexport function hashString(str: string = \"\"): string {\r\n let hash = 0x811c9dc5; // FNV-1a 32-bit offset basis\r\n for (let i = 0; i < str.length; i++) {\r\n hash ^= str.charCodeAt(i);\r\n hash = (hash * 0x01000193) >>> 0; // FNV prime, keep 32-bit unsigned\r\n }\r\n return String.fromCharCode(97 + (hash % 26)) + hash.toString(16);\r\n}\r\n\r\nexport function toState<T>(val: T | State<T>, name?: string): State<T> {\r\n return (val instanceof State || (val as any)?._isState) ? val as State<T> : new State<T>(val, name);\r\n}\r\n\r\nexport function r<T>(fn: (listener: Listener) => T): (listener: Listener) => T {\r\n return fn;\r\n}\r\n\r\n","import { DomphyElement, PartialElement, HookMap, EventName, Handler, TagName } from \"./types.js\";\r\nimport { ElementNode } from \"./classes/ElementNode.js\"\r\nimport { State } from \"./classes/State.js\"\r\nimport { eventNameMap } from \"./types/EventProperties.js\"\r\nimport { HtmlTags } from \"./constants/HtmlTags.js\"\r\nimport {merge} from \"./utils.js\"\r\n\r\nexport function addHook<K extends keyof HookMap>(partial: PartialElement, hookName: K, handler: HookMap[K]): void {\r\n const hookProperty = `_on${hookName}` as keyof PartialElement;\r\n let current = partial[hookProperty];\r\n\r\n if (typeof current === \"function\") {\r\n (partial as any)[hookProperty] = (...args: any[]) => {\r\n (current as Function)(...args);\r\n (handler as Function)(...args);\r\n };\r\n } else {\r\n (partial as any)[hookProperty] = handler;\r\n }\r\n}\r\n\r\nexport function addEvent<K extends keyof HTMLElementEventMap>(\r\n attributes: PartialElement,\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K], node: ElementNode) => void\r\n): void {\r\n const eventProperty = eventNameMap[eventName];\r\n if (!eventProperty) {\r\n throw Error(`invalid event name \"${eventName}\"`);\r\n }\r\n const current = (attributes as any)[eventProperty]\r\n\r\n if (typeof current == \"function\") {\r\n (attributes as any)[eventProperty] = (event: HTMLElementEventMap[K], node: ElementNode) => {\r\n current(event, node)\r\n handler(event, node);\r\n };\r\n } else {\r\n (attributes as any)[eventProperty] = handler\r\n }\r\n}\r\n\r\nexport function deepClone(value: any, seen = new WeakMap()): any {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (typeof value === \"function\") return value;\r\n if (seen.has(value)) return seen.get(value);\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto !== Object.prototype && !Array.isArray(value)) return value; // ignore class instance\r\n\r\n let clone: any;\r\n\r\n if (Array.isArray(value)) {\r\n clone = [];\r\n seen.set(value, clone);\r\n for (const v of value) clone.push(deepClone(v, seen));\r\n return clone;\r\n }\r\n\r\n if (value instanceof Date) return new Date(value);\r\n if (value instanceof RegExp) return new RegExp(value);\r\n if (value instanceof Map) {\r\n clone = new Map();\r\n seen.set(value, clone);\r\n for (const [k, v] of value) clone.set(deepClone(k, seen), deepClone(v, seen));\r\n return clone;\r\n }\r\n if (value instanceof Set) {\r\n clone = new Set();\r\n seen.set(value, clone);\r\n for (const v of value) clone.add(deepClone(v, seen));\r\n return clone;\r\n }\r\n if (ArrayBuffer.isView(value)) {\r\n return new (value as any).constructor(value);\r\n }\r\n if (value instanceof ArrayBuffer) {\r\n return value.slice(0);\r\n }\r\n\r\n clone = Object.create(proto);\r\n seen.set(value, clone);\r\n\r\n for (const key of Reflect.ownKeys(value)) {\r\n clone[key] = deepClone(value[key], seen);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nexport function validate(element: DomphyElement | PartialElement, asPartial = false): boolean {\r\n if (Object.prototype.toString.call(element) !== \"[object Object]\") {\r\n throw Error(`typeof ${element} is invalid DomphyElement`);\r\n }\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element]\r\n if (i == 0 && !HtmlTags.includes(key) && !key.includes(\"-\") && !asPartial) { // web-component\r\n throw Error(`key ${key} is not valid HTML tag name`);\r\n } else if (key == \"style\" && val && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"style\" must be a object`);\r\n } else if (key == \"$\") {\r\n element.$!.forEach(v => validate(v as PartialElement, true))\r\n } else if (key.startsWith(\"_on\") && typeof val != \"function\") {\r\n throw Error(`hook ${key} value \"${val}\" must be a function `)\r\n } else if (key.startsWith(\"on\") && typeof val != \"function\") {\r\n throw Error(`event ${key} value \"${val}\" must be a function `);\r\n } else if (key == \"_portal\" && typeof val !== \"function\") {\r\n throw Error(`\"_portal\" must be a function return HTMLElement`);\r\n } else if (key == \"_context\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_context\" must be a object`);\r\n } else if (key == \"_metadata\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_metadata\" must be a object`);\r\n } else if (key == \"_key\" && (typeof val !== \"string\" && typeof val !== \"number\")) {\r\n throw Error(`\"_key\" must be a string or number`);\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function isValid(element: DomphyElement): boolean {\r\n\r\n if (Array.isArray(element)) return false;\r\n if (!element || typeof element !== \"object\") return false;\r\n\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element];\r\n if (i == 0 && !HtmlTags.includes(key)) return false\r\n if (key === \"style\" && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n if (key.startsWith(\"_on\") && typeof val !== \"function\") return false;\r\n if (key.startsWith(\"on\") && typeof val !== \"function\") return false;\r\n if (key === \"_portalChildren\" && !Array.isArray(val)) return false;\r\n if ((key === \"_context\" || key === \"_metadata\") && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function isHTML(str: string): boolean {\r\n return /<([a-z][\\w-]*)(\\s[^>]*)?>.*<\\/\\1>|<([a-z][\\w-]*)(\\s[^>]*)?\\/>/i.test(str.trim());\r\n}\r\n\r\nexport function escapeHTML(str: string): string {\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\");\r\n}\r\n\r\nexport function addClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => String(reactive(listener)) + \" \" + className\r\n } else {\r\n let current = element.class || \"\"\r\n let split = String(current).split(\" \")\r\n split.push(className)\r\n element.class = split.filter(e => e).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function removeClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.filter(e => e != className).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.filter(e => e != className).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function toggleClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function getTagName(element: DomphyElement): TagName | undefined {\r\n return Object.keys(element).find(e => HtmlTags.includes(e)) as TagName | undefined\r\n}\r\n\r\n\r\nexport function camelToKebab(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\n\r\nexport function selectorSplitter(selectors: string) {\r\n if (selectors.indexOf('@') === 0) {\r\n return [selectors];\r\n }\r\n var splitted = [];\r\n var parens = 0;\r\n var angulars = 0;\r\n var soFar = '';\r\n for (var i = 0, len = selectors.length; i < len; i++) {\r\n var char = selectors[i];\r\n if (char === '(') {\r\n parens += 1;\r\n } else if (char === ')') {\r\n parens -= 1;\r\n } else if (char === '[') {\r\n angulars += 1;\r\n } else if (char === ']') {\r\n angulars -= 1;\r\n } else if (char === ',') {\r\n if (!parens && !angulars) {\r\n splitted.push(soFar.trim());\r\n soFar = '';\r\n continue;\r\n }\r\n }\r\n soFar += char;\r\n }\r\n splitted.push(soFar.trim());\r\n return splitted;\r\n};\r\n\r\nexport function normalizeSelectorKey(selectorText: string): string {\r\n const text = selectorText.trim();\r\n // At-rule headers (@media, @keyframes, @supports...) are matched\r\n // whitespace-insensitive because CSSOM reformats them unpredictably.\r\n if (text.startsWith(\"@\")) return text.replace(/\\s+/g, \"\");\r\n return text\r\n .replace(/\\s*([>+~,])\\s*/g, \"$1\") // tighten combinators and selector lists\r\n .replace(/\\s+/g, \" \") // collapse descendant-combinator whitespace\r\n .replace(/\\(\\s*odd\\s*\\)/g, \"(2n+1)\") // CSSOM serializes :nth-child(odd) as (2n+1)\r\n .replace(/\\(\\s*even\\s*\\)/g, \"(2n)\")\r\n .trim();\r\n}\r\n\r\nexport function collectCSSRules(rules: CSSRuleList, map: Map<string, CSSRule>): Map<string, CSSRule> {\r\n for (let i = 0; i < rules.length; i++) {\r\n const rule = rules[i] as any;\r\n let key: string | null = null;\r\n if (typeof rule.selectorText === \"string\") {\r\n key = normalizeSelectorKey(rule.selectorText);\r\n } else if (typeof rule.cssText === \"string\" && rule.cssText.startsWith(\"@\")) {\r\n key = normalizeSelectorKey(rule.cssText.split(\"{\")[0]);\r\n }\r\n if (key && !map.has(key)) map.set(key, rule as CSSRule);\r\n }\r\n return map;\r\n}\r\n\r\nexport function ensureDomStyle(styleParent: HTMLHeadElement | ShadowRoot): HTMLStyleElement {\r\n let domStyle = styleParent.querySelector(\"#domphy-style\") as HTMLStyleElement | null;\r\n\r\n if (!domStyle) {\r\n domStyle = document.createElement(\"style\");\r\n domStyle.id = \"domphy-style\";\r\n styleParent.appendChild(domStyle);\r\n }\r\n\r\n if (domStyle.dataset.domphyBase !== \"true\") {\r\n domStyle.sheet?.insertRule(\"[hidden] { display: none !important; }\", 0);\r\n domStyle.dataset.domphyBase = \"true\";\r\n }\r\n\r\n return domStyle;\r\n}\r\n\r\nexport const mergePartial = (partial: PartialElement | DomphyElement): typeof partial => {\r\n\r\n if (Array.isArray(partial.$)) {\r\n let part: typeof partial = {}\r\n partial.$.forEach(p => merge(part, mergePartial(p)))\r\n delete partial.$\r\n merge(part, partial) // native win\r\n\r\n return part\r\n } else {\r\n return partial\r\n }\r\n}\r\n","export const VoidTags = [\r\n \"area\",\r\n \"base\",\r\n \"br\",\r\n \"col\",\r\n \"embed\",\r\n \"hr\",\r\n \"img\",\r\n \"input\",\r\n \"link\",\r\n \"meta\",\r\n \"source\",\r\n \"track\",\r\n \"wbr\",\r\n] as const;\r\n\r\nexport type VoidTagName = (typeof VoidTags)[number];\r\n\r\n","export const SvgTags = [\"svg\", \"circle\", \"path\", \"rect\", \"ellipse\",\r\n \"line\", \"polyline\", \"polygon\", \"g\", \"defs\",\r\n \"use\", \"symbol\", \"linearGradient\", \"radialGradient\",\r\n \"stop\", \"clipPath\", \"mask\", \"filter\", \"text\",\r\n \"tspan\", \"textPath\", \"image\", \"pattern\", \"marker\",\r\n \"animate\", \"animateTransform\", \"animateMotion\",\r\n \"feGaussianBlur\", \"feComposite\", \"feColorMatrix\",\r\n \"feMerge\", \"feMergeNode\", \"feOffset\", \"feFlood\",\r\n \"feBlend\", \"foreignObject\"]","export const BooleanAttributes = [\r\n \"allowFullScreen\",\r\n \"async\",\r\n \"autoFocus\",\r\n \"autoPlay\",\r\n \"checked\",\r\n \"compact\",\r\n \"contentEditable\",\r\n \"controls\",\r\n \"declare\",\r\n \"default\",\r\n \"defer\",\r\n \"disabled\",\r\n \"formNoValidate\",\r\n \"hidden\",\r\n \"isMap\",\r\n \"itemScope\",\r\n \"loop\",\r\n \"multiple\",\r\n \"muted\",\r\n \"noHref\",\r\n \"noShade\",\r\n \"noValidate\",\r\n \"open\",\r\n \"playsInline\",\r\n \"readonly\",\r\n \"required\",\r\n \"reversed\",\r\n \"scoped\",\r\n \"selected\",\r\n \"sortable\",\r\n \"trueSpeed\",\r\n \"typeMustMatch\",\r\n \"wmode\",\r\n \"autoCapitalize\",\r\n \"translate\",\r\n \"spellCheck\",\r\n \"inert\",\r\n \"download\",\r\n \"noModule\",\r\n \"paused\",\r\n \"autoPictureInPicture\",\r\n] as const;","//browserslist query \"> 0.1%, not dead\"\r\nexport const PrefixCSS: Record<string, string[]> = {\r\n transform: [\"webkit\", \"ms\"],\r\n transition: [\"webkit\", \"ms\"],\r\n animation: [\"webkit\"],\r\n userSelect: [\"webkit\", \"ms\"],\r\n flexDirection: [\"webkit\", \"ms\"],\r\n flexWrap: [\"webkit\", \"ms\"],\r\n justifyContent: [\"webkit\", \"ms\"],\r\n alignItems: [\"webkit\", \"ms\"],\r\n alignSelf: [\"webkit\", \"ms\"],\r\n order: [\"webkit\", \"ms\"],\r\n flexGrow: [\"webkit\", \"ms\"],\r\n flexShrink: [\"webkit\", \"ms\"],\r\n flexBasis: [\"webkit\", \"ms\"],\r\n columns: [\"webkit\"],\r\n columnCount: [\"webkit\"],\r\n columnGap: [\"webkit\"],\r\n columnRule: [\"webkit\"],\r\n columnWidth: [\"webkit\"],\r\n boxSizing: [\"webkit\"],\r\n appearance: [\"webkit\", \"moz\"],\r\n filter: [\"webkit\"],\r\n backdropFilter: [\"webkit\"],\r\n clipPath: [\"webkit\"],\r\n mask: [\"webkit\"],\r\n maskImage: [\"webkit\"],\r\n textSizeAdjust: [\"webkit\", \"ms\"],\r\n hyphens: [\"webkit\", \"ms\"],\r\n writingMode: [\"webkit\", \"ms\"],\r\n gridTemplateColumns: [\"ms\"],\r\n gridTemplateRows: [\"ms\"],\r\n gridAutoColumns: [\"ms\"],\r\n gridAutoRows: [\"ms\"],\r\n gridColumn: [\"ms\"],\r\n gridRow: [\"ms\"],\r\n marginInlineStart: [\"webkit\"],\r\n marginInlineEnd: [\"webkit\"],\r\n paddingInlineStart: [\"webkit\"],\r\n paddingInlineEnd: [\"webkit\"],\r\n minInlineSize: [\"webkit\"],\r\n maxInlineSize: [\"webkit\"],\r\n minBlockSize: [\"webkit\"],\r\n maxBlockSize: [\"webkit\"],\r\n inlineSize: [\"webkit\"],\r\n blockSize: [\"webkit\"],\r\n tabSize: [\"moz\"],\r\n overscrollBehavior: [\"webkit\", \"ms\"],\r\n touchAction: [\"ms\"],\r\n resize: [\"webkit\"],\r\n printColorAdjust: [\"webkit\"],\r\n backgroundClip: [\"webkit\"],\r\n boxDecorationBreak: [\"webkit\"],\r\n overflowScrolling: [\"webkit\"],\r\n};\r\n","export const CamelAttributes: string[] = [\r\n \"viewBox\",\r\n \"preserveAspectRatio\",\r\n \"gradientTransform\",\r\n \"gradientUnits\",\r\n \"spreadMethod\",\r\n \"markerStart\",\r\n \"markerMid\",\r\n \"markerEnd\",\r\n \"markerHeight\",\r\n \"markerWidth\",\r\n \"markerUnits\",\r\n \"refX\",\r\n \"refY\",\r\n \"patternContentUnits\",\r\n \"patternTransform\",\r\n \"patternUnits\",\r\n \"filterUnits\",\r\n \"primitiveUnits\",\r\n \"kernelUnitLength\",\r\n \"clipPathUnits\",\r\n \"maskContentUnits\",\r\n \"maskUnits\"\r\n] as const\r\n","import { escapeHTML, camelToKebab } from \"../helpers.js\";\nimport { BooleanAttributes, CamelAttributes } from \"../constants.js\";\nimport type { ElementNode } from \"./ElementNode.js\"\nimport { type AttributeValue } from \"../types.js\"\nimport { Notifier } from \"./Notifier.js\"\n\nexport class ElementAttribute {\n readonly name: string;\n readonly isBoolean: boolean;\n value: any;\n parent: ElementNode;\n _notifier = new Notifier();\n // Release handles for the reactive listener's state subscriptions, so a\n // re-set (e.g. patch() replacing a reactive value) can drop the old listener\n // instead of leaking it on the long-lived State until node removal.\n private _releases: (() => void)[] = [];\n\n constructor(name: string, value: any, parent: any) {\n this.parent = parent;\n this.isBoolean = (BooleanAttributes as readonly string[]).includes(name);\n if (CamelAttributes.includes(name)) {\n this.name = name\n } else {\n this.name = camelToKebab(name)\n }\n this.value = undefined;\n this.set(value);\n }\n\n render(): void {\n if (!this.parent || !this.parent.domElement) return;\n const domElement = this.parent.domElement;\n\n const mutateAttrs = [\"value\"];\n if (this.isBoolean) {\n if (this.value === false || this.value == null) {\n domElement.removeAttribute(this.name)\n } else {\n domElement.setAttribute(this.name, this.value === true ? \"\" : this.value)\n }\n } else if (this.value == null) {\n domElement.removeAttribute(this.name);\n } else if (mutateAttrs.includes(this.name)) {\n (domElement as any)[this.name] = this.value;\n } else {\n domElement.setAttribute(this.name, this.value);\n }\n }\n\n set(value: AttributeValue): void {\n let prev = this.value;\n\n // Drop any previous reactive subscription before (re)binding.\n if (this._releases.length) {\n for (const release of this._releases) release();\n this._releases = [];\n }\n\n if (value == null) {\n this.value = null;\n } else if (typeof value == \"function\") {\n let listener: any = () => {\n if (!this.parent || this.parent._disposed) return;\n let p = this.value;\n // Re-pass `listener` so states read only on a later run (conditional\n // dependencies) get subscribed too — matching children/style paths.\n this.value = this.isBoolean ? Boolean((value as Function)(listener)) : (value as Function)(listener);\n this.render();\n if (p !== this.value) this._notifier.notify(this.name, this.value);\n };\n\n listener.elementNode = this.parent!;\n listener.debug = `class:${this.parent?.tagName}_${this.parent?.nodeId} attribute:${this.name}`;\n\n listener.onSubscribe = (release: () => void) => {\n this._releases.push(release);\n if (this.parent) {\n this.parent.addHook(\"BeforeRemove\", () => {\n release();\n listener = null;\n });\n }\n };\n\n this.value = this.isBoolean ? Boolean(value(listener)) : value(listener);\n } else {\n this.value = this.isBoolean ? Boolean(value) : value;\n }\n\n this.render();\n if (prev !== this.value) this._notifier.notify(this.name, this.value);\n }\n\n addListener(callback: (value: any) => void): void {\n const handler = callback as any\n handler.onSubscribe = (release: () => void) => this.parent?.addHook(\"BeforeRemove\", release);\n this._notifier.addListener(this.name, handler)\n }\n\n remove(): void {\n if (this.parent && this.parent.attributes) {\n this.parent.attributes.remove(this.name);\n }\n this._dispose();\n }\n\n _dispose(): void {\n this._notifier._dispose();\n this.value = null;\n this.parent = null as any\n }\n\n generateHTML(): string {\n const { name, value } = this;\n if (this.isBoolean) {\n return value ? `${name}` : \"\";\n } else {\n const val = Array.isArray(value) ? JSON.stringify(value) : value;\n return `${name}=\"${escapeHTML(String(val))}\"`;\n }\n }\n}\n","import type { ElementNode } from \"./ElementNode.js\";\nimport { ElementAttribute } from \"./ElementAttribute.js\";\nimport { BooleanAttributes } from \"../constants.js\";\nimport { AttributeValue } from \"../types.js\"\n\nexport class AttributeList {\n items: Record<string, ElementAttribute> | null = {};\n parent: ElementNode | null;\n\n constructor(parent: ElementNode) {\n this.parent = parent;\n }\n\n generateHTML(): string {\n if (!this.items) return \"\";\n const str = Object.values(this.items)\n .map((attr) => attr.generateHTML())\n .join(\" \");\n return str ? ` ${str}` : \"\";\n }\n\n get(name: string): any {\n if (!this.items) return undefined;\n return this.items[name]?.value;\n }\n\n set(name: string, value: AttributeValue): void {\n if (!this.items || !this.parent) return;\n if (this.items[name]) {\n this.items[name].set(value);\n } else {\n this.items[name] = new ElementAttribute(name, value, this.parent);\n }\n }\n\n addListener(name: string, callback: (value: string | number) => void): void {\n if (this.has(name)) {\n this.items![name].addListener(callback);\n }\n }\n\n has(name: string): boolean {\n if (!this.items) return false;\n return Object.prototype.hasOwnProperty.call(this.items, name);\n }\n\n remove(name: string): void {\n if (!this.items) return;\n\n if (this.items[name]) {\n this.items[name]._dispose();\n delete this.items[name];\n }\n\n if (this.parent && this.parent.domElement && this.parent.domElement instanceof Element) {\n this.parent.domElement.removeAttribute(name);\n }\n }\n\n _dispose(): void {\n if (this.items) {\n for (const key in this.items) {\n this.items[key]._dispose();\n }\n }\n this.items = null;\n this.parent = null;\n }\n\n toggle(name: string, force?: boolean): void {\n if (\n !BooleanAttributes.includes(name as (typeof BooleanAttributes)[number])\n ) {\n throw Error(`${name} is not a boolean attribute`);\n }\n if (force === true) {\n this.set(name, true);\n } else if (force === false) {\n this.remove(name);\n } else {\n this.has(name) ? this.remove(name) : this.set(name, true);\n }\n }\n\n addClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n\n const add = (classes: string, newClass: string) => {\n const list = (classes || \"\").split(\" \").filter((e: string) => e);\n !list.includes(newClass) && list.push(className)\n return list.join(\" \")\n }\n\n let current = this.get(\"class\");\n\n if (typeof current === \"function\") {\n this.set(\"class\", () => add(current(), className));\n } else {\n this.set(\"class\", add(current, className))\n }\n }\n\n hasClass(className: string): boolean {\n if (!className || typeof className !== \"string\") return false;\n const current = this.get(\"class\") || \"\";\n const list = current.split(\" \").filter((e: string) => e);\n return list.includes(className);\n }\n\n toggleClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n this.hasClass(className)\n ? this.removeClass(className)\n : this.addClass(className);\n }\n\n removeClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n const current = this.get(\"class\") || \"\";\n const list: string[] = current.split(\" \").filter((e: string) => e);\n const updated = list.filter((cls) => cls !== className);\n updated.length > 0\n ? this.set(\"class\", updated.join(\" \"))\n : this.remove(\"class\");\n }\n\n replaceClass(oldClass: string, newClass: string): void {\n if (\n !oldClass ||\n !newClass ||\n typeof oldClass !== \"string\" ||\n typeof newClass !== \"string\"\n )\n return;\n if (this.hasClass(oldClass)) {\n this.removeClass(oldClass);\n this.addClass(newClass);\n }\n }\n}\n","import { ElementNode } from \"./ElementNode.js\";\r\nimport { isHTML, escapeHTML } from \"../helpers.js\";\r\n\r\nexport class TextNode {\r\n type = \"TextNode\"\r\n parent: ElementNode;\r\n text: string;\r\n domText?: ChildNode;\r\n\r\n constructor(textContent: string | number, parent: ElementNode) {\r\n this.parent = parent;\r\n this.text = textContent === \"\" ? \"\\u200B\" : String(textContent);\r\n }\r\n _createDOMNode() {\r\n let newNode: ChildNode;\r\n if (isHTML(this.text)) {\r\n const tpl = document.createElement(\"template\");\r\n tpl.innerHTML = this.text.trim();\r\n newNode = tpl.content.firstChild || document.createTextNode(\"\");\r\n } else {\r\n newNode = document.createTextNode(this.text);\r\n }\r\n this.domText = newNode;\r\n return newNode;\r\n }\r\n\r\n _dispose(): void {\r\n this.domText = undefined;\r\n this.text = \"\";\r\n }\r\n\r\n generateHTML(): string {\r\n if (this.text === \"\\u200B\") return \"&#8203;\";\r\n // Mirror _createDOMNode: a single-root HTML string is intentional inline\r\n // HTML, anything else is plain text and must be escaped so the server\r\n // output is XSS-safe and parses back to the same text node the client\r\n // builds (otherwise hydration child alignment drifts).\r\n return isHTML(this.text) ? this.text : escapeHTML(this.text);\r\n }\r\n\r\n render(domText: ChildNode | DocumentFragment | HTMLElement): void {\r\n const newNode = this._createDOMNode();\r\n domText.appendChild(newNode);\r\n }\r\n}","import { TextNode } from \"./TextNode.js\";\r\nimport { ElementNode } from \"./ElementNode.js\";\r\nimport type { DomphyElement } from \"../types.js\";\r\nimport { ensureDomStyle, getTagName } from \"../helpers.js\";\r\n\r\ntype ElementInput = DomphyElement | null | undefined | number | string\r\ntype NodeItem = ElementNode | TextNode;\r\n\r\nexport class ElementList {\r\n items: NodeItem[] = [];\r\n owner: ElementNode;\r\n _nextKey: number = 0;\r\n\r\n constructor(parent: ElementNode) {\r\n this.owner = parent;\r\n }\r\n\r\n _createNode(element: ElementInput | DomphyElement): NodeItem {\r\n return (typeof element === \"object\" && element !== null)\r\n ? new ElementNode(element, this.owner, this._nextKey++)\r\n : new TextNode(element == null ? \"\" : String(element), this.owner);\r\n }\r\n\r\n _moveDomElement(node: NodeItem, index: number) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const dom = this.owner.domElement;\r\n\r\n const el = node instanceof ElementNode ? node.domElement : node.domText;\r\n if (el) {\r\n const currentRef = dom.childNodes[index] || null;\r\n if (el !== currentRef) {\r\n dom.insertBefore(el, currentRef);\r\n }\r\n }\r\n }\r\n\r\n _swapDomElement(aNode: NodeItem, bNode: NodeItem) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const parent = this.owner.domElement;\r\n\r\n const a = aNode instanceof ElementNode ? aNode.domElement : aNode.domText;\r\n const b = bNode instanceof ElementNode ? bNode.domElement : bNode.domText;\r\n if (!a || !b) return;\r\n\r\n const aNext = a.nextSibling;\r\n const bNext = b.nextSibling;\r\n\r\n parent.insertBefore(a, bNext);\r\n parent.insertBefore(b, aNext);\r\n }\r\n\r\n update(inputs: ElementInput[], updateDom = true, silent = false): void {\r\n\r\n const oldItems = this.items.slice(); // snapshot for cleanup\r\n\r\n // keyed lookup from old list\r\n const keyed = new Map<string | number, NodeItem>();\r\n for (const item of oldItems) {\r\n if (item instanceof ElementNode && item.key !== null && item.key !== undefined) {\r\n keyed.set(item.key, item);\r\n }\r\n }\r\n\r\n if (!silent && this.owner.domElement) this.owner._hooks?.BeforeUpdate?.(this.owner, inputs);\r\n\r\n const oldSet = new Set<NodeItem>(oldItems);\r\n const claimed = new Set<NodeItem>();\r\n\r\n // build target order using existing ops (mutating this.items)\r\n for (let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n const isObj = typeof input === \"object\" && input !== null;\r\n const key = isObj ? (input as any)._key : undefined;\r\n const tag = isObj ? getTagName(input as DomphyElement) : undefined;\r\n\r\n // Keyed reuse: same key + same tag → reuse the node and patch it in place\r\n // (preserves DOM identity/state while reflecting new data).\r\n if (key !== undefined) {\r\n const reused = keyed.get(key);\r\n if (reused instanceof ElementNode && reused.tagName === tag) {\r\n keyed.delete(key);\r\n const cur = this.items.indexOf(reused);\r\n if (cur !== i && cur >= 0) {\r\n const isPortal = !!reused._portal;\r\n this.move(cur, i, isPortal ? false : updateDom, true);\r\n }\r\n reused.parent = this.owner as any;\r\n reused.patch(input as DomphyElement);\r\n claimed.add(reused);\r\n continue;\r\n }\r\n // key present but no tag-compatible match → fall through to insert; any\r\n // stale keyed node keeps its slot in `keyed` and is removed below.\r\n } else if (isObj) {\r\n // Unkeyed positional reuse: reuse the old unkeyed element already sitting\r\n // at this slot if its tag matches — this is what preserves focus, scroll,\r\n // selection, IME and uncontrolled input values across plain list updates.\r\n const at = this.items[i];\r\n if (at instanceof ElementNode && at.key == null && at.tagName === tag\r\n && oldSet.has(at) && !claimed.has(at)) {\r\n at.parent = this.owner as any;\r\n at.patch(input as DomphyElement);\r\n claimed.add(at);\r\n continue;\r\n }\r\n }\r\n\r\n claimed.add(this.insert(input, i, updateDom, true));\r\n }\r\n\r\n // Remove leftover nodes beyond the new length. Iterate a SNAPSHOT (not a\r\n // `while length > inputs.length` loop): a removal may defer (async exit\r\n // animation), leaving the node in `items`, so a length-based loop would spin.\r\n const extras = this.items.slice(inputs.length);\r\n for (const node of extras) this.remove(node, updateDom, true);\r\n keyed.forEach((node) => this.remove(node, updateDom, true));\r\n if (!silent) this.owner._hooks?.Update?.(this.owner);\r\n }\r\n\r\n insert(input: ElementInput, index?: number, updateDom = true, silent = false): NodeItem {\r\n\r\n let length = this.items.length;\r\n const finalIndex = (typeof index !== \"number\" || isNaN(index) || index < 0 || index > length)\r\n ? length\r\n : index;\r\n const item = this._createNode(input);\r\n this.items.splice(finalIndex, 0, item);\r\n\r\n if (item instanceof ElementNode) {\r\n //Parent always insert/mount before children\r\n item._hooks.Insert && item._hooks.Insert(item)\r\n\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n\r\n\r\n if (item._portal) {\r\n let domElement = item._portal!(this.owner.getRoot())\r\n domElement && item.render(domElement)\r\n } else {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n let domStyle = ensureDomStyle(styleParent)\r\n item.styles.render(domStyle as HTMLStyleElement)\r\n item._hooks.Mount && item._hooks.Mount(item)\r\n item.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(child.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(domNode)\r\n }\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n } else {\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n }\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n return item;\r\n }\r\n\r\n remove(item: NodeItem, updateDom = true, silent = false): void {\r\n\r\n const index = this.items.indexOf(item);\r\n if (index < 0) return;\r\n\r\n if (item instanceof ElementNode) {\r\n // Guard against re-entrant removal of a node whose (deferred) removal is\r\n // already in flight — otherwise update()'s extras + keyed passes could\r\n // fire its BeforeRemove/animation twice. Synchronous removals are already\r\n // guarded by the indexOf check above (the node is spliced before re-entry).\r\n if (item._beforeRemoveFired) return;\r\n const done = () => {\r\n const el = item.domElement\r\n // Re-resolve position at completion time — a deferred (animated) removal\r\n // may run after other inserts/removes have shifted indices.\r\n const i = this.items.indexOf(item);\r\n if (i >= 0) this.items.splice(i, 1);\r\n updateDom && el && el.remove()\r\n item._dispose(); // _dispose fires Remove + releases subscriptions for the whole subtree\r\n }\r\n if (item._hooks.BeforeRemove && item.domElement) {\r\n let doneCalled = false;\r\n const onceDone = () => { if (!doneCalled) { doneCalled = true; done(); } };\r\n item._beforeRemoveFired = true; // prevent _dispose from re-firing BeforeRemove\r\n item._hooks.BeforeRemove(item, onceDone);\r\n // Auto-complete only for sync cleanup hooks. A hook that declares `done`\r\n // (arity >= 2, e.g. an exit animation) owns completion and defers removal.\r\n if ((item._hooks.BeforeRemove as Function).length < 2 && !doneCalled) onceDone();\r\n } else {\r\n done()\r\n }\r\n\r\n } else {\r\n const el = item.domText\r\n this.items.splice(index, 1);\r\n updateDom && el && el.remove()\r\n item._dispose();\r\n }\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n clear(updateDom = true, silent = false): void {\r\n if (this.items.length === 0) return;\r\n const snapshot = this.items.slice();\r\n\r\n for (const item of snapshot) {\r\n this.remove(item, updateDom, true);\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n _dispose(): void {\r\n this.items.forEach(child => child._dispose())\r\n this.items = [];\r\n }\r\n\r\n swap(aIndex: number, bIndex: number, updateDom = true, silent = false) {\r\n if (aIndex < 0 || bIndex < 0 ||\r\n aIndex >= this.items.length || bIndex >= this.items.length ||\r\n aIndex === bIndex) return;\r\n\r\n const itemA = this.items[aIndex];\r\n const itemB = this.items[bIndex];\r\n\r\n this.items[aIndex] = itemB;\r\n this.items[bIndex] = itemA;\r\n\r\n if (updateDom) this._swapDomElement(itemA, itemB);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n move(fromIndex: number, toIndex: number, updateDom = true, silent = false): void {\r\n if (fromIndex < 0 || fromIndex >= this.items.length ||\r\n toIndex < 0 || toIndex >= this.items.length || fromIndex === toIndex) return;\r\n\r\n const item = this.items[fromIndex];\r\n\r\n this.items.splice(fromIndex, 1);\r\n this.items.splice(toIndex, 0, item);\r\n\r\n if (updateDom) this._moveDomElement(item, toIndex);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n generateHTML(): string {\r\n let html = \"\";\r\n for (const item of this.items) html += item.generateHTML();\r\n return html;\r\n }\r\n}\r\n","import type { StyleRule } from \"./StyleRule.js\";\r\nimport type { StyleValue } from \"../types.js\";\r\nimport { camelToKebab } from \"../helpers.js\";\r\nimport { PrefixCSS } from \"../constants.js\";\r\nimport { Listener } from \"../types.js\"\r\n\r\nexport class StyleProperty {\r\n name: string;\r\n cssName: string;\r\n value: StyleValue = \"\";\r\n parentRule: StyleRule;\r\n\r\n constructor(name: string, value: StyleValue, parentRule: StyleRule) {\r\n this.name = name;\r\n this.cssName = camelToKebab(name);\r\n this.parentRule = parentRule;\r\n this.set(value);\r\n }\r\n\r\n _domUpdate(): void {\r\n if (!this.parentRule) return;\r\n const domRule = this.parentRule.domRule;\r\n\r\n if (domRule && (domRule as CSSStyleRule).style) {\r\n let style: CSSStyleDeclaration = (domRule as CSSStyleRule).style;\r\n style.setProperty(this.cssName, String(this.value));\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n style.setProperty(`-${prefix}-${this.cssName}`, String(this.value));\r\n });\r\n }\r\n }\r\n }\r\n _dispose(): void {\r\n this.value = \"\";\r\n this.parentRule = null as any;\r\n }\r\n\r\n set(value: StyleValue): void {\r\n\r\n if (typeof value === \"function\") {\r\n let listener = (() => {\r\n if (!this.parentRule || this.parentRule.parentNode?._disposed) return;\r\n this.value = value(listener);\r\n this._domUpdate();\r\n }) as unknown as Listener;\r\n\r\n listener.onSubscribe = (release: () => void) => {\r\n this.parentRule.parentNode?.addHook(\"BeforeRemove\", () => {\r\n release();\r\n listener = null!;\r\n });\r\n };\r\n\r\n listener.elementNode = this.parentRule!.root!;\r\n listener.debug = `class:${this.parentRule?.root?.tagName}_${this.parentRule?.root?.nodeId} style:${this.name}`;\r\n this.value = value(listener);\r\n } else {\r\n this.value = value;\r\n }\r\n\r\n this._domUpdate();\r\n }\r\n\r\n remove(): void {\r\n if (!this.parentRule) return;\r\n\r\n if (this.parentRule.domRule instanceof CSSStyleRule) {\r\n const domStyle = this.parentRule.domRule.style;\r\n domStyle.removeProperty(this.cssName);\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n domStyle.removeProperty(`-${prefix}-${this.cssName}`);\r\n });\r\n }\r\n }\r\n delete this.parentRule.styleBlock![this.name];\r\n this._dispose();\r\n }\r\n\r\n cssText(): string {\r\n let str = `${this.cssName}: ${this.value}`;\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n str += `; -${prefix}-${this.cssName}: ${this.value}`;\r\n });\r\n }\r\n return str;\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { StyleProperty } from \"./StyleProperty.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\n\r\nexport class StyleRule {\r\n selectorText: string;\r\n domRule: CSSRule | CSSMediaRule | CSSKeyframesRule | null = null;\r\n styleList: StyleList | null;\r\n styleBlock: Record<string, StyleProperty> | null = {};\r\n parent: StyleRule | ElementNode | null;\r\n\r\n constructor(selectorText: string, parent: StyleRule | ElementNode) {\r\n this.selectorText = selectorText;\r\n this.styleList = new StyleList(this);\r\n this.parent = parent;\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.styleBlock) {\r\n for (const prop of Object.values(this.styleBlock)) {\r\n prop._dispose();\r\n }\r\n }\r\n\r\n if (this.styleList) {\r\n this.styleList._dispose();\r\n }\r\n\r\n this.styleBlock = null;\r\n this.styleList = null;\r\n this.domRule = null;\r\n this.parent = null;\r\n }\r\n\r\n get root() {\r\n let node = this.parent;\r\n while (node instanceof StyleRule) {\r\n node = node.parent;\r\n }\r\n return node;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n \r\n insertStyle(name: string, val: any): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].set(val);\r\n } else {\r\n this.styleBlock[name] = new StyleProperty(name, val, this);\r\n }\r\n }\r\n\r\n removeStyle(name: string): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].remove();\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.styleBlock || !this.styleList) return \"\";\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n const nested = this.styleList.cssText();\r\n return `${this.selectorText} { ${styleStr} ${nested} } `;\r\n }\r\n\r\n mount(domRule: CSSRule | CSSKeyframesRule): void {\r\n if (!domRule || !this.styleList) return;\r\n this.domRule = domRule;\r\n if (\"cssRules\" in domRule) {\r\n this.styleList.mount(domRule.cssRules as CSSRuleList);\r\n }\r\n }\r\n\r\n remove(): void {\r\n\r\n if (this.domRule && this.domRule.parentStyleSheet) {\r\n const sheet = this.domRule.parentStyleSheet;\r\n const rules = sheet.cssRules;\r\n for (let i = 0; i < rules.length; i++) {\r\n if (rules[i] === this.domRule) {\r\n sheet.deleteRule(i);\r\n break;\r\n }\r\n }\r\n }\r\n this._dispose();\r\n }\r\n\r\n render(domSheet: CSSStyleSheet | CSSGroupingRule) {\r\n if (!this.styleBlock || !this.styleList) return;\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n try {\r\n if (!this.selectorText.startsWith(\"@\")) {\r\n const css = `${this.selectorText} { ${styleStr} }`;\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (domRule && \"selectorText\" in domRule) {\r\n this.mount(domRule);\r\n }\r\n } else if (/^@(media|supports|container|layer)\\b/.test(this.selectorText)) {\r\n const index = domSheet.insertRule(`${this.selectorText} {}`, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (\"cssRules\" in domRule) {\r\n this.mount(domRule as CSSGroupingRule);\r\n this.styleList.render(domRule as CSSGroupingRule);\r\n }\r\n } else if (this.selectorText.startsWith(\"@keyframes\") || this.selectorText.startsWith(\"@font-face\")) {\r\n const css = this.cssText();\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n this.mount(domRule);\r\n }\r\n } catch (err) {\r\n console.warn(\"Failed to insert rule:\", this.selectorText, err);\r\n }\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { selectorSplitter, normalizeSelectorKey } from \"../helpers.js\";\r\nimport { StyleRule } from \"./StyleRule.js\";\r\n\r\nexport class StyleList {\r\n parent: StyleRule | ElementNode | null;\r\n items: StyleRule[] = [];\r\n domStyle: HTMLStyleElement | null = null;\r\n\r\n constructor(parent: StyleRule | ElementNode) {\r\n this.parent = parent;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n\r\n addCSS(obj: Record<string, any>, parentSelector: string = \"\"): void {\r\n if (!this.items || !this.parent) return;\r\n const basic: Record<string, any> = {};\r\n\r\n function getSelector(selector: string, prev: string): string {\r\n return selector.startsWith(\"&\")\r\n ? `${prev}${selector.slice(1)}`\r\n : `${prev} ${selector}`;\r\n }\r\n\r\n for (const selector in obj) {\r\n const value = obj[selector];\r\n let splitKeys = selectorSplitter(selector);\r\n for (let key of splitKeys) {\r\n const currentSelector = getSelector(key, parentSelector);\r\n if (/^@(container|layer|supports|media)\\b/.test(key)) {\r\n if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, parentSelector);\r\n this.items.push(rule);\r\n }\r\n } else if (key.startsWith(\"@keyframes\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, \"\");\r\n this.items.push(rule);\r\n } else if (key.startsWith(\"@font-face\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n for (const k in value) rule.insertStyle(k, value[k]);\r\n this.items.push(rule);\r\n } else if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(currentSelector, this.parent);\r\n this.items.push(rule);\r\n for (const [k, v] of Object.entries(value)) {\r\n if (typeof v === \"object\" && v != null) {\r\n let newSelector = getSelector(k, currentSelector);\r\n if (k.startsWith(\"&\")) {\r\n this.addCSS(v, newSelector);\r\n } else {\r\n const r = rule.styleList!.insertRule(newSelector);\r\n r.styleList!.addCSS(v, newSelector);\r\n }\r\n } else {\r\n rule.insertStyle(k, v);\r\n }\r\n }\r\n } else {\r\n basic[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if (Object.keys(basic).length) {\r\n const rule = new StyleRule(parentSelector, this.parent);\r\n for (const key in basic) rule.insertStyle(key, basic[key]);\r\n this.items.push(rule);\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.items) return \"\";\r\n return this.items.map((rule) => rule.cssText()).join(\"\");\r\n }\r\n\r\n insertRule(selector: string): StyleRule {\r\n if (!this.items || !this.parent) return null as any;\r\n let rule = this.items.find((rule) => rule.selectorText === selector);\r\n if (!rule) {\r\n rule = new StyleRule(selector, this.parent);\r\n this.items.push(rule);\r\n }\r\n return rule;\r\n }\r\n\r\n hydrate(domRuleMap: Map<string, CSSRule>): void {\r\n if (!this.items) return;\r\n for (const rule of this.items) {\r\n const domRule = domRuleMap.get(normalizeSelectorKey(rule.selectorText));\r\n if (domRule) rule.mount(domRule as CSSRule);\r\n }\r\n }\r\n\r\n mount(domRuleList: CSSRuleList): void {\r\n if (!this.items) return;\r\n if (!domRuleList) throw Error(\"Require domRuleList argument\");\r\n let wrongCount = 0;\r\n const fixOddEven = (css: string) => css.replace(\"(odd)\", \"(2n+1)\").replace(\"(even)\", \"(2n)\");\r\n\r\n this.items.forEach((rule, i) => {\r\n const index = i - wrongCount;\r\n const domRule = domRuleList[index];\r\n if (!domRule) return;\r\n if (rule.selectorText.startsWith(\"@\") && domRule instanceof CSSKeyframesRule) {\r\n rule.mount(domRule);\r\n } else if (\"keyText\" in domRule) {\r\n rule.mount(domRule);\r\n } else if (\"selectorText\" in domRule) {\r\n if (domRule.selectorText !== fixOddEven(rule.selectorText)) {\r\n wrongCount += 1;\r\n } else {\r\n rule.mount(domRule);\r\n }\r\n } else if (\"cssRules\" in domRule) {\r\n rule.mount(domRule as CSSMediaRule);\r\n }\r\n });\r\n }\r\n\r\n render(dom: HTMLStyleElement | CSSGroupingRule) {\r\n if (dom instanceof HTMLStyleElement) {\r\n this.domStyle = dom\r\n this.items.forEach((rule) => rule.render(dom.sheet!));\r\n } else if (dom instanceof CSSGroupingRule) {\r\n this.items.forEach((rule) => rule.render(dom));\r\n }\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.items) {\r\n for (let i = 0; i < this.items.length; i++) {\r\n this.items[i]._dispose();\r\n }\r\n }\r\n\r\n this.items = [];\r\n this.parent = null;\r\n this.domStyle = null;\r\n }\r\n}\r\n","import type { DomphyElement, EventName, HookMap, TagName, PartialElement } from \"../types.js\";\r\nimport { AttributeList } from \"./AttributeList.js\";\r\nimport { ElementList } from \"./ElementList.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\nimport { validate, mergePartial, getTagName, deepClone, ensureDomStyle, collectCSSRules } from \"../helpers.js\";\r\nimport { merge, hashString } from \"../utils.js\";\r\nimport { SvgTags, VoidTags } from \"../constants.js\"\r\n\r\nexport class ElementNode {\r\n _disposed = false\r\n _beforeRemoveFired = false\r\n type = \"ElementNode\"\r\n parent: ElementNode | null = null;\r\n _portal?: (root: ElementNode) => HTMLElement;\r\n tagName: TagName;\r\n children = new ElementList(this);\r\n styles = new StyleList(this);\r\n attributes = new AttributeList(this);\r\n domElement?: HTMLElement | null = null;\r\n _hooks: HookMap = {};\r\n _events?: { [K in EventName]?: (event: Event, node: ElementNode) => void } | null = null;\r\n _boundEvents = new Set<EventName>();\r\n _context?: Record<string, any> = {};\r\n _metadata?: Record<string, any> = {};\r\n key?: string | number | null = null;\r\n nodeId: string\r\n\r\n constructor(domphyElement: DomphyElement, _parent: ElementNode | null = null, index = 0) {\r\n domphyElement = deepClone(domphyElement)\r\n validate(domphyElement)\r\n domphyElement.style = domphyElement.style || {}\r\n this.parent = _parent;\r\n this.tagName = getTagName(domphyElement) as TagName;\r\n domphyElement = mergePartial(domphyElement) as DomphyElement\r\n\r\n this.key = (domphyElement as any)._key ?? null;\r\n this._context = domphyElement._context || {}\r\n this._metadata = domphyElement._metadata || {}\r\n\r\n let tempPath = `${this.parent?.nodeId}.${index}`\r\n const str = JSON.stringify(domphyElement.style || {}, (k, v) => typeof v === \"function\" ? tempPath : v,);\r\n this.nodeId = hashString(tempPath + str)\r\n\r\n this.attributes!.addClass(`${this.tagName}_${this.nodeId}`);\r\n if (domphyElement._onSchedule) domphyElement._onSchedule(this, domphyElement)\r\n\r\n this.merge(domphyElement)\r\n\r\n const children = (domphyElement as any)[this.tagName];\r\n\r\n if (children != null && children != undefined) {\r\n if (typeof children === \"function\") {\r\n\r\n let listener: any = () => {\r\n if (this._disposed) return\r\n let input = children(listener)\r\n this.children!.update(Array.isArray(input) ? input : [input])\r\n }\r\n\r\n listener!.elementNode = this;\r\n listener!.debug = `class:${this.tagName}_${this.nodeId} children`;\r\n listener!.onSubscribe = (release: () => void) => this.addHook(\"BeforeRemove\", () => {\r\n release()\r\n listener = null\r\n });\r\n listener && listener();\r\n } else {\r\n this.children!.update(Array.isArray(children) ? children : [children])\r\n }\r\n }\r\n this._hooks.Init && this._hooks.Init(this)\r\n }\r\n\r\n _createDOMNode() {\r\n const svgNamespace = \"http://www.w3.org/2000/svg\"\r\n let node = SvgTags.includes(this.tagName)\r\n ? document.createElementNS(svgNamespace, this.tagName)\r\n : document.createElement(this.tagName)\r\n\r\n this.domElement = node as HTMLElement\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n\r\n if (this.attributes) {\r\n Object.values(this.attributes.items!).forEach(attr => attr.render())\r\n }\r\n return node\r\n }\r\n\r\n // Bind a DOM listener that dispatches LIVE from this._events, so patch() can\r\n // swap the handler (e.g. a list item's onClick closure after its data changes)\r\n // without detaching/reattaching the DOM listener.\r\n _bindEvent(eventName: EventName): void {\r\n if (!this.domElement || this._boundEvents.has(eventName)) return\r\n this._boundEvents.add(eventName)\r\n let fn: any = (event: Event) => this._events?.[eventName]?.(event, this)\r\n this.domElement.addEventListener(eventName, fn)\r\n this.addHook(\"BeforeRemove\", (n) => {\r\n n.domElement?.removeEventListener(eventName, fn)\r\n fn = null\r\n })\r\n }\r\n\r\n _dispose(): void {\r\n if (this._disposed) return\r\n this._disposed = true\r\n\r\n // Fire BeforeRemove so reactive-listener releases (registered as BeforeRemove\r\n // hooks via onSubscribe) actually run for this node. Descendants are torn\r\n // down through this recursive _dispose — not through ElementList.remove — so\r\n // without this their subscriptions to long-lived State/RecordState leak.\r\n // Skip if the async-removal path in ElementList already fired it.\r\n if (!this._beforeRemoveFired) {\r\n this._beforeRemoveFired = true\r\n this._hooks.BeforeRemove?.(this, () => { })\r\n }\r\n\r\n if (this.children) {\r\n this.children._dispose();\r\n }\r\n\r\n if (this.styles) {\r\n this.styles.items!.forEach((rule) => rule.remove());\r\n this.styles._dispose();\r\n }\r\n\r\n if (this.attributes) {\r\n this.attributes._dispose();\r\n }\r\n\r\n // _onRemove fires for every node in the subtree, not just the directly-removed one.\r\n this._hooks.Remove?.(this)\r\n\r\n this.domElement = null;\r\n this._hooks = {};\r\n this._events = null;\r\n this._context = {};\r\n this._metadata = {};\r\n this.parent = null;\r\n }\r\n merge(part: PartialElement) {\r\n merge(this._context, part._context)\r\n merge(this._metadata, part._metadata)\r\n\r\n const keys = Object.keys(part)\r\n for (let i = 0; i < keys.length; i++) {\r\n const originalKey = keys[i];\r\n const value = (part as any)[originalKey];\r\n if ([\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName].includes(originalKey)) {\r\n continue\r\n } else if ([\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"].includes(originalKey)) {\r\n this.addHook(originalKey.substring(3) as keyof HookMap, value);\r\n } else if (originalKey.startsWith(\"on\")) {\r\n this.addEvent(originalKey.substring(2).toLowerCase() as EventName, value);\r\n } else if (originalKey == \"_portal\") {\r\n this._portal = value\r\n } else if (originalKey == \"class\" && typeof value === \"string\") {\r\n this.attributes!.addClass(value);\r\n } else {\r\n this.attributes!.set(originalKey, value);\r\n }\r\n }\r\n if (part.style) {\r\n this.styles.addCSS(part.style || {}, `.${`${this.tagName}_${this.nodeId}`}`);\r\n }\r\n\r\n }\r\n\r\n // Update this live node IN PLACE from a fresh element description, preserving\r\n // its DOM element (and thus focus/scroll/selection/uncontrolled value) and its\r\n // children's identity. Used by list reconciliation to reuse a node by key\r\n // (keyed) or position (unkeyed) while reflecting new data, instead of\r\n // destroying and recreating the DOM. Styles and lifecycle hooks are NOT\r\n // re-applied (reused items share structure; hooks already ran). Reactive\r\n // content (a function child) keeps its own listener and is left untouched.\r\n patch(rawElement: DomphyElement): void {\r\n let element: any = deepClone(rawElement)\r\n element.style = element.style || {}\r\n element = mergePartial(element)\r\n\r\n // Children / content — recurse so grandchildren are reused/patched too.\r\n const content = element[this.tagName]\r\n if (typeof content !== \"function\") {\r\n const next = content == null ? [] : Array.isArray(content) ? content : [content]\r\n this.children.update(next, !!this.domElement, true)\r\n }\r\n\r\n if (element._context) merge(this._context, element._context)\r\n if (element._metadata) merge(this._metadata, element._metadata)\r\n\r\n // Rebuild attributes and events. Events are replaced (live dispatch in\r\n // _bindEvent reads this._events, so swapping the map is enough); attributes\r\n // present before but absent now are removed; the auto scope class is kept.\r\n const autoClass = `${this.tagName}_${this.nodeId}`\r\n const reserved = [\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName]\r\n const hookKeys = [\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"]\r\n const keep = new Set<string>([\"class\"])\r\n let userClass: string | null = null\r\n\r\n this._events = {}\r\n for (const key of Object.keys(element)) {\r\n if (reserved.includes(key) || hookKeys.includes(key) || key === \"_portal\") continue\r\n const value = element[key]\r\n if (key.startsWith(\"on\") && typeof value === \"function\") {\r\n this.addEvent(key.substring(2).toLowerCase() as EventName, value)\r\n } else if (key === \"class\" && typeof value === \"string\") {\r\n userClass = value\r\n } else {\r\n this.attributes!.set(key, value)\r\n keep.add(key)\r\n }\r\n }\r\n\r\n this.attributes!.set(\"class\", userClass ? `${autoClass} ${userClass}` : autoClass)\r\n\r\n if (this.attributes!.items) {\r\n for (const name of Object.keys(this.attributes!.items)) {\r\n if (!keep.has(name)) this.attributes!.remove(name)\r\n }\r\n }\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n }\r\n\r\n addEvent(name: EventName, callback: (event: Event, node: ElementNode) => void): void {\r\n\r\n this._events = this._events || {}\r\n\r\n let current = this._events[name]\r\n if (typeof current == \"function\") {\r\n this._events[name] = (event: Event, node: ElementNode) => {\r\n current!(event, node)\r\n callback(event, node)\r\n }\r\n } else {\r\n this._events[name] = callback\r\n }\r\n }\r\n\r\n addHook<K extends keyof HookMap>(name: K, callback: HookMap[K]): void {\r\n const current = this._hooks[name];\r\n\r\n if (typeof current === \"function\") {\r\n const composed = ((...args: any[]) => {\r\n (current as Function)(...args);\r\n (callback as Function)(...args);\r\n }) as HookMap[K];\r\n // Preserve the maximum declared arity across composed hooks. Removal logic\r\n // inspects BeforeRemove.length (>= 2 means the hook owns `done()`, e.g. an\r\n // exit animation); a naive (...args) wrapper would report 0 and break that.\r\n try {\r\n Object.defineProperty(composed, \"length\", {\r\n value: Math.max((current as Function).length, (callback as Function).length),\r\n configurable: true,\r\n });\r\n } catch { /* length non-configurable on some engines — best effort */ }\r\n this._hooks[name] = composed;\r\n } else {\r\n this._hooks[name] = callback;\r\n }\r\n }\r\n getRoot(): ElementNode {\r\n let root: ElementNode = this;\r\n while (root && root instanceof ElementNode && root.parent) {\r\n root = root.parent;\r\n }\r\n return root\r\n }\r\n\r\n getContext(name: string): any {\r\n let node: ElementNode | null = this;\r\n while (node && (!node._context || !Object.prototype.hasOwnProperty.call(node._context, name))) {\r\n node = node.parent;\r\n }\r\n return node && node._context ? node._context[name] : undefined;\r\n }\r\n\r\n setContext(name: string, value: any) {\r\n this._context = this._context || {}\r\n this._context[name] = value;\r\n }\r\n\r\n getMetadata(name: string): any {\r\n return this._metadata ? this._metadata[name] : undefined;\r\n }\r\n\r\n setMetadata(key: string, value: any) {\r\n this._metadata = this._metadata || {}\r\n this._metadata[key] = value;\r\n\r\n }\r\n\r\n generateCSS(): string {\r\n if (!this.styles || !this.children) return \"\";\r\n let css = this.styles.cssText()\r\n css += this.children.items.map(child => child instanceof ElementNode ? child.generateCSS() : \"\").join(\"\")\r\n return css\r\n }\r\n\r\n generateHTML(): string {\r\n if (!this.children || !this.attributes) return \"\";\r\n const attributes = this.attributes.generateHTML();\r\n // Void elements must not emit a closing tag — `<br></br>` is parsed by the\r\n // HTML tokenizer as two <br>, which corrupts hydration child alignment.\r\n if ((VoidTags as readonly string[]).includes(this.tagName)) {\r\n return `<${this.tagName}${attributes}>`;\r\n }\r\n const content = this.children.generateHTML();\r\n return `<${this.tagName}${attributes}>${content}</${this.tagName}>`;\r\n }\r\n\r\n mount(domElement: HTMLElement, domStyle?: HTMLStyleElement): void {\r\n if (!domElement) throw new Error(\"Missing dom node on bind\");\r\n this.domElement = domElement;\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n\r\n if (this.children) {\r\n this.children.items.forEach((child, i) => {\r\n const childNode = domElement.childNodes[i];\r\n if (!childNode) return;\r\n if (child instanceof ElementNode) {\r\n child.mount(childNode as HTMLElement);\r\n } else {\r\n // Bind the server-rendered text/inline-HTML node so that reactive\r\n // child updates after hydration can locate and replace it.\r\n child.domText = childNode;\r\n }\r\n });\r\n }\r\n\r\n // Attach reactive style declarations to the server-rendered stylesheet so\r\n // post-hydration updates mutate the existing CSSOM rules instead of being\r\n // silently dropped (StyleProperty._domUpdate needs a bound domRule). Done\r\n // once from the call that received the style element, walking the whole\r\n // subtree because per-node selectors are globally unique.\r\n if (domStyle) {\r\n const sheet = domStyle.sheet;\r\n if (sheet) this._hydrateStyles(collectCSSRules(sheet.cssRules, new Map()));\r\n }\r\n\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n }\r\n\r\n _hydrateStyles(domRuleMap: Map<string, CSSRule>): void {\r\n this.styles?.hydrate(domRuleMap);\r\n if (this.children) {\r\n for (const child of this.children.items) {\r\n if (child instanceof ElementNode) child._hydrateStyles(domRuleMap);\r\n }\r\n }\r\n }\r\n\r\n render(domElement: HTMLElement | SVGElement | DocumentFragment): HTMLElement | SVGElement {\r\n const newNode = this._createDOMNode();\r\n domElement.appendChild(newNode)\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n let domStyle = this.getRoot().styles.domStyle\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n domStyle ||= ensureDomStyle(styleParent)\r\n this.styles.render(domStyle as HTMLStyleElement)\r\n this.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(this.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(newNode)\r\n }\r\n })\r\n return newNode;\r\n }\r\n\r\n remove() {\r\n if (this.parent) {\r\n this.parent.children.remove(this)\r\n } else {\r\n // Root removal must also run BeforeRemove/Remove (and release reactive\r\n // subscriptions across the whole tree via _dispose), honoring async done().\r\n const done = () => {\r\n this.domElement?.remove()\r\n this._dispose()\r\n }\r\n if (this._hooks.BeforeRemove && this.domElement) {\r\n let called = false\r\n const once = () => { if (!called) { called = true; done() } }\r\n this._beforeRemoveFired = true\r\n this._hooks.BeforeRemove(this, once)\r\n if ((this._hooks.BeforeRemove as Function).length < 2 && !called) once()\r\n } else {\r\n done()\r\n }\r\n }\r\n }\r\n}\r\n","import { Notifier } from \"./Notifier.js\"\r\n\r\ntype Listener = (...args: any[]) => void\r\n\r\nexport class RecordState<T extends Record<string, any> = Record<string, any>> {\r\n private _notifier = new Notifier()\r\n private _record: T\r\n readonly initialRecord: T\r\n\r\n constructor(record: T) {\r\n this.initialRecord = { ...record }\r\n this._record = { ...record }\r\n }\r\n\r\n get<K extends keyof T>(key: K, l?: Listener): T[K] {\r\n if (l) this._notifier.addListener(key as string, l)\r\n return this._record[key]\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n this._record[key] = value\r\n this._notifier.notify(key as string)\r\n }\r\n\r\n addListener<K extends keyof T>(key: K, fn: Listener): () => void {\r\n return this._notifier.addListener(key as string, fn)\r\n }\r\n\r\n removeListener<K extends keyof T>(key: K, fn: Listener): void {\r\n this._notifier.removeListener(key as string, fn)\r\n }\r\n\r\n reset<K extends keyof T>(key: K): void {\r\n this.set(key, this.initialRecord[key])\r\n }\r\n\r\n _dispose(): void {\r\n this._notifier._dispose()\r\n }\r\n}\r\n","import type { LoaderContext, MetadataValue } from \"./types.js\";\n\n/**\n * Port of the Next.js Metadata API. Static objects merge from root layout to\n * page; later segments override earlier ones. `title.template` applies to the\n * titles of child segments, exactly like Next.js.\n */\n\nexport interface MetadataTitle {\n default?: string;\n template?: string;\n absolute?: string;\n}\n\nexport interface OpenGraphImage {\n url: string;\n width?: number;\n height?: number;\n alt?: string;\n}\n\nexport interface OpenGraphMetadata {\n title?: string;\n description?: string;\n url?: string;\n siteName?: string;\n type?: string;\n locale?: string;\n images?: (string | OpenGraphImage)[];\n}\n\nexport interface TwitterMetadata {\n card?: \"summary\" | \"summary_large_image\" | \"app\" | \"player\";\n title?: string;\n description?: string;\n site?: string;\n creator?: string;\n images?: string[];\n}\n\nexport interface RobotsMetadata {\n index?: boolean;\n follow?: boolean;\n noarchive?: boolean;\n nosnippet?: boolean;\n noimageindex?: boolean;\n}\n\nexport interface IconsMetadata {\n icon?: string;\n shortcut?: string;\n apple?: string;\n}\n\nexport interface AlternatesMetadata {\n canonical?: string;\n languages?: Record<string, string>;\n}\n\nexport interface Metadata {\n title?: string | MetadataTitle;\n description?: string;\n applicationName?: string;\n generator?: string;\n keywords?: string[];\n authors?: { name: string; url?: string }[];\n referrer?: string;\n themeColor?: string;\n colorScheme?: string;\n viewport?: string;\n robots?: string | RobotsMetadata;\n icons?: string | IconsMetadata;\n openGraph?: OpenGraphMetadata;\n twitter?: TwitterMetadata;\n alternates?: AlternatesMetadata;\n metadataBase?: string;\n /** Arbitrary extra meta tags: name -> content. */\n other?: Record<string, string>;\n}\n\nexport interface ResolvedMetadata extends Omit<Metadata, \"title\"> {\n title?: string;\n}\n\nexport interface HeadTag {\n tag: \"title\" | \"meta\" | \"link\";\n attributes: Record<string, string>;\n content?: string;\n}\n\n/** Resolves the metadata chain of all matched segments into one flat object. */\nexport async function resolveMetadata(\n values: (MetadataValue | undefined)[],\n context: LoaderContext,\n): Promise<ResolvedMetadata> {\n const resolved: ResolvedMetadata = {};\n let template: string | null = null;\n\n for (const value of values) {\n if (!value) continue;\n const metadata = typeof value === \"function\" ? await value(context) : value;\n\n for (const key of Object.keys(metadata) as (keyof Metadata)[]) {\n if (key === \"title\") continue;\n const entry = metadata[key];\n if (entry !== undefined) {\n (resolved as Record<string, unknown>)[key] = entry;\n }\n }\n\n const title = metadata.title;\n if (title === undefined) continue;\n if (typeof title === \"string\") {\n resolved.title = template ? template.replace(\"%s\", title) : title;\n continue;\n }\n if (title.absolute !== undefined) {\n resolved.title = title.absolute;\n } else if (title.default !== undefined) {\n resolved.title = template\n ? template.replace(\"%s\", title.default)\n : title.default;\n }\n if (title.template !== undefined) {\n template = title.template;\n }\n }\n\n return resolved;\n}\n\nfunction absoluteUrl(url: string, base: string | undefined): string {\n if (!base || /^[a-z][a-z0-9+.-]*:/i.test(url)) return url;\n return new URL(url, base).toString();\n}\n\nfunction robotsContent(robots: string | RobotsMetadata): string {\n if (typeof robots === \"string\") return robots;\n const directives: string[] = [];\n directives.push(robots.index === false ? \"noindex\" : \"index\");\n directives.push(robots.follow === false ? \"nofollow\" : \"follow\");\n if (robots.noarchive) directives.push(\"noarchive\");\n if (robots.nosnippet) directives.push(\"nosnippet\");\n if (robots.noimageindex) directives.push(\"noimageindex\");\n return directives.join(\", \");\n}\n\n/** Converts resolved metadata into a flat list of head tag descriptions. */\nexport function metadataToHeadTags(metadata: ResolvedMetadata): HeadTag[] {\n const tags: HeadTag[] = [];\n const base = metadata.metadataBase;\n const meta = (name: string, content: string | undefined) => {\n if (content !== undefined)\n tags.push({ tag: \"meta\", attributes: { name, content } });\n };\n const property = (name: string, content: string | undefined) => {\n if (content !== undefined) {\n tags.push({ tag: \"meta\", attributes: { property: name, content } });\n }\n };\n\n if (metadata.title !== undefined) {\n tags.push({ tag: \"title\", attributes: {}, content: metadata.title });\n }\n meta(\"description\", metadata.description);\n meta(\"application-name\", metadata.applicationName);\n meta(\"generator\", metadata.generator);\n meta(\"keywords\", metadata.keywords?.join(\", \"));\n meta(\"referrer\", metadata.referrer);\n meta(\"theme-color\", metadata.themeColor);\n meta(\"color-scheme\", metadata.colorScheme);\n meta(\"viewport\", metadata.viewport);\n if (metadata.robots !== undefined)\n meta(\"robots\", robotsContent(metadata.robots));\n for (const author of metadata.authors ?? []) {\n meta(\"author\", author.name);\n if (author.url) {\n tags.push({\n tag: \"link\",\n attributes: { rel: \"author\", href: author.url },\n });\n }\n }\n\n if (metadata.icons !== undefined) {\n const icons =\n typeof metadata.icons === \"string\"\n ? { icon: metadata.icons }\n : metadata.icons;\n if (icons.icon)\n tags.push({ tag: \"link\", attributes: { rel: \"icon\", href: icons.icon } });\n if (icons.shortcut) {\n tags.push({\n tag: \"link\",\n attributes: { rel: \"shortcut icon\", href: icons.shortcut },\n });\n }\n if (icons.apple) {\n tags.push({\n tag: \"link\",\n attributes: { rel: \"apple-touch-icon\", href: icons.apple },\n });\n }\n }\n\n const openGraph = metadata.openGraph;\n if (openGraph) {\n property(\"og:title\", openGraph.title ?? metadata.title);\n property(\"og:description\", openGraph.description ?? metadata.description);\n property(\n \"og:url\",\n openGraph.url ? absoluteUrl(openGraph.url, base) : undefined,\n );\n property(\"og:site_name\", openGraph.siteName);\n property(\"og:type\", openGraph.type);\n property(\"og:locale\", openGraph.locale);\n for (const image of openGraph.images ?? []) {\n const value = typeof image === \"string\" ? { url: image } : image;\n property(\"og:image\", absoluteUrl(value.url, base));\n if (value.width !== undefined)\n property(\"og:image:width\", String(value.width));\n if (value.height !== undefined)\n property(\"og:image:height\", String(value.height));\n if (value.alt !== undefined) property(\"og:image:alt\", value.alt);\n }\n }\n\n const twitter = metadata.twitter;\n if (twitter) {\n meta(\"twitter:card\", twitter.card ?? \"summary\");\n meta(\"twitter:title\", twitter.title ?? metadata.title);\n meta(\"twitter:description\", twitter.description ?? metadata.description);\n meta(\"twitter:site\", twitter.site);\n meta(\"twitter:creator\", twitter.creator);\n for (const image of twitter.images ?? []) {\n meta(\"twitter:image\", absoluteUrl(image, base));\n }\n }\n\n const alternates = metadata.alternates;\n if (alternates) {\n if (alternates.canonical) {\n tags.push({\n tag: \"link\",\n attributes: {\n rel: \"canonical\",\n href: absoluteUrl(alternates.canonical, base),\n },\n });\n }\n for (const language of Object.keys(alternates.languages ?? {})) {\n tags.push({\n tag: \"link\",\n attributes: {\n rel: \"alternate\",\n hreflang: language,\n href: absoluteUrl(\n (alternates.languages as Record<string, string>)[language],\n base,\n ),\n },\n });\n }\n }\n\n for (const name of Object.keys(metadata.other ?? {})) {\n meta(name, (metadata.other as Record<string, string>)[name]);\n }\n\n return tags;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\");\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\");\n}\n\n/** Serializes head tags for server rendering. */\nexport function renderHeadTags(tags: HeadTag[]): string {\n return tags\n .map((tag) => {\n const attributes = Object.keys(tag.attributes)\n .map((name) => ` ${name}=\"${escapeAttribute(tag.attributes[name])}\"`)\n .join(\"\");\n if (tag.tag === \"title\") {\n return `<title>${escapeText(tag.content ?? \"\")}</title>`;\n }\n return `<${tag.tag}${attributes}>`;\n })\n .join(\"\\n\");\n}\n\nconst MANAGED_ATTRIBUTE = \"data-domphy-head\";\n\n/** Applies head tags to `document.head`, replacing tags from the previous navigation. */\nexport function applyHeadTags(tags: HeadTag[]): void {\n if (typeof document === \"undefined\") return;\n\n for (const element of Array.from(\n document.head.querySelectorAll(`[${MANAGED_ATTRIBUTE}]`),\n )) {\n element.remove();\n }\n\n for (const tag of tags) {\n if (tag.tag === \"title\") {\n document.title = tag.content ?? \"\";\n continue;\n }\n const element = document.createElement(tag.tag);\n for (const name of Object.keys(tag.attributes)) {\n element.setAttribute(name, tag.attributes[name]);\n }\n element.setAttribute(MANAGED_ATTRIBUTE, \"\");\n document.head.appendChild(element);\n }\n}\n","import { Notifier } from \"@domphy/core\";\nimport type { Loader, LoaderContext } from \"./types.js\";\n\ninterface CacheEntry {\n data: unknown;\n timestamp: number;\n /** Entries seeded from SSR or prefetch are consumed once even by uncached loaders. */\n consumable: boolean;\n}\n\n/** How long a prefetched entry stays usable, mirrors the Next.js client router cache. */\nexport const PREFETCH_LIFETIME = 30_000;\n\n/**\n * Loader result cache. The `revalidate` option of a route controls the entry\n * lifetime, the equivalent of fetch caching / ISR in Next.js.\n */\nexport class DataCache {\n private entries = new Map<string, CacheEntry>();\n private inflight = new Map<string, Promise<unknown>>();\n private notifier = new Notifier();\n /** Stale entries served this render, queued for background refetch after commit. */\n private pending = new Map<string, () => void>();\n\n /**\n * Subscribes to background revalidation. Fires with the entry key once a\n * stale-while-revalidate refetch lands fresh data, so the router can re-render\n * the route that served the stale value.\n */\n onRevalidated(callback: (key: string) => void): () => void {\n return this.notifier.addListener(\"revalidated\", callback);\n }\n\n /** Seeds entries (from SSR payloads) that satisfy the next load exactly once. */\n seed(record: Record<string, unknown>): void {\n for (const key of Object.keys(record)) {\n this.entries.set(key, {\n data: record[key],\n timestamp: Date.now(),\n consumable: true,\n });\n }\n }\n\n snapshot(keys: string[]): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n for (const key of keys) {\n const entry = this.entries.get(key);\n if (entry) record[key] = entry.data;\n }\n return record;\n }\n\n invalidate(prefix?: string): void {\n if (prefix === undefined) {\n this.entries.clear();\n return;\n }\n for (const key of this.entries.keys()) {\n if (key.startsWith(prefix)) this.entries.delete(key);\n }\n }\n\n async load(\n key: string,\n loader: Loader,\n context: LoaderContext,\n revalidate: number | undefined,\n ): Promise<unknown> {\n const entry = this.entries.get(key);\n if (entry) {\n const lifetime = revalidate !== undefined ? revalidate * 1000 : 0;\n const fresh = Date.now() - entry.timestamp <= lifetime;\n const usableSeed =\n entry.consumable && Date.now() - entry.timestamp <= PREFETCH_LIFETIME;\n if (fresh || usableSeed) {\n if (entry.consumable && !fresh) this.entries.delete(key);\n return entry.data;\n }\n // Stale-while-revalidate: a cached (revalidate > 0) entry that aged out is\n // served immediately and queued for a background refetch. The refetch is\n // deferred until `flushRevalidations()` (called after the current render\n // commits) so `onRevalidated` fires against the committed route.\n if (revalidate !== undefined && revalidate > 0) {\n this.pending.set(key, () => this.revalidate(key, loader, context));\n return entry.data;\n }\n this.entries.delete(key);\n }\n\n const pending = this.inflight.get(key);\n if (pending) return pending;\n\n const promise = Promise.resolve(loader(context)).then(\n (data) => {\n this.inflight.delete(key);\n if (revalidate !== undefined && revalidate > 0) {\n this.entries.set(key, {\n data,\n timestamp: Date.now(),\n consumable: false,\n });\n }\n return data;\n },\n (error) => {\n this.inflight.delete(key);\n throw error;\n },\n );\n this.inflight.set(key, promise);\n return promise;\n }\n\n /** Starts the background refetch for every stale entry served by the last render. */\n flushRevalidations(): void {\n if (this.pending.size === 0) return;\n const thunks = [...this.pending.values()];\n this.pending.clear();\n for (const thunk of thunks) thunk();\n }\n\n /** Background refetch for stale-while-revalidate; updates the entry and notifies on success. */\n private revalidate(\n key: string,\n loader: Loader,\n context: LoaderContext,\n ): void {\n if (this.inflight.has(key)) return;\n const promise = Promise.resolve(loader(context)).then(\n (data) => {\n this.inflight.delete(key);\n this.entries.set(key, {\n data,\n timestamp: Date.now(),\n consumable: false,\n });\n this.notifier.notify(\"revalidated\", key);\n return data;\n },\n (error) => {\n // Keep the stale entry on failure; revalidation errors are silent.\n this.inflight.delete(key);\n throw error;\n },\n );\n // Swallow rejection here so the background refetch never becomes an\n // unhandled rejection; the stale entry simply remains.\n promise.catch(() => {});\n this.inflight.set(key, promise);\n }\n\n /** Runs the loader ahead of navigation and stores the result as a one-shot entry. */\n async prefetch(\n key: string,\n loader: Loader,\n context: LoaderContext,\n revalidate: number | undefined,\n ): Promise<void> {\n if (revalidate !== undefined) {\n await this.load(key, loader, context, revalidate);\n return;\n }\n const existing = this.entries.get(key);\n if (existing && Date.now() - existing.timestamp <= PREFETCH_LIFETIME)\n return;\n if (this.inflight.has(key)) return;\n const data = await loader(context);\n this.entries.set(key, { data, timestamp: Date.now(), consumable: true });\n }\n}\n","/**\n * Minimal history abstraction so the router runs against the real browser\n * history, an in-memory stack (tests, embedded demos) or nothing at all (SSR).\n */\n\nexport interface HistoryAdapter {\n url(): URL;\n push(url: string): void;\n replace(url: string): void;\n go(delta: number): void;\n /** Subscribes to external navigation (popstate / memory go). Returns a release function. */\n listen(callback: (url: URL) => void): () => void;\n /** Saves and restores scroll positions per history entry. */\n saveScroll?(position: { x: number; y: number }): void;\n readScroll?(): { x: number; y: number } | null;\n}\n\ninterface BrowserHistoryState {\n __domphyIndex: number;\n}\n\nexport function createBrowserHistory(): HistoryAdapter {\n const scrollPositions = new Map<number, { x: number; y: number }>();\n let index =\n (window.history.state as BrowserHistoryState | null)?.__domphyIndex ?? 0;\n if (window.history.state?.__domphyIndex === undefined) {\n window.history.replaceState({ __domphyIndex: index }, \"\");\n }\n if (\"scrollRestoration\" in window.history) {\n window.history.scrollRestoration = \"manual\";\n }\n\n return {\n url: () => new URL(window.location.href),\n push: (url) => {\n index++;\n window.history.pushState({ __domphyIndex: index }, \"\", url);\n },\n replace: (url) => {\n window.history.replaceState({ __domphyIndex: index }, \"\", url);\n },\n go: (delta) => window.history.go(delta),\n listen: (callback) => {\n const handler = () => {\n index =\n (window.history.state as BrowserHistoryState | null)?.__domphyIndex ??\n 0;\n callback(new URL(window.location.href));\n };\n window.addEventListener(\"popstate\", handler);\n return () => window.removeEventListener(\"popstate\", handler);\n },\n saveScroll: (position) => scrollPositions.set(index, position),\n readScroll: () => scrollPositions.get(index) ?? null,\n };\n}\n\nconst MEMORY_ORIGIN = \"http://localhost\";\n\nexport function createMemoryHistory(initial = \"/\"): HistoryAdapter {\n const stack: string[] = [initial];\n let index = 0;\n const listeners = new Set<(url: URL) => void>();\n\n return {\n url: () => new URL(stack[index], MEMORY_ORIGIN),\n push: (url) => {\n stack.splice(index + 1);\n stack.push(url);\n index++;\n },\n replace: (url) => {\n stack[index] = url;\n },\n go: (delta) => {\n const next = Math.min(Math.max(index + delta, 0), stack.length - 1);\n if (next === index) return;\n index = next;\n const url = new URL(stack[index], MEMORY_ORIGIN);\n for (const listener of listeners) listener(url);\n },\n listen: (callback) => {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n}\n","import type { DomphyElement } from \"@domphy/core\";\nimport type { RouteMatch } from \"./matcher.js\";\nimport type {\n ErrorBlock,\n NotFoundBlock,\n RouteContext,\n RouterStatus,\n} from \"./types.js\";\n\nexport type SegmentStatus = \"success\" | \"pending\" | \"error\" | \"notfound\";\n\nexport interface SegmentResult {\n status: SegmentStatus;\n data?: unknown;\n error?: Error;\n}\n\nexport interface BuildTreeInput {\n match: RouteMatch;\n baseContext: Omit<RouteContext, \"data\" | \"segmentData\">;\n results: SegmentResult[];\n retry: () => void;\n defaultError: ErrorBlock;\n defaultNotFound: NotFoundBlock;\n /** Rendered parallel-route slots per chain index, passed to that segment's layout. */\n slots?: Record<number, Record<string, DomphyElement>>;\n}\n\nexport interface BuiltTree {\n element: DomphyElement;\n status: RouterStatus;\n}\n\nexport function defaultErrorBlock(error: Error): DomphyElement {\n return {\n div: [{ h2: \"Application error\" }, { p: error.message }],\n };\n}\n\nexport function defaultNotFoundBlock(): DomphyElement {\n return {\n div: [{ h2: \"404\" }, { p: \"This page could not be found.\" }],\n };\n}\n\nfunction findBoundary(results: SegmentResult[], status: SegmentStatus): number {\n return results.findIndex((result) => result.status === status);\n}\n\n/**\n * Composes the matched chain into one element: page wrapped by every layout,\n * exactly like nested `layout.tsx` files. When a segment failed, is pending or\n * raised `notFound()`, the subtree below the nearest boundary block (`error`,\n * `loading`, `notFound`) is replaced by that block while ancestor layouts keep\n * rendering — the same boundary model as the Next.js App Router.\n */\nexport function buildTree(input: BuildTreeInput): BuiltTree {\n const { match, baseContext, results, retry, defaultError, defaultNotFound } =\n input;\n const { chain, chainIds } = match.route;\n\n const segmentData: Record<string, unknown> = {};\n for (let i = 0; i < chain.length; i++) {\n segmentData[chainIds[i]] = results[i]?.data;\n }\n const contexts: RouteContext[] = chain.map((_, i) => ({\n ...baseContext,\n data: results[i]?.data,\n segmentData,\n }));\n\n const errorIndex = findBoundary(results, \"error\");\n const notFoundIndex = findBoundary(results, \"notfound\");\n const pendingIndex = findBoundary(results, \"pending\");\n\n let inner: DomphyElement;\n let wrapLimit: number;\n let status: RouterStatus;\n\n if (errorIndex !== -1) {\n const blockIndex = nearestBlockIndex(chain, errorIndex, (route) =>\n Boolean(route.error),\n );\n const block =\n blockIndex === -1\n ? defaultError\n : (chain[blockIndex].error as ErrorBlock);\n inner = block(results[errorIndex].error as Error, retry);\n inner._key = `${chainIds[Math.max(blockIndex, 0)]}:error`;\n wrapLimit = Math.min(blockIndex, errorIndex - 1);\n status = \"error\";\n } else if (notFoundIndex !== -1) {\n const blockIndex = nearestBlockIndex(chain, notFoundIndex, (route) =>\n Boolean(route.notFound),\n );\n const block =\n blockIndex === -1\n ? defaultNotFound\n : (chain[blockIndex].notFound as NotFoundBlock);\n inner = block();\n inner._key = `${chainIds[Math.max(blockIndex, 0)]}:notfound`;\n wrapLimit = Math.min(blockIndex, notFoundIndex - 1);\n status = \"notfound\";\n } else if (pendingIndex !== -1) {\n const blockIndex = nearestBlockIndex(chain, pendingIndex, (route) =>\n Boolean(route.loading),\n );\n if (blockIndex === -1) {\n // No loading block anywhere: caller keeps the previous tree on screen.\n return { element: { div: \"\" }, status: \"loading\" };\n }\n inner = chain[blockIndex].loading!(contexts[blockIndex]);\n inner._key = `${chainIds[blockIndex]}:loading`;\n wrapLimit = Math.min(blockIndex, pendingIndex - 1);\n status = \"loading\";\n } else {\n const leaf = chain[chain.length - 1];\n inner = leaf.page!(contexts[chain.length - 1]);\n inner._key = `${match.route.id}:page`;\n wrapLimit = chain.length - 1;\n status = \"idle\";\n }\n\n let element = inner;\n for (let i = wrapLimit; i >= 0; i--) {\n const layout = chain[i].layout;\n if (!layout) continue;\n element = layout(element, contexts[i], input.slots?.[i] ?? {});\n if (element._key === undefined) element._key = `${chainIds[i]}:layout`;\n }\n\n return { element, status };\n}\n\nfunction nearestBlockIndex(\n chain: BuildTreeInput[\"match\"][\"route\"][\"chain\"],\n fromIndex: number,\n predicate: (\n route: BuildTreeInput[\"match\"][\"route\"][\"chain\"][number],\n ) => boolean,\n): number {\n for (let i = fromIndex; i >= 0; i--) {\n if (predicate(chain[i])) return i;\n }\n return -1;\n}\n\n/** Wraps a bare not-found block with the root layouts of a match-less render. */\nexport function buildNotFoundTree(block: NotFoundBlock): BuiltTree {\n const element = block();\n if (element._key === undefined) element._key = \"app:notfound\";\n return { element, status: \"notfound\" };\n}\n","import {\n type DomphyElement,\n Notifier,\n RecordState,\n type State,\n toState,\n} from \"@domphy/core\";\nimport { DataCache } from \"./dataCache.js\";\nimport { createBrowserHistory, type HistoryAdapter } from \"./history.js\";\nimport {\n type CompiledRoute,\n compileRoutes,\n matchRoute,\n matchRouteSuffix,\n type RouteMatch,\n urlPartCount,\n} from \"./matcher.js\";\nimport {\n applyHeadTags,\n metadataToHeadTags,\n renderHeadTags,\n type ResolvedMetadata,\n resolveMetadata,\n} from \"./metadata.js\";\nimport { isRewrite, NotFoundSignal, RedirectSignal } from \"./navigation.js\";\nimport {\n buildNotFoundTree,\n buildTree,\n defaultErrorBlock,\n defaultNotFoundBlock,\n type SegmentResult,\n} from \"./tree.js\";\nimport type {\n ErrorBlock,\n LoaderContext,\n Middleware,\n NavigateOptions,\n NotFoundBlock,\n Route,\n RouterEventName,\n RouterStateRecord,\n} from \"./types.js\";\n\nexport interface RouterOptions {\n /** Defaults to the browser history in a DOM environment, otherwise none (SSR). */\n history?: HistoryAdapter | null;\n /** Global middleware, the equivalent of `middleware.ts`. */\n middleware?: Middleware[];\n /** App-level not-found block, the equivalent of the root `not-found.tsx`. */\n notFound?: NotFoundBlock;\n /** App-level error block, the equivalent of `global-error.tsx`. */\n error?: ErrorBlock;\n /** Request headers, forwarded to loaders and middleware during server rendering. */\n headers?: Headers;\n}\n\ninterface TransitionOptions {\n replace?: boolean;\n scroll?: boolean;\n fromHistory?: boolean;\n initial?: boolean;\n}\n\nlet defaultRouter: AppRouter | null = null;\n\n/** The most recently created router, used by `navLink` when no router is passed explicitly. */\nexport function getRouter(): AppRouter {\n if (!defaultRouter) {\n throw new Error(\n \"No router created yet. Call createApp() or new AppRouter() first.\",\n );\n }\n return defaultRouter;\n}\n\nexport class AppRouter {\n readonly routes: CompiledRoute[];\n readonly state: RecordState<RouterStateRecord>;\n readonly tree: State<DomphyElement>;\n readonly events = new Notifier();\n readonly cache = new DataCache();\n\n private history: HistoryAdapter | null;\n private middleware: Middleware[];\n private notFoundBlock: NotFoundBlock;\n private errorBlock: ErrorBlock;\n private headers?: Headers;\n private navigationToken = 0;\n private releaseHistory: (() => void) | null = null;\n private currentMatch: RouteMatch | null = null;\n /** Cache keys backing the current render, used to drive stale-while-revalidate re-renders. */\n private currentRenderKeys = new Set<string>();\n /** Per-route compiled parallel-route slots: hard (no interception) and soft (with). */\n private slotCompiled = new Map<\n Route,\n Record<string, { soft: CompiledRoute[]; hard: CompiledRoute[] }>\n >();\n /** Metadata resolved for the current route, exposed for server rendering. */\n metadata: ResolvedMetadata = {};\n /** The last redirect followed during a transition, exposed for server rendering. */\n lastRedirect: { to: string; permanent: boolean } | null = null;\n /** Loader data of the latest render keyed by cache key, used for SSR payloads. */\n lastData: Record<string, unknown> = {};\n\n constructor(routes: Route[], options: RouterOptions = {}) {\n this.routes = compileRoutes(routes);\n this.compileSlots(routes);\n this.middleware = options.middleware ?? [];\n this.notFoundBlock = options.notFound ?? defaultNotFoundBlock;\n this.errorBlock = options.error ?? ((error) => defaultErrorBlock(error));\n this.headers = options.headers;\n this.history =\n options.history !== undefined\n ? options.history\n : typeof window !== \"undefined\"\n ? createBrowserHistory()\n : null;\n\n this.state = new RecordState<RouterStateRecord>({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n params: {},\n status: \"idle\",\n error: null,\n });\n this.tree = toState<DomphyElement>({ div: \"\" });\n // Stale-while-revalidate: when a displayed loader entry refreshes in the\n // background, re-render the current route so the fresh data appears.\n this.cache.onRevalidated((key) => this.onRevalidated(key));\n defaultRouter = this;\n }\n\n /** Precompiles parallel-route slots for every segment (recursively). */\n private compileSlots(routes: Route[]): void {\n for (const route of routes) {\n if (route.slots) {\n const entry: Record<\n string,\n { soft: CompiledRoute[]; hard: CompiledRoute[] }\n > = {};\n for (const name of Object.keys(route.slots)) {\n const slotRoutes = route.slots[name];\n entry[name] = {\n soft: compileRoutes(slotRoutes),\n hard: compileRoutes(slotRoutes.filter((route) => !route.intercept)),\n };\n this.compileSlots(slotRoutes);\n }\n this.slotCompiled.set(route, entry);\n }\n if (route.children) this.compileSlots(route.children);\n }\n }\n\n /** Runs a match's loaders and returns one result per chain segment (no loading UI). */\n private async loadMatch(\n match: RouteMatch,\n url: URL,\n ): Promise<SegmentResult[]> {\n const { chain, chainIds } = match.route;\n const context = this.loaderContext(url, match);\n const results: SegmentResult[] = chain.map(() => ({ status: \"pending\" }));\n await Promise.all(\n chain.map((route, index) => {\n if (!route.loader) {\n results[index] = { status: \"success\", data: undefined };\n return Promise.resolve();\n }\n const key = this.cacheKey(chainIds[index], url);\n return this.cache\n .load(key, route.loader, context, route.revalidate)\n .then(\n (data) => {\n results[index] = { status: \"success\", data };\n },\n (error) => {\n if (error instanceof NotFoundSignal) {\n results[index] = { status: \"notfound\" };\n } else {\n results[index] = {\n status: \"error\",\n error:\n error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n );\n }),\n );\n return results;\n }\n\n /** Renders the parallel-route slots declared on chain segment `chainIndex`. */\n private async renderSlots(\n chainIndex: number,\n match: RouteMatch,\n url: URL,\n soft: boolean,\n ): Promise<Record<string, DomphyElement>> {\n const route = match.route.chain[chainIndex];\n const compiledSlots = this.slotCompiled.get(route);\n if (!compiledSlots) return {};\n\n let prefixParts = 0;\n for (let i = 0; i <= chainIndex; i++) {\n prefixParts += urlPartCount(match.route.chain[i].path);\n }\n\n const slots: Record<string, DomphyElement> = {};\n for (const name of Object.keys(compiledSlots)) {\n const compiled = soft\n ? compiledSlots[name].soft\n : compiledSlots[name].hard;\n const slotMatch = matchRouteSuffix(compiled, url.pathname, prefixParts);\n if (!slotMatch) continue;\n slotMatch.pathname = url.pathname;\n slotMatch.params = { ...match.params, ...slotMatch.params };\n const results = await this.loadMatch(slotMatch, url);\n slots[name] = buildTree({\n match: slotMatch,\n baseContext: this.baseContext(url, slotMatch),\n results,\n retry: () => void this.refresh(),\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n }).element;\n }\n return slots;\n }\n\n private onRevalidated(key: string): void {\n // Only on the client and only when the refreshed key backs the current view.\n if (!this.history || !this.currentRenderKeys.has(key)) return;\n void this.transition(this.currentUrl(), {\n replace: true,\n scroll: false,\n fromHistory: true,\n });\n }\n\n /** Renders the current URL and starts listening to history navigation. */\n async start(): Promise<void> {\n if (this.history && !this.releaseHistory) {\n this.releaseHistory = this.history.listen((url) => {\n void this.transition(url, { fromHistory: true });\n });\n }\n const url = this.history\n ? this.history.url()\n : new URL(\"/\", \"http://localhost\");\n await this.transition(url, { initial: true });\n }\n\n destroy(): void {\n this.releaseHistory?.();\n this.releaseHistory = null;\n if (defaultRouter === this) defaultRouter = null;\n }\n\n currentUrl(): URL {\n if (this.history) return this.history.url();\n const search = this.state.get(\"search\");\n return new URL(\n `${this.state.get(\"pathname\")}${search}`,\n \"http://localhost\",\n );\n }\n\n resolve(href: string): URL {\n return new URL(href, this.currentUrl());\n }\n\n async navigate(href: string, options: NavigateOptions = {}): Promise<void> {\n const url = this.resolve(href);\n if (\n typeof window !== \"undefined\" &&\n url.origin !== this.currentUrl().origin\n ) {\n window.location.assign(url.href);\n return;\n }\n await this.transition(url, options);\n }\n\n push(\n href: string,\n options: Omit<NavigateOptions, \"replace\"> = {},\n ): Promise<void> {\n return this.navigate(href, options);\n }\n\n replace(\n href: string,\n options: Omit<NavigateOptions, \"replace\"> = {},\n ): Promise<void> {\n return this.navigate(href, { ...options, replace: true });\n }\n\n back(): void {\n this.history?.go(-1);\n }\n\n forward(): void {\n this.history?.go(1);\n }\n\n /** Clears the loader cache and re-renders the current URL, like `router.refresh()`. */\n async refresh(): Promise<void> {\n this.cache.invalidate();\n await this.transition(this.currentUrl(), { replace: true, scroll: false });\n }\n\n /** Runs the loaders of a route ahead of navigation, like `router.prefetch()`. */\n async prefetch(href: string): Promise<void> {\n try {\n const url = this.resolve(href);\n const match = matchRoute(this.routes, url.pathname);\n if (!match) return;\n const context = this.loaderContext(url, match);\n await Promise.all(\n match.route.chain.map((route, index) => {\n if (!route.loader) return Promise.resolve();\n const key = this.cacheKey(match.route.chainIds[index], url);\n return this.cache.prefetch(\n key,\n route.loader,\n context,\n route.revalidate,\n );\n }),\n );\n } catch {\n // Prefetch failures are silent; the real navigation reports errors.\n }\n }\n\n searchParams(\n listener?: Parameters<RecordState<RouterStateRecord>[\"get\"]>[1],\n ): URLSearchParams {\n return new URLSearchParams(this.state.get(\"search\", listener) as string);\n }\n\n addEventListener(\n event: RouterEventName,\n callback: (...args: unknown[]) => void,\n ): () => void {\n return this.events.addListener(event, callback);\n }\n\n /** The match rendered by the latest completed transition, null when no route matched. */\n getMatch(): RouteMatch | null {\n return this.currentMatch;\n }\n\n /**\n * Two-phase server render for streaming SSR: returns the shell (layouts +\n * loading fallbacks) synchronously, plus a promise for the resolved content,\n * head and loader data once the loaders settle. The caller streams the shell\n * first for a fast TTFB, then the content chunk when `rest` resolves.\n */\n async renderStream(url: URL): Promise<{\n shell: DomphyElement;\n status: number;\n redirect: string | null;\n rest: Promise<{\n content: DomphyElement;\n data: Record<string, unknown>;\n head: string;\n }>;\n }> {\n let renderPathname = url.pathname;\n const middlewareContext = {\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n headers: this.headers,\n };\n for (const middleware of this.middleware) {\n const result = await middleware(middlewareContext);\n if (isRewrite(result)) renderPathname = result.__domphyRewrite;\n }\n\n const match = matchRoute(this.routes, renderPathname);\n if (!match) {\n const built = buildNotFoundTree(this.notFoundBlock);\n return {\n shell: built.element,\n status: 404,\n redirect: null,\n rest: Promise.resolve({ content: built.element, data: {}, head: \"\" }),\n };\n }\n\n const leaf = match.route.chain[match.route.chain.length - 1];\n if (leaf.redirect) {\n return {\n shell: { div: \"\" },\n status: leaf.permanent ? 308 : 307,\n redirect: leaf.redirect,\n rest: Promise.resolve({ content: { div: \"\" }, data: {}, head: \"\" }),\n };\n }\n\n const baseContext = this.baseContext(url, match);\n // Only loader-bearing segments are pending in the shell; the rest render now.\n const pending = match.route.chain.map((route) =>\n route.loader\n ? ({ status: \"pending\" } as SegmentResult)\n : ({ status: \"success\", data: undefined } as SegmentResult),\n );\n const shell = buildTree({\n match,\n baseContext,\n results: pending,\n retry: () => {},\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n }).element;\n\n const rest = (async () => {\n const results = await this.loadMatch(match, url);\n const slots: Record<number, Record<string, DomphyElement>> = {};\n await Promise.all(\n match.route.chain.map(async (route, index) => {\n if (this.slotCompiled.has(route)) {\n slots[index] = await this.renderSlots(index, match, url, false);\n }\n }),\n );\n const content = buildTree({\n match,\n baseContext,\n results,\n retry: () => {},\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n slots,\n }).element;\n\n const data: Record<string, unknown> = {};\n match.route.chain.forEach((route, index) => {\n if (route.loader && results[index].status === \"success\") {\n data[this.cacheKey(match.route.chainIds[index], url)] =\n results[index].data;\n }\n });\n\n let head = \"\";\n try {\n const metadata = await resolveMetadata(\n match.route.chain.map((route) => route.metadata),\n this.loaderContext(url, match),\n );\n head = renderHeadTags(metadataToHeadTags(metadata));\n } catch {\n head = \"\";\n }\n\n return { content, data, head };\n })();\n\n return { shell, status: 200, redirect: null, rest };\n }\n\n private cacheKey(segmentId: string, url: URL): string {\n return `${segmentId}|${url.pathname}${url.search}`;\n }\n\n private loaderContext(url: URL, match: RouteMatch): LoaderContext {\n return {\n pathname: match.pathname,\n url: url.pathname + url.search,\n params: match.params,\n searchParams: url.searchParams,\n headers: this.headers,\n };\n }\n\n /** Core navigation pipeline: middleware -> match -> loaders -> tree -> history/scroll. */\n async transition(url: URL, options: TransitionOptions = {}): Promise<void> {\n const token = ++this.navigationToken;\n const href = url.pathname + url.search + url.hash;\n if (!options.fromHistory) this.lastRedirect = null;\n this.events.notify(\"routeChangeStart\", href);\n this.saveScroll();\n\n try {\n let renderPathname = url.pathname;\n const middlewareContext = {\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n headers: this.headers,\n };\n for (const middleware of this.middleware) {\n const result = await middleware(middlewareContext);\n if (isRewrite(result)) renderPathname = result.__domphyRewrite;\n }\n if (token !== this.navigationToken) return;\n\n const match = matchRoute(this.routes, renderPathname);\n\n if (match) {\n const leaf = match.route.chain[match.route.chain.length - 1];\n if (leaf.redirect) {\n throw new RedirectSignal(leaf.redirect, leaf.permanent ?? false);\n }\n for (const route of match.route.chain) {\n for (const middleware of route.middleware ?? []) {\n const result = await middleware(middlewareContext);\n if (isRewrite(result)) {\n await this.transition(\n new URL(result.__domphyRewrite, url),\n options,\n );\n return;\n }\n }\n }\n if (token !== this.navigationToken) return;\n await this.renderMatch(url, match, token, options);\n } else {\n await this.renderNotFound(url, token, options);\n }\n } catch (error) {\n if (token !== this.navigationToken) return;\n if (error instanceof RedirectSignal) {\n await this.transition(this.resolve(error.to), {\n ...options,\n replace: true,\n });\n // Set after the inner transition so its entry reset does not erase this.\n this.lastRedirect = { to: error.to, permanent: error.permanent };\n return;\n }\n if (error instanceof NotFoundSignal) {\n await this.renderNotFound(url, token, options);\n return;\n }\n const failure = error instanceof Error ? error : new Error(String(error));\n this.tree.set(this.errorBlock(failure, () => void this.refresh()));\n this.state.set(\"status\", \"error\");\n this.state.set(\"error\", failure);\n this.events.notify(\"routeChangeError\", failure, href);\n return;\n }\n\n if (token === this.navigationToken) {\n this.events.notify(\"routeChangeComplete\", href);\n }\n }\n\n private async renderMatch(\n url: URL,\n match: RouteMatch,\n token: number,\n options: TransitionOptions,\n ): Promise<void> {\n const { chain, chainIds } = match.route;\n const context = this.loaderContext(url, match);\n const results: SegmentResult[] = chain.map(() => ({ status: \"pending\" }));\n let redirectSignal: RedirectSignal | null = null;\n\n const promises = chain.map((route, index) => {\n if (!route.loader) {\n results[index] = { status: \"success\", data: undefined };\n return Promise.resolve();\n }\n const key = this.cacheKey(chainIds[index], url);\n return this.cache.load(key, route.loader, context, route.revalidate).then(\n (data) => {\n results[index] = { status: \"success\", data };\n },\n (error) => {\n if (error instanceof RedirectSignal) {\n redirectSignal = redirectSignal ?? error;\n } else if (error instanceof NotFoundSignal) {\n results[index] = { status: \"notfound\" };\n } else {\n results[index] = {\n status: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n );\n });\n\n let settled = false;\n const allSettled = Promise.all(promises).then(() => {\n settled = true;\n });\n\n // Give already-resolved (cached) loaders a chance to finish before showing loading UI.\n await new Promise((resolve) => setTimeout(resolve, 0));\n if (!settled && chain.some((route) => route.loading)) {\n const interim = buildTree({\n match,\n baseContext: this.baseContext(url, match),\n results: results.map((result) => ({ ...result })),\n retry: () => void this.refresh(),\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n });\n if (token === this.navigationToken && interim.status === \"loading\") {\n this.state.set(\"status\", \"loading\");\n this.tree.set(interim.element);\n }\n }\n\n await allSettled;\n if (token !== this.navigationToken) return;\n if (redirectSignal) throw redirectSignal;\n\n // Parallel routes: render each segment's slots ((.)intercept routes match\n // only on soft navigation, i.e. not the initial hard load).\n const soft = !options.initial;\n const slots: Record<number, Record<string, DomphyElement>> = {};\n await Promise.all(\n chain.map(async (route, index) => {\n if (this.slotCompiled.has(route)) {\n slots[index] = await this.renderSlots(index, match, url, soft);\n }\n }),\n );\n if (token !== this.navigationToken) return;\n\n const built = buildTree({\n match,\n baseContext: this.baseContext(url, match),\n results,\n retry: () => void this.refresh(),\n defaultError: this.errorBlock,\n defaultNotFound: this.notFoundBlock,\n slots,\n });\n\n const dataRecord: Record<string, unknown> = {};\n chain.forEach((route, index) => {\n if (route.loader && results[index].status === \"success\") {\n dataRecord[this.cacheKey(chainIds[index], url)] = results[index].data;\n }\n });\n this.lastData = dataRecord;\n this.currentRenderKeys = new Set(Object.keys(dataRecord));\n\n this.currentMatch = match;\n await this.applyMetadata(match, context);\n if (token !== this.navigationToken) return;\n\n this.commit(url, match, built.element, built.status, options);\n // Kick off stale-while-revalidate refetches now that the route is committed,\n // so onRevalidated re-renders against the current view.\n this.cache.flushRevalidations();\n }\n\n private async renderNotFound(\n url: URL,\n token: number,\n options: TransitionOptions,\n ): Promise<void> {\n const built = buildNotFoundTree(this.notFoundBlock);\n this.currentMatch = null;\n this.metadata = {};\n applyHeadTags([]);\n if (token !== this.navigationToken) return;\n this.commit(url, null, built.element, \"notfound\", options);\n }\n\n private baseContext(url: URL, match: RouteMatch) {\n return {\n pathname: match.pathname,\n url: url.pathname + url.search,\n params: match.params,\n searchParams: url.searchParams,\n hash: url.hash,\n headers: this.headers,\n };\n }\n\n private async applyMetadata(\n match: RouteMatch,\n context: LoaderContext,\n ): Promise<void> {\n try {\n this.metadata = await resolveMetadata(\n match.route.chain.map((route) => route.metadata),\n context,\n );\n } catch {\n this.metadata = {};\n }\n applyHeadTags(metadataToHeadTags(this.metadata));\n }\n\n private commit(\n url: URL,\n match: RouteMatch | null,\n element: DomphyElement,\n status: RouterStateRecord[\"status\"],\n options: TransitionOptions,\n ): void {\n if (this.history && !options.fromHistory && !options.initial) {\n const href = url.pathname + url.search + url.hash;\n if (options.replace) {\n this.history.replace(href);\n } else {\n this.history.push(href);\n }\n }\n\n this.state.set(\"pathname\", url.pathname);\n this.state.set(\"search\", url.search);\n this.state.set(\"hash\", url.hash);\n this.state.set(\"params\", match?.params ?? {});\n this.state.set(\"error\", null);\n this.state.set(\"status\", status);\n this.tree.set(element);\n\n this.restoreScroll(url, options);\n }\n\n private saveScroll(): void {\n if (typeof window === \"undefined\") return;\n this.history?.saveScroll?.({ x: window.scrollX, y: window.scrollY });\n }\n\n private restoreScroll(url: URL, options: TransitionOptions): void {\n if (\n typeof window === \"undefined\" ||\n options.scroll === false ||\n options.initial\n )\n return;\n if (options.fromHistory) {\n const position = this.history?.readScroll?.();\n window.scrollTo(position?.x ?? 0, position?.y ?? 0);\n return;\n }\n if (url.hash) {\n const target = document.getElementById(url.hash.slice(1));\n if (target) {\n target.scrollIntoView();\n return;\n }\n }\n window.scrollTo(0, 0);\n }\n}\n","import { type DomphyElement, ElementNode } from \"@domphy/core\";\nimport type { HistoryAdapter } from \"./history.js\";\nimport { metadataToHeadTags, renderHeadTags } from \"./metadata.js\";\nimport { AppRouter, type RouterOptions } from \"./router.js\";\nimport type { Route } from \"./types.js\";\n\nexport interface AppOptions extends Omit<RouterOptions, \"history\" | \"headers\"> {\n history?: HistoryAdapter | null;\n}\n\nexport interface RenderToStringOptions {\n headers?: Headers;\n}\n\nexport interface RenderToStreamOptions extends RenderToStringOptions {\n /** Extra HTML for `<head>` (charset, viewport, fonts, a CSS link…), sent in the first flush. */\n head?: string;\n /** Markup appended before `</body>`, typically the client bundle `<script>` that calls `hydrate()`. */\n bootstrap?: string;\n}\n\nexport interface StreamResult {\n /** A web `ReadableStream` of UTF-8 bytes: the shell flushes first, content follows. */\n stream: ReadableStream<Uint8Array>;\n status: number;\n redirect?: string;\n}\n\n/** Swaps the streamed content/head templates into place as soon as they arrive. */\nconst STREAM_SWAP_SCRIPT =\n \"(function(){var h=document.getElementById('domphy-head');\" +\n \"if(h){document.head.appendChild(h.content.cloneNode(true));h.remove();}\" +\n \"var c=document.getElementById('domphy-content'),a=document.getElementById('domphy-app');\" +\n \"if(c&&a){a.replaceChildren(c.content.cloneNode(true));c.remove();}})();\";\n\nexport interface SSRResult {\n /** Body markup of the app root, ready to place inside the mount element. */\n html: string;\n /** Scoped CSS of the rendered tree, place inside `<style id=\"domphy-style\">`. */\n css: string;\n /** Serialized `<title>`, `<meta>` and `<link>` tags for the document head. */\n head: string;\n /** 200, 404, or the redirect status. */\n status: number;\n /** Set when a loader or middleware redirected. */\n redirect?: string;\n /** Loader data to embed for hydration, see `bootstrapScript`. */\n data: Record<string, unknown>;\n /** Inline script that exposes loader data to `hydrate()` on the client. */\n bootstrapScript: string;\n}\n\nconst HYDRATION_GLOBAL = \"__DOMPHY_APP_DATA__\";\n\n/**\n * The app shell: routing, rendering and server rendering in one object, the\n * Domphy equivalent of a Next.js application instance.\n */\nexport class DomphyApp {\n readonly routes: Route[];\n readonly options: AppOptions;\n readonly router: AppRouter;\n private node: ElementNode | null = null;\n\n constructor(routes: Route[], options: AppOptions = {}) {\n this.routes = routes;\n this.options = options;\n this.router = new AppRouter(routes, options);\n }\n\n /** The root element; the whole route tree re-renders through one reactive child. */\n element(): DomphyElement {\n const router = this.router;\n return {\n div: (listener) => [router.tree.get(listener)],\n style: { display: \"contents\" },\n };\n }\n\n /** Client-side render from scratch. */\n async render(target: HTMLElement): Promise<ElementNode> {\n await this.router.start();\n this.node = new ElementNode(this.element());\n this.node.render(target);\n return this.node;\n }\n\n /**\n * Hydrates server-rendered markup. Reads the loader data embedded by\n * `bootstrapScript` so loaders are not re-run and the tree matches the HTML.\n */\n async hydrate(\n target: HTMLElement,\n style?: HTMLStyleElement,\n ): Promise<ElementNode> {\n const seeded = (globalThis as Record<string, unknown>)[HYDRATION_GLOBAL];\n if (seeded && typeof seeded === \"object\") {\n this.router.cache.seed(seeded as Record<string, unknown>);\n }\n await this.router.start();\n this.node = new ElementNode(this.element());\n this.node.mount(target, style);\n return this.node;\n }\n\n destroy(): void {\n this.node?.remove();\n this.node = null;\n this.router.destroy();\n }\n\n /** Server rendering: runs middleware and loaders for `url`, returns markup + CSS + head. */\n async renderToString(\n url: string | URL,\n options: RenderToStringOptions = {},\n ): Promise<SSRResult> {\n const requestUrl =\n typeof url === \"string\" ? new URL(url, \"http://localhost\") : url;\n const serverRouter = new AppRouter(this.routes, {\n ...this.options,\n history: null,\n headers: options.headers,\n });\n\n await serverRouter.transition(requestUrl, { initial: true });\n\n const status = serverRouter.state.get(\"status\");\n const redirect = serverRouter.lastRedirect;\n const node = new ElementNode({\n div: [serverRouter.tree.get()],\n style: { display: \"contents\" },\n });\n\n const data = serverRouter.lastData;\n\n const result: SSRResult = {\n html: node.generateHTML(),\n css: node.generateCSS(),\n head: renderHeadTags(metadataToHeadTags(serverRouter.metadata)),\n status: redirect\n ? redirect.permanent\n ? 308\n : 307\n : status === \"notfound\"\n ? 404\n : 200,\n redirect: redirect?.to,\n data,\n bootstrapScript: `<script>window.${HYDRATION_GLOBAL} = ${serializeData(data)};</script>`,\n };\n serverRouter.destroy();\n return result;\n }\n\n /**\n * Streaming server render. Flushes the shell (layouts + loading fallbacks)\n * immediately for a fast TTFB, then streams the resolved content, head and\n * hydration data once loaders settle. The content arrives in `<template>`s\n * that an inline script swaps into place; the client then calls `hydrate`.\n */\n async renderToStream(\n url: string | URL,\n options: RenderToStreamOptions = {},\n ): Promise<StreamResult> {\n const requestUrl =\n typeof url === \"string\" ? new URL(url, \"http://localhost\") : url;\n const serverRouter = new AppRouter(this.routes, {\n ...this.options,\n history: null,\n headers: options.headers,\n });\n\n const { shell, status, redirect, rest } =\n await serverRouter.renderStream(requestUrl);\n\n const encoder = new TextEncoder();\n const shellNode = new ElementNode({\n div: [shell],\n style: { display: \"contents\" },\n });\n const open =\n `<!DOCTYPE html><html><head>${options.head ?? \"\"}` +\n `<style id=\"domphy-style\">${shellNode.generateCSS()}</style>` +\n `</head><body><div id=\"domphy-app\">${shellNode.generateHTML()}</div>`;\n const bootstrap = options.bootstrap ?? \"\";\n\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n controller.enqueue(encoder.encode(open));\n const { content, data, head } = await rest;\n const contentNode = new ElementNode({\n div: [content],\n style: { display: \"contents\" },\n });\n const chunk =\n `<style>${contentNode.generateCSS()}</style>` +\n `<template id=\"domphy-head\">${head}</template>` +\n `<template id=\"domphy-content\">${contentNode.generateHTML()}</template>` +\n `<script>${STREAM_SWAP_SCRIPT}</script>` +\n `<script>window.${HYDRATION_GLOBAL} = ${serializeData(data)};</script>` +\n `${bootstrap}</body></html>`;\n controller.enqueue(encoder.encode(chunk));\n controller.close();\n serverRouter.destroy();\n },\n });\n\n return { stream, status, redirect: redirect ?? undefined };\n }\n}\n\n/** JSON with `</script>`-safe escaping so the payload can be inlined. */\nfunction serializeData(data: Record<string, unknown>): string {\n return JSON.stringify(data).replace(/</g, \"\\\\u003c\");\n}\n\nexport function createApp(routes: Route[], options: AppOptions = {}): DomphyApp {\n return new DomphyApp(routes, options);\n}\n","import type { PartialElement } from \"@domphy/core\";\n\nexport interface ImageLoaderInput {\n src: string;\n width: number;\n quality: number;\n}\n\nexport type ImageLoader = (input: ImageLoaderInput) => string;\n\nexport interface OptimizedImageProps {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n /** Stretch over the positioned parent, like the `fill` prop of `next/image`. */\n fill?: boolean;\n sizes?: string;\n quality?: number;\n /** Load eagerly with high fetch priority — use for the LCP image. */\n priority?: boolean;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n /** Maps `src` + width to an optimized URL; enables `srcset` generation. */\n loader?: ImageLoader;\n deviceSizes?: number[];\n}\n\nconst DEFAULT_DEVICE_SIZES = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\n\n/**\n * Patch for `img` elements, the equivalent of `next/image`: lazy loading,\n * async decoding, fetch priority, `srcset` through a custom loader, fill\n * layout and blur placeholders. URL optimization itself is the loader's job —\n * point it at any image CDN.\n */\nexport function optimizedImage(props: OptimizedImageProps): PartialElement<\"img\"> {\n const {\n src,\n alt = \"\",\n width,\n height,\n fill = false,\n sizes,\n quality = 75,\n priority = false,\n placeholder = \"empty\",\n blurDataURL,\n loader,\n deviceSizes = DEFAULT_DEVICE_SIZES,\n } = props;\n\n const part: PartialElement<\"img\"> = {\n src: loader\n ? loader({\n src,\n width: width ?? deviceSizes[deviceSizes.length - 1],\n quality,\n })\n : src,\n alt,\n loading: priority ? \"eager\" : \"lazy\",\n decoding: \"async\",\n fetchPriority: priority ? \"high\" : \"auto\",\n style: {},\n };\n\n if (loader) {\n part.srcSet = deviceSizes\n .map((size) => `${loader({ src, width: size, quality })} ${size}w`)\n .join(\", \");\n if (sizes) part.sizes = sizes;\n }\n\n if (width !== undefined) part.width = width;\n if (height !== undefined) part.height = height;\n\n if (fill) {\n part.style = {\n ...part.style,\n position: \"absolute\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n };\n }\n\n if (placeholder === \"blur\" && blurDataURL) {\n part.style = {\n ...part.style,\n backgroundImage: `url(\"${blurDataURL}\")`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n };\n part.onLoad = (event) => {\n const image = event.target as HTMLImageElement;\n image.style.backgroundImage = \"\";\n };\n }\n\n return part;\n}\n","import type { PartialElement } from \"@domphy/core\";\nimport { type AppRouter, getRouter } from \"./router.js\";\n\nexport interface NavLinkProps {\n href: string;\n /** Replace the current history entry instead of pushing. */\n replace?: boolean;\n /** Scroll after navigation, defaults to true. */\n scroll?: boolean;\n /**\n * Prefetch strategy, like the `prefetch` prop of `next/link`:\n * `\"visible\"` when the link enters the viewport, `\"hover\"` on pointer/focus,\n * `false` never. Defaults to `\"hover\"`.\n */\n prefetch?: \"visible\" | \"hover\" | false;\n /** Mark active only on an exact pathname match, not on descendants. */\n exact?: boolean;\n /** Explicit router; defaults to the app router. */\n router?: AppRouter;\n}\n\nfunction isModifiedClick(event: MouseEvent): boolean {\n return (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n );\n}\n\n/**\n * Patch for `a` elements, the equivalent of `next/link`: client-side\n * navigation, prefetching and active state (`aria-current` + `data-active`).\n */\nexport function navLink(props: NavLinkProps): PartialElement<\"a\"> {\n const {\n href,\n replace = false,\n scroll = true,\n prefetch = \"hover\",\n exact = false,\n } = props;\n const router = () => props.router ?? getRouter();\n\n const isActive = (pathname: string): boolean => {\n const target = new URL(href, \"http://localhost\").pathname;\n if (exact || target === \"/\") return pathname === target;\n return pathname === target || pathname.startsWith(`${target}/`);\n };\n\n let prefetched = false;\n const prefetchOnce = () => {\n if (prefetched) return;\n prefetched = true;\n void router().prefetch(href);\n };\n\n return {\n href,\n ariaCurrent: (listener) =>\n isActive(router().state.get(\"pathname\", listener) as string)\n ? \"page\"\n : null,\n dataActive: (listener) =>\n isActive(router().state.get(\"pathname\", listener) as string) ? \"\" : null,\n onClick: (event) => {\n const mouseEvent = event as MouseEvent;\n const anchor = mouseEvent.currentTarget as HTMLAnchorElement;\n if (isModifiedClick(mouseEvent)) return;\n if (anchor.target && anchor.target !== \"_self\") return;\n if (anchor.hasAttribute(\"download\")) return;\n if (\n new URL(anchor.href, window.location.href).origin !==\n window.location.origin\n )\n return;\n mouseEvent.preventDefault();\n void router().navigate(href, { replace, scroll });\n },\n onMouseEnter: () => {\n if (prefetch === \"hover\") prefetchOnce();\n },\n onFocus: () => {\n if (prefetch === \"hover\") prefetchOnce();\n },\n _onMount: (node) => {\n if (prefetch !== \"visible\") return;\n if (typeof IntersectionObserver === \"undefined\") {\n prefetchOnce();\n return;\n }\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n prefetchOnce();\n observer.disconnect();\n }\n });\n observer.observe(node.domElement as Element);\n node.setMetadata(\"navLinkObserver\", observer);\n },\n _onRemove: (node) => {\n const observer = node.getMetadata(\"navLinkObserver\") as\n | IntersectionObserver\n | undefined;\n observer?.disconnect();\n },\n };\n}\n","import type { DomphyElement } from \"@domphy/core\";\n\nexport interface ScriptProps {\n src: string;\n /**\n * Loading strategy, like `next/script`:\n * `\"afterInteractive\"` loads as soon as the element mounts (default),\n * `\"lazyOnload\"` waits for the window `load` event plus idle time.\n */\n strategy?: \"afterInteractive\" | \"lazyOnload\";\n id?: string;\n async?: boolean;\n onLoad?: () => void;\n onError?: () => void;\n}\n\nconst loadedScripts = new Set<string>();\n\n/** Resets script dedupe between tests. */\nexport function resetScripts(): void {\n loadedScripts.clear();\n}\n\nfunction whenIdle(callback: () => void): void {\n const idle = (\n globalThis as { requestIdleCallback?: (cb: () => void) => void }\n ).requestIdleCallback;\n if (idle) {\n idle(callback);\n } else {\n setTimeout(callback, 0);\n }\n}\n\n/**\n * Block that loads an external script once, the equivalent of `next/script`.\n * Place it anywhere in the tree; duplicate sources are loaded only once.\n */\nexport function script(props: ScriptProps): DomphyElement<\"script\"> {\n const {\n src,\n strategy = \"afterInteractive\",\n id,\n async = true,\n onLoad,\n onError,\n } = props;\n const dedupeKey = id ?? src;\n\n const start = (element: HTMLScriptElement) => {\n if (loadedScripts.has(dedupeKey)) return;\n loadedScripts.add(dedupeKey);\n element.src = src;\n };\n\n const part: DomphyElement<\"script\"> = {\n script: \"\",\n async,\n onLoad: () => onLoad?.(),\n onError: () => onError?.(),\n _onMount: (node) => {\n const element = node.domElement as HTMLScriptElement;\n if (strategy === \"afterInteractive\") {\n start(element);\n return;\n }\n if (document.readyState === \"complete\") {\n whenIdle(() => start(element));\n } else {\n window.addEventListener(\"load\", () => whenIdle(() => start(element)), {\n once: true,\n });\n }\n },\n };\n if (id !== undefined) part.id = id;\n return part;\n}\n","import type { DomphyElement } from \"@domphy/core\";\nimport type { Metadata } from \"./metadata.js\";\n\n/** Route params. Dynamic segments map to strings, catch-all segments to string arrays. */\nexport type Params = Record<string, string | string[]>;\n\n/** Shared context given to pages, layouts, loaders, metadata functions and middleware. */\nexport interface RouteContext<TData = unknown> {\n /** Pathname actually rendered (after middleware rewrites). */\n pathname: string;\n /** Pathname shown in the address bar (before rewrites). */\n url: string;\n params: Params;\n searchParams: URLSearchParams;\n hash: string;\n /** Resolved loader data of the owning segment. */\n data: TData;\n /** Resolved loader data of every matched segment, keyed by segment id. */\n segmentData: Record<string, unknown>;\n /** Request headers, only present during server rendering. */\n headers?: Headers;\n}\n\nexport type PageBlock<TData = unknown> = (\n context: RouteContext<TData>,\n) => DomphyElement;\n\nexport type LayoutBlock<TData = unknown> = (\n children: DomphyElement,\n context: RouteContext<TData>,\n /** Rendered parallel-route slots declared on this segment, keyed by slot name. */\n slots: Record<string, DomphyElement>,\n) => DomphyElement;\n\nexport type LoadingBlock = (context: RouteContext) => DomphyElement;\n\nexport type ErrorBlock = (error: Error, retry: () => void) => DomphyElement;\n\nexport type NotFoundBlock = () => DomphyElement;\n\nexport interface LoaderContext {\n pathname: string;\n url: string;\n params: Params;\n searchParams: URLSearchParams;\n headers?: Headers;\n}\n\nexport type Loader<TData = unknown> = (\n context: LoaderContext,\n) => TData | Promise<TData>;\n\nexport type MetadataValue =\n | Metadata\n | ((context: LoaderContext) => Metadata | Promise<Metadata>);\n\nexport interface MiddlewareContext {\n url: URL;\n pathname: string;\n searchParams: URLSearchParams;\n headers?: Headers;\n}\n\n/** A rewrite instruction returned from middleware. Create with `rewrite()`. */\nexport interface RewriteResult {\n __domphyRewrite: string;\n}\n\n/**\n * Middleware runs before every navigation and server render.\n * Return `rewrite(path)` to render another route under the same URL,\n * call `redirect(path)` / `notFound()` to interrupt, or return nothing to continue.\n */\nexport type Middleware = (\n context: MiddlewareContext,\n) =>\n | RewriteResult\n | undefined\n | void\n | Promise<RewriteResult | undefined | void>;\n\n/**\n * One route segment, the equivalent of one folder in the Next.js `app` directory.\n *\n * `path` uses Next.js conventions:\n * - `\"about\"` static segment (may contain several parts: `\"docs/getting-started\"`)\n * - `\"[slug]\"` dynamic segment\n * - `\"[...slug]\"` catch-all segment\n * - `\"[[...slug]]\"` optional catch-all segment\n * - `\"(marketing)\"` route group, organizes the tree without affecting the URL\n *\n * A segment is routable when it declares `page` or `redirect`.\n */\nexport interface Route {\n path: string;\n page?: PageBlock<any>;\n layout?: LayoutBlock<any>;\n loading?: LoadingBlock;\n error?: ErrorBlock;\n notFound?: NotFoundBlock;\n metadata?: MetadataValue;\n loader?: Loader<any>;\n /**\n * Loader cache lifetime in seconds, the equivalent of Next.js `revalidate`.\n * `undefined` re-runs the loader on every navigation, `Infinity` caches forever.\n */\n revalidate?: number;\n middleware?: Middleware[];\n /** Static redirect: navigating to this route immediately redirects to the target. */\n redirect?: string;\n /** Use a 308 redirect on the server when `redirect` is set. */\n permanent?: boolean;\n children?: Route[];\n /**\n * Parallel routes (Next.js `@slot` folders). Each slot is an independent route\n * tree matched against the path *below* this segment; the rendered element of\n * each is passed to `layout`'s third argument. A slot route with `intercept`\n * set captures a matching URL during client navigation (intercepting routes).\n */\n slots?: Record<string, Route[]>;\n /**\n * Intercepting route marker (Next.js `(.)`, `(..)`, `(...)`). When set, this\n * slot route only matches during client-side (soft) navigation, letting it\n * render an interception (e.g. a modal) over the previous page; a hard load of\n * the same URL renders the real route instead.\n */\n intercept?: boolean;\n}\n\nexport type RouterStatus = \"idle\" | \"loading\" | \"error\" | \"notfound\";\n\nexport interface RouterStateRecord {\n pathname: string;\n search: string;\n hash: string;\n params: Params;\n status: RouterStatus;\n error: Error | null;\n\n [key: string]: unknown;\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n /** Scroll to the top (or the URL hash) after navigation. Defaults to true. */\n scroll?: boolean;\n}\n\nexport type RouterEventName =\n | \"routeChangeStart\"\n | \"routeChangeComplete\"\n | \"routeChangeError\";\n\n/** Identity helper that keeps route literals fully typed. */\nexport function defineRoutes(routes: Route[]): Route[] {\n return routes;\n}\n"],"mappings":"y/BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,SAAAE,KCAA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,eAAAE,EAAA,cAAAC,EAAA,cAAAC,GAAA,mBAAAC,EAAA,sBAAAC,GAAA,mBAAAC,EAAA,kBAAAC,EAAA,cAAAC,GAAA,sBAAAC,EAAA,cAAAC,EAAA,uBAAAC,GAAA,kBAAAC,EAAA,qBAAAC,GAAA,cAAAC,GAAA,yBAAAC,GAAA,wBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,cAAAC,EAAA,SAAAC,EAAA,cAAAC,GAAA,eAAAC,EAAA,qBAAAC,GAAA,uBAAAC,EAAA,YAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,iBAAAC,EAAA,sBAAAC,GAAA,aAAAC,GAAA,mBAAAC,EAAA,iBAAAC,GAAA,oBAAAC,EAAA,YAAAC,GAAA,WAAAC,GAAA,cAAAC,EAAA,iBAAAC,KCiCO,SAASC,EAAaC,EAA8B,CACzD,OAAIA,EAAK,WAAW,GAAG,GAAKA,EAAK,SAAS,GAAG,EACpC,CAAE,KAAM,QAAS,MAAOA,EAAK,MAAM,EAAG,EAAE,CAAE,EAE/CA,EAAK,WAAW,OAAO,GAAKA,EAAK,SAAS,IAAI,EACzC,CAAE,KAAM,oBAAqB,MAAOA,EAAK,MAAM,EAAG,EAAE,CAAE,EAE3DA,EAAK,WAAW,MAAM,GAAKA,EAAK,SAAS,GAAG,EACvC,CAAE,KAAM,WAAY,MAAOA,EAAK,MAAM,EAAG,EAAE,CAAE,EAElDA,EAAK,WAAW,GAAG,GAAKA,EAAK,SAAS,GAAG,EACpC,CAAE,KAAM,UAAW,MAAOA,EAAK,MAAM,EAAG,EAAE,CAAE,EAE9C,CAAE,KAAM,SAAU,MAAOA,CAAK,CACvC,CAEO,SAASC,EAAUC,EAAwB,CAChD,OAAOA,EAAK,MAAM,GAAG,EAAE,OAAQF,GAASA,EAAK,OAAS,CAAC,CACzD,CAGO,SAASG,GAAaD,EAAsB,CACjD,OAAOD,EAAUC,CAAI,EAClB,IAAIH,CAAY,EAChB,OAAQK,GAAYA,EAAQ,OAAS,OAAO,EAAE,MACnD,CAGO,SAASC,GACdC,EACAC,EACAC,EACmB,CACnB,IAAMC,EAAS,IAAIR,EAAUM,CAAQ,EAAE,MAAMC,CAAW,EAAE,KAAK,GAAG,CAAC,GACnE,OAAOE,EAAWJ,EAAUG,CAAM,CACpC,CAGO,SAASE,EAAcC,EAAkC,CAC9D,IAAMN,EAA4B,CAAC,EAEnC,SAASO,EACPC,EACAC,EACAC,EACAC,EACAC,EACM,CACN,QAAWC,KAAQL,EAAO,CACxB,IAAMM,EAAQnB,EAAUkB,EAAK,IAAI,EAC3BE,EAAcD,EAAM,IAAIrB,CAAY,EACpCuB,EAAc,CAClB,GAAGP,EACH,GAAGM,EAAY,OAAQjB,GAAYA,EAAQ,OAAS,OAAO,CAC7D,EACMmB,EAAK,GAAGL,CAAQ,IAAIE,EAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,OAAQ,GAAG,EACzDI,EAAQ,CAAC,GAAGR,EAAaG,CAAI,EAC7BM,EAAW,CAAC,GAAGR,EAAgBM,IAAO,GAAK,IAAMA,CAAE,GAErDJ,EAAK,MAAQA,EAAK,WACpBb,EAAS,KAAK,CACZ,GAAIiB,IAAO,GAAK,IAAMA,EACtB,SAAUD,EACV,MAAAE,EACA,SAAAC,CACF,CAAC,EAECN,EAAK,UACPN,EAAKM,EAAK,SAAUG,EAAaE,EAAOC,EAAUF,CAAE,CAExD,CACF,CAEA,OAAAV,EAAKD,EAAQ,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,EAC3BN,EAAS,KAAKoB,EAAkB,EACzBpB,CACT,CAEA,IAAMqB,GAAyC,CAC7C,OAAQ,EACR,QAAS,EACT,SAAU,EACV,oBAAqB,EACrB,MAAO,CACT,EAGO,SAASD,GAAmBE,EAAkBC,EAA0B,CAC7E,IAAMC,EAAS,KAAK,IAAIF,EAAE,SAAS,OAAQC,EAAE,SAAS,MAAM,EAC5D,QAASE,EAAI,EAAGA,EAAID,EAAQC,IAAK,CAC/B,IAAMC,EAAWJ,EAAE,SAASG,CAAC,EACvBE,EAAWJ,EAAE,SAASE,CAAC,EAC7B,GAAI,CAACC,EAAU,MAAO,GACtB,GAAI,CAACC,EAAU,MAAO,GACtB,IAAMC,EAAiBP,GAAUK,EAAS,IAAI,EAAIL,GAAUM,EAAS,IAAI,EACzE,GAAIC,IAAmB,EAAG,OAAOA,CACnC,CACA,MAAO,EACT,CAEO,SAASC,GACdC,EACA7B,EACe,CACf,IAAMa,EAAQnB,EAAUM,CAAQ,EAAE,IAAKP,GAAS,mBAAmBA,CAAI,CAAC,EAClEqC,EAAiB,CAAC,EACpBC,EAAY,EAEhB,QAAS,EAAI,EAAG,EAAIF,EAAS,OAAQ,IAAK,CACxC,IAAMhC,EAAUgC,EAAS,CAAC,EACpBG,EAAS,IAAMH,EAAS,OAAS,EAEvC,GAAIhC,EAAQ,OAAS,SAAU,CAC7B,GAAIgB,EAAMkB,CAAS,IAAMlC,EAAQ,MAAO,OAAO,KAC/CkC,IACA,QACF,CACA,GAAIlC,EAAQ,OAAS,UAAW,CAC9B,GAAIkC,GAAalB,EAAM,OAAQ,OAAO,KACtCiB,EAAOjC,EAAQ,KAAK,EAAIgB,EAAMkB,CAAS,EACvCA,IACA,QACF,CACA,GAAIlC,EAAQ,OAAS,WACnB,MAAI,CAACmC,GAAUD,GAAalB,EAAM,OAAe,MACjDiB,EAAOjC,EAAQ,KAAK,EAAIgB,EAAM,MAAMkB,CAAS,EACtCD,GAET,GAAIjC,EAAQ,OAAS,oBACnB,OAAKmC,GACLF,EAAOjC,EAAQ,KAAK,EAAIgB,EAAM,MAAMkB,CAAS,EACtCD,GAFa,IAIxB,CAEA,OAAIC,IAAclB,EAAM,OAAe,KAChCiB,CACT,CAEO,SAAS3B,EACdJ,EACAC,EACmB,CACnB,QAAWiC,KAASlC,EAAU,CAC5B,IAAM+B,EAASF,GAAUK,EAAM,SAAUjC,CAAQ,EACjD,GAAI8B,EACF,MAAO,CAAE,MAAAG,EAAO,OAAAH,EAAQ,SAAA9B,CAAS,CAErC,CACA,OAAO,IACT,CAGO,SAASkC,GAAUC,EAAiBL,EAAiB,CAAC,EAAW,CAgBtE,MAAO,IAfOpC,EAAUyC,CAAO,EAC5B,IAAI3C,CAAY,EAChB,OAAQK,GAAYA,EAAQ,OAAS,OAAO,EAC5C,QAASA,GAAY,CACpB,GAAIA,EAAQ,OAAS,SAAU,MAAO,CAACA,EAAQ,KAAK,EACpD,IAAMuC,EAAQN,EAAOjC,EAAQ,KAAK,EAClC,GAAIuC,IAAU,OAAW,CACvB,GAAIvC,EAAQ,OAAS,oBAAqB,MAAO,CAAC,EAClD,MAAM,IAAI,MACR,kBAAkBA,EAAQ,KAAK,kBAAkBsC,CAAO,IAC1D,CACF,CAEA,OADa,MAAM,QAAQC,CAAK,EAAIA,EAAQ,CAACA,CAAK,GACtC,IAAK3C,GAAS,mBAAmBA,CAAI,CAAC,CACpD,CAAC,EACc,KAAK,GAAG,CAAC,EAC5B,CClMO,IAAM4C,EAAN,cAA6B,KAAM,CAIxC,YAAYC,EAAYC,EAAoB,CAC1C,MAAM,eAAeD,CAAE,EAAE,EACzB,KAAK,KAAO,iBACZ,KAAK,GAAKA,EACV,KAAK,UAAYC,CACnB,CACF,EAEaC,EAAN,cAA6B,KAAM,CACxC,aAAc,CACZ,MAAM,WAAW,EACjB,KAAK,KAAO,gBACd,CACF,EAEO,SAASC,GAASH,EAAmB,CAC1C,MAAM,IAAID,EAAeC,EAAI,EAAK,CACpC,CAEO,SAASI,GAAkBJ,EAAmB,CACnD,MAAM,IAAID,EAAeC,EAAI,EAAI,CACnC,CAEO,SAASK,IAAkB,CAChC,MAAM,IAAIH,CACZ,CAGO,SAASI,GAAQN,EAA2B,CACjD,MAAO,CAAE,gBAAiBA,CAAG,CAC/B,CAEO,SAASO,EAAUC,EAAwC,CAChE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,OAAQA,EAAwB,iBAAoB,QAExD,CCXA,IAAMC,GAAwB,CAC5B,MACA,OACA,MACA,QACA,SACA,OACA,SACF,EAGO,SAASC,EAAKC,EAAeC,EAAqB,CAAC,EAAa,CACrE,IAAMC,EAAU,IAAI,QAAQD,EAAK,OAAO,EACxC,OAAKC,EAAQ,IAAI,cAAc,GAC7BA,EAAQ,IAAI,eAAgB,iCAAiC,EAExD,IAAI,SAAS,KAAK,UAAUF,CAAI,EAAGG,EAAAC,EAAA,GAAKH,GAAL,CAAW,QAAAC,CAAQ,EAAC,CAChE,CAEO,SAASG,GACdC,EACyC,CACzC,IAAMC,EAAQD,EAAO,IAAKE,IAAc,CACtC,SAAAA,EACA,UAAW,CAAE,KAAMA,EAAS,KAAM,KAAM,KAAO,CAAE,IAAK,EAAG,EAAG,CAC9D,EAAE,EACIC,EAAWC,EAAcH,EAAM,IAAKI,GAASA,EAAK,SAAS,CAAC,EAC5DC,EAAS,IAAI,IAAIL,EAAM,IAAKI,GAAS,CAACA,EAAK,UAAWA,EAAK,QAAQ,CAAC,CAAC,EAE3E,OAAcE,GAAwCC,EAAA,sBACpD,IAAMC,EAAM,IAAI,IAAIF,EAAQ,GAAG,EACzBG,EAAQC,EAAWR,EAAUM,EAAI,QAAQ,EAC/C,GAAI,CAACC,EACH,OAAOjB,EAAK,CAAE,MAAO,WAAY,EAAG,CAAE,OAAQ,GAAI,CAAC,EAGrD,IAAMmB,EAAQN,EAAO,IACnBI,EAAM,MAAM,MAAMA,EAAM,MAAM,MAAM,OAAS,CAAC,CAChD,EACMG,EAAUrB,GAAQ,OAAQsB,GAAWF,EAAME,CAAM,CAAC,EAClDA,EAASP,EAAQ,OAAO,YAAY,EACtCQ,EAAUH,EAAME,CAAM,EAK1B,GAHI,CAACC,GAAWD,IAAW,QAAUF,EAAM,MACzCG,EAAUH,EAAM,KAEd,CAACG,GAAWD,IAAW,UACzB,OAAO,IAAI,SAAS,KAAM,CACxB,OAAQ,IACR,QAAS,CAAE,MAAOD,EAAQ,KAAK,IAAI,CAAE,CACvC,CAAC,EAEH,GAAI,CAACE,EACH,OAAOtB,EACL,CAAE,MAAO,oBAAqB,EAC9B,CAAE,OAAQ,IAAK,QAAS,CAAE,MAAOoB,EAAQ,KAAK,IAAI,CAAE,CAAE,CACxD,EAGF,GAAI,CACF,IAAMG,EAAW,MAAMD,EAAQR,EAAS,CAAE,OAAQG,EAAM,MAAO,CAAC,EAChE,OAAII,IAAW,OACN,IAAI,SAAS,KAAM,CACxB,OAAQE,EAAS,OACjB,QAASA,EAAS,OACpB,CAAC,EAEIA,CACT,OAASC,EAAO,CACd,OAAIA,aAAiBC,EACZ,IAAI,SAAS,KAAM,CACxB,OAAQD,EAAM,UAAY,IAAM,IAChC,QAAS,CAAE,SAAUA,EAAM,EAAG,CAChC,CAAC,EAECA,aAAiBE,EACZ1B,EAAK,CAAE,MAAO,WAAY,EAAG,CAAE,OAAQ,GAAI,CAAC,EAE9CA,EAAK,CAAE,MAAO,uBAAwB,EAAG,CAAE,OAAQ,GAAI,CAAC,CACjE,CACF,EACF,2VCzHa2B,GAAkB,CAC7B,UACA,aACA,gBACA,iBACA,SACA,WACA,YACA,mBACA,WACA,UACA,UACA,gBACA,gBACA,oBACA,SACA,cACA,QACA,aACA,SACA,YACA,cACA,cACA,aACA,cACA,SACA,mBACA,YACA,UACA,UACA,UACA,aACA,UACA,YACA,YACA,aACA,UACA,SACA,eACA,mBACA,cACA,cACA,eACA,eACA,cACA,aACA,cACA,YACA,UACA,UACA,SACA,YACA,aACA,eACA,UACA,WACA,WACA,cACA,4BACA,WACA,YACA,WACA,eACA,YACA,WACA,YACA,eACA,WACA,iBACA,YACA,UACA,eACA,cACA,aACA,gBACA,gBACA,gBACA,cACA,kBACA,iBACA,iBACA,gBACA,eACA,sBACA,uBACA,qBACA,sBACA,mBACA,kBACA,oBACA,mBACA,iBACA,uBACA,qBACA,oBACA,YACA,YACF,EAEaC,GAAeD,GAAgB,OAAO,CAACE,EAAKC,IAAO,CAC9D,IAAMC,EAAMD,EAAG,MAAM,CAAC,EAAE,YAAY,EACpC,OAAAD,EAAIE,CAAG,EAAID,EACJD,CACT,EAAG,CAAC,CAAiF,ECvGxEG,GAAW,CACtB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,OACA,aACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,MACA,MACA,MACA,OACA,OACA,SACA,OACA,QACA,KACA,UACA,gBACA,mBACA,SACA,WACA,SACA,OACA,OACA,UACA,UACA,gBACA,sBACA,cACA,mBACA,oBA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","names":["global_exports","__export","src_exports","src_exports","__export","AppRouter","DataCache","DomphyApp","NotFoundSignal","PREFETCH_LIFETIME","RedirectSignal","applyHeadTags","buildHref","buildNotFoundTree","buildTree","compareSpecificity","compileRoutes","createApiHandler","createApp","createBrowserHistory","createMemoryHistory","defaultErrorBlock","defaultNotFoundBlock","defineRoutes","getRouter","isRewrite","json","matchPath","matchRoute","matchRouteSuffix","metadataToHeadTags","navLink","notFound","optimizedImage","parseSegment","permanentRedirect","redirect","renderHeadTags","resetScripts","resolveMetadata","rewrite","script","splitPath","urlPartCount","parseSegment","part","splitPath","path","urlPartCount","segment","matchRouteSuffix","compiled","pathname","prefixParts","suffix","matchRoute","compileRoutes","routes","walk","nodes","parentSegments","parentChain","parentChainIds","parentId","node","parts","ownSegments","urlSegments","id","chain","chainIds","compareSpecificity","KIND_RANK","a","b","length","i","segmentA","segmentB","rankDifference","matchPath","segments","params","partIndex","isLast","route","buildHref","pattern","value","RedirectSignal","to","permanent","NotFoundSignal","redirect","permanentRedirect","notFound","rewrite","isRewrite","value","METHODS","json","data","init","headers","__spreadProps","__spreadValues","createApiHandler","routes","pairs","apiRoute","compiled","compileRoutes","pair","byNode","request","__async","url","match","matchRoute","route","allowed","method","handler","response","error","RedirectSignal","NotFoundSignal","EventProperties","eventNameMap","acc","ev","key","HtmlTags","_chain","_microtask","cb","e","SELF_NOTIFY_CAP","Notifier","event","listener","release","listeners","args","top","inflight","idx","n","names","pending","chain","State","initialValue","name","newValue","merge","source","target","comma","space","adjacent","deepClone","value","old","val1","val2","addEvent","addHook","hashString","str","hash","i","toState","val","addHook","partial","hookName","handler","hookProperty","current","args","addEvent","attributes","eventName","eventProperty","eventNameMap","event","node","deepClone","value","seen","proto","clone","v","k","key","validate","element","asPartial","keys","i","val","HtmlTags","isHTML","str","escapeHTML","getTagName","e","camelToKebab","selectorSplitter","selectors","splitted","parens","angulars","soFar","len","char","normalizeSelectorKey","selectorText","text","collectCSSRules","rules","map","rule","ensureDomStyle","styleParent","_a","domStyle","mergePartial","part","p","merge","VoidTags","SvgTags","BooleanAttributes","PrefixCSS","CamelAttributes","ElementAttribute","name","parent","Notifier","domElement","mutateAttrs","_b","prev","release","listener","callback","AttributeList","attr","force","className","add","classes","newClass","list","updated","cls","oldClass","TextNode","textContent","newNode","tpl","domText","ElementList","ElementNode","index","dom","el","currentRef","aNode","bNode","a","b","aNext","bNext","inputs","updateDom","silent","_c","_d","oldItems","keyed","item","oldSet","claimed","input","isObj","tag","reused","cur","isPortal","at","extras","length","finalIndex","domNode","ref","root","child","done","doneCalled","onceDone","snapshot","aIndex","bIndex","itemA","itemB","fromIndex","toIndex","html","StyleProperty","parentRule","domRule","style","prefix","StyleRule","_StyleRule","StyleList","prop","styleStr","decl","nested","sheet","domSheet","css","err","obj","parentSelector","basic","getSelector","selector","splitKeys","currentSelector","newSelector","domRuleMap","domRuleList","wrongCount","fixOddEven","_ElementNode","domphyElement","_parent","tempPath","hashString","children","fn","n","originalKey","rawElement","content","next","autoClass","reserved","hookKeys","keep","userClass","composed","childNode","called","once","RecordState","record","__spreadValues","l","resolveMetadata","values","context","__async","resolved","template","value","metadata","key","entry","title","absoluteUrl","url","base","robotsContent","robots","directives","metadataToHeadTags","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","tags","meta","name","content","property","author","icons","openGraph","image","twitter","alternates","language","escapeAttribute","escapeText","renderHeadTags","tag","attributes","MANAGED_ATTRIBUTE","applyHeadTags","element","PREFETCH_LIFETIME","DataCache","k","callback","record","key","keys","entry","prefix","loader","context","revalidate","__async","lifetime","fresh","usableSeed","pending","promise","data","error","thunks","thunk","existing","createBrowserHistory","_a","_b","_c","scrollPositions","index","url","delta","callback","handler","position","MEMORY_ORIGIN","createMemoryHistory","initial","stack","listeners","next","listener","defaultErrorBlock","error","defaultNotFoundBlock","findBoundary","results","status","result","buildTree","input","_a","_b","_c","match","baseContext","retry","defaultError","defaultNotFound","chain","chainIds","segmentData","i","contexts","_","__spreadProps","__spreadValues","errorIndex","notFoundIndex","pendingIndex","inner","wrapLimit","blockIndex","nearestBlockIndex","route","element","layout","fromIndex","predicate","buildNotFoundTree","block","defaultRouter","getRouter","AppRouter","routes","options","k","DataCache","_a","_b","_c","compileRoutes","defaultNotFoundBlock","error","defaultErrorBlock","createBrowserHistory","ie","_e","key","route","entry","name","slotRoutes","match","url","__async","chain","chainIds","context","results","index","data","NotFoundSignal","chainIndex","soft","compiledSlots","prefixParts","i","urlPartCount","slots","compiled","slotMatch","matchRouteSuffix","__spreadValues","buildTree","search","href","_0","__spreadProps","matchRoute","e","listener","event","callback","renderPathname","middlewareContext","middleware","result","isRewrite","built","buildNotFoundTree","leaf","baseContext","pending","shell","rest","content","head","metadata","resolveMetadata","renderHeadTags","metadataToHeadTags","segmentId","token","RedirectSignal","failure","redirectSignal","promises","settled","allSettled","resolve","interim","dataRecord","applyHeadTags","element","status","_d","position","target","STREAM_SWAP_SCRIPT","HYDRATION_GLOBAL","DomphyApp","routes","options","AppRouter","router","listener","target","__async","m","style","seeded","_a","_0","url","requestUrl","serverRouter","__spreadProps","__spreadValues","status","redirect","node","data","result","renderHeadTags","metadataToHeadTags","serializeData","_b","shell","rest","encoder","shellNode","open","bootstrap","controller","content","head","contentNode","chunk","createApp","DEFAULT_DEVICE_SIZES","optimizedImage","props","src","alt","width","height","fill","sizes","quality","priority","placeholder","blurDataURL","loader","deviceSizes","part","size","__spreadProps","__spreadValues","event","image","isModifiedClick","event","navLink","props","href","replace","scroll","prefetch","exact","router","_a","getRouter","isActive","pathname","target","prefetched","prefetchOnce","listener","mouseEvent","anchor","node","observer","entries","entry","loadedScripts","resetScripts","whenIdle","callback","idle","script","props","src","strategy","id","async","onLoad","onError","dedupeKey","start","element","part","node","defineRoutes","routes"]}