{"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","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\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\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\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 {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);\n\n/**\n * Get a callback from the registry by name/key\n *\n * @param {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);\n\n/**\n *\t Remove a callback from the registry\n *\n * @param {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);\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 * @returns {string} The automatically generated key/name of the registered callback\n */\nexport const createCallback = (callback) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback);\n\n/**\n * Call a callback fromt the registry by name/key\n *\n * @param {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)) {\n\t\treturn registry.get(name).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 {string} name The name/key to register the callback under\n * @param {Function} callback The callback value to register\n * @returns {string} The registered name/key\n */\nexport function registerCallback(name, callback) {\n\tif (typeof name !==  'string' || name.length === 0) {\n\t\tthrow new TypeError('Callback name must be a string.');\n\t} if (! (callback instanceof 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)) {\n\t\tthrow new Error(`Handler \"${name}\" is already registered.`);\n\t} else {\n\t\tregistry.set(name, callback);\n\t\treturn name;\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 } = {}) {\n\tif (callback instanceof Function) {\n\t\treturn on(event, createCallback(callback), { capture, passive, once, signal });\n\t} else if (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';\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\nexport const eventAttrs = [\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\nlet selector = eventAttrs.map(attr => `[${CSS.escape(attr)}]`).join(', ');\n\nconst attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;\n\nexport const eventToProp = event => EVENT_PREFIX + event;\n\nexport const hasEventAttribute = event => eventAttrs.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\n\tif (! eventAttrs.includes(fullAttr)) {\n\t\tconst sel = `[${CSS.escape(fullAttr)}]`;\n\t\tconst prop = attrToProp(fullAttr);\n\t\teventAttrs.push(fullAttr);\n\t\tEVENTS[prop] = fullAttr;\n\t\tselector += `, ${sel}`;\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)\n\t\t? [target, ...target.querySelectorAll(selector)]\n\t\t: target.querySelectorAll(selector);\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,\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","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\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#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 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 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\tabort(reason) {\n\t\tthis.#controller.abort(reason);\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})).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\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\tEVENT_TARGET.dispatchEvent(navigate);\n\n\tif (! await navigate[NAV_CLOSE_SYMBOL]()) {\n\t\tconst old = history.scrollRestoration;\n\t\tconst [content] = await Promise.all([\n\t\t\tgetModule(new URL(location.href)),\n\t\t\tnotifyStateChange(diff),\n\t\t]);\n\n\t\thistory.scrollRestoration = 'auto';\n\t\t_updatePage(content);\n\t\thistory.scrollRestoration = old;\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 { method, action } = event.target;\n\t\tconst formData = new FormData(event.target);\n\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\tEVENT_TARGET.dispatchEvent(submit);\n\n\t\tif (await submit[NAV_CLOSE_SYMBOL]()) {\n\t\t\treturn;\n\t\t} else if (NO_BODY_METHODS.includes(method.toUpperCase())) {\n\t\t\tconst url = new URL(action);\n\t\t\tconst params = new URLSearchParams(formData);\n\n\t\t\tfor (const [key, val] of params.entries()) {\n\t\t\t\turl.searchParams.append(key, val);\n\t\t\t}\n\n\t\t\tawait navigate(url, getStateObj(), { method });\n\t\t} else {\n\t\t\tawait navigate(action, getStateObj(), { method, formData });\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\nfunction _updatePage(content) {\n\tconst timestamp = performance.now();\n\n\tif (content instanceof Document) {\n\t\tif (content.head.childElementCount !== 0) {\n\t\t\tsetTitle(content.title);\n\t\t\tsetDescription(content.querySelector(DESC_SELECTOR)?.content);\n\t\t}\n\n\t\tconst contentEl = typeof rootSelector === 'string' ? content.body.querySelector(rootSelector) ?? content.body : content.body;\n\n\t\trootEl.replaceChildren(...contentEl.childNodes);\n\t} else if (content instanceof HTMLTemplateElement) {\n\t\trootEl.replaceChildren(content.content);\n\t} else if (content instanceof Function && content.prototype instanceof HTMLElement) {\n\t\trootEl.replaceChildren(new content({ state: getStateObj(), url: new URL(location.href), timestamp }));\n\t} else if (content instanceof Node) {\n\t\trootEl.replaceChildren(content);\n\t} else if (content instanceof Function) {\n\t\t_updatePage(content());\n\t} else if (typeof content === 'string') {\n\t\trootEl.setHTMLUnsafe(policy.createHTML(content));\n\t} else if (_isTrustedHTML(content)) {\n\t\trootEl.setHTMLUnsafe(content);\n\t} else if (content instanceof Error) {\n\t\treportError(content);\n\t\trootEl.textContent = content.message;\n\t} else if (content instanceof URL) {\n\t\tnavigate(content);\n\t} else if (! (content === null || typeof content === 'undefined')) {\n\t\trootEl.textContent = content;\n\t}\n\n\tEVENT_TARGET.dispatchEvent(new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.load, { cancelable: false }));\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\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\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\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\ttry {\n\t\t\tconst oldState = getStateObj();\n\t\t\tconst diff = diffState(newState, oldState);\n\t\t\tconst navigate = new AegisNavigationEvent(NAV_EVENT, EVENT_TYPES.navigate, {\n\t\t\t\tdetail: { newState, oldState, oldURL: new URL(location.href), newURL: url, method, formData },\n\t\t\t});\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}\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});\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});\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});\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});\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\tconst content = await getModule(new URL(location.href));\n\t\tsetScrollRestoration(scrollRestoration);\n\t\t_updatePage(content);\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\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","debug","log","info","warn","error","navigate","back","forward","reload","close","link","popup","ui","print","remove","hide","unhide","showModal","closeModal","showPopover","hidePopover","togglePopover","enable","disable","scrollTo","prevent","revokeObjectURL","cancelAnimationFrame","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","clearInterval","clearTimeout","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","PREFIX","EVENT_PREFIX","DATA_PREFIX","signalRegistry","controllerRegistry","once","passive","capture","signal","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","attr","CSS","isEventDataAttr","MutationObserver","records","record","type","addedNodes","filter","node","nodeType","Node","ELEMENT_NODE","attrFilter","EVENTS","val","Object","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","Symbol","for","prefersReducedMotion","rootEl","body","rootSelector","SUPPORTS_TRUSTED_TYPES","_isTrustedHTML","input","trustedTypes","isHTML","MutationRecord","tagName","classList","contains","a","preloadOnHover","NAV_EVENT","EVENT_TYPES","pop","load","submit","DEFAULT_REASONS","AegisNavigationEvent","CustomEvent","promises","errors","constructor","bubbles","cancelable","detail","oldState","getStateObj","oldURL","super","this","aborted","AggregateError","result","Promise","allSettled","then","results","push","status","defaultPrevented","waitUntil","promiseOrCallback","promise","resolve","reject","withResolvers","AbortSignal","try","any","timestamp","performance","now","toStringTag","defaultType","reasons","policy","createPolicy","createHTML","freeze","async","_popstateHandler","diff","diffState","state","newState","method","formData","dispatchEvent","old","scrollRestoration","content","all","getModule","notifyStateChange","_updatePage","_createMeta","props","meta","createElement","setAttribute","_loadLink","relList","crossOrigin","referrerPolicy","fetchPriority","passedSignal","as","integrity","media","add","MediaQueryList","DOMException","_isModuleURL","_resolveModule","head","append","catch","isConnected","_interceptLinkClick","origin","metaKey","ctrlKey","shiftKey","fromEntries","_getLinkStateData","cache","_interceptFormSubmit","action","FormData","includes","toUpperCase","params","URLSearchParams","searchParams","_getHTML","resp","fetch","headers","Accept","ok","html","text","Document","parseHTMLUnsafe","stack","AsyncDisposableStack","view404","_handleModule","disposeAsync","_get404","childElementCount","setTitle","title","setDescription","contentEl","replaceChildren","childNodes","HTMLTemplateElement","setHTMLUnsafe","textContent","message","hash","autofocus","focus","_handleMetadata","description","moduleSrc","args","module","import","default","customElements","getName","define","crypto","randomUUID","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","set","preloadModule","clearPaths","clear","match","handler","protocol","username","password","hostname","port","search","requestAnimationFrame","bind","newURL","pushState","prevented","whenNavigated","delta","addPopstateListener","removeListener","setScrollRestoration","getScrollRestoration","itemprop","property","init","routes","observePreloads","inteceptRoot","notFound","root","transition","keyframes","options","duration","easing","delay","composite","fill","JSON","getPrototypeOf","opts","reg","observePreloadsOn","navEvents","animate","direction","finished","errs","prefetch","preconnect","dnsPrefetch","getNavController","setTimeout","whenLoaded","from","download","preloadAs","preloadType","documentElement","timeNavigation","navController","loadController","start"],"mappings":"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AAe,eAChC2E,GAAY3E,EAAe,UAC3B4E,GAAgB5E,EAAe,cAC/B6E,GAAoB7E,EAAe,kBACnC8E,GAAW9E,EAAe,SAC1B+E,GAAkB/E,EAAe,gBACjCgF,GAAgBhF,EAAe,cAC/BiF,GAAcjF,EAAe,YAC7BkF,GAAgBlF,EAAe,cAC/BmF,GAAenF,EAAe,aAC9BoF,GAAgBpF,EAAe,cAC/BqF,GAAiBrF,EAAe,eAChCsF,GAAiBtF,EAAe,eAChCuF,GAAsBvF,EAAe,oBACrCwF,GAAuBxF,EAAe,qBACtCyF,GAAwBzF,EAAe,sBACvC0F,GAAuB1F,EAAe,qBACtC2F,GAAoB3F,EAAe,kBACnC4F,GAAiB5F,EAAe,eAChC6F,GAAuB7F,EAAe,qBACtC8F,GAAmB9F,EAAe,iBAClC+F,GAAqB/F,EAAe,mBACpCgG,GAAkBhG,EAAe,gBACjCiG,GAAkBjG,EAAe,gBACjCkG,GAAoBlG,EAAe,kBACnCmG,GAAuBnG,EAAe,qBACtCoG,GAA6BpG,EAAe,2BAC5CqG,GAAyBrG,EAAe,uBACxCsG,GAAwBtG,EAAe,sBACvCuG,GAAUvG,EAAe,QAqGtC,IAAItG,GAnGsB,CACzB8G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,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","x_google_ignoreList":[0,1,2,3]}