{"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 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\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\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.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]);\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 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\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\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\tpassedSignal.addEventListener('abort', ({ target }) => {\n\t\t\t\treject(target.reason);\n\t\t\t}, { signal: controller.signal });\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 (event.isTrusted && event.currentTarget.href.startsWith(location.origin)) {\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 === 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, { state = getStateObj(), matches = {}, params = {}, signal, ...args } = {}) {\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\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\t\treturn await module.default({\n\t\t\turl,\n\t\t\tmatches,\n\t\t\tparams,\n\t\t\tstate,\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 {\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\n\tif (typeof view404 === 'string') {\n\t\treturn await _handleModule(view404, { url, matches: null, signal, method, formData, timestamp, integrity });\n\t} else if (view404 instanceof Function) {\n\t\t_updatePage(view404({ timestamp, state: getStateObj(), url, matches: null, signal, method, formData, integrity }));\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\n\tif (input === null) {\n\t\tthrow new Error('Invalid path.');\n\t} else if (! (input instanceof URL)) {\n\t\treturn await getModule(URL.parse(input, document.baseURI), { signal, method, formData, state, integrity, cache, referrerPolicy });\n\t} else {\n\t\tconst match = findPath(input);\n\n\t\tif (! (match instanceof URLPattern)) {\n\t\t\treturn await _getHTML(input, { method, signal: getNavSignal({ signal }), body: formData, state, integrity, cache, referrerPolicy });\n\t\t} else {\n\t\t\tconst handler = ROUTES_REGISTRY.get(match);\n\t\t\tconst matches = match.exec(input);\n\t\t\tconst params = typeof matches === 'object'\n\t\t\t\t? {\n\t\t\t\t\t...matches.protocol.groups, ...matches.username.groups, ...matches.password.groups, ...matches.hostname.groups,\n\t\t\t\t\t...matches.port.groups, ...matches.pathname.groups, ...matches.search.groups, ...matches.hash.groups,\n\t\t\t\t} : {};\n\n\t\t\tdelete params['0'];\n\n\t\t\treturn await _handleModule(handler, {\n\t\t\t\turl: input,\n\t\t\t\tmatches,\n\t\t\t\tparams,\n\t\t\t\tstate,\n\t\t\t\tmethod,\n\t\t\t\tformData,\n\t\t\t\tintegrity,\n\t\t\t\ttimestamp,\n\t\t\t});\n\t\t}\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=AbortSignal.timeout(5000)] - 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 = AbortSignal.timeout(5000),\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=AbortSignal.timeout(5000)] - 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 = AbortSignal.timeout(5000),\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\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","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","abortController","registry","Map","console","history","go","event","isTrusted","preventDefault","location","href","currentTarget","dataset","open","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","showModalSelector","HTMLDialogElement","closeModalSelector","showPopoverSelector","HTMLElement","hidePopoverSelector","togglePopoverSelector","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","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","hasOwnProperty","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","getElementById","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","fromEntries","_getLinkStateData","cache","_interceptFormSubmit","action","FormData","includes","toUpperCase","params","URLSearchParams","searchParams","_getHTML","resp","fetch","headers","Accept","ok","html","text","Document","parseHTMLUnsafe","view404","_handleModule","_get404","childElementCount","setTitle","title","setDescription","contentEl","replaceChildren","childNodes","HTMLTemplateElement","setHTMLUnsafe","textContent","message","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","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","bind","from","download","preloadAs","preloadType","documentElement","timeNavigation","navController","loadController","start"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}