{"version":3,"file":"router.mjs","sources":["node_modules/@aegisjsproject/url/utils.js","node_modules/@aegisjsproject/url/parser.js","node_modules/@aegisjsproject/callback-registry/callbacks.js","node_modules/@aegisjsproject/callback-registry/events.js","node_modules/@shgysk8zer0/signals/signals.js","router.js"],"sourcesContent":["export function stringify(thing) {\n\tswitch(typeof thing) {\n\t\tcase 'string':\n\t\t\treturn thing;\n\n\t\tcase 'function':\n\t\t\tthrow new TypeError('Functions are not supported.');\n\n\t\tcase 'undefined':\n\t\t\treturn '';\n\n\t\tcase 'object':\n\t\t\tif (thing === null) {\n\t\t\t\treturn '';\n\t\t\t} else if (thing instanceof Date) {\n\t\t\t\treturn thing.toISOString();\n\t\t\t} else if (Array.isArray(thing)) {\n\t\t\t\treturn thing.map(stringify).join(',');\n\t\t\t} else if (thing instanceof ArrayBuffer && Uint8Array.prototype.toBase64 instanceof Function) {\n\t\t\t\treturn new Uint8Array(thing).toBase64();\n\t\t\t} else if (ArrayBuffer.isView(thing) && thing.toBase64 instanceof Function) {\n\t\t\t\treturn thing.toBase64();\n\t\t\t} else if (thing instanceof Blob) {\n\t\t\t\treturn URL.createObjectURL(thing);\n\t\t\t} else {\n\t\t\t\treturn thing.toString();\n\t\t\t}\n\n\t\tdefault:\n\t\t\treturn thing.toString();\n\t}\n}\n","import { stringify } from './utils.js';\n\n/**\n * Escapes a component of a URL, also protecting against path traversal\n *\n * @param {string} str\n * @returns {string} The URL-safe string\n */\nexport function escape(str) {\n\treturn encodeURIComponent(stringify(str).trim()).replaceAll('..%2F', '%2E%2E%2F').replaceAll('.%2F', '%2E%2E%2F');\n}\n\n/**\n * Creates a URL parser tagged template with a custom base\n *\n * @param {string} [base=document.baseURI] Base to parse relative URLs from\n * @returns {Function} A URL parsing tagged template\n */\nexport function createURLParser(base = globalThis?.document?.baseURI) {\n\treturn function url(strings, value, ...values) {\n\t\tif (value instanceof Blob && strings.length === 2 && strings[0] === '' && strings[1] === '') {\n\t\t\treturn new URL(URL.createObjectURL(value));\n\t\t} else if (URL.canParse(value)) {\n\t\t\treturn URL.parse(String.raw(strings, '', ...values.map(escape)), value);\n\t\t} else if (strings[0].startsWith('/')) {\n\t\t\treturn URL.parse(String.raw(strings, escape(value), ...values.map(escape)), base);\n\t\t} else if (strings[0].startsWith('./') || strings[0].startsWith('../')) {\n\t\t\treturn URL.parse(String.raw(strings, escape(value), ...values.map(escape)), base);\n\t\t} else {\n\t\t\treturn URL.parse(String.raw(strings, escape(value), ...values.map(escape)));\n\t\t}\n\t};\n}\n\n/**\n * A function for creating URL objects from tagged template literals.\n *\n * @param {TemplateStringsArray} strings - The template string parts.\n * @param  {...any} args - The template string substitutions.\n * @returns {URL | null} - A URL object if the URL is valid, otherwise null.\n */\nexport const url = createURLParser();\n","import {\n\teventToProp, capture as captureAttr, once as onceAttr, passive as passiveAttr, signal as signalAttr,\n\tregisterEventAttribute, hasEventAttribute, registerSignal, abortController,\n} from './events.js';\n\nlet _isRegistrationOpen = true;\n\nconst $$ = (selector, base = document) => base.querySelectorAll(selector);\n\nconst $ = (selector, base = document) => base.querySelector(selector);\n\nexport const requestFullscreen = { attr: 'data-request-fullscreen-selector', data: 'requestFullscreenSelector' };\nexport const toggleFullsceen = { attr: 'data-toggle-fullscreen-selector', data: 'toggleFullscreenSelector' };\n\nexport const FUNCS = {\n\tdebug: {\n\t\tlog: 'aegis:debug:log',\n\t\tinfo: 'aegis:debug:info',\n\t\twarn: 'aegis:debug:warn',\n\t\terror: 'aegis:debug:error',\n\t},\n\tnavigate: {\n\t\tback: 'aegis:navigate:back',\n\t\tforward: 'aegis:navigate:forward',\n\t\treload: 'aegis:navigate:reload',\n\t\tclose: 'aegis:navigate:close',\n\t\tlink: 'aegis:navigate:go',\n\t\tpopup: 'aegis:navigate:popup',\n\t},\n\tui: {\n\t\tcommand: 'aegis:ui:command',\n\t\tprint: 'aegis:ui:print',\n\t\tremove: 'aegis:ui:remove',\n\t\thide: 'aegis:ui:hide',\n\t\tunhide: 'aegis:ui:unhide',\n\t\tshowModal: 'aegis:ui:showModal',\n\t\tcloseModal: 'aegis:ui:closeModal',\n\t\tshowPopover: 'aegis:ui:showPopover',\n\t\thidePopover: 'aegis:ui:hidePopover',\n\t\ttogglePopover: 'aegis:ui:togglePopover',\n\t\tenable: 'aegis:ui:enable',\n\t\tdisable: 'aegis:ui:disable',\n\t\tscrollTo: 'aegis:ui:scrollTo',\n\t\tprevent: 'aegis:ui:prevent',\n\t\trevokeObjectURL: 'aegis:ui:revokeObjectURL',\n\t\tcancelAnimationFrame: 'aegis:ui:cancelAnimationFrame',\n\t\tclearInterval: 'aegis:clearInterval',\n\t\tclearTimeout: 'aegis:clearTimeout',\n\t\trequestFullscreen: 'aegis:ui:requestFullscreen',\n\t\ttoggleFullscreen: 'aegis:ui:toggleFullsceen',\n\t\texitFullsceen: 'aegis:ui:exitFullscreen',\n\t\topen: 'aegis:ui:open',\n\t\tclose: 'aegis:ui:close',\n\t\tabortController: 'aegis:ui:controller:abort',\n\t},\n};\n\n/**\n * @type {Map<string, function>}\n */\nconst registry = new Map([\n\t[FUNCS.debug.log, console.log],\n\t[FUNCS.debug.warn, console.warn],\n\t[FUNCS.debug.error, console.error],\n\t[FUNCS.debug.info, console.info],\n\t[FUNCS.navigate.back, () => history.back()],\n\t[FUNCS.navigate.forward, () => history.forward()],\n\t[FUNCS.navigate.reload, () => history.go(0)],\n\t[FUNCS.navigate.close, () => globalThis.close()],\n\t[FUNCS.navigate.link, event => {\n\t\tif (event.isTrusted) {\n\t\t\tevent.preventDefault();\n\t\t\tlocation.href = event.currentTarget.dataset.url;\n\t\t}\n\t}],\n\t[FUNCS.navigate.popup, event => {\n\t\tif (event.isTrusted) {\n\t\t\tevent.preventDefault();\n\t\t\tglobalThis.open(event.currentTarget.dataset.url);\n\t\t}\n\t}],\n\t[FUNCS.ui.hide, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.hideSelector).forEach(el => el.hidden = true);\n\t}],\n\t[FUNCS.ui.unhide, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.unhideSelector).forEach(el => el.hidden = false);\n\t}],\n\t[FUNCS.ui.disable, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.disableSelector).forEach(el => el.disabled = true);\n\t}],\n\t[FUNCS.ui.enable, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.enableSelector).forEach(el => el.disabled = false);\n\t}],\n\t[FUNCS.ui.remove, ({ currentTarget }) => {\n\t\t$$(currentTarget.dataset.removeSelector).forEach(el => el.remove());\n\t}],\n\t[FUNCS.ui.scrollTo, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.scrollToSelector);\n\n\t\tif (target instanceof Element) {\n\t\t\ttarget.scrollIntoView({\n\t\t\t\tbehavior: matchMedia('(prefers-reduced-motion: reduce)').matches\n\t\t\t\t\t? 'instant'\n\t\t\t\t\t: 'smooth',\n\t\t\t});\n\t\t}\n\t}],\n\t[FUNCS.ui.revokeObjectURL, ({ currentTarget }) => URL.revokeObjectURL(currentTarget.src)],\n\t[FUNCS.ui.cancelAnimationFrame, ({ currentTarget }) => cancelAnimationFrame(parseInt(currentTarget.dataset.animationFrame))],\n\t[FUNCS.ui.clearInterval, ({ currentTarget }) => clearInterval(parseInt(currentTarget.dataset.clearInterval))],\n\t[FUNCS.ui.clearTimeout, ({ currentTarget }) => clearTimeout(parseInt(currentTarget.dataset.timeout))],\n\t[FUNCS.ui.abortController, ({ currentTarget }) => abortController(currentTarget.dataset.aegisEventController, currentTarget.dataset.aegisControllerReason)],\n\t[FUNCS.ui.open, ({ currentTarget }) => document.querySelector(currentTarget.dataset.openSelector).open = true],\n\t[FUNCS.ui.close, ({ currentTarget }) => document.querySelector(currentTarget.dataset.closeSelector).open = false],\n\t[FUNCS.ui.showModal, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.showModalSelector);\n\n\t\tif (target instanceof HTMLDialogElement) {\n\t\t\ttarget.showModal();\n\t\t}\n\t}],\n\t[FUNCS.ui.closeModal, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.closeModalSelector);\n\n\t\tif (target instanceof HTMLDialogElement) {\n\t\t\ttarget.close();\n\t\t}\n\t}],\n\t[FUNCS.ui.showPopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.showPopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.showPopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.hidePopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.hidePopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.hidePopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.togglePopover, ({ currentTarget }) => {\n\t\tconst target = $(currentTarget.dataset.togglePopoverSelector);\n\n\t\tif (target instanceof HTMLElement) {\n\t\t\ttarget.togglePopover();\n\t\t}\n\t}],\n\t[FUNCS.ui.print, () => globalThis.print()],\n\t[FUNCS.ui.prevent, event => event.preventDefault()],\n\t[FUNCS.ui.requestFullscreen, ({ currentTarget}) => {\n\t\tif (currentTarget.dataset.hasOwnProperty(requestFullscreen.data)) {\n\t\t\tdocument.getElementById(currentTarget.dataset[requestFullscreen.data]).requestFullscreen();\n\t\t} else {\n\t\t\tcurrentTarget.requestFullscreen();\n\t\t}\n\t}],\n\t[FUNCS.ui.toggleFullscreen, ({ currentTarget }) => {\n\t\tconst target = currentTarget.dataset.hasOwnProperty(toggleFullsceen.data)\n\t\t\t? document.getElementById(currentTarget.dataset[toggleFullsceen.data])\n\t\t\t: currentTarget;\n\n\t\tif (target.isSameNode(document.fullscreenElement)) {\n\t\t\tdocument.exitFullscreen();\n\t\t} else {\n\t\t\ttarget.requestFullscreen();\n\t\t}\n\t}],\n\t[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],\n]);\n\nexport class CallbackRegistryKey extends String {\n\t[Symbol.dispose]() {\n\t\tregistry.delete(this.toString());\n\t}\n}\n\n/**\n * Check if callback registry is open\n *\n * @returns {boolean} Whether or not callback registry is open\n */\nexport const isRegistrationOpen = () => _isRegistrationOpen;\n\n/**\n * Close callback registry\n *\n * @returns {boolean} Whether or not the callback was succesfully removed\n */\nexport const closeRegistration = () => _isRegistrationOpen = false;\n\n/**\n * Get an array of registered callbacks\n *\n * @returns {Array} A frozen array listing keys to all registered callbacks\n */\nexport const listCallbacks = () => Object.freeze(Array.from(registry.keys()));\n\n/**\n * Check if a callback is registered\n *\n * @param {CallbackRegistryKey|string} name The name/key to check for in callback registry\n * @returns {boolean} Whether or not a callback is registered\n */\nexport const hasCallback = name => registry.has(name?.toString());\n\n/**\n * Get a callback from the registry by name/key\n *\n * @param {CallbackRegistryKey|string} name The name/key of the callback to get\n * @returns {Function|undefined} The corresponding function registered under that name/key\n */\nexport const getCallback = name => registry.get(name?.toString());\n\n/**\n *\t Remove a callback from the registry\n *\n * @param {CallbackRegistryKey|string} name The name/key of the callback to get\n * @returns {boolean} Whether or not the callback was successfully unregisterd\n */\nexport const unregisterCallback = name => _isRegistrationOpen && registry.delete(name?.toString());\n\n/**\n * Remove all callbacks from the registry\n *\n * @returns {void}\n */\nexport const clearRegistry = () => registry.clear();\n\n/**\n * Create a registered callback with a randomly generated name\n *\n * @param {Function} callback Callback function to register\n * @param {object} [config]\n * @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.\n * @returns {CallbackRegistryKey} The automatically generated key/name of the registered callback\n */\nexport const createCallback = (callback, { stack } = {}) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback, { stack });\n\n/**\n * Call a callback fromt the registry by name/key\n *\n * @param {CallbackRegistryKey|string} name The name/key of the registered function\n * @param  {...any} args Any arguments to pass along to the function\n * @returns {any} Whatever the return value of the function is\n * @throws {Error} Throws if callback is not found or any error resulting from calling the function\n */\nexport function callCallback(name, ...args) {\n\tif (registry.has(name?.toString())) {\n\t\treturn registry.get(name?.toString()).apply(this || globalThis, args);\n\t} else {\n\t\tthrow new Error(`No ${name} function registered.`);\n\t}\n}\n\n/**\n * Register a named callback in registry\n *\n * @param {CallbackRegistryKey|string} name The name/key to register the callback under\n * @param {Function} callback The callback value to register\n * @param {object} config\n * @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.\n * @returns {CallbackRegistryKey} The registered name/key\n */\nexport function registerCallback(name, callback, { stack } = {}) {\n\tif (typeof name === 'string') {\n\t\treturn registerCallback(new CallbackRegistryKey(name), callback, { stack });\n\t} else if (! (name instanceof CallbackRegistryKey)) {\n\t\tthrow new TypeError('Callback name must be a disposable string/CallbackRegistryKey.');\n\t} else if (typeof callback === 'object' && typeof callback.handleEvent === 'function') {\n\t\treturn registerCallback(name, callback.handleEvent.bind(callback), { stack });\n\t} else if (! (typeof callback === 'function' || typeof callback?.handleEvent === 'function')) {\n\t\tthrow new TypeError('Callback must be a function.');\n\t} else if (! _isRegistrationOpen) {\n\t\tthrow new TypeError('Cannot register new callbacks because registry is closed.');\n\t} else if (registry.has(name?.toString())) {\n\t\tthrow new Error(`Handler \"${name}\" is already registered.`);\n\t} else if (stack instanceof DisposableStack || stack instanceof AsyncDisposableStack) {\n\t\tconst key = stack.use(new CallbackRegistryKey(name));\n\t\tregistry.set(key.toString(), callback);\n\n\t\treturn key;\n\t} else {\n\t\tconst key = new CallbackRegistryKey(name);\n\t\tregistry.set(key.toString(), callback);\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Get the host/root node of a given thing.\n *\n * @param {Event|Document|Element|ShadowRoot} target Source thing to search for host of\n * @returns {Document|Element|null} The host/root node, or null\n */\nexport function getHost(target) {\n\tif (target instanceof Event) {\n\t\treturn getHost(target.currentTarget);\n\t} else if (target instanceof Document) {\n\t\treturn target;\n\t} else if (target instanceof Element) {\n\t\treturn getHost(target.getRootNode());\n\t} else if (target instanceof ShadowRoot) {\n\t\treturn target.host;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nexport function on(event, callback, { capture = false, passive = false, once = false, signal, stack } = {}) {\n\tif (callback instanceof Function) {\n\t\treturn on(event, createCallback(callback, { stack }), { capture, passive, once, signal });\n\t} else if (! (callback instanceof String || typeof callback === 'string') || callback.length === 0) {\n\t\tthrow new TypeError('Callback must be a function or a registered callback string.');\n\t} else if (typeof event !== 'string' || event.length === 0) {\n\t\tthrow new TypeError('Event must be a non-empty string.');\n\t} else {\n\t\tif (! hasEventAttribute(event)) {\n\t\t\tregisterEventAttribute(event);\n\t\t}\n\n\t\tconst parts = [[eventToProp(event), callback]];\n\n\t\tif (capture) {\n\t\t\tparts.push([captureAttr, '']);\n\t\t}\n\n\t\tif (passive) {\n\t\t\tparts.push([passiveAttr, '']);\n\t\t}\n\n\t\tif (once) {\n\t\t\tparts.push([onceAttr, '']);\n\t\t}\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tparts.push([signalAttr, registerSignal(signal)]);\n\t\t} else if (typeof signal === 'string') {\n\t\t\tparts.push([signalAttr, signal]);\n\t\t}\n\n\t\treturn parts.map(([prop, val]) => `${prop}=\"${val}\"`).join(' ');\n\t}\n}\n","import { hasCallback, getCallback } from './callbacks.js';\nimport { Signal } from '@shgysk8zer0/signals';\n\nconst PREFIX = 'data-aegis-event-';\nconst EVENT_PREFIX = PREFIX + 'on-';\nconst EVENT_PREFIX_LENGTH = EVENT_PREFIX.length;\nconst DATA_PREFIX = 'aegisEventOn';\nconst DATA_PREFIX_LENGTH = DATA_PREFIX.length;\nconst signalSymbol = Symbol('aegis:signal');\nconst controllerSymbol = Symbol('aegis:controller');\nconst signalRegistry = new Map();\nconst controllerRegistry = new Map();\n\nexport const once = PREFIX + 'once';\nexport const passive = PREFIX + 'passive';\nexport const capture = PREFIX + 'capture';\nexport const signal = PREFIX + 'signal';\nexport const controller = PREFIX + 'controller';\nexport const onAbort = EVENT_PREFIX + 'abort';\nexport const onBlur = EVENT_PREFIX + 'blur';\nexport const onFocus = EVENT_PREFIX + 'focus';\nexport const onCancel = EVENT_PREFIX + 'cancel';\nexport const onAuxclick = EVENT_PREFIX + 'auxclick';\nexport const onBeforeinput = EVENT_PREFIX + 'beforeinput';\nexport const onBeforetoggle = EVENT_PREFIX + 'beforetoggle';\nexport const onCanplay = EVENT_PREFIX + 'canplay';\nexport const onCanplaythrough = EVENT_PREFIX + 'canplaythrough';\nexport const onChange = EVENT_PREFIX + 'change';\nexport const onClick = EVENT_PREFIX + 'click';\nexport const onClose = EVENT_PREFIX + 'close';\nexport const onCommand = EVENT_PREFIX + 'command';\nexport const onContextmenu = EVENT_PREFIX + 'contextmenu';\nexport const onCopy = EVENT_PREFIX + 'copy';\nexport const onCuechange = EVENT_PREFIX + 'cuechange';\nexport const onCut = EVENT_PREFIX + 'cut';\nexport const onDblclick = EVENT_PREFIX + 'dblclick';\nexport const onDrag = EVENT_PREFIX + 'drag';\nexport const onDragend = EVENT_PREFIX + 'dragend';\nexport const onDragenter = EVENT_PREFIX + 'dragenter';\nexport const onDragexit = EVENT_PREFIX + 'dragexit';\nexport const onDragleave = EVENT_PREFIX + 'dragleave';\nexport const onDragover = EVENT_PREFIX + 'dragover';\nexport const onDragstart = EVENT_PREFIX + 'dragstart';\nexport const onDrop = EVENT_PREFIX + 'drop';\nexport const onDurationchange = EVENT_PREFIX + 'durationchange';\nexport const onEmptied = EVENT_PREFIX + 'emptied';\nexport const onEnded = EVENT_PREFIX + 'ended';\nexport const onFormdata = EVENT_PREFIX + 'formdata';\nexport const onInput = EVENT_PREFIX + 'input';\nexport const onInvalid = EVENT_PREFIX + 'invalid';\nexport const onKeydown = EVENT_PREFIX + 'keydown';\nexport const onKeypress = EVENT_PREFIX + 'keypress';\nexport const onKeyup = EVENT_PREFIX + 'keyup';\nexport const onLoad = EVENT_PREFIX + 'load';\nexport const onLoadeddata = EVENT_PREFIX + 'loadeddata';\nexport const onLoadedmetadata = EVENT_PREFIX + 'loadedmetadata';\nexport const onLoadstart = EVENT_PREFIX + 'loadstart';\nexport const onMousedown = EVENT_PREFIX + 'mousedown';\nexport const onMouseenter = EVENT_PREFIX + 'mouseenter';\nexport const onMouseleave = EVENT_PREFIX + 'mouseleave';\nexport const onMousemove = EVENT_PREFIX + 'mousemove';\nexport const onMouseout = EVENT_PREFIX + 'mouseout';\nexport const onMouseover = EVENT_PREFIX + 'mouseover';\nexport const onMouseup = EVENT_PREFIX + 'mouseup';\nexport const onWheel = EVENT_PREFIX + 'wheel';\nexport const onPaste = EVENT_PREFIX + 'paste';\nexport const onPause = EVENT_PREFIX + 'pause';\nexport const onPlay = EVENT_PREFIX + 'play';\nexport const onPlaying = EVENT_PREFIX + 'playing';\nexport const onProgress = EVENT_PREFIX + 'progress';\nexport const onRatechange = EVENT_PREFIX + 'ratechange';\nexport const onReset = EVENT_PREFIX + 'reset';\nexport const onResize = EVENT_PREFIX + 'resize';\nexport const onScroll = EVENT_PREFIX + 'scroll';\nexport const onScrollend = EVENT_PREFIX + 'scrollend';\nexport const onSecuritypolicyviolation = EVENT_PREFIX + 'securitypolicyviolation';\nexport const onSeeked = EVENT_PREFIX + 'seeked';\nexport const onSeeking = EVENT_PREFIX + 'seeking';\nexport const onSelect = EVENT_PREFIX + 'select';\nexport const onSlotchange = EVENT_PREFIX + 'slotchange';\nexport const onStalled = EVENT_PREFIX + 'stalled';\nexport const onSubmit = EVENT_PREFIX + 'submit';\nexport const onSuspend = EVENT_PREFIX + 'suspend';\nexport const onTimeupdate = EVENT_PREFIX + 'timeupdate';\nexport const onVolumechange = EVENT_PREFIX + 'volumechange';\nexport const onWaiting = EVENT_PREFIX + 'waiting';\nexport const onSelectstart = EVENT_PREFIX + 'selectstart';\nexport const onSelectionchange = EVENT_PREFIX + 'selectionchange';\nexport const onToggle = EVENT_PREFIX + 'toggle';\nexport const onPointercancel = EVENT_PREFIX + 'pointercancel';\nexport const onPointerdown = EVENT_PREFIX + 'pointerdown';\nexport const onPointerup = EVENT_PREFIX + 'pointerup';\nexport const onPointermove = EVENT_PREFIX + 'pointermove';\nexport const onPointerout = EVENT_PREFIX + 'pointerout';\nexport const onPointerover = EVENT_PREFIX + 'pointerover';\nexport const onPointerenter = EVENT_PREFIX + 'pointerenter';\nexport const onPointerleave = EVENT_PREFIX + 'pointerleave';\nexport const onGotpointercapture = EVENT_PREFIX + 'gotpointercapture';\nexport const onLostpointercapture = EVENT_PREFIX + 'lostpointercapture';\nexport const onMozfullscreenchange = EVENT_PREFIX + 'mozfullscreenchange';\nexport const onMozfullscreenerror = EVENT_PREFIX + 'mozfullscreenerror';\nexport const onAnimationcancel = EVENT_PREFIX + 'animationcancel';\nexport const onAnimationend = EVENT_PREFIX + 'animationend';\nexport const onAnimationiteration = EVENT_PREFIX + 'animationiteration';\nexport const onAnimationstart = EVENT_PREFIX + 'animationstart';\nexport const onTransitioncancel = EVENT_PREFIX + 'transitioncancel';\nexport const onTransitionend = EVENT_PREFIX + 'transitionend';\nexport const onTransitionrun = EVENT_PREFIX + 'transitionrun';\nexport const onTransitionstart = EVENT_PREFIX + 'transitionstart';\nexport const onWebkitanimationend = EVENT_PREFIX + 'webkitanimationend';\nexport const onWebkitanimationiteration = EVENT_PREFIX + 'webkitanimationiteration';\nexport const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart';\nexport const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend';\nexport const onError = EVENT_PREFIX + 'error';\n\nconst eventAttrs = new Signal.State([\n\tonAbort,\n\tonBlur,\n\tonFocus,\n\tonCancel,\n\tonAuxclick,\n\tonBeforeinput,\n\tonBeforetoggle,\n\tonCanplay,\n\tonCanplaythrough,\n\tonChange,\n\tonClick,\n\tonClose,\n\tonCommand,\n\tonContextmenu,\n\tonCopy,\n\tonCuechange,\n\tonCut,\n\tonDblclick,\n\tonDrag,\n\tonDragend,\n\tonDragenter,\n\tonDragexit,\n\tonDragleave,\n\tonDragover,\n\tonDragstart,\n\tonDrop,\n\tonDurationchange,\n\tonEmptied,\n\tonEnded,\n\tonFormdata,\n\tonInput,\n\tonInvalid,\n\tonKeydown,\n\tonKeypress,\n\tonKeyup,\n\tonLoad,\n\tonLoadeddata,\n\tonLoadedmetadata,\n\tonLoadstart,\n\tonMousedown,\n\tonMouseenter,\n\tonMouseleave,\n\tonMousemove,\n\tonMouseout,\n\tonMouseover,\n\tonMouseup,\n\tonWheel,\n\tonPaste,\n\tonPause,\n\tonPlay,\n\tonPlaying,\n\tonProgress,\n\tonRatechange,\n\tonReset,\n\tonResize,\n\tonScroll,\n\tonScrollend,\n\tonSecuritypolicyviolation,\n\tonSeeked,\n\tonSeeking,\n\tonSelect,\n\tonSlotchange,\n\tonStalled,\n\tonSubmit,\n\tonSuspend,\n\tonTimeupdate,\n\tonVolumechange,\n\tonWaiting,\n\tonSelectstart,\n\tonSelectionchange,\n\tonToggle,\n\tonPointercancel,\n\tonPointerdown,\n\tonPointerup,\n\tonPointermove,\n\tonPointerout,\n\tonPointerover,\n\tonPointerenter,\n\tonPointerleave,\n\tonGotpointercapture,\n\tonLostpointercapture,\n\tonMozfullscreenchange,\n\tonMozfullscreenerror,\n\tonAnimationcancel,\n\tonAnimationend,\n\tonAnimationiteration,\n\tonAnimationstart,\n\tonTransitioncancel,\n\tonTransitionend,\n\tonTransitionrun,\n\tonTransitionstart,\n\tonWebkitanimationend,\n\tonWebkitanimationiteration,\n\tonWebkitanimationstart,\n\tonWebkittransitionend,\n\tonError,\n]);\n\n\nconst attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;\nconst selector = new Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(','));\n\nexport const eventToProp = event => EVENT_PREFIX + event;\n\nexport const hasEventAttribute = event => eventAttrs.get().includes(EVENT_PREFIX + event);\n\nconst isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX);\n\nfunction _addListeners(el, { signal, attrFilter = EVENTS } = {}) {\n\tconst dataset = el.dataset;\n\n\tfor (const [attr, val] of Object.entries(dataset).filter(isEventDataAttr)) {\n\t\ttry {\n\t\t\tconst event = 'on' + attr.substring(DATA_PREFIX_LENGTH);\n\n\t\t\tif (attrFilter.hasOwnProperty(event) && hasCallback(val)) {\n\t\t\t\tel.addEventListener(event.substring(2).toLowerCase(), getCallback(val), {\n\t\t\t\t\tpassive: dataset.hasOwnProperty('aegisEventPassive'),\n\t\t\t\t\tcapture: dataset.hasOwnProperty('aegisEventCapture'),\n\t\t\t\t\tonce: dataset.hasOwnProperty('aegisEventOnce'),\n\t\t\t\t\tsignal: dataset.hasOwnProperty('aegisEventSignal') ? getSignal(dataset.aegisEventSignal) : signal,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch(err) {\n\t\t\treportError(err);\n\t\t}\n\t}\n}\n\nconst observer = new MutationObserver(records => {\n\trecords.forEach(record  => {\n\t\tswitch(record.type) {\n\t\t\tcase 'childList':\n\t\t\t\t[...record.addedNodes]\n\t\t\t\t\t.filter(node => node.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t.forEach(node => attachListeners(node));\n\t\t\t\tbreak;\n\n\t\t\tcase 'attributes':\n\t\t\t\tif (typeof record.oldValue === 'string' && hasCallback(record.oldValue)) {\n\t\t\t\t\trecord.target.removeEventListener(\n\t\t\t\t\t\trecord.attributeName.substring(EVENT_PREFIX_LENGTH),\n\t\t\t\t\t\tgetCallback(record.oldValue), {\n\t\t\t\t\t\t\tonce: record.target.hasAttribute(once),\n\t\t\t\t\t\t\tcapture: record.target.hasAttribute(capture),\n\t\t\t\t\t\t\tpassive: record.target.hasAttribute(passive),\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trecord.target.hasAttribute(record.attributeName)\n\t\t\t\t\t&& hasCallback(record.target.getAttribute(record.attributeName))\n\t\t\t\t) {\n\t\t\t\t\trecord.target.addEventListener(\n\t\t\t\t\t\trecord.attributeName.substring(EVENT_PREFIX_LENGTH),\n\t\t\t\t\t\tgetCallback(record.target.getAttribute(record.attributeName)), {\n\t\t\t\t\t\t\tonce: record.target.hasAttribute(once),\n\t\t\t\t\t\t\tcapture: record.target.hasAttribute(capture),\n\t\t\t\t\t\t\tpassive: record.target.hasAttribute(passive),\n\t\t\t\t\t\t\tsignal: record.target.hasAttribute(signal) ? getSignal(record.target.getAttribute(signal)) : undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n});\n\nexport const EVENTS = {\n\tonAbort,\n\tonBlur,\n\tonFocus,\n\tonCancel,\n\tonAuxclick,\n\tonBeforeinput,\n\tonBeforetoggle,\n\tonCanplay,\n\tonCanplaythrough,\n\tonChange,\n\tonClick,\n\tonClose,\n\tonCommand,\n\tonContextmenu,\n\tonCopy,\n\tonCuechange,\n\tonCut,\n\tonDblclick,\n\tonDrag,\n\tonDragend,\n\tonDragenter,\n\tonDragexit,\n\tonDragleave,\n\tonDragover,\n\tonDragstart,\n\tonDrop,\n\tonDurationchange,\n\tonEmptied,\n\tonEnded,\n\tonFormdata,\n\tonInput,\n\tonInvalid,\n\tonKeydown,\n\tonKeypress,\n\tonKeyup,\n\tonLoad,\n\tonLoadeddata,\n\tonLoadedmetadata,\n\tonLoadstart,\n\tonMousedown,\n\tonMouseenter,\n\tonMouseleave,\n\tonMousemove,\n\tonMouseout,\n\tonMouseover,\n\tonMouseup,\n\tonWheel,\n\tonPaste,\n\tonPause,\n\tonPlay,\n\tonPlaying,\n\tonProgress,\n\tonRatechange,\n\tonReset,\n\tonResize,\n\tonScroll,\n\tonScrollend,\n\tonSecuritypolicyviolation,\n\tonSeeked,\n\tonSeeking,\n\tonSelect,\n\tonSlotchange,\n\tonStalled,\n\tonSubmit,\n\tonSuspend,\n\tonTimeupdate,\n\tonVolumechange,\n\tonWaiting,\n\tonSelectstart,\n\tonSelectionchange,\n\tonToggle,\n\tonPointercancel,\n\tonPointerdown,\n\tonPointerup,\n\tonPointermove,\n\tonPointerout,\n\tonPointerover,\n\tonPointerenter,\n\tonPointerleave,\n\tonGotpointercapture,\n\tonLostpointercapture,\n\tonMozfullscreenchange,\n\tonMozfullscreenerror,\n\tonAnimationcancel,\n\tonAnimationend,\n\tonAnimationiteration,\n\tonAnimationstart,\n\tonTransitioncancel,\n\tonTransitionend,\n\tonTransitionrun,\n\tonTransitionstart,\n\tonWebkitanimationend,\n\tonWebkitanimationiteration,\n\tonWebkitanimationstart,\n\tonWebkittransitionend,\n\tonError,\n\tonce,\n\tpassive,\n\tcapture,\n};\n\n/**\n * Register an attribute to observe for adding/removing event listeners\n *\n * @param {string} attr Name of the attribute to observe\n * @param {object} options\n * @param {boolean} [options.addListeners=false] Whether or not to automatically add listeners\n * @param {Document|Element} [options.base=document.body] Root node to observe\n * @param {AbortSignal} [options.signal] An abort signal to remove any listeners when aborted\n * @returns {string} The resulting `data-*` attribute name\n */\nexport function registerEventAttribute(attr, {\n\taddListeners = false,\n\tbase = document.body,\n\tsignal,\n} = {}) {\n\tconst fullAttr = EVENT_PREFIX + attr.toLowerCase();\n\tconst attrs = eventAttrs.get();\n\n\tif (! attrs.includes(fullAttr)) {\n\t\tconst sel = `[${CSS.escape(fullAttr)}]`;\n\t\tconst prop = attrToProp(fullAttr);\n\t\teventAttrs.set([...attrs, fullAttr]);\n\t\tEVENTS[prop] = fullAttr;\n\n\t\tif (addListeners) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst config = { attrFilter: { [prop]: sel }, signal };\n\t\t\t\t[base, ...base.querySelectorAll(sel)].forEach(el => _addListeners(el, config));\n\t\t\t});\n\t\t}\n\t}\n\n\treturn fullAttr;\n}\n\n/**\n * Registers an `AbortController` in the controller registry and returns the key for it\n *\n * @param {AbortController} controller\n * @returns {string} The randomly generated key with which the controller is registered\n * @throws {TypeError} If controller is not an `AbortController`\n * @throws {Error} Any `reason` if controller is already aborted\n */\nexport function registerController(controller) {\n\tif (! (controller instanceof AbortController)) {\n\t\tthrow new TypeError('Controller is not an `AbortSignal.');\n\t} else if (controller.signal.aborted) {\n\t\tthrow controller.signal.reason;\n\t} else if (typeof controller.signal[controllerSymbol] === 'string') {\n\t\treturn controller.signal[controllerSymbol];\n\t} else {\n\t\tconst key = 'aegis:event:controller:' + crypto.randomUUID();\n\t\tObject.defineProperty(controller.signal, controllerSymbol, { value: key, writable: false, enumerable: false });\n\t\tcontrollerRegistry.set(key, controller);\n\n\t\tcontroller.signal.addEventListener('abort', unregisterController, { once: true });\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Removes a controller from the registry\n *\n * @param {AbortController|AbortSignal|string} key The registed key or the controller or signal it corresponds to\n * @returns {boolean} Whether or not the controller was successfully unregistered\n */\nexport function unregisterController(key) {\n\tif (key instanceof AbortController) {\n\t\treturn controllerRegistry.delete(key.signal[controllerSymbol]);\n\t} else if (key instanceof AbortSignal) {\n\t\treturn controllerRegistry.delete(key[controllerSymbol]);\n\t} else {\n\t\treturn controllerRegistry.delete(key);\n\t}\n}\n\n/**\n * Creates and registers an `AbortController` in the controller registry and returns the key for it\n *\n * @param {object} options\n * @param {AbortSignal} [options.signal] An optional `AbortSignal` to externally abort the controller with\n * @returns {string} The randomly generated key with which the controller is registered\n */\nexport function createController({ signal } = {}) {\n\tconst controller = new AbortController();\n\n\tif (signal instanceof AbortSignal) {\n\t\tsignal.addEventListener('abort', ({ target }) => controller.abort(target.reason), { signal: controller.signal});\n\t}\n\n\treturn registerController(controller);\n}\n\n/**\n * Get a registetd controller from the registry\n *\n * @param {string} key Generated key with which the controller was registered\n * @returns {AbortController|void} Any registered controller, if any\n */\nexport const getController = key => controllerRegistry.get(key);\n\nexport function abortController(key, reason) {\n\tconst controller = getController(key);\n\n\tif (! (controller instanceof AbortController)) {\n\t\treturn false;\n\t} else if (typeof reason === 'string') {\n\t\tcontroller.abort(new Error(reason));\n\t\treturn true;\n\t} else {\n\t\tcontroller.abort(reason);\n\t\treturn true;\n\t}\n}\n\n/**\n * Register an `AbortSignal` to be used in declarative HTML as a value for `data-aegis-event-signal`\n *\n * @param {AbortSignal} signal The signal to register\n * @returns {string} The registered key\n * @throws {TypeError} Thrown if not an `AbortSignal`\n */\nexport function registerSignal(signal) {\n\tif (! (signal instanceof AbortSignal)) {\n\t\tthrow new TypeError('Signal must be an `AbortSignal`.');\n\t} else if (typeof signal[signalSymbol] === 'string') {\n\t\treturn signal[signalSymbol];\n\t} else {\n\t\tconst key = 'aegis:event:signal:' + crypto.randomUUID();\n\t\tObject.defineProperty(signal, signalSymbol, { value: key, writable: false, enumerable: false });\n\t\tsignalRegistry.set(key, signal);\n\t\tsignal.addEventListener('abort', ({ target }) => unregisterSignal(target[signalSymbol]), { once: true });\n\n\t\treturn key;\n\t}\n}\n\n/**\n * Gets and `AbortSignal` from the registry\n *\n * @param {string} key The registered key for the signal\n * @returns {AbortSignal|void} The corresponding `AbortSignal`, if any\n */\nexport const getSignal = key => signalRegistry.get(key);\n\n/**\n * Removes an `AbortSignal` from the registry\n *\n * @param {AbortSignal|string} signal An `AbortSignal` or the registered key for one\n * @returns {boolean} Whether or not the signal was sucessfully unregistered\n * @throws {TypeError} Throws if `signal` is not an `AbortSignal` or the key for a registered signal\n */\nexport function unregisterSignal(signal) {\n\tif (signal instanceof AbortSignal) {\n\t\treturn signalRegistry.delete(signal[signalSymbol]);\n\t} else if (typeof signal === 'string') {\n\t\treturn signalRegistry.delete(signal);\n\t} else {\n\t\tthrow new TypeError('Signal must be an `AbortSignal` or registered key/attribute.');\n\t}\n}\n\n/**\n * Add listeners to an element and its children, matching a generated query based on registered attributes\n *\n * @param {Element|Document} target Root node to add listeners from\n * @param {object} options\n * @param {AbortSignal} [options.signal] Optional signal to remove event listeners\n * @returns {Element|Document} Returns the passed target node\n */\nexport function attachListeners(target, { signal } = {}) {\n\tconst nodes = target instanceof Element && target.matches(selector.get())\n\t\t? [target, ...target.querySelectorAll(selector.get())]\n\t\t: target.querySelectorAll(selector.get());\n\n\tnodes.forEach(el => _addListeners(el, { signal }));\n\n\treturn target;\n}\n\n/**\n * Add a node to the `MutationObserver` to observe attributes and add/remove event listeners\n *\n * @param {Document|Element} root Element to observe attributes on\n */\nexport function observeEvents(root = document) {\n\tattachListeners(root);\n\n\tobserver.observe(root, {\n\t\tsubtree: true,\n\t\tchildList:true,\n\t\tattributes: true,\n\t\tattributeOldValue: true,\n\t\tattributeFilter: eventAttrs.get(),\n\t});\n}\n\n/**\n * Disconnects the `MutationObserver`, disabling observing of all attribute changes\n *\n * @returns {void}\n */\nexport const disconnectEventsObserver = () => observer.disconnect();\n\n/**\n * Register a global error handler callback\n *\n * @param {Function} callback Callback to register as a global error handler\n * @param {EventInit} config Typical event listener config object\n */\nexport function setGlobalErrorHandler(callback, { capture, once, passive, signal } = {}) {\n\tif (callback instanceof Function) {\n\t\tglobalThis.addEventListener('error', callback, { capture, once, passive, signal });\n\t} else {\n\t\tthrow new TypeError('Callback is not a function.');\n\t}\n}\n","// @ts-check\n/**\n * Internal slot for the callback to call to nnotify of changes\n * @type {unique symbol}\n */\nconst notify = Symbol('signal:watcher:notify');\n\n/**\n * @type {unique symbol}\n */\nconst currentComputed = Symbol('signal:currentComputed');\n\n/**\n * Callback called when isWatched becomes true, if it was previously false (`Signal.subtle.watched`)\n *\n * @type {unique symbol}\n */\nconst watched = Symbol('Signal:subtle:watched');\n\n/**\n * Callback called whenever isWatched becomes false, if it was previously true  (`Signal.subtle.unwatched`)\n *\n * @type {unique symbol}\n */\nconst unwatched = Symbol('Signal:subtle:unwatched');\n\n/**\n * For equality checks in Computed, it must be a unique value\n * @type {unique symbol}\n */\nconst initial = Symbol('signal:initial');\n\n/**\n * Internal slot for determining calling `Signal.subtle.watched` and `Signal.subtle.unwatched` callbacks\n * @type {unique symbol}\n */\nconst isWatched = Symbol('Signal:isWatched');\n\n/**\n * Internal slot for State|Computed to store the `Signal.subtle.watched` callback\n * @type {unique symbol}\n */\nconst onWatch = Symbol('Signal:onWatch');\n\n/**\n * Internal slot for State|Computed to store the `Signal.subtle.unwatched` callback\n * @type {unique symbol}\n */\nconst onUnwatch = Symbol('Signal:onUnwatch');\n\n/**\n * @type {unique symbol}\n */\nconst sources = Symbol('Signal:sources');\n\n/**\n * @type {unique symbol}\n */\nconst sinks = Symbol('Signal:sinks');\n\n/**\n * @typedef {(t: any, t2: any) => boolean} EqualityCheck\n */\n\n/**\n * Custom comparison function between old and new value. Default: Object.is.\n * The signal is passed in as the this value for context.\n *\n * @type {EqualityCheck}\n */\nconst equals = Object.is;\n\n/**\n * @typedef {{\n * \tequals?: EqualityCheck,\n * \t[watched]?: (this: AnySignal<any>) => void,\n *  [unwatched]?: (this: AnySignal<any>) => void,\n * }} SignalOptions\n */\n\n/**\n * @type {SignalOptions}\n */\nconst opts = Object.freeze({ equals });\n\n/**\n * @template T\n * @typedef {State<T> | Computed<T>} AnySignal<T>\n */\n\n/**\n * A read-write Signal\n * @template T\n */\nclass State {\n\t/**\n\t * @type {T}\n\t */\n\t#value;\n\n\t/**\n\t * @type {EqualityCheck}\n\t */\n\t#equals;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[unwatched] = null;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[onWatch] = null;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[onUnwatch] = null;\n\n\t/**\n\t * @type {boolean}\n\t */\n\t[isWatched] = false;\n\n\t/**\n\t * @type {Set<Computed<any>|Watcher>}\n\t */\n\t[sinks] = new Set();\n\n\t/**\n\t * @type {Set<Set<any>|Computed<any>>}\n\t */\n\t[sources] = new Set();\n\n\t/**\n\t * Create a state Signal starting with the value T\n\t * @param {T} value - The initial value.\n\t * @param {SignalOptions} options\n\t */\n\tconstructor(value, options = opts) {\n\t\tif (typeof options !== 'object') {\n\t\t\tthrow new TypeError('Invalid options.');\n\t\t} else {\n\t\t\tthis.#equals = options.equals ?? equals;\n\t\t\tthis.#value = value;\n\n\t\t\tif (typeof options?.[watched] === 'function') {\n\t\t\t\tthis[onWatch] = options[watched].bind(this);\n\t\t\t}\n\n\t\t\tif (typeof options?.[unwatched] === 'function') {\n\t\t\t\tthis[onUnwatch] = options[unwatched].bind(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the value of the signal\n\t *\n\t * @returns {T}\n\t */\n\tget() {\n\t\tconst currentComputed = Signal.subtle.currentComputed();\n\n\t\tif (currentComputed instanceof Computed && ! currentComputed[sources].has(this)) {\n\t\t\tcurrentComputed[sources].add(this);\n\t\t\tthis[sinks].add(currentComputed);\n\t\t}\n\n\t\treturn this.#value;\n\t}\n\n\t/**\n\t * Set the state Signal value to T\n\t *\n\t * @param {T} newValue\n\t */\n\tset(newValue) {\n\t\tif (! this.#equals(this.#value, newValue)) {\n\t\t\tthis.#value = newValue;\n\n\t\t\tfor (const sink of Signal.subtle.introspectSinks(this)) {\n\t\t\t\tsink[notify](this);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * A Signal which is a formula based on other Signals\n *\n * @template T\n */\nclass Computed {\n\t/**\n\t * @type {EqualityCheck}\n\t */\n\t#equals;\n\n\t/**\n\t * @type {() => T}\n\t */\n\t#computation;\n\n\t/**\n\t * @type {boolean}\n\t */\n\t#dirty = true;\n\n\t/**\n\t * @type {T|initial}\n\t */\n\t#value = initial;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[watched] = null;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[unwatched] = null;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[onWatch] = null;\n\n\t/**\n\t * @type {VoidFunction|null}\n\t */\n\t[onUnwatch] = null;\n\n\t/**\n\t * @type {boolean}\n\t */\n\t[isWatched] = false;\n\n\t/**\n\t * @type {Set<Computed<any>|Watcher>}\n\t */\n\t[sinks] = new Set();\n\n\t/**\n\t * @type {Set<State<any>|Computed<any>>}\n\t */\n\t[sources] = new Set();\n\n\t/**\n\t * Create a Signal which evaluates to the value returned by the callback.\n\t * Callback is called with this signal as the this value.\n\t *\n\t * @param {() => T} computation - The function to calculate the value.\n\t * @param {SignalOptions} [options]\n\t */\n\tconstructor(computation, options = opts) {\n\t\tif (typeof computation !== 'function') {\n\t\t\tthrow new TypeError('Computation must be a function.');\n\t\t}  else if (typeof options !== 'object') {\n\t\t\tthrow new TypeError('Invalid options.');\n\t\t} else {\n\t\t\tthis.#equals = options.equals ?? equals;\n\t\t\tthis.#computation = computation;\n\n\t\t\tif (typeof options[watched] === 'function') {\n\t\t\t\tthis[onWatch] = options[watched].bind(this);\n\t\t\t}\n\n\t\t\tif (typeof options[unwatched] === 'function') {\n\t\t\t\tthis[onUnwatch] = options[unwatched].bind(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the value of the signal\n\t *\n\t * @this {Computed<T>}\n\t * @returns {T|initial}\n\t */\n\tget() {\n\t\tconst oldComputed = Signal.subtle.currentComputed();\n\n\t\ttry {\n\t\t\tif (oldComputed !== this && oldComputed !== null) {\n\t\t\t\toldComputed[sources].add(this);\n\t\t\t\tthis[sinks].add(oldComputed);\n\t\t\t}\n\n\t\t\tSignal[currentComputed] = this;\n\n\t\t\tif (this.#dirty) {\n\t\t\t\t// Must clear prior dependencies BEFORE computation\n\t\t\t\tfor (const source of Signal.subtle.introspectSources(this)) {\n\t\t\t\t\tsource[sinks].delete(this);\n\t\t\t\t}\n\n\t\t\t\tthis[sources].clear();\n\n\t\t\t\tconst val = this.#computation();\n\n\t\t\t\tif (! this.#equals(val, this.#value)) {\n\t\t\t\t\tthis.#value = val;\n\n\t\t\t\t\tfor (const sink of Signal.subtle.introspectSinks(this)) {\n\t\t\t\t\t\tsink[notify](this);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#dirty = false;\n\t\t\t\treturn val;\n\t\t\t} else {\n\t\t\t\treturn this.#value;\n\t\t\t}\n\t\t} finally {\n\t\t\t// Restore previous context\n\t\t\tSignal[currentComputed] = oldComputed;\n\t\t}\n\t}\n\n\t/**\n\t * Notifiies a `Signal.Computed` when a source has changed\n\t *\n\t * @param {State<any>|Computed<any>} source\n\t */\n\t[notify](source) {\n\t\tthis.#dirty = true;\n\t\tthis[sources].add(source);\n\t\tsource[sinks].add(this);\n\n\t\tfor (const sink of Signal.subtle.introspectSinks(this)) {\n\t\t\tsink[notify](this);\n\t\t}\n\t}\n}\n\n/**\n * Watches for changes to specific signals.\n * @memberof Signal.subtle\n */\nclass Watcher {\n\t/**\n\t * @type {boolean}\n\t */\n\t#isWatched = false;\n\n\t/**\n\t * @type {Set<AnySignal<any>>}\n\t */\n\t#pending = new Set();\n\n\t/**\n\t * @type {(this: Watcher) => void}\n\t */\n\t#notify;\n\n\t/**\n\t * @type {Set<AnySignal<any>>}\n\t */\n\t[sources] = new Set();\n\n\n\t/**\n\t * When a (recursive) source of Watcher is written to, call this callback,\n\t * if it hasn't already been called since the last `watch` call.\n\t * No signals may be read or written during the notify.\n\t *\n\t * @param {(this: Watcher) => void} notify - Called synchronously when a watched signal becomes dirty.\n\t */\n\tconstructor(notify) {\n\t\tif (typeof notify !== 'function') {\n\t\t\tthrow new TypeError(`Notify must be a function but got a ${typeof notify}.`);\n\t\t} else {\n\t\t\tthis.#notify = notify;\n\t\t}\n\t}\n\n\t/**\n\t * Add these signals to the Watcher's set, and set the watcher to run its\n\t * notify callback next time any signal in the set (or one of its dependencies) changes.\n\t * Can be called with no arguments just to reset the \"notified\" state, so that\n\t * the notify callback will be invoked again.\n\t *\n\t * @param {...AnySignal<any>} signals\n\t */\n\twatch(...signals) {\n\t\tthis.#isWatched = true;\n\n\t\tfor (const signal of signals) {\n\t\t\tif (! (signal instanceof State || signal instanceof Computed)) {\n\t\t\t\tthrow new TypeError('Signal must be an instance of `Signal.State` or `Signal.Computed`.');\n\t\t\t} else if (! this[sources].has(signal)) {\n\t\t\t\tif (typeof signal[onWatch] === 'function' && ! signal[isWatched]) {\n\t\t\t\t\tsignal[isWatched] = true;\n\t\t\t\t\tsignal[onWatch].call(signal);\n\t\t\t\t}\n\n\t\t\t\tthis[sources].add(signal);\n\t\t\t\tsignal[sinks].add(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Remove these signals from the watched set (e.g., for an effect which is disposed)\n\t * @template T\n\t * @param {...AnySignal<T>} signals\n\t */\n\tunwatch(...signals) {\n\t\tfor (const signal of signals) {\n\t\t\tif (! (signal instanceof State || signal instanceof Computed)) {\n\t\t\t\tthrow new TypeError('Signal must be an instance of `Signal.State` or `Signal.Computed`.');\n\t\t\t} else {\n\t\t\t\tif (typeof signal[onUnwatch] === 'function' && signal[isWatched]) {\n\t\t\t\t\tconst watchers = Signal.subtle.introspectSinks(signal).filter(sink => sink instanceof Signal.subtle.Watcher);\n\n\t\t\t\t\tif (watchers.length === 1) {\n\t\t\t\t\t\tsignal[isWatched] = false;\n\t\t\t\t\t\tsignal[onUnwatch].call(signal);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsignal[sinks].delete(this);\n\t\t\t\tthis[sources].delete(signal);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the set of sources in the Watcher's set which are still dirty, or is a computed signal\n\t * with a source which is dirty or pending and hasn't yet been re-evaluated\n\t *\n\t * @returns {Array<AnySignal<any>>}\n\t */\n\tgetPending() {\n\t\tconst pending = Array.from(this.#pending);\n\t\tthis.#pending.clear();\n\t\treturn pending;\n\t}\n\n\t/**\n\t * Notify a `Signal.subtle.Watcher` when a source has changed\n\t *\n\t * @template T\n\t * @param {AnySignal<T>} signal\n\t */\n\t[notify](signal) {\n\t\tthis.#pending.add(signal);\n\t\tif (this.#isWatched) {\n\t\t\tthis.#notify.call(this);\n\t\t}\n\t}\n}\n\n/**\n * This namespace includes \"advanced\" features that are better to\n * leave for framework authors rather than application developers.\n * Analogous to `crypto.subtle`\n *\n * @namespace subtle\n */\nconst subtle = {\n\tWatcher,\n\t/**\n\t * Hook to observe being watched\n\t * @type {unique symbol}\n\t */\n\twatched,\n\n\t/**\n\t * Hook to observe no longer watched\n\t * @type {unique s}\n\t */\n\tunwatched,\n\n\t/**\n\t * Run a callback with all tracking disabled\n\t *\n\t * @template T\n\t * @param {() => T} cb\n\t * @returns {T}\n\t */\n\tuntrack(cb) {\n\t\tif (typeof cb !== 'function') {\n\t\t\tthrow new TypeError('Callback must be a function.');\n\t\t} else {\n\t\t\tconst prev = Signal.subtle.currentComputed();\n\t\t\tSignal[currentComputed] = null;\n\n\t\t\ttry {\n\t\t\t\treturn cb();\n\t\t\t} finally {\n\t\t\t\tSignal[currentComputed] = prev;\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Get the current computed signal which is tracking any signal reads, if any\n\t *\n\t * @returns {Computed<any>|null}\n\t */\n\tcurrentComputed() {\n\t\treturn Signal[currentComputed];\n\t},\n\n\t/**\n\t * Returns ordered list of all signals which this one referenced\n\t * during the last time it was evaluated.\n\t * For a Watcher, lists the set of signals which it is watching.\n\t *\n\t * @param {Computed<any>|Watcher} s\n\t * @returns {(State<any>|Computed<any>)[]}\n\t */\n\tintrospectSources(s) {\n\t\tif (! (s instanceof Computed || s instanceof Watcher)) {\n\t\t\tthrow new TypeError('Expected a `Signal.Watcher` or `Signal.Computed`.');\n\t\t} else {\n\t\t\treturn Array.from(s[sources]);\n\t\t}\n\t},\n\n\t/**\n\t * Returns the Watchers that this signal is contained in, plus any\n\t * Computed signals which read this signal last time they were evaluated,\n\t * if that computed signal is (recursively) watched.\n\t *\n\t * @param {State<any>|Computed<any>} s\n\t * @returns {(Computed<any>|Watcher)[]}\n\t */\n\tintrospectSinks(s) {\n\t\tif (! (s instanceof State || s instanceof Computed)) {\n\t\t\tthrow new TypeError('Expected a `Signal.State` or `Signal.Computed`.');\n\t\t} else {\n\t\t\treturn Array.from(s[sinks]);\n\t\t}\n\t},\n\n\t/**\n\t * True if this signal is \"live\", in that it is watched by a Watcher,\n\t * or it is read by a Computed signal which is (recursively) live.\n\t *\n\t * @param {State<any>|Computed<any>} s\n\t * @return {boolean}\n\t */\n\thasSinks(s) {\n\t\tif (! (s instanceof State || s instanceof Computed)) {\n\t\t\tthrow new TypeError('Expected a `Signal.State` or `Signal.Computed`.');\n\t\t} else {\n\t\t\treturn s[sinks].size !== 0;\n\t\t}\n\t},\n\n\t/**\n\t * True if this element is \"reactive\", in that it depends\n\t * on some other signal. A Computed where hasSources is false\n\t * will always return the same constant.\n\t *\n\t * @param {Computed<any>|Watcher} s\n\t * @returns {boolean}\n\t */\n\thasSources(s) {\n\t\tif (! (s instanceof Computed || s instanceof Watcher)) {\n\t\t\tthrow new TypeError('Expected a `Signal.Watcher` or `Signal.Computed`.');\n\t\t} else {\n\t\t\treturn s[sources].size !== 0;\n\t\t}\n\t},\n};\n\n/**\n * The core Signals namespace.\n * @namespace Signal\n */\nexport const Signal = {\n\tState,\n\tComputed,\n\tsubtle,\n\n\t/**\n\t * @type {Computed<any>|null}\n\t */\n\t[currentComputed]: null,\n};\n\nexport { Signal as SignalShim };\n","import { getStateObj, diffState, notifyStateChange } from '@aegisjsproject/state';\nexport { url } from '@aegisjsproject/url/url.js';\nimport { onClick, onSubmit } from '@aegisjsproject/callback-registry/events.js';\n\nconst isModule = ! (document.currentScript instanceof HTMLScriptElement);\nconst SUPPORTS_IMPORTMAP = HTMLScriptElement.supports('importmap');\nconst ROUTES_REGISTRY = new Map();\nconst NO_BODY_METHODS = ['GET', 'HEAD', 'DELETE', 'OPTIONS'];\nconst DESC_SELECTOR = 'meta[name=\"description\"], meta[itemprop=\"description\"], meta[property=\"og:description\"], meta[name=\"twitter:description\"]';\nconst navObserver = new MutationObserver(entries => entries.forEach(entry => interceptNav(entry.target)));\nconst preloadObserver = new MutationObserver(entries => entries.forEach(_handlePreloadMutations));\nconst ROOT_ID = 'root';\nconst EVENT_TARGET = document;\nconst NAV_CLOSE_SYMBOL = Symbol.for('aegis:navigate:event:close');\nconst prefersReducedMotion = matchMedia('(prefers-reduced-motion: reduce)');\nlet rootEl = document.getElementById(ROOT_ID) ?? document.body;\nlet rootSelector = '#' + ROOT_ID;\nconst SUPPORTS_TRUSTED_TYPES = 'trustedTypes' in globalThis;\nconst _isTrustedHTML = input => SUPPORTS_TRUSTED_TYPES && trustedTypes.isHTML(input);\n\nconst startViewTransition = typeof document.startViewTransition === 'function'\n\t? (update, types) => document.startViewTransition({ update, types })\n\t: update => Promise.try(update);\n\nfunction _handlePreloadMutations(target) {\n\tif (target instanceof MutationRecord) {\n\t\t_handlePreloadMutations(target.target);\n\t} else if (target.tagName === 'A' && ! target.classList.contains('no-router') && ! target.hasAttribute(onClick)) {\n\t\tpreloadOnHover(target, target.dataset);\n\t} else {\n\t\ttarget.querySelectorAll(`a:not(.no-router, [${onClick}])`).forEach(a => preloadOnHover(a, a.dataset));\n\t}\n}\n\nexport const NAV_EVENT = 'aegis:navigate';\n\nexport const EVENT_TYPES = {\n\tnavigate: 'aegis:router:navigate',\n\tback: 'aegis:router:back',\n\tforward: 'aegis:router:forward',\n\treload: 'aegis:router:reload',\n\tpop: 'aegis:router:pop',\n\tgo: 'aegis:router:go',\n\tload: 'aegis:router:load',\n\tsubmit: 'aegis:router:submit',\n};\n\nconst DEFAULT_REASONS = [EVENT_TYPES.back, EVENT_TYPES.forward, EVENT_TYPES.navigate, EVENT_TYPES.submit, EVENT_TYPES.reload, EVENT_TYPES.go];\n\nexport class AegisNavigationEvent extends CustomEvent {\n\t#reason;\n\t#url;\n\t#stack = new AsyncDisposableStack();\n\t#controller = new AbortController();\n\t#promises = [];\n\t#errors = [];\n\n\tconstructor(name = NAV_EVENT, reason = 'unknown', { bubbles = false, cancelable = true, detail = {\n\t\toldState: getStateObj(),\n\t\toldURL: new URL(location.href),\n\t} } = {}) {\n\t\tsuper(name, { bubbles, cancelable, detail });\n\t\tthis.#reason = reason;\n\t\tthis.#url = location.href;\n\t}\n\n\tget aborted() {\n\t\treturn this.#controller.signal.aborted;\n\t}\n\n\tget disposed() {\n\t\treturn this.#stack.disposed;\n\t}\n\n\tget error() {\n\t\tswitch(this.#errors.length) {\n\t\t\tcase 0:\n\t\t\t\treturn null;\n\n\t\t\tcase 1:\n\t\t\t\treturn this.#errors[0];\n\n\t\t\tdefault:\n\t\t\t\treturn new AggregateError(this.#errors);\n\t\t}\n\t}\n\n\tget reason() {\n\t\treturn this.#reason;\n\t}\n\n\tget signal() {\n\t\treturn this.#controller.signal;\n\t}\n\n\tget stack() {\n\t\treturn this.#stack;\n\t}\n\n\tget url() {\n\t\treturn this.#url;\n\t}\n\n\tasync [NAV_CLOSE_SYMBOL]() {\n\t\tconst result = await Promise.allSettled(this.#promises).then(results => {\n\t\t\tthis.#errors.push(...results.filter(result => result.status === 'rejected').map(result => result.reason));\n\n\t\t\treturn this.cancelable && this.defaultPrevented;\n\t\t});\n\n\t\tthis.#controller.abort();\n\t\treturn result;\n\t}\n\n\tadopt(obj, callback) {\n\t\treturn this.#stack.adopt(obj, callback);\n\t}\n\n\tabort(reason) {\n\t\tthis.#controller.abort(reason);\n\t}\n\n\tdefer(callback) {\n\t\tthis.#stack.defer(callback);\n\t}\n\n\tasync disposeAsync() {\n\t\tawait this[Symbol.asyncDispose]();\n\t}\n\n\tuse(obj) {\n\t\treturn this.#stack.use(obj);\n\t}\n\n\twaitUntil(promiseOrCallback, { signal } = {}) {\n\t\tconst { promise, resolve, reject } = Promise.withResolvers();\n\n\t\tthis.#promises.push(promise);\n\n\t\tif (signal instanceof AbortSignal && ! signal.aborted) {\n\t\t\tsignal.addEventListener('abort', ({ target }) =>{\n\t\t\t\treject(target.reason);\n\n\t\t\t\tif (this.cancelable && ! this.defaultPrevented) {\n\t\t\t\t\tsuper.preventDefault();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tonce: true,\n\t\t\t\tsignal: this.#controller.signal,\n\t\t\t});\n\t\t}\n\n\t\tif (this.#controller.signal.aborted) {\n\t\t\treject(this.#controller.signal.reason);\n\t\t} else if (signal instanceof AbortSignal && signal.aborted) {\n\t\t\treject(signal.reason);\n\n\t\t\tif (this.cancelable && ! this.defaultPrevented) {\n\t\t\t\tsuper.preventDefault();\n\t\t\t}\n\t\t} else if (! this.defaultPrevented && promiseOrCallback instanceof Function) {\n\t\t\tPromise.try(() => promiseOrCallback(this, {\n\t\t\t\tsignal: signal instanceof AbortSignal ? AbortSignal.any([signal, this.#controller.signal]) : this.#controller.signal,\n\t\t\t\ttimestamp: performance.now(),\n\t\t\t\tstack: this.#stack,\n\t\t\t})).then(resolve, reject);\n\t\t} else if (! this.defaultPrevented && promiseOrCallback instanceof Promise) {\n\t\t\tpromiseOrCallback.then(resolve, reject);\n\t\t}\n\t}\n\n\t[Symbol.toStringTag]() {\n\t\treturn 'NavigationEvent';\n\t}\n\n\tasync [Symbol.asyncDispose]() {\n\t\tif (! this.#controller.signal.aborted) {\n\t\t\tthis.#controller.abort(new DOMException('The stack of the event was disposed.', 'AbortError'));\n\t\t}\n\n\t\tif (! this.#stack.disposed) {\n\t\t\tawait this.#stack.disposeAsync();\n\t\t}\n\t}\n\n\tstatic get defaultType() {\n\t\treturn NAV_EVENT;\n\t}\n\n\tstatic get reasons() {\n\t\treturn EVENT_TYPES;\n\t}\n}\n\n// Need this to be \"unsafe\" to not be restrictive on what modifications can be made to a page\nconst policy = SUPPORTS_TRUSTED_TYPES\n\t? trustedTypes.createPolicy('aegis-router#html', { createHTML: input => input })\n\t: Object.freeze({ createPolicy: input => input });\n\nasync function _popstateHandler(event) {\n\tconst diff = diffState(event.state ?? {});\n\tconst navigate = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.pop, {\n\t\tdetail: { newState: event.state, oldState: null, oldURL: new URL(location.href), method: 'GET', formData: null },\n\t});\n\n\ttry {\n\t\tEVENT_TARGET.dispatchEvent(navigate);\n\n\t\tif (! await navigate[NAV_CLOSE_SYMBOL]()) {\n\t\t\tconst old = history.scrollRestoration;\n\t\t\tconst [content] = await Promise.all([\n\t\t\t\tgetModule(new URL(location.href)),\n\t\t\t\tnotifyStateChange(diff),\n\t\t\t]);\n\n\t\t\thistory.scrollRestoration = 'auto';\n\t\t\t_updatePage(content);\n\t\t\thistory.scrollRestoration = old;\n\t\t}\n\t} finally {\n\t\trequestAnimationFrame(navigate[Symbol.asyncDispose].bind(navigate));\n\t}\n};\n\nfunction _addStyle(sheet) {\n\tif (sheet instanceof CSSStyleSheet && ! document.adoptedStyleSheets.includes(sheet)) {\n\t\tdocument.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n\t} else if (Array.isArray(sheet) && sheet.length !== 0) {\n\t\tdocument.adoptedStyleSheets = [\n\t\t\t...document.adoptedStyleSheets,\n\t\t\t...sheet.filter(s => s instanceof CSSStyleSheet && ! document.adoptedStyleSheets.includes(s))\n\t\t];\n\t}\n}\n\nfunction _createMeta(props = {}) {\n\tconst meta = document.createElement('meta');\n\n\tObject.entries(props).forEach(([key, val]) => meta.setAttribute(key, val));\n\treturn meta;\n}\n\nfunction _loadLink(href, {\n\trelList = [],\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n\tfetchPriority = 'auto',\n\tsignal: passedSignal,\n\tas,\n\tintegrity,\n\tmedia,\n\ttype,\n} = {}) {\n\tconst { promise, resolve, reject } = Promise.withResolvers();\n\tconst link = document.createElement('link');\n\n\tif (passedSignal instanceof AbortSignal && passedSignal.aborted) {\n\t\treject(passedSignal.reason);\n\t} else {\n\t\tlink.relList.add(...relList);\n\n\t\tif (typeof fetchPriority === 'string') {\n\t\t\tlink.fetchPriority = fetchPriority;\n\t\t}\n\n\t\tif (typeof crossOrigin === 'string') {\n\t\t\tlink.crossOrigin = crossOrigin;\n\t\t}\n\n\t\tif (typeof type === 'string') {\n\t\t\tlink.type = type;\n\t\t}\n\n\t\tif (typeof media === 'string') {\n\t\t\tlink.media = media;\n\t\t} else if (media instanceof MediaQueryList) {\n\t\t\tlink.media = media.media;\n\t\t}\n\n\t\tif (typeof as === 'string') {\n\t\t\tlink.as = as;\n\t\t}\n\n\t\tif (typeof integrity === 'string') {\n\t\t\tlink.integrity = integrity;\n\t\t}\n\n\t\tif (link.relList.contains('preload') || link.relList.contains('modulepreload')) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst signal = passedSignal instanceof AbortSignal ? AbortSignal.any([controller.signal, passedSignal]) : controller.signal;\n\n\t\t\tif (passedSignal instanceof AbortSignal) {\n\t\t\t\tpassedSignal.addEventListener('abort', ({ target }) => {\n\t\t\t\t\treject(target.reason);\n\t\t\t\t}, { signal: controller.signal, once: true  });\n\t\t\t}\n\n\t\t\tlink.referrerPolicy = referrerPolicy;\n\n\t\t\tlink.addEventListener('load', () => {\n\t\t\t\tresolve();\n\t\t\t\tcontroller.abort();\n\t\t\t}, { signal });\n\n\t\t\tlink.addEventListener('error', () => {\n\t\t\t\treject(new DOMException(`Error loading ${href}`, 'NotFoundError'));\n\t\t\t\tcontroller.abort();\n\t\t\t}, { signal });\n\n\t\t\tlink.href = _resolveModule(href);\n\n\t\t\tdocument.head.append(link);\n\n\t\t\treturn promise.then(() => link.remove()).catch(err => {\n\t\t\t\tif (link.isConnected) {\n\t\t\t\t\tlink.remove();\n\t\t\t\t}\n\n\t\t\t\treportError(err);\n\t\t\t});\n\t\t} else {\n\t\t\tlink.href = href;\n\t\t\tdocument.head.append(link);\n\t\t\tresolve();\n\t\t\treturn promise;\n\t\t}\n\t}\n}\n\nfunction _isModuleURL(src) {\n\tswitch(src[0]) {\n\t\tcase '/':\n\t\tcase '.':\n\t\t\treturn true;\n\n\t\tcase 'h':\n\t\t\treturn src.substring(0, '4') === 'http' && URL.canParse(src);\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction _resolveModule(src) {\n\tif (_isModuleURL(src)) {\n\t\treturn URL.parse(src, document.baseURI);\n\t} else if (! SUPPORTS_IMPORTMAP) {\n\t\tthrow new TypeError('Importmaps and module specifiers are not supported');\n\t} else if (! isModule) {\n\t\tthrow new TypeError('Cannot resolve a module specifier outside of a module script.');\n\t} else {\n\t\treturn import.meta.resolve(src);\n\t}\n}\n\nfunction _getLinkStateData(a) {\n\tconst entries = Object.entries(a.dataset)\n\t\t.filter(([name]) => name.startsWith('aegisState'))\n\t\t.map(([name, value]) => [name[10].toLowerCase() + name.substring(11), value]);\n\n\treturn Object.fromEntries(entries);\n}\n\nfunction _interceptLinkClick(event) {\n\tif (event.target.classList.contains('no-router') || event.target.hasAttribute(onClick)) {\n\t\tevent.target.removeEventListener(_interceptLinkClick);\n\t} else if (\n\t\tevent.isTrusted\n\t\t&& event.currentTarget.href.startsWith(location.origin)\n\t\t&& ! (event.metaKey || event.ctrlKey || event.shiftKey)\n\t) {\n\t\tevent.preventDefault();\n\t\tconst state = _getLinkStateData(event.currentTarget);\n\t\tnavigate(event.currentTarget.href, state, {\n\t\t\tintegrity: event.currentTarget.dataset.integrity,\n\t\t\tcache: event.currentTarget.dataset.cache,\n\t\t\treferrerPolicy: event.currentTarget.dataset.referrerPolicy,\n\t\t});\n\t}\n}\n\nasync function _interceptFormSubmit(event) {\n\tif (event.target.classList.contains('no-router') || event.target.hasAttribute(onSubmit)) {\n\t\tevent.target.removeEventListener('submit', _interceptFormSubmit);\n\t} else if (event.isTrusted && event.target.action.startsWith(location.origin)) {\n\t\tevent.preventDefault();\n\t\tconst { target, submitter } = event;\n\t\tconst { method, action } = target;\n\t\tconst formData = new FormData(target);\n\t\tconst submit = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.submit, {\n\t\t\tdetail: { oldState: getStateObj(), oldURL: new URL(location.href), formData },\n\t\t});\n\n\t\ttry {\n\t\t\tif (submitter instanceof HTMLButtonElement) {\n\t\t\t\tsubmitter.disabled = true;\n\t\t\t}\n\n\n\t\t\tEVENT_TARGET.dispatchEvent(submit);\n\n\t\t\tif (await submit[NAV_CLOSE_SYMBOL]()) {\n\t\t\t\treturn;\n\t\t\t} else if (NO_BODY_METHODS.includes(method.toUpperCase())) {\n\t\t\t\tconst url = new URL(action);\n\t\t\t\tconst params = new URLSearchParams(formData);\n\n\t\t\t\tfor (const [key, val] of params.entries()) {\n\t\t\t\t\turl.searchParams.append(key, val);\n\t\t\t\t}\n\n\t\t\t\tawait navigate(url, getStateObj(), { method });\n\t\t\t} else {\n\t\t\t\tawait navigate(action, getStateObj(), { method, formData });\n\t\t\t}\n\t\t} finally {\n\t\t\tif (submitter instanceof HTMLButtonElement) {\n\t\t\t\tsubmitter.disabled = false;\n\t\t\t}\n\n\t\t\trequestAnimationFrame(submit[Symbol.asyncDispose].bind(submit));\n\t\t}\n\t}\n}\n\nasync function _getHTML(url, { signal, method = 'GET', body, integrity, cache = 'default', referrerPolicy = 'no-referrer' } = {}) {\n\tconst resp = await fetch(url, {\n\t\tmethod,\n\t\tbody: NO_BODY_METHODS.includes(method.toUpperCase()) ? null : body,\n\t\theaders: { 'Accept': 'text/html' },\n\t\tcache,\n\t\treferrerPolicy,\n\t\tintegrity,\n\t\tsignal,\n\t}).catch(err => err);\n\n\tif (resp.ok) {\n\t\tconst html = await resp.text();\n\t\treturn Document.parseHTMLUnsafe(policy.createHTML(html));\n\t} else if (resp instanceof Error) {\n\t\treturn resp;\n\t} else {\n\t\treturn _get404(url, method, { signal });\n\t}\n}\n\nasync function _updatePage(content) {\n\tconst timestamp = performance.now();\n\n\tawait startViewTransition(() => {\n\t\tif (content instanceof Document) {\n\t\t\tif (content.head.childElementCount !== 0) {\n\t\t\t\tsetTitle(content.title);\n\t\t\t\tsetDescription(content.querySelector(DESC_SELECTOR)?.content);\n\t\t\t}\n\n\t\t\tconst contentEl = typeof rootSelector === 'string' ? content.body.querySelector(rootSelector) ?? content.body : content.body;\n\n\t\t\trootEl.replaceChildren(...contentEl.childNodes);\n\t\t} else if (content instanceof HTMLTemplateElement) {\n\t\t\trootEl.replaceChildren(content.content);\n\t\t} else if (content instanceof Function && content.prototype instanceof HTMLElement) {\n\t\t\trootEl.replaceChildren(new content({ state: getStateObj(), url: new URL(location.href), timestamp }));\n\t\t} else if (content instanceof Node) {\n\t\t\trootEl.replaceChildren(content);\n\t\t} else if (content instanceof Function) {\n\t\t\t_updatePage(content());\n\t\t} else if (typeof content === 'string') {\n\t\t\trootEl.setHTMLUnsafe(policy.createHTML(content));\n\t\t} else if (_isTrustedHTML(content)) {\n\t\t\trootEl.setHTMLUnsafe(content);\n\t\t} else if (content instanceof Error) {\n\t\t\treportError(content);\n\t\t\trootEl.textContent = content.message;\n\t\t} else if (content instanceof URL) {\n\t\t\tnavigate(content);\n\t\t} else if (! (content === null || typeof content === 'undefined')) {\n\t\t\trootEl.textContent = content;\n\t\t}\n\t});\n\n\tconst ev = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.load, { cancelable: false });\n\tPromise.try(() => EVENT_TARGET.dispatchEvent(ev)).finally(ev[Symbol.asyncDispose].bind(ev));\n\n\tif (history.scrollRestoration === 'manual') {\n\t\tif (location.hash.length > 1) {\n\t\t\tconst target = document.getElementById(location.hash.substring(1)) ?? document.body;\n\t\t\ttarget.scrollIntoView({ behavior: prefersReducedMotion.matches ? 'instant' : 'smooth' });\n\t\t} else {\n\t\t\tconst autofocus = rootEl.querySelector('[autofocus]');\n\n\t\t\tif (autofocus instanceof Element) {\n\t\t\t\tautofocus.focus();\n\t\t\t} else {\n\t\t\t\tdocument.body.scrollIntoView({ behavior: prefersReducedMotion.matches ? 'instant' : 'smooth' });\n\t\t\t}\n\t\t}\n\t}\n}\n\nasync function _handleMetadata({ title, description } = {}, { state, matches, params, url, signal } = {}) {\n\tif (typeof title === 'string') {\n\t\tsetTitle(title);\n\t} else if (typeof title === 'function') {\n\t\tsetTitle(await title({ state, matches, params, url, signal }));\n\t}\n\n\tif (typeof description === 'string') {\n\t\tsetDescription(description);\n\t} else if (typeof description === 'function') {\n\t\tsetDescription(await description({ state, matches, params, url, signal }));\n\t}\n}\n\nasync function _handleModule(moduleSrc, {\n\tstate = getStateObj(),\n\tmatches = {},\n\tparams = {},\n\tstack,\n\tsignal,\n\t...args\n} = {}) {\n\tconst module = await Promise.try(() => {\n\t\tif (moduleSrc instanceof Function) {\n\t\t\treturn moduleSrc(args);\n\t\t} else if (typeof moduleSrc === 'string' || module instanceof URL) {\n\t\t\treturn _isModuleURL(moduleSrc)\n\t\t\t\t? import(URL.parse(moduleSrc, document.baseURI))\n\t\t\t\t: import(moduleSrc);\n\t\t} else {\n\t\t\treturn new TypeError('Invalid module src.');\n\t\t}\n\t}).catch(err => err);\n\n\tconst url = new URL(location.href);\n\tconst timestamp = performance.now();\n\n\tif (module instanceof URL) {\n\t\tawait navigate(module, state, args);\n\t} else if (module instanceof Error) {\n\t\treturn module.message;\n\t} else if (! ('default' in module)) {\n\t\treturn new Error(`${moduleSrc} has no default export.`);\n\t} else if (module.default instanceof Function && module.default.prototype instanceof HTMLElement) {\n\t\tif (typeof customElements.getName(module.default) !== 'string') {\n\t\t\tcustomElements.define(\n\t\t\t\tmodule.default[Symbol.for('tagName')] ?? `aegis-el-${crypto.randomUUID()}`,\n\t\t\t\tmodule.default\n\t\t\t);\n\t\t}\n\n\t\tif (typeof module.styles !== 'undefined') {\n\t\t\t_addStyle(module.styles);\n\t\t}\n\n\t\t_handleMetadata(module, { state, matches, params, url, signal });\n\n\t\treturn new module.default({\n\t\t\turl,\n\t\t\tmatches,\n\t\t\tparams,\n\t\t\tstate,\n\t\t\tstack,\n\t\t\ttimestamp,\n\t\t\tsignal: getNavSignal({ signal }),\n\t\t\t...args\n\t\t});\n\t} else if (module.default instanceof Function) {\n\t\tif (typeof module.styles !== 'undefined') {\n\t\t\t_addStyle(module.styles);\n\t\t}\n\n\t\t_handleMetadata(module, { state, matches, params, url, signal });\n\n\t\treturn await module.default({\n\t\t\turl,\n\t\t\tmatches,\n\t\t\tparams,\n\t\t\tstate,\n\t\t\tstack,\n\t\t\ttimestamp,\n\t\t\tsignal: getNavSignal({ signal }),\n\t\t\t...args\n\t\t});\n\t} else if (module.default instanceof Node || module.default instanceof Error) {\n\t\tif (typeof module.styles !== 'undefined') {\n\t\t\t_addStyle(module.styles);\n\t\t}\n\n\t\t_handleMetadata(module, { state, matches, params, url, signal });\n\t\t_updatePage(module.default);\n\t} else if (module.default instanceof URL && module.default.origin === location.origin) {\n\t\tnavigate(module.default);\n\t} else {\n\t\tthrow new TypeError(`${moduleSrc} has a missing or invalid default export.`);\n\t}\n}\n\nlet view404 = ({ url = location, method = 'GET' }) => {\n\tconst div = document.createElement('div');\n\tconst p = document.createElement('p');\n\tconst a = document.createElement('a');\n\n\tp.textContent = `${method.toUpperCase()} ${url.href} [404 Not Found]`;\n\ta.href = document.baseURI;\n\ta.textContent = 'Go Home';\n\n\ta.addEventListener('click', _interceptLinkClick);\n\tdiv.append(p, a);\n\n\treturn div;\n};\n\nasync function _get404(url = location, method = 'GET', { signal, formData, integrity } = {}) {\n\tconst timestamp = performance.now();\n\tconst stack = new AsyncDisposableStack();\n\n\ttry {\n\t\tif (typeof view404 === 'string') {\n\t\t\treturn await _handleModule(view404, { url, matches: null, signal, method, formData, timestamp, integrity });\n\t\t} else if (view404 instanceof Function) {\n\t\t\t_updatePage(view404({ timestamp, state: getStateObj(), url, matches: null, signal, method, formData, integrity }));\n\t\t}\n\t} finally {\n\t\tstack.disposeAsync();\n\t}\n}\n\n/**\n * Finds the matching URL pattern for a given input.\n *\n * @param {string|URL} input - The input URL or path.\n * @returns {URLPattern|undefined} - The matching URL pattern, or undefined if no match is found.\n */\nexport const findPath = input => ROUTES_REGISTRY.keys().find(pattern => pattern.test(input));\n\n/**\n * Sets the 404 handler.\n *\n * @param {string} path - The path to the 404 handler module or the handler function itself.\n */\nexport const set404 = path => view404 = path;\n\n/**\n * Intercepts navigation events within a target element.\n *\n * @param {HTMLElement|ShadowRoot|string} target - The element to intercept navigation events on. Defaults to document.body.\n * @param {Object} [options] - Optional options.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the interception.\n */\nexport function interceptNav(target = document.body, { signal } = {}) {\n\tif (typeof target === 'string') {\n\t\tinterceptNav(document.querySelector(target), { signal });\n\t} else if (! (target instanceof HTMLElement || target instanceof ShadowRoot)) {\n\t\tthrow new TypeError('Cannot intercept navigation on a non-Element. Element or selector is required.');\n\t} else if (target instanceof HTMLAnchorElement && ! target.classList.contains('no-router') && ! target.hasAttribute(onClick) && target.href.startsWith(location.origin)) {\n\t\ttarget.addEventListener('click', _interceptLinkClick, { signal, passive: false });\n\t} else if (target instanceof HTMLFormElement && ! target.classList.contains('no-router') && ! target.hasAttribute(onSubmit) && target.action.startsWith(location.origin)) {\n\t\ttarget.addEventListener('submit', _interceptFormSubmit, { signal, passive: false });\n\n\t\ttarget.querySelectorAll(`a[href]:not([rel~=\"external\"], [download], .no-router, [${onClick}])`).forEach(el => {\n\t\t\tif (el.href.startsWith(location.origin)) {\n\t\t\t\tel.addEventListener('click', _interceptLinkClick, { passive: false, signal });\n\t\t\t}\n\t\t});\n\t} else {\n\t\ttarget.querySelectorAll(`a[href]:not([rel~=\"external\"], [download], .no-router, [${onClick}])`).forEach(el => {\n\t\t\tif (el.href.startsWith(location.origin)) {\n\t\t\t\tel.addEventListener('click', _interceptLinkClick, { passive: false, signal });\n\t\t\t}\n\t\t});\n\n\t\ttarget.querySelectorAll(`form:not(.no-router, [${onSubmit}])`).forEach(el => {\n\t\t\tel.addEventListener('submit', _interceptFormSubmit, { passive: false, signal });\n\t\t});\n\t}\n}\n\n/**\n * Sets the root element for the navigation system.\n *\n * @param {HTMLElement|string} target - The element to set as the root.\n */\nexport function setRoot(target, selector) {\n\tif (target instanceof HTMLElement) {\n\t\trootEl = target;\n\t\trootSelector = typeof selector === 'string' ? selector : target.hasAttribute('id') ? `#${target.id}` : null;\n\n\t\tif (typeof rootEl.ariaLive !== 'string') {\n\t\t\trootEl.ariaLive = 'assertive';;\n\t\t}\n\t} else if (typeof target === 'string') {\n\t\tsetRoot(document.querySelector(target), target);\n\t} else {\n\t\tthrow new TypeError('Cannot set root to a non-html element.');\n\t}\n}\n\n/**\n * Observes links on an element for navigation.\n *\n * @param {HTMLElement|ShadowRoot|string} target - The element to observe links on. Defaults to document.body.\n * @param {object} [options] - Optional options.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the observation.\n */\nexport function observeLinksOn(target = document.body, { signal } = {}) {\n\tif (signal instanceof AbortSignal && signal.aborted) {\n\t\tthrow signal.reason;\n\t} else if (typeof target === 'string') {\n\t\tobserveLinksOn(document.querySelector(target), { signal });\n\t} else if (target instanceof HTMLElement || target instanceof ShadowRoot) {\n\t\tinterceptNav(target, { signal });\n\t\tnavObserver.observe(target, { childList: true, subtree: true });\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tsignal.addEventListener('abort', () => navObserver.disconnect(), { once: true });\n\t\t}\n\t} else {\n\t\tthrow new TypeError('Cannot observe link on a non-Element. Requires an Element or selector.');\n\t}\n}\n\n/**\n * Creates a URLPattern object from the given path and base URL.\n *\n * @param {string|URL|URLPattern} path - The path to create the pattern from.\n * @param {string} [baseURL=location.origin] - The base URL to use for relative paths. Defaults to the current origin.\n * @returns {URLPattern|null} - The created URLPattern object, or `null` if the input is invalid.\n */\nexport function getURLPattern(path, baseURL = location.origin) {\n\tif (path instanceof URLPattern) {\n\t\treturn path;\n\t} else if (typeof path === 'string') {\n\t\treturn new URLPattern(path, baseURL);\n\t} else if (path instanceof URL) {\n\t\treturn new URLPattern(path.href);\n\t} else {\n\t\treturn null;\n\t}\n}\n\n/**\n * Extracts a specific parameter value from a URL path.\n *\n * @param {string|URL|URLPattern} path - The path to extract the parameter from.\n * @param {string} param - The name of the parameter to extract.\n * @param {object} [options] - Optional options.\n *   - `fallbackValue` {string} - The default value to return if the parameter is not found.\n *   - `baseURL` {string} - The base URL to use for relative paths.\n * @returns {object} - An object with a `toString()` method to retrieve the parameter value as a string, and a `[Symbol.toPrimitive]()` method to convert it to a number or string.\n */\nexport function getURLPath(path, param, {\n\tfallbackValue = '',\n\tbaseURL = location.origin,\n} = {}) {\n\tconst pattern = getURLPattern(path, baseURL);\n\n\treturn Object.freeze({\n\t\ttoString() {\n\t\t\treturn pattern.exec(location.href)?.pathname.groups?.[param] ?? fallbackValue;\n\t\t},\n\t\t[Symbol.toPrimitive](hint = 'default') {\n\t\t\treturn hint === 'number' ? parseFloat(this.toString()) : this.toString();\n\t\t}\n\t});\n}\n\n/**\n * Registers a URL pattern with its corresponding module source.\n *\n * @param {URLPattern|string|URL} path - The URL pattern or URL to register.\n * @param {string|URL|Function} moduleSrc - The module source URL/specifier or a function.\n */\nexport async function registerPath(path, moduleSrc, {\n\tpreload = false,\n\tsignal,\n\tbaseURL = location.origin,\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n} = {}) {\n\tif (signal instanceof AbortSignal && signal.aborted) {\n\t\tthrow signal.reason;\n\t} else if (typeof path === 'string') {\n\t\tawait registerPath(new URLPattern(path, baseURL), moduleSrc, { preload, signal, crossOrigin, referrerPolicy });\n\t} else if (path instanceof URL) {\n\t\tawait registerPath(new URLPattern(path.href), moduleSrc, { preload, baseURL, signal, crossOrigin, referrerPolicy });\n\t} else if (! (typeof moduleSrc === 'string' || moduleSrc instanceof Function || moduleSrc instanceof URL)) {\n\t\tthrow new TypeError('Module source/handler must be a module specifier/url or handler function.');\n\t} else if (path instanceof URLPattern) {\n\t\tROUTES_REGISTRY.set(path, moduleSrc);\n\n\t\tif (preload && (typeof moduleSrc === 'string' || moduleSrc instanceof URL)) {\n\t\t\tawait preloadModule(moduleSrc, { signal, crossOrigin, referrerPolicy });\n\t\t}\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tsignal.addEventListener('abort', clearPaths, { once: true });\n\t\t}\n\t} else {\n\t\tthrow new TypeError(`Could not convert ${path} to a URLPattern.`);\n\t}\n}\n\n/**\n * Clears all registered paths\n */\nexport function clearPaths() {\n\tROUTES_REGISTRY.clear();\n}\n\n/**\n * Fetches a module or retrieves its content based on a URL or path.\n *\n * @param {URL|string|null} input - The URL, path, or null to throw an error. Defaults to `location`.\n * @param {object} [options] - Optional options.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the fetch.\n * @param {string} [options.method] - The HTTP method to use for fetching the module. Defaults to 'GET'.\n * @param {FormData} [options.formData] - The form data to send with the request. Defaults to a new FormData object.\n * @returns {Promise<string|void>} - A promise that resolves with the module content or triggers navigation if a path match is found.\n * @throws {Error} - Throws an error if the input is null or cannot be parsed as a URL.\n */\nexport async function getModule(input = location, {\n\tmethod = 'GET',\n\tstate = getStateObj(),\n\tformData = new FormData(),\n\tcache = 'default',\n\treferrerPolicy = 'no-referrer',\n\tintegrity,\n\tsignal,\n} = {}) {\n\tconst timestamp = performance.now();\n\tconst stack = new AsyncDisposableStack();\n\n\ttry {\n\t\tif (input === null) {\n\t\t\tthrow new Error('Invalid path.');\n\t\t} else if (! (input instanceof URL)) {\n\t\t\treturn await getModule(URL.parse(input, document.baseURI), { signal, method, formData, state, stack, integrity, cache, referrerPolicy });\n\t\t} else {\n\t\t\tconst match = findPath(input);\n\n\t\t\tif (! (match instanceof URLPattern)) {\n\t\t\t\treturn await _getHTML(input, { method, signal: getNavSignal({ signal }), body: formData, state, stack, integrity, cache, referrerPolicy });\n\t\t\t} else {\n\t\t\t\tconst handler = ROUTES_REGISTRY.get(match);\n\t\t\t\tconst matches = match.exec(input);\n\t\t\t\tconst params = typeof matches === 'object'\n\t\t\t\t\t? {\n\t\t\t\t\t\t...matches.protocol.groups, ...matches.username.groups, ...matches.password.groups, ...matches.hostname.groups,\n\t\t\t\t\t\t...matches.port.groups, ...matches.pathname.groups, ...matches.search.groups, ...matches.hash.groups,\n\t\t\t\t\t} : {};\n\n\t\t\t\tdelete params['0'];\n\n\t\t\t\treturn await _handleModule(handler, {\n\t\t\t\t\turl: input,\n\t\t\t\t\tmatches,\n\t\t\t\t\tparams,\n\t\t\t\t\tstate,\n\t\t\t\t\tstack,\n\t\t\t\t\tmethod,\n\t\t\t\t\tformData,\n\t\t\t\t\tintegrity,\n\t\t\t\t\ttimestamp,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trequestAnimationFrame(stack.disposeAsync.bind(stack));\n\t}\n}\n\n/**\n * Navigates to a new URL.\n *\n * @param {string|URL} url - The URL to navigate to.\n * @param {object} [newState] - The new state object to push to the history.\n * @param {object} [options] - Optional options.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the navigation.\n * @param {string} [options.method=\"GET\"] - The HTTP method to use for the navigation.\n * @param {FormData} [options.formData] - The form data to send with the request.\n * @returns {Promise<any>} - A promise that resolves with the new content or `null` if navigation is cancelled.\n */\nexport async function navigate(url, newState = getStateObj(), {\n\tsignal,\n\tmethod = 'GET',\n\tcache = 'default',\n\treferrerPolicy = 'no-referrer',\n\tformData,\n\tintegrity,\n\tscrollRestoration = null,\n} = {}) {\n\tif (url === null) {\n\t\tthrow new TypeError('URL cannot be null.');\n\t} else if (signal instanceof AbortSignal && signal.aborted) {\n\t\tthrow signal.reason;\n\t} else if (! (url instanceof URL)) {\n\t\treturn await navigate(URL.parse(url, document.baseURI), newState, { signal, method, cache, referrerPolicy, formData, integrity });\n\t} else if (formData instanceof FormData && NO_BODY_METHODS.includes(method.toUpperCase())) {\n\t\tconst params = new URLSearchParams(formData);\n\n\t\tfor (const [key, val] of params) {\n\t\t\turl.searchParams.append(key, val);\n\t\t}\n\n\t\treturn await navigate(url, newState, { signal, method, cache, referrerPolicy, integrity });\n\t} else if (url.href !== location.href) {\n\t\tconst oldState = getStateObj();\n\t\tconst navigate = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.navigate, {\n\t\t\tdetail: { newState, oldState, oldURL: new URL(location.href), newURL: url, method, formData },\n\t\t});\n\n\t\ttry {\n\t\t\tconst diff = diffState(newState, oldState);\n\n\t\t\tEVENT_TARGET.dispatchEvent(navigate);\n\n\t\t\tif (! await navigate[NAV_CLOSE_SYMBOL]()) {\n\t\t\t\tif (typeof scrollRestoration === 'string') {\n\t\t\t\t\thistory.scrollRestoration = scrollRestoration;\n\t\t\t\t}\n\n\t\t\t\thistory.pushState(newState, '', url);\n\t\t\t\tconst content = await getModule(url, { signal, method, cache, referrerPolicy, formData, state: newState, integrity });\n\t\t\t\tawait notifyStateChange(diff);\n\t\t\t\t_updatePage(content);\n\n\t\t\t\treturn content;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch(err) {\n\t\t\tback();\n\t\t\treportError(err);\n\t\t} finally {\n\t\t\trequestAnimationFrame(navigate[Symbol.asyncDispose].bind(navigate));\n\t\t}\n\t}\n}\n\n/**\n * Navigates back in the history.\n */\nexport async function back({ signal } = {}) {\n\tconst event = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.back);\n\tEVENT_TARGET.dispatchEvent(event);\n\n\tawait event[NAV_CLOSE_SYMBOL]().then(async prevented => {\n\t\tif (! prevented) {\n\t\t\thistory.back();\n\t\t\tawait whenNavigated({ signal, reasons: [EVENT_TYPES.load] });\n\t\t}\n\t}).finally(event[Symbol.asyncDispose].bind(event));\n}\n\n/**\n * Navigates forward in the history.\n */\nexport async function forward({ signal } = {}) {\n\tconst event = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.forward);\n\tEVENT_TARGET.dispatchEvent(event);\n\n\tawait event[NAV_CLOSE_SYMBOL]().then(async prevented => {\n\t\tif (! prevented) {\n\t\t\thistory.forward();\n\t\t\tawait whenNavigated({ signal, reasons: [EVENT_TYPES.load] });\n\t\t}\n\t}).finally(event[Symbol.asyncDispose].bind(event));\n}\n\n/**\n * Navigates to a specific history entry.\n *\n * @param {number} [delta=0] - The number of entries to go back or forward. 0 to reload.\n */\nexport async function go(delta = 0, { signal } = {}) {\n\tconst event = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.go);\n\tEVENT_TARGET.dispatchEvent(event);\n\n\tawait event[NAV_CLOSE_SYMBOL]().then(async prevented => {\n\t\tif (! prevented) {\n\t\t\thistory.go(delta);\n\t\t\tawait whenNavigated({ signal, reasons: [EVENT_TYPES.load] });\n\t\t}\n\t}).finally(event[Symbol.asyncDispose].bind(event));\n}\n\n/**\n * Reloads the current page.\n */\nexport function reload() {\n\tconst event = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.reload);\n\tEVENT_TARGET.dispatchEvent(event);\n\n\tevent[NAV_CLOSE_SYMBOL]().then(prevented => {\n\t\tif (! prevented) {\n\t\t\thistory.go(0);\n\t\t}\n\t}).finally(event[Symbol.asyncDispose].bind(event));\n}\n\n/**\n * Adds a popstate listener to the window.\n *\n * @param {object} [options] - Optional options.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the listener.\n */\nexport function addPopstateListener({ signal } = {}) {\n\tglobalThis.addEventListener('popstate', _popstateHandler, { signal });\n}\n\n/**\n * Removes a popstate listener to the window.\n */\nexport function removeListener() {\n\tglobalThis.removeEventListener('popstate', _popstateHandler);\n}\n\n/**\n * Set default scroll restoration behavior on history navigation.\n *\n * @param {string} value (auto or manual)\n */\nexport function setScrollRestoration(value = 'auto') {\n\thistory.scrollRestoration = value;\n}\n\n/**\n * Get the current value of scroll restoration\n *\n * @returns string\n */\nexport function getScrollRestoration() {\n\treturn history.scrollRestoration;\n}\n\n/**\n * Sets the page title\n *\n * @param {string} title New title for page\n */\nexport function setTitle(title) {\n\tif (typeof title === 'string') {\n\t\tdocument.title = title;\n\t}\n}\n\n/**\n * Setts the page description\n *\n * @param {string} description New description for page\n */\nexport function setDescription(description) {\n\tif (typeof description === 'string' && description.length !== 0) {\n\t\tconst descs = document.head.querySelectorAll(DESC_SELECTOR);\n\n\t\tdescs.forEach(meta => meta.remove());\n\t\tdocument.head.append(\n\t\t\t_createMeta({ name: 'description', content: description }),\n\t\t\t_createMeta({ itemprop: 'description', content: description }),\n\t\t\t_createMeta({ property: 'og:description', content: description }),\n\t\t\t_createMeta({ name: 'twitter:description', content: description }),\n\t\t);\n\t}\n}\n\n/**\n * Initializes the navigation system/router.\n *\n * @param {object|string|HTMLScriptElement} routes - An object mapping URL patterns to module source URLs or specifiers, or a script/id to script\n * @param {object} [options] - Optional options.\n * @param {boolean} [options.preload=false] - Whether to preload all modules.\n * @param {boolean} [options.observePreloads=false] - If true, modules will be preloaded on link hover\n * @param {HTMLElement|ShadowRoot|string} [options.inteceptRoot] - The element to intercept link clicks on.\n * @param {string} [options.baseURL] - The base URL for URL patterns.\n * @param {string} [options.notFound] - The 404 handler.\n * @param {HTMLElement|ShadowRoot|string} [options.rootNode] - The root element for the navigation system.\n * @param {object} [options.transition] - Config for optional animations on navigation events\n * @param {Keyframe} [options.transition.keyframes] - Keyframes for an animation during transitions/navigation\n * @param {KeyframeAnimationOptions} [options.transition.options] - Options such as duration and easing for navigation animations\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the initialization.\n * @returns {Promise<AbortSignal>} - A promise that resolves with an `AbortSignal` that aborts on first navigation.\n */\nexport async function init(routes, {\n\tpreload = false,\n\tobservePreloads = false,\n\tinteceptRoot = document.body,\n\tbaseURL = location.origin,\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n\tfetchPriority = 'low',\n\tas = 'script',\n\tscrollRestoration = 'manual',\n\tnotFound,\n\trootEl: root,\n\ttransition: {\n\t\tkeyframes,\n\t\toptions: {\n\t\t\tduration = 150,\n\t\t\teasing = 'ease-out',\n\t\t\tdelay = 0,\n\t\t\tcomposite = 'replace',\n\t\t\tfill = 'both',\n\t\t} = {}\n\t} = {},\n\tsignal,\n} = {}) {\n\tif (typeof routes === 'string') {\n\t\tawait init(document.querySelector(routes), {\n\t\t\tpreload, observePreloads, inteceptRoot, baseURL, notFound, rootEl: root,\n\t\t\ttransition: { keyframes, options: { duration, easing, delay, composite, fill }},\n\t\t\tsignal,\n\t\t},\n\t\t);\n\t} else if (routes instanceof HTMLScriptElement && routes.type === 'application/json') {\n\t\tawait init(JSON.parse(routes.textContent), {\n\t\t\tpreload, observePreloads, inteceptRoot, baseURL, notFound, rootEl: root,\n\t\t\ttransition: { keyframes, options: { duration, easing, delay, composite, fill }},\n\t\t\tsignal,\n\t\t});\n\t} else if (typeof routes !== 'object' || routes === null || Object.getPrototypeOf(routes) !== Object.prototype) {\n\t\tthrow new TypeError('Routes must be a plain object, a script with JSON, or the selector to such a script.');\n\t} else if (typeof inteceptRoot === 'string') {\n\t\tinit(routes, { preload, observePreloads, inteceptRoot: document.querySelector(inteceptRoot), baseURL, notFound, rootEl, signal });\n\t} else if (typeof root === 'string') {\n\t\tinit(routes, {\n\t\t\tpreload, observePreloads, inteceptRoot, baseURL, notFound, rootEl: document.querySelector(root),\n\t\t\ttransition: { keyframes, options: { duration, easing, delay, composite, fill }},\n\t\t\tsignal,\n\t\t});\n\t} else if (! (inteceptRoot instanceof HTMLElement || inteceptRoot instanceof ShadowRoot)) {\n\t\tthrow new TypeError('`interceptRoot` must be a selector, HTMLElement, or ShadowRoot.');\n\t} else if (! (root instanceof HTMLElement || root instanceof ShadowRoot)) {\n\t\tthrow new TypeError('`rootEl` must be a selector, HTMLElement, or ShadowRoot.');\n\t} else {\n\t\tconst opts = { preload, signal, crossOrigin, referrerPolicy, fetchPriority, as, baseURL };\n\n\t\tconst reg = Object.entries(routes).map(([pattern, moduleSrc]) => registerPath(pattern, moduleSrc, opts));\n\n\t\tif (observePreloads) {\n\t\t\tobservePreloadsOn(inteceptRoot);\n\t\t}\n\n\t\tif (typeof notFound === 'string') {\n\t\t\tset404(notFound);\n\n\t\t\tif (preload) {\n\t\t\t\tpreloadModule(notFound);\n\t\t\t}\n\t\t}\n\n\t\tif (root instanceof HTMLElement || root instanceof ShadowRoot || typeof root === 'string') {\n\t\t\tsetRoot(root);\n\t\t} else if (rootEl instanceof HTMLElement && typeof rootEl.ariaLive !== 'string') {\n\t\t\trootEl.ariaLive = 'assertive';\n\t\t}\n\n\t\tif (inteceptRoot instanceof HTMLElement || inteceptRoot instanceof ShadowRoot || typeof inteceptRoot === 'string') {\n\t\t\tobserveLinksOn(inteceptRoot, { signal });\n\t\t}\n\n\t\taddPopstateListener({ signal });\n\n\t\tif (typeof keyframes === 'object' && keyframes !== null) {\n\t\t\tconst navEvents = [EVENT_TYPES.navigate, EVENT_TYPES.go, EVENT_TYPES.back, EVENT_TYPES.forward];\n\n\t\t\tEVENT_TARGET.addEventListener(NAV_EVENT, event => {\n\t\t\t\tif (! event.defaultPrevented && navEvents.includes(event.reason)) {\n\t\t\t\t\tevent.waitUntil(() => rootEl.animate(keyframes, { duration, easing, fill, delay, composite, direction: 'normal' }).finished, { signal });\n\t\t\t\t} else if (event.reason === EVENT_TYPES.load) {\n\t\t\t\t\tevent.waitUntil(() => rootEl.animate(keyframes, { duration, easing, fill, delay, composite, direction: 'reverse' }).finished, { signal });\n\t\t\t\t}\n\t\t\t}, { signal });\n\t\t}\n\n\t\tawait Promise.allSettled(reg).then(results => {\n\t\t\tconst errs = results.filter(result => result.status === 'rejected');\n\n\t\t\tif (errs.length === 1) {\n\t\t\t\tthrow errs[0].reason;\n\t\t\t} else if (errs.length !== 0) {\n\t\t\t\tthrow new AggregateError(errs.map(err => err.reason), 'Error initializing module routes.');\n\t\t\t}\n\t\t});\n\n\t\tif (ROUTES_REGISTRY.keys().some(pattern => pattern.test(location.href))) {\n\t\t\tconst content = await getModule(new URL(location.href));\n\t\t\tsetScrollRestoration(scrollRestoration);\n\t\t\t_updatePage(content);\n\t\t}\n\t}\n\n\treturn getNavSignal({ signal });\n}\n\n/**\n * Preloads a module asynchronously.\n *\n * @param {string} src - The URL or specifier to the module to preload.\n * @param {object} [options] - Optional options for the preload element.\n * @param {string} [options.crossOrigin=\"anonymous\"] - The CORS mode to use when fetching the module. Defaults to 'anonymous'.\n * @param {string} [options.referrerPolicy=\"no-referrer\"] - The referrer policy to use when fetching the module. Defaults to 'no-referrer'.\n * @param {string} [options.fetchPriority=\"low\"] - The fetch priority for the preload request. Defaults to 'auto'.\n * @param {string} [options.as=\"script\"] - The type of resource to preload. Defaults to 'script'.\n * @param {AbortSignal} [options.signal] - An AbortSignal to abort the preload request. Defaults to a 5-second timeout.\n * @param {string} [options.integrity] - A base64-encoded cryptographic hash of the resource\n * @returns {Promise<void>} A promise that resolves when the module is preloaded or rejects on error or signal is aborted.\n * @throws {Error} Throws if the signal is aborted or if an `error` event is fired on the preload.\n */\nexport async function preloadModule(src, {\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n\tfetchPriority = 'low',\n\tas = 'script',\n\tsignal,\n\tintegrity,\n} = {}) {\n\n\tawait _loadLink(src, {\n\t\trelList: ['modulepreload'],\n\t\tcrossOrigin, referrerPolicy, fetchPriority, as, signal, integrity,\n\t});\n}\n\n/**\n * Preloads a resource asynchronously.\n\n * @param {string|URL} href - The URL or specifier to the resource to preload.\n * @param {Object} [options] - Optional options for the preload element.\n * @param {string} [options.crossOrigin=\"anonymous\"] - The CORS mode to use when fetching the resource. Defaults to 'anonymous'.\n * @param {string} [options.referrerPolicy=\"no-referrer\"] - The referrer policy to use when fetching the resource. Defaults to 'no-referrer'.\n * @param {string} [options.fetchPriority=\"auto\"] - The fetch priority for the preload request. Defaults to 'auto'.\n * @param {AbortSignal} [options.signal] - An AbortSignal to abort the preload request. Defaults to a 5-second timeout.\n * @param {string} [options.integrity] - A base64-encoded cryptographic hash of the resource\n * @param {string} [options.as] - The type of resource to preload.\n * @param {string} [options.type] - The MIME type of the resource to preload.\n * @param {(string|MediaQueryList)} [options.media] - A media query string or a MediaQueryList object.\n * @returns {Promise<void>} A promise that resolves when the resource is preloaded or rejects on error or signal is aborted.\n * @throws {Error} Throws if the signal is aborted or if an `error` event is fired on the preload.\n */\nexport async function preload(href, {\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n\tfetchPriority = 'auto',\n\tsignal,\n\tas,\n\tintegrity,\n\tmedia,\n\ttype,\n} = {}) {\n\n\tawait _loadLink(href, {\n\t\trelList: ['preload'],\n\t\tcrossOrigin, referrerPolicy, fetchPriority, as, signal, type, media, integrity,\n\t});\n}\n\n/**\n * Prefetch a resource asynchronously.\n\n * @param {string|URL} href - The URL or specifier to the resource to prefetch.\n * @param {Object} [options] - Optional options for the prefetch element.\n */\nexport function prefetch(href, { referrerPolicy = 'no-referrer' } = {}) {\n\tconst link = document.createElement('link');\n\tlink.referrerPolicy = referrerPolicy;\n\tlink.relList.add('prefetch');\n\tlink.href = href;\n\tdocument.head.append(link);\n}\n\n/**\n * Preconnect to an origin to speed up future requests\n\n * @param {string|URL} href - The origin to preconnect to.\n * @param {Object} [options] - Optional options for the preconnect element.\n * @param {string} [options.crossOrigin=\"anonymous\"] - The CORS mode to use when preconnecting to the origin. Defaults to 'anonymous'.\n * @param {string} [options.referrerPolicy=\"no-referrer\"] - The referrer policy to use when preconnecting to the origin. Defaults to 'no-referrer'.\n * @returns {Promise<void>} A promise that resolves when the origin is connected or rejects on error or signal is aborted.\n * @throws {Error} Throws if the signal is aborted or if an `error` event is fired on the preload.\n */\nexport async function preconnect(href, {\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n} = {}) {\n\tconst url = href instanceof URL ? href : URL.parse(href);\n\n\tif (! (url instanceof URL)) {\n\t\tthrow new TypeError(`Invalid origin: ${href}.`);\n\t} else if (url.href !== `${url.origin}/`) {\n\t\tthrow new TypeError('Preconnect requires only the origin of a URL.');\n\t} else {\n\t\tawait _loadLink(url.origin, {\n\t\t\trelList: ['preconnect'],\n\t\t\tcrossOrigin, referrerPolicy, fetchPriority: null, signal: null,\n\t\t});\n\t}\n}\n\n/**\n * Hints to the browser to do a DNS look-up ahead of making a future connection\n *\n * @param {string|URL} href The origin to make DNS prefetching for\n * @returns {Promise<void>} A promise which resolves when the `<link>` is appended\n */\nexport async function dnsPrefetch(href) {\n\tconst url = URL.parse(href);\n\n\tif (url instanceof URL && url.origin === `${url.origin}/`) {\n\t\tawait _loadLink(href, {\n\t\t\trelList: ['dns-prefetch'],\n\t\t\tcrossOrigin: null,\n\t\t\treferrerPolicy: null,\n\t\t\tfetchPriority: null,\n\t\t\tsignal: null,\n\t\t});\n\t}\n}\n\n/**\n * Creates an `AbortController` that is aborted when the user navigates away from the current page.\n *\n * @param {object} options - Optional options object.\n * @param {AbortSignal} [options.signal] - An optional AbortSignal to tie the lifetime of the `AbortController` to.\n * @param {string|string[]} [options.reasons] - An array of event type/reasons to abort on.\n * @returns {AbortController} An `AbortController` that is aborted on navigation or when the provided signal is aborted.\n */\nexport function getNavController({ signal, reasons = DEFAULT_REASONS } = {}) {\n\tif (typeof reasons === 'string') {\n\t\treturn getNavController({ signal, reasons: [reasons] });\n\t} else if (! Array.isArray(reasons) || reasons.length === 0) {\n\t\tthrow new TypeError('`reasosn` must be an array of reasons for the naviation event.');\n\t} else if (signal instanceof AbortSignal && signal.aborted) {\n\t\tthrow signal.reason;\n\t} else {\n\t\tconst controller = new AbortController();\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tsignal.addEventListener('abort', ({ target }) => {\n\t\t\t\tcontroller.abort(target.reason);\n\t\t\t}, { once: true, signal: controller.signal });\n\t\t}\n\n\t\tEVENT_TARGET.addEventListener(NAV_EVENT, event => {\n\t\t\tif (reasons.includes(event.reason)) {\n\t\t\t\tsetTimeout(controller.abort.bind(controller), 50, `Navigated away from ${location.href}.`);\n\t\t\t}\n\t\t}, { passive: true, signal: controller.signal });\n\n\t\treturn controller;\n\t}\n}\n\n/**\n * Creates an AbortSignal that is aborted when the user navigates away from the current page.\n *\n * If an `AbortSignal` is provided, it will be combined with the navigation signal using `AbortSignal.any`.\n * This means the signal will be aborted if either the user navigates away or the provided signal is aborted.\n *\n * @param {object} options - Optional options object.\n * @param {AbortSignal} [options.signal] - An optional AbortSignal to tie the lifetime of the returned signal to.\n * @param {string|string[]} [options.reasons] - An array of event type/reasons to abort on.\n * @returns {AbortSignal} An AbortSignal that is aborted on navigation or when the provided signal is aborted.\n */\nexport function getNavSignal({ signal, reasons = DEFAULT_REASONS } = {}) {\n\tconst controller = getNavController({ signal, reasons });\n\n\treturn controller.signal;\n}\n\n/**\n * Waits for the user to navigate away from the current page.\n *\n * If an `AbortSignal` is provided, the operation will be aborted if the user navigates away or the provided signal is aborted.\n *\n * @param {object} options - Optional options object.\n * @param {AbortSignal} [options.signal] - An optional AbortSignal to tie the lifetime of the operation to.\n * @param {string[]} [options.reasons] - An array of event type/reasons to abort on.\n * @returns {Promise<URL>} A Promise that resolves to the URL of the new page or rejects with an AbortError.\n */\nexport async function whenNavigated({ signal, reasons = DEFAULT_REASONS } = {}) {\n\tconst { resolve, reject, promise } = Promise.withResolvers();\n\n\tif (typeof reasons === 'string') {\n\t\treturn whenNavigated({ signal, reasons: [reasons] });\n\t} else if (signal instanceof AbortSignal && signal.aborted) {\n\t\treject(signal.reason);\n\t} else if (! Array.isArray(reasons) || reasons.length === 0) {\n\t\treject(new TypeError('`reasosn` must be an array of reasons for the naviation event.'));\n\t} else {\n\t\tconst controller = new AbortController();\n\n\t\tdocument.addEventListener(NAV_EVENT, event => {\n\t\t\tif (reasons.includes(event.reason)) {\n\t\t\t\tresolve(new URL(location.href));\n\t\t\t\tcontroller.abort();\n\t\t\t}\n\t\t}, { signal: controller.signal });\n\n\t\tif (signal instanceof AbortSignal) {\n\t\t\tsignal.addEventListener('abort', ({ target }) => {\n\t\t\t\treject(target.reason);\n\t\t\t\tcontroller.abort(target.reason);\n\t\t\t}, { once: true, signal: controller.signal });\n\t\t}\n\t}\n\n\treturn promise;\n}\n\nexport const whenLoaded = async ({ signal }) => await whenNavigated({ signal, reasons: [EVENT_TYPES.load]});\n\n/**\n * Preloads resources associated with an element or selector when hovered over, with optional configuration.\n *\n * @param {string|HTMLElement} target - A CSS selector string or an HTMLElement that triggers preloading.\n * @param {object} [options={}] - Configuration options for preloading.\n * @param {string} [options.crossOrigin='anonymous'] - The cross-origin attribute for the request, useful for fetching from other origins.\n * @param {string} [options.referrerPolicy='no-referrer'] - The referrer policy to apply to the request.\n * @param {string} [options.fetchPriority='high'] - The priority level of the fetch operation.\n * @param {AbortSignal} [options.signal] - Optional signal to abort the preload operation if needed.\n * @returns {Promise<void>} A promise that resolves once preloading completes.\n * @throws {TypeError} Throws if the target is not a valid selector or an HTMLElement with a valid `href` attribute.\n */\nexport async function preloadOnHover(target, {\n\tcrossOrigin = 'anonymous',\n\treferrerPolicy = 'no-referrer',\n\tfetchPriority = 'high',\n\tsignal,\n} = {}) {\n\tconst { resolve, reject, promise } = Promise.withResolvers();\n\n\tif (typeof target === 'string') {\n\t\tawait Promise.all(Array.from(\n\t\t\tdocument.querySelectorAll(target),\n\t\t\tlink => preloadOnHover(link)\n\t\t)).then(resolve, reject);\n\t} else if (\n\t\ttarget instanceof HTMLElement\n\t\t&& ! target.classList.contains('no-router')\n\t\t&& typeof target.href === 'string'\n\t\t&& target.origin === location.origin\n\t\t&& target.download.length === 0\n\t\t&& URL.canParse(target.href)\n\t) {\n\t\ttarget.addEventListener('mouseover', async ({ currentTarget }) => {\n\t\t\tconst pattern = findPath(currentTarget.href);\n\n\t\t\tif (pattern instanceof URLPattern) {\n\t\t\t\tawait preloadModule(ROUTES_REGISTRY.get(pattern), {\n\t\t\t\t\tfetchPriority,\n\t\t\t\t\treferrerPolicy,\n\t\t\t\t\tcrossOrigin,\n\t\t\t\t\tintegrity: currentTarget.dataset.integrity,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tawait preload(currentTarget.href, {\n\t\t\t\t\tfetchPriority,\n\t\t\t\t\tcrossOrigin,\n\t\t\t\t\treferrerPolicy,\n\t\t\t\t\tas: currentTarget.dataset.preloadAs ?? 'fetch',\n\t\t\t\t\ttype: currentTarget.dataset.preloadType ?? 'text/html',\n\t\t\t\t\tintegrity: currentTarget.dataset.integrity,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, { once: true, passive: true, signal });\n\t} else {\n\t\tresolve();\n\t}\n\n\tawait promise;\n}\n\n/**\n * Adds `mouseenter` listeners to preload links/handlers via a `MutationObserver`\n *\n * @param {HTMLElement|ShadowRoot|string} target Target for the mutation observer or its selector\n * @param {HTMLElement|ShadowRoot} [base=document] The element to query from if `target` is a selector\n */\nexport function observePreloadsOn(target, base = document.documentElement) {\n\tif (typeof target === 'string') {\n\t\tobservePreloadsOn(base.querySelector(target));\n\t} else if (target instanceof HTMLElement || target instanceof ShadowRoot) {\n\t\tpreloadObserver.observe(target, { childList : true, subtree: true });\n\t\t_handlePreloadMutations(target);\n\t} else {\n\t\tthrow new TypeError('`observePreloadsOn` requires a selector or HTMLElement or ShadowRoot.');\n\t}\n}\n\n/**\n * Combines `observeLinksOn` and `observePreloadsOn`\n *\n * @param {HTMLElement|ShadowRoot|string} target Target for the mutation observers or its selector\n * @param {HTMLElement|ShadowRoot} [base=document] The element to query from if `target` is a selector\n */\nexport function observe(target, base = document.documentElement) {\n\tif (typeof target === 'string') {\n\t\tobserve(base.querySelector(target));\n\t} else if (target instanceof HTMLElement || target instanceof ShadowRoot) {\n\t\tobserveLinksOn(target);\n\t\tobservePreloadsOn(target);\n\t}else {\n\t\tthrow new TypeError('`observe` requires a selector or HTMLElement or ShadowRoot.');\n\t}\n}\n\n/**\n * Measures navigation time between initial nav event and load event\n *\n * @param {object} options\n * @param {AbortSignal} [options.signal] Optional signal to cancel and reject\n * @returns {number} Total duration between nav start and load in ms\n */\nexport async function timeNavigation({ signal } = {}) {\n\tconst { resolve, promise, reject } = Promise.withResolvers();\n\tconst navController = new AbortController();\n\tconst loadController = new AbortController();\n\n\tif (signal instanceof AbortSignal) {\n\t\tif (signal.aborted) {\n\t\t\treject(signal.reason);\n\t\t} else {\n\t\t\tsignal.addEventListener('abort', ({ target }) => {\n\t\t\t\treject(target.reason);\n\t\t\t\tnavController.abort(target.reason);\n\t\t\t\tloadController.abort(target.reason);\n\t\t\t}, { signal: loadController.signal });\n\t\t}\n\t}\n\n\tEVENT_TARGET.addEventListener(NAV_EVENT, event => {\n\t\tif ([EVENT_TYPES.navigate, EVENT_TYPES.back, EVENT_TYPES.forward, EVENT_TYPES.go].includes(event.reason)) {\n\t\t\tnavController.abort();\n\t\t\tconst start = performance.now();\n\n\t\t\tEVENT_TARGET.addEventListener(NAV_EVENT, event => {\n\t\t\t\tif (event.reason === EVENT_TYPES.load) {\n\t\t\t\t\tresolve(performance.now() - start);\n\t\t\t\t\tloadController.abort();\n\t\t\t\t}\n\t\t\t}, { signal: loadController.signal });\n\t\t}\n\t}, { signal: navController.signal });\n\n\treturn promise;\n}\n"],"names":["stringify","thing","TypeError","Date","toISOString","Array","isArray","map","join","ArrayBuffer","Uint8Array","prototype","toBase64","Function","isView","Blob","URL","createObjectURL","toString","escape","str","encodeURIComponent","trim","replaceAll","url","base","globalThis","document","baseURI","strings","value","values","length","canParse","parse","String","raw","startsWith","createURLParser","$$","selector","querySelectorAll","$","querySelector","requestFullscreen","toggleFullsceen","FUNCS","log","info","warn","error","back","forward","reload","close","link","popup","print","remove","hide","unhide","showModal","closeModal","showPopover","hidePopover","togglePopover","enable","disable","scrollTo","prevent","revokeObjectURL","cancelAnimationFrame","clearInterval","clearTimeout","toggleFullscreen","exitFullsceen","open","abortController","registry","Map","console","history","go","event","isTrusted","preventDefault","location","href","currentTarget","dataset","hideSelector","forEach","el","hidden","unhideSelector","disableSelector","disabled","enableSelector","removeSelector","target","scrollToSelector","Element","scrollIntoView","behavior","matchMedia","matches","src","parseInt","animationFrame","timeout","key","reason","controller","getController","AbortController","abort","Error","aegisEventController","aegisControllerReason","openSelector","closeSelector","showModalSelector","HTMLDialogElement","closeModalSelector","showPopoverSelector","HTMLElement","hidePopoverSelector","togglePopoverSelector","hasOwnProperty","getElementById","isSameNode","fullscreenElement","exitFullscreen","hasCallback","name","has","getCallback","get","notify","Symbol","currentComputed","watched","unwatched","initial","isWatched","onWatch","onUnwatch","sources","sinks","equals","Object","is","opts","freeze","State","Set","constructor","options","this","bind","Signal","subtle","Computed","add","set","newValue","sink","introspectSinks","computation","dirty","oldComputed","source","introspectSources","delete","clear","val","Watcher","pending","watch","signals","signal","call","unwatch","filter","getPending","from","untrack","cb","prev","s","hasSinks","size","hasSources","PREFIX","EVENT_PREFIX","DATA_PREFIX","signalRegistry","controllerRegistry","once","passive","capture","onAbort","onBlur","onFocus","onCancel","onAuxclick","onBeforeinput","onBeforetoggle","onCanplay","onCanplaythrough","onChange","onClick","onClose","onCommand","onContextmenu","onCopy","onCuechange","onCut","onDblclick","onDrag","onDragend","onDragenter","onDragexit","onDragleave","onDragover","onDragstart","onDrop","onDurationchange","onEmptied","onEnded","onFormdata","onInput","onInvalid","onKeydown","onKeypress","onKeyup","onLoad","onLoadeddata","onLoadedmetadata","onLoadstart","onMousedown","onMouseenter","onMouseleave","onMousemove","onMouseout","onMouseover","onMouseup","onWheel","onPaste","onPause","onPlay","onPlaying","onProgress","onRatechange","onReset","onResize","onScroll","onScrollend","onSecuritypolicyviolation","onSeeked","onSeeking","onSelect","onSlotchange","onStalled","onSubmit","onSuspend","onTimeupdate","onVolumechange","onWaiting","onSelectstart","onSelectionchange","onToggle","onPointercancel","onPointerdown","onPointerup","onPointermove","onPointerout","onPointerover","onPointerenter","onPointerleave","onGotpointercapture","onLostpointercapture","onMozfullscreenchange","onMozfullscreenerror","onAnimationcancel","onAnimationend","onAnimationiteration","onAnimationstart","onTransitioncancel","onTransitionend","onTransitionrun","onTransitionstart","onWebkitanimationend","onWebkitanimationiteration","onWebkitanimationstart","onWebkittransitionend","onError","eventAttrs","attr","CSS","isEventDataAttr","MutationObserver","records","record","type","addedNodes","node","nodeType","Node","ELEMENT_NODE","attrFilter","EVENTS","entries","substring","addEventListener","toLowerCase","getSignal","aegisEventSignal","err","reportError","_addListeners","attachListeners","oldValue","removeEventListener","attributeName","hasAttribute","getAttribute","undefined","isModule","currentScript","HTMLScriptElement","SUPPORTS_IMPORTMAP","supports","ROUTES_REGISTRY","NO_BODY_METHODS","DESC_SELECTOR","navObserver","entry","interceptNav","preloadObserver","_handlePreloadMutations","ROOT_ID","EVENT_TARGET","NAV_CLOSE_SYMBOL","for","prefersReducedMotion","rootEl","body","rootSelector","SUPPORTS_TRUSTED_TYPES","_isTrustedHTML","input","trustedTypes","isHTML","startViewTransition","update","types","Promise","try","MutationRecord","tagName","classList","contains","a","preloadOnHover","NAV_EVENT","EVENT_TYPES","navigate","pop","load","submit","DEFAULT_REASONS","AegisNavigationEvent","CustomEvent","stack","AsyncDisposableStack","promises","errors","bubbles","cancelable","detail","oldState","getStateObj","oldURL","super","aborted","disposed","AggregateError","result","allSettled","then","results","push","status","defaultPrevented","adopt","obj","callback","defer","disposeAsync","asyncDispose","use","waitUntil","promiseOrCallback","promise","resolve","reject","withResolvers","AbortSignal","any","timestamp","performance","now","toStringTag","DOMException","defaultType","reasons","policy","createPolicy","createHTML","async","_popstateHandler","diff","diffState","state","newState","method","formData","dispatchEvent","old","scrollRestoration","content","all","getModule","notifyStateChange","_updatePage","requestAnimationFrame","_addStyle","sheet","CSSStyleSheet","adoptedStyleSheets","includes","_createMeta","props","meta","createElement","setAttribute","_loadLink","relList","crossOrigin","referrerPolicy","fetchPriority","passedSignal","as","integrity","media","MediaQueryList","_isModuleURL","_resolveModule","head","append","catch","isConnected","_interceptLinkClick","origin","metaKey","ctrlKey","shiftKey","fromEntries","_getLinkStateData","cache","_interceptFormSubmit","action","submitter","FormData","HTMLButtonElement","toUpperCase","params","URLSearchParams","searchParams","_getHTML","resp","fetch","headers","Accept","ok","html","text","Document","parseHTMLUnsafe","view404","_handleModule","_get404","childElementCount","setTitle","title","setDescription","contentEl","replaceChildren","childNodes","HTMLTemplateElement","setHTMLUnsafe","textContent","message","ev","finally","hash","autofocus","focus","_handleMetadata","description","moduleSrc","args","module","import","default","customElements","getName","define","crypto","randomUUID","styles","getNavSignal","div","p","findPath","keys","find","pattern","test","set404","path","ShadowRoot","HTMLAnchorElement","HTMLFormElement","setRoot","id","ariaLive","observeLinksOn","observe","childList","subtree","disconnect","getURLPattern","baseURL","URLPattern","getURLPath","param","fallbackValue","exec","pathname","groups","toPrimitive","hint","parseFloat","registerPath","preload","preloadModule","clearPaths","match","handler","protocol","username","password","hostname","port","search","newURL","pushState","prevented","whenNavigated","delta","addPopstateListener","removeListener","setScrollRestoration","getScrollRestoration","itemprop","property","init","routes","observePreloads","inteceptRoot","notFound","root","transition","keyframes","duration","easing","delay","composite","fill","JSON","getPrototypeOf","reg","observePreloadsOn","navEvents","animate","direction","finished","errs","some","prefetch","preconnect","dnsPrefetch","getNavController","setTimeout","whenLoaded","download","preloadAs","preloadType","documentElement","timeNavigation","navController","loadController","start"],"mappings":"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mB,UAAW,CAC7B5H,KAAMyG,EAAO5M,OAAOkO,aAAa/H,GACjCE,QAASuG,EAAO5M,OAAOkO,aAAa7H,GACpCD,QAASwG,EAAO5M,OAAOkO,aAAa9H,KAMtCwG,EAAO5M,OAAOkO,aAAatB,EAAOqB,gBAC/B/L,EAAY0K,EAAO5M,OAAOmO,aAAavB,EAAOqB,iBAEjDrB,EAAO5M,OAAOuN,iBACbX,EAAOqB,cAAcX,UA1QCvH,IA2QtB1D,EAAYuK,EAAO5M,OAAOmO,aAAavB,EAAOqB,gBAAiB,CAC9D9H,KAAMyG,EAAO5M,OAAOkO,aAAa/H,GACjCE,QAASuG,EAAO5M,OAAOkO,aAAa7H,GACpCD,QAASwG,EAAO5M,OAAOkO,aAAa9H,GACpCnB,OAAQ2H,EAAO5M,OAAOkO,aAAajJ,GAAUwI,GAAUb,EAAO5M,OAAOmO,aAAalJ,SAAWmJ,IAKpG,GACG,IAGI,MAAMhB,GAAS,CACrB9G,UACAC,SACAC,UACAC,WACAC,aACAC,gBACAC,iBACAC,YACAC,mBACAC,WACAC,UACAC,UACAC,YACAC,iBACAC,UACAC,eACAC,SACAC,cACAC,UACAC,aACAC,eACAC,cACAC,eACAC,cACAC,eACAC,UACAC,oBACAC,aACAC,WACAC,cACAC,WACAC,aACAC,aACAC,cACAC,WACAC,UACAC,gBACAC,oBACAC,eACAC,eACAC,gBACAC,gBACAC,eACAC,cACAC,eACAC,aACAC,WACAC,WACAC,WACAC,UACAC,aACAC,cACAC,gBACAC,WACAC,YACAC,YACAC,eACAC,6BACAC,YACAC,aACAC,YACAC,gBACAC,aACAC,YACAC,aACAC,gBACAC,kBACAC,aACAC,iBACAC,qBACAC,YACAC,mBACAC,iBACAC,eACAC,iBACAC,gBACAC,iBACAC,kBACAC,kBACAC,uBACAC,wBACAC,yBACAC,wBACAC,qBACAC,kBACAC,wBACAC,oBACAC,sBACAC,mBACAC,mBACAC,qBACAC,wBACAC,8BACAC,0BACAC,yBACAC,WACAlG,OACAC,UACAC,WAuGYvF,GAAgBH,GAAOuF,EAAmB5D,IAAI3B,GA4CpD,MAAM8M,GAAY9M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","x_google_ignoreList":[0,1,2,3,4]}