{"version":3,"file":"bundle.js","sources":["../frontend/behaviors/index.js","../frontend/behaviors/bookmark-page.js","../frontend/behaviors/bulk-edit.js","../frontend/behaviors/confirm-button.js","../frontend/behaviors/dropdown.js","../frontend/behaviors/fetch.js","../frontend/behaviors/form.js","../frontend/behaviors/modal.js","../../node_modules/svelte/src/runtime/internal/utils.js","../../node_modules/svelte/src/runtime/internal/dom.js","../../node_modules/svelte/src/runtime/internal/lifecycle.js","../frontend/behaviors/global-shortcuts.js","../../node_modules/svelte/src/runtime/internal/scheduler.js","../../node_modules/svelte/src/runtime/internal/transitions.js","../../node_modules/svelte/src/runtime/internal/each.js","../../node_modules/svelte/src/runtime/internal/Component.js","../frontend/util.js","../frontend/components/TagAutocomplete.svelte","../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../../node_modules/svelte/src/shared/version.js","../frontend/api.js","../frontend/behaviors/tag-autocomplete.js","../frontend/components/SearchHistory.js","../frontend/components/SearchAutoComplete.svelte"],"sourcesContent":["const behaviorRegistry = {};\nconst debug = false;\n\nconst mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n if (node instanceof HTMLElement && !node.isConnected) {\n destroyBehaviors(node);\n }\n });\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement && node.isConnected) {\n applyBehaviors(node);\n }\n });\n });\n});\n\nmutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n});\n\nexport class Behavior {\n constructor(element) {\n this.element = element;\n }\n\n destroy() {}\n}\n\nBehavior.interacting = false;\n\nexport function registerBehavior(name, behavior) {\n behaviorRegistry[name] = behavior;\n applyBehaviors(document, [name]);\n}\n\nexport function applyBehaviors(container, behaviorNames = null) {\n if (!behaviorNames) {\n behaviorNames = Object.keys(behaviorRegistry);\n }\n\n behaviorNames.forEach((behaviorName) => {\n const behavior = behaviorRegistry[behaviorName];\n const elements = Array.from(\n container.querySelectorAll(`[${behaviorName}]`),\n );\n\n // Include the container element if it has the behavior\n if (container.hasAttribute && container.hasAttribute(behaviorName)) {\n elements.push(container);\n }\n\n elements.forEach((element) => {\n element.__behaviors = element.__behaviors || [];\n const hasBehavior = element.__behaviors.some(\n (b) => b instanceof behavior,\n );\n\n if (hasBehavior) {\n return;\n }\n\n const behaviorInstance = new behavior(element);\n element.__behaviors.push(behaviorInstance);\n if (debug) {\n console.log(\n `[Behavior] ${behaviorInstance.constructor.name} initialized`,\n );\n }\n });\n });\n}\n\nexport function destroyBehaviors(element) {\n const behaviorNames = Object.keys(behaviorRegistry);\n\n behaviorNames.forEach((behaviorName) => {\n const elements = Array.from(element.querySelectorAll(`[${behaviorName}]`));\n elements.push(element);\n\n elements.forEach((element) => {\n if (!element.__behaviors) {\n return;\n }\n\n element.__behaviors.forEach((behavior) => {\n behavior.destroy();\n if (debug) {\n console.log(`[Behavior] ${behavior.constructor.name} destroyed`);\n }\n });\n delete element.__behaviors;\n });\n });\n}\n\nexport function swap(element, html, options) {\n const dom = new DOMParser().parseFromString(html, \"text/html\");\n\n let targetElement = element;\n let strategy = \"innerHTML\";\n if (options.target) {\n const parts = options.target.split(\"|\");\n targetElement =\n parts[0] === \"self\" ? element : document.querySelector(parts[0]);\n strategy = parts[1] || \"innerHTML\";\n }\n\n let contents = Array.from(dom.body.children);\n if (options.select) {\n contents = Array.from(dom.querySelectorAll(options.select));\n }\n\n switch (strategy) {\n case \"append\":\n targetElement.append(...contents);\n break;\n case \"outerHTML\":\n targetElement.parentElement.replaceChild(contents[0], targetElement);\n break;\n case \"innerHTML\":\n default:\n Array.from(targetElement.children).forEach((child) => {\n child.remove();\n });\n targetElement.append(...contents);\n }\n}\n\nexport function fireEvents(events) {\n if (!events) {\n return;\n }\n events.split(\",\").forEach((eventName) => {\n const targets = Array.from(\n document.querySelectorAll(`[ld-on='${eventName}']`),\n );\n targets.push(document);\n targets.forEach((target) => {\n target.dispatchEvent(new CustomEvent(eventName));\n });\n });\n}\n","import { Behavior, registerBehavior } from \"./index\";\n\nclass BookmarkItem extends Behavior {\n constructor(element) {\n super(element);\n\n // Toggle notes\n const notesToggle = element.querySelector(\".toggle-notes\");\n if (notesToggle) {\n notesToggle.addEventListener(\"click\", this.onToggleNotes.bind(this));\n }\n\n // Add tooltip to title if it is truncated\n const titleAnchor = element.querySelector(\".title > a\");\n const titleSpan = titleAnchor.querySelector(\"span\");\n requestAnimationFrame(() => {\n if (titleSpan.offsetWidth > titleAnchor.offsetWidth) {\n titleAnchor.dataset.tooltip = titleSpan.textContent;\n }\n });\n }\n\n onToggleNotes(event) {\n event.preventDefault();\n event.stopPropagation();\n this.element.classList.toggle(\"show-notes\");\n }\n}\n\nregisterBehavior(\"ld-bookmark-item\", BookmarkItem);\n","import { Behavior, registerBehavior } from \"./index\";\n\nclass BulkEdit extends Behavior {\n constructor(element) {\n super(element);\n\n this.active = false;\n\n this.onToggleActive = this.onToggleActive.bind(this);\n this.onToggleAll = this.onToggleAll.bind(this);\n this.onToggleBookmark = this.onToggleBookmark.bind(this);\n this.onActionSelected = this.onActionSelected.bind(this);\n\n this.init();\n // Reset when bookmarks are refreshed\n document.addEventListener(\"refresh-bookmark-list-done\", () => this.init());\n }\n\n init() {\n // Update elements\n this.activeToggle = this.element.querySelector(\".bulk-edit-active-toggle\");\n this.actionSelect = this.element.querySelector(\n \"select[name='bulk_action']\",\n );\n this.tagAutoComplete = this.element.querySelector(\".tag-autocomplete\");\n this.selectAcross = this.element.querySelector(\"label.select-across\");\n this.allCheckbox = this.element.querySelector(\n \".bulk-edit-checkbox.all input\",\n );\n this.bookmarkCheckboxes = Array.from(\n this.element.querySelectorAll(\".bulk-edit-checkbox:not(.all) input\"),\n );\n\n // Remove previous listeners if elements are the same\n this.activeToggle.removeEventListener(\"click\", this.onToggleActive);\n this.actionSelect.removeEventListener(\"change\", this.onActionSelected);\n this.allCheckbox.removeEventListener(\"change\", this.onToggleAll);\n this.bookmarkCheckboxes.forEach((checkbox) => {\n checkbox.removeEventListener(\"change\", this.onToggleBookmark);\n });\n\n // Reset checkbox states\n this.reset();\n\n // Update total number of bookmarks\n const totalHolder = this.element.querySelector(\"[data-bookmarks-total]\");\n const total = totalHolder?.dataset.bookmarksTotal || 0;\n const totalSpan = this.selectAcross.querySelector(\"span.total\");\n totalSpan.textContent = total;\n\n // Add new listeners\n this.activeToggle.addEventListener(\"click\", this.onToggleActive);\n this.actionSelect.addEventListener(\"change\", this.onActionSelected);\n this.allCheckbox.addEventListener(\"change\", this.onToggleAll);\n this.bookmarkCheckboxes.forEach((checkbox) => {\n checkbox.addEventListener(\"change\", this.onToggleBookmark);\n });\n }\n\n onToggleActive() {\n this.active = !this.active;\n if (this.active) {\n this.element.classList.add(\"active\", \"activating\");\n setTimeout(() => {\n this.element.classList.remove(\"activating\");\n }, 500);\n } else {\n this.element.classList.remove(\"active\");\n }\n }\n\n onToggleBookmark() {\n const allChecked = this.bookmarkCheckboxes.every((checkbox) => {\n return checkbox.checked;\n });\n this.allCheckbox.checked = allChecked;\n this.updateSelectAcross(allChecked);\n }\n\n onToggleAll() {\n const allChecked = this.allCheckbox.checked;\n this.bookmarkCheckboxes.forEach((checkbox) => {\n checkbox.checked = allChecked;\n });\n this.updateSelectAcross(allChecked);\n }\n\n onActionSelected() {\n const action = this.actionSelect.value;\n\n if (action === \"bulk_tag\" || action === \"bulk_untag\") {\n this.tagAutoComplete.classList.remove(\"d-none\");\n } else {\n this.tagAutoComplete.classList.add(\"d-none\");\n }\n }\n\n updateSelectAcross(allChecked) {\n if (allChecked) {\n this.selectAcross.classList.remove(\"d-none\");\n } else {\n this.selectAcross.classList.add(\"d-none\");\n this.selectAcross.querySelector(\"input\").checked = false;\n }\n }\n\n reset() {\n this.allCheckbox.checked = false;\n this.bookmarkCheckboxes.forEach((checkbox) => {\n checkbox.checked = false;\n });\n this.updateSelectAcross(false);\n }\n}\n\nregisterBehavior(\"ld-bulk-edit\", BulkEdit);\n","import { Behavior, registerBehavior } from \"./index\";\n\nclass ConfirmButtonBehavior extends Behavior {\n constructor(element) {\n super(element);\n element.dataset.type = element.type;\n element.dataset.name = element.name;\n element.dataset.value = element.value;\n element.removeAttribute(\"type\");\n element.removeAttribute(\"name\");\n element.removeAttribute(\"value\");\n element.addEventListener(\"click\", this.onClick.bind(this));\n }\n\n destroy() {\n Behavior.interacting = false;\n }\n\n onClick(event) {\n event.preventDefault();\n Behavior.interacting = true;\n\n const container = document.createElement(\"span\");\n container.className = \"confirmation\";\n\n const icon = this.element.getAttribute(\"ld-confirm-icon\");\n if (icon) {\n const iconElement = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"svg\",\n );\n iconElement.style.width = \"16px\";\n iconElement.style.height = \"16px\";\n iconElement.innerHTML = ``;\n container.append(iconElement);\n }\n\n const question = this.element.getAttribute(\"ld-confirm-question\");\n if (question) {\n const questionElement = document.createElement(\"span\");\n questionElement.innerText = question;\n container.append(question);\n }\n\n const buttonClasses = Array.from(this.element.classList.values())\n .filter((cls) => cls.startsWith(\"btn\"))\n .join(\" \");\n\n const cancelButton = document.createElement(this.element.nodeName);\n cancelButton.type = \"button\";\n cancelButton.innerText = question ? \"No\" : \"Cancel\";\n cancelButton.className = `${buttonClasses} mr-1`;\n cancelButton.addEventListener(\"click\", this.reset.bind(this));\n\n const confirmButton = document.createElement(this.element.nodeName);\n confirmButton.type = this.element.dataset.type;\n confirmButton.name = this.element.dataset.name;\n confirmButton.value = this.element.dataset.value;\n confirmButton.innerText = question ? \"Yes\" : \"Confirm\";\n confirmButton.className = buttonClasses;\n confirmButton.addEventListener(\"click\", this.reset.bind(this));\n\n container.append(cancelButton, confirmButton);\n this.container = container;\n\n this.element.before(container);\n this.element.classList.add(\"d-none\");\n }\n\n reset() {\n setTimeout(() => {\n Behavior.interacting = false;\n this.container.remove();\n this.element.classList.remove(\"d-none\");\n });\n }\n}\n\nregisterBehavior(\"ld-confirm-button\", ConfirmButtonBehavior);\n","import { Behavior, registerBehavior } from \"./index\";\n\nclass DropdownBehavior extends Behavior {\n constructor(element) {\n super(element);\n this.opened = false;\n this.onOutsideClick = this.onOutsideClick.bind(this);\n\n const toggle = element.querySelector(\".dropdown-toggle\");\n toggle.addEventListener(\"click\", () => {\n if (this.opened) {\n this.close();\n } else {\n this.open();\n }\n });\n }\n\n open() {\n this.element.classList.add(\"active\");\n document.addEventListener(\"click\", this.onOutsideClick);\n }\n\n close() {\n this.element.classList.remove(\"active\");\n document.removeEventListener(\"click\", this.onOutsideClick);\n }\n\n onOutsideClick(event) {\n if (!this.element.contains(event.target)) {\n this.close();\n }\n }\n}\n\nregisterBehavior(\"ld-dropdown\", DropdownBehavior);\n","import { Behavior, fireEvents, registerBehavior, swap } from \"./index\";\n\nclass FetchBehavior extends Behavior {\n constructor(element) {\n super(element);\n\n const eventName = element.getAttribute(\"ld-on\");\n const interval = parseInt(element.getAttribute(\"ld-interval\")) * 1000;\n\n this.onFetch = this.onFetch.bind(this);\n this.onInterval = this.onInterval.bind(this);\n\n element.addEventListener(eventName, this.onFetch);\n if (interval) {\n this.intervalId = setInterval(this.onInterval, interval);\n }\n }\n\n destroy() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n }\n\n async onFetch(maybeEvent) {\n if (maybeEvent) {\n maybeEvent.preventDefault();\n }\n const url = this.element.getAttribute(\"ld-fetch\");\n const html = await fetch(url).then((response) => response.text());\n\n const target = this.element.getAttribute(\"ld-target\");\n const select = this.element.getAttribute(\"ld-select\");\n swap(this.element, html, { target, select });\n\n const events = this.element.getAttribute(\"ld-fire\");\n fireEvents(events);\n }\n\n onInterval() {\n if (Behavior.interacting) {\n return;\n }\n this.onFetch();\n }\n}\n\nregisterBehavior(\"ld-fetch\", FetchBehavior);\n","import { Behavior, fireEvents, registerBehavior } from \"./index\";\n\nclass FormBehavior extends Behavior {\n constructor(element) {\n super(element);\n\n element.addEventListener(\"submit\", this.onSubmit.bind(this));\n }\n\n async onSubmit(event) {\n event.preventDefault();\n\n const url = this.element.action;\n const formData = new FormData(this.element);\n if (event.submitter) {\n formData.append(event.submitter.name, event.submitter.value);\n }\n\n await fetch(url, {\n method: \"POST\",\n body: formData,\n redirect: \"manual\", // ignore redirect\n });\n\n const events = this.element.getAttribute(\"ld-fire\");\n if (fireEvents) {\n fireEvents(events);\n }\n }\n}\n\nclass AutoSubmitBehavior extends Behavior {\n constructor(element) {\n super(element);\n\n element.addEventListener(\"change\", () => {\n const form = element.closest(\"form\");\n form.dispatchEvent(new Event(\"submit\", { cancelable: true }));\n });\n }\n}\n\nclass UploadButton extends Behavior {\n constructor(element) {\n super(element);\n\n const fileInput = element.nextElementSibling;\n\n element.addEventListener(\"click\", () => {\n fileInput.click();\n });\n\n fileInput.addEventListener(\"change\", () => {\n const form = fileInput.closest(\"form\");\n const event = new Event(\"submit\", { cancelable: true });\n event.submitter = element;\n form.dispatchEvent(event);\n });\n }\n}\n\nregisterBehavior(\"ld-form\", FormBehavior);\nregisterBehavior(\"ld-auto-submit\", AutoSubmitBehavior);\nregisterBehavior(\"ld-upload-button\", UploadButton);\n","import { Behavior, registerBehavior } from \"./index\";\n\nclass ModalBehavior extends Behavior {\n constructor(element) {\n super(element);\n\n this.onClose = this.onClose.bind(this);\n this.onKeyDown = this.onKeyDown.bind(this);\n\n const modalOverlay = element.querySelector(\".modal-overlay\");\n const closeButton = element.querySelector(\"button.close\");\n modalOverlay.addEventListener(\"click\", this.onClose);\n closeButton.addEventListener(\"click\", this.onClose);\n\n document.addEventListener(\"keydown\", this.onKeyDown);\n }\n\n destroy() {\n document.removeEventListener(\"keydown\", this.onKeyDown);\n }\n\n onKeyDown(event) {\n // Skip if event occurred within an input element\n const targetNodeName = event.target.nodeName;\n const isInputTarget =\n targetNodeName === \"INPUT\" ||\n targetNodeName === \"SELECT\" ||\n targetNodeName === \"TEXTAREA\";\n\n if (isInputTarget) {\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.onClose();\n }\n }\n\n onClose() {\n document.removeEventListener(\"keydown\", this.onKeyDown);\n this.element.classList.add(\"closing\");\n this.element.addEventListener(\"animationend\", (event) => {\n if (event.animationName === \"fade-out\") {\n this.element.remove();\n }\n });\n }\n}\n\nregisterBehavior(\"ld-modal\", ModalBehavior);\n","/** @returns {void} */\nexport function noop() {}\n\nexport const identity = (x) => x;\n\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nexport function assign(tar, src) {\n\t// @ts-ignore\n\tfor (const k in src) tar[k] = src[k];\n\treturn /** @type {T & S} */ (tar);\n}\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n/**\n * @param {any} value\n * @returns {value is PromiseLike}\n */\nexport function is_promise(value) {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\ttypeof (/** @type {any} */ (value).then) === 'function'\n\t);\n}\n\n/** @returns {void} */\nexport function add_location(element, file, line, column, char) {\n\telement.__svelte_meta = {\n\t\tloc: { file, line, column, char }\n\t};\n}\n\nexport function run(fn) {\n\treturn fn();\n}\n\nexport function blank_object() {\n\treturn Object.create(null);\n}\n\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function run_all(fns) {\n\tfns.forEach(run);\n}\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\n/** @returns {boolean} */\nexport function safe_not_equal(a, b) {\n\treturn a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function';\n}\n\nlet src_url_equal_anchor;\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nexport function src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\tif (!src_url_equal_anchor) {\n\t\tsrc_url_equal_anchor = document.createElement('a');\n\t}\n\t// This is actually faster than doing URL(..).href\n\tsrc_url_equal_anchor.href = url;\n\treturn element_src === src_url_equal_anchor.href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element_srcset\n * @param {string | undefined | null} srcset\n * @returns {boolean}\n */\nexport function srcset_url_equal(element_srcset, srcset) {\n\tconst element_urls = split_srcset(element_srcset.srcset);\n\tconst urls = split_srcset(srcset || '');\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n\n/** @returns {boolean} */\nexport function not_equal(a, b) {\n\treturn a != a ? b == b : a !== b;\n}\n\n/** @returns {boolean} */\nexport function is_empty(obj) {\n\treturn Object.keys(obj).length === 0;\n}\n\n/** @returns {void} */\nexport function validate_store(store, name) {\n\tif (store != null && typeof store.subscribe !== 'function') {\n\t\tthrow new Error(`'${name}' is not a store with a 'subscribe' method`);\n\t}\n}\n\nexport function subscribe(store, ...callbacks) {\n\tif (store == null) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(undefined);\n\t\t}\n\t\treturn noop;\n\t}\n\tconst unsub = store.subscribe(...callbacks);\n\treturn unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable} store\n * @returns {T}\n */\nexport function get_store_value(store) {\n\tlet value;\n\tsubscribe(store, (_) => (value = _))();\n\treturn value;\n}\n\n/** @returns {void} */\nexport function component_subscribe(component, store, callback) {\n\tcomponent.$$.on_destroy.push(subscribe(store, callback));\n}\n\nexport function create_slot(definition, ctx, $$scope, fn) {\n\tif (definition) {\n\t\tconst slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n\t\treturn definition[0](slot_ctx);\n\t}\n}\n\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n\treturn definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\n\nexport function get_slot_changes(definition, $$scope, dirty, fn) {\n\tif (definition[2] && fn) {\n\t\tconst lets = definition[2](fn(dirty));\n\t\tif ($$scope.dirty === undefined) {\n\t\t\treturn lets;\n\t\t}\n\t\tif (typeof lets === 'object') {\n\t\t\tconst merged = [];\n\t\t\tconst len = Math.max($$scope.dirty.length, lets.length);\n\t\t\tfor (let i = 0; i < len; i += 1) {\n\t\t\t\tmerged[i] = $$scope.dirty[i] | lets[i];\n\t\t\t}\n\t\t\treturn merged;\n\t\t}\n\t\treturn $$scope.dirty | lets;\n\t}\n\treturn $$scope.dirty;\n}\n\n/** @returns {void} */\nexport function update_slot_base(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tslot_changes,\n\tget_slot_context_fn\n) {\n\tif (slot_changes) {\n\t\tconst slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n\t\tslot.p(slot_context, slot_changes);\n\t}\n}\n\n/** @returns {void} */\nexport function update_slot(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tdirty,\n\tget_slot_changes_fn,\n\tget_slot_context_fn\n) {\n\tconst slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n\tupdate_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\n\n/** @returns {any[] | -1} */\nexport function get_all_dirty_from_scope($$scope) {\n\tif ($$scope.ctx.length > 32) {\n\t\tconst dirty = [];\n\t\tconst length = $$scope.ctx.length / 32;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tdirty[i] = -1;\n\t\t}\n\t\treturn dirty;\n\t}\n\treturn -1;\n}\n\n/** @returns {{}} */\nexport function exclude_internal_props(props) {\n\tconst result = {};\n\tfor (const k in props) if (k[0] !== '$') result[k] = props[k];\n\treturn result;\n}\n\n/** @returns {{}} */\nexport function compute_rest_props(props, keys) {\n\tconst rest = {};\n\tkeys = new Set(keys);\n\tfor (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k];\n\treturn rest;\n}\n\n/** @returns {{}} */\nexport function compute_slots(slots) {\n\tconst result = {};\n\tfor (const key in slots) {\n\t\tresult[key] = true;\n\t}\n\treturn result;\n}\n\n/** @returns {(this: any, ...args: any[]) => void} */\nexport function once(fn) {\n\tlet ran = false;\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\t\tfn.call(this, ...args);\n\t};\n}\n\nexport function null_to_empty(value) {\n\treturn value == null ? '' : value;\n}\n\nexport function set_store_value(store, ret, value) {\n\tstore.set(value);\n\treturn ret;\n}\n\nexport const has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\n\nexport function action_destroyer(action_result) {\n\treturn action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/** @param {number | string} value\n * @returns {[number, string]}\n */\nexport function split_css_unit(value) {\n\tconst split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n\treturn split ? [parseFloat(split[1]), split[2] || 'px'] : [/** @type {number} */ (value), 'px'];\n}\n\nexport const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n","import { contenteditable_truthy_values, has_prop } from './utils.js';\n\nimport { ResizeObserverSingleton } from './ResizeObserverSingleton.js';\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\n\n/**\n * @returns {void}\n */\nexport function start_hydrating() {\n\tis_hydrating = true;\n}\n\n/**\n * @returns {void}\n */\nexport function end_hydrating() {\n\tis_hydrating = false;\n}\n\n/**\n * @param {number} low\n * @param {number} high\n * @param {(index: number) => number} key\n * @param {number} value\n * @returns {number}\n */\nfunction upper_bound(low, high, key, value) {\n\t// Return first index of value larger than input value in the range [low, high)\n\twhile (low < high) {\n\t\tconst mid = low + ((high - low) >> 1);\n\t\tif (key(mid) <= value) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\treturn low;\n}\n\n/**\n * @param {NodeEx} target\n * @returns {void}\n */\nfunction init_hydrate(target) {\n\tif (target.hydrate_init) return;\n\ttarget.hydrate_init = true;\n\t// We know that all children have claim_order values since the unclaimed have been detached if target is not \n\n\tlet children = /** @type {ArrayLike} */ (target.childNodes);\n\t// If target is , there may be children without claim_order\n\tif (target.nodeName === 'HEAD') {\n\t\tconst my_children = [];\n\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\tconst node = children[i];\n\t\t\tif (node.claim_order !== undefined) {\n\t\t\t\tmy_children.push(node);\n\t\t\t}\n\t\t}\n\t\tchildren = my_children;\n\t}\n\t/*\n\t * Reorder claimed children optimally.\n\t * We can reorder claimed children optimally by finding the longest subsequence of\n\t * nodes that are already claimed in order and only moving the rest. The longest\n\t * subsequence of nodes that are claimed in order can be found by\n\t * computing the longest increasing subsequence of .claim_order values.\n\t *\n\t * This algorithm is optimal in generating the least amount of reorder operations\n\t * possible.\n\t *\n\t * Proof:\n\t * We know that, given a set of reordering operations, the nodes that do not move\n\t * always form an increasing subsequence, since they do not move among each other\n\t * meaning that they must be already ordered among each other. Thus, the maximal\n\t * set of nodes that do not move form a longest increasing subsequence.\n\t */\n\t// Compute longest increasing subsequence\n\t// m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n\tconst m = new Int32Array(children.length + 1);\n\t// Predecessor indices + 1\n\tconst p = new Int32Array(children.length);\n\tm[0] = -1;\n\tlet longest = 0;\n\tfor (let i = 0; i < children.length; i++) {\n\t\tconst current = children[i].claim_order;\n\t\t// Find the largest subsequence length such that it ends in a value less than our current value\n\t\t// upper_bound returns first greater value, so we subtract one\n\t\t// with fast path for when we are on the current longest subsequence\n\t\tconst seq_len =\n\t\t\t(longest > 0 && children[m[longest]].claim_order <= current\n\t\t\t\t? longest + 1\n\t\t\t\t: upper_bound(1, longest, (idx) => children[m[idx]].claim_order, current)) - 1;\n\t\tp[i] = m[seq_len] + 1;\n\t\tconst new_len = seq_len + 1;\n\t\t// We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n\t\tm[new_len] = i;\n\t\tlongest = Math.max(new_len, longest);\n\t}\n\t// The longest increasing subsequence of nodes (initially reversed)\n\n\t/**\n\t * @type {NodeEx2[]}\n\t */\n\tconst lis = [];\n\t// The rest of the nodes, nodes that will be moved\n\n\t/**\n\t * @type {NodeEx2[]}\n\t */\n\tconst to_move = [];\n\tlet last = children.length - 1;\n\tfor (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n\t\tlis.push(children[cur - 1]);\n\t\tfor (; last >= cur; last--) {\n\t\t\tto_move.push(children[last]);\n\t\t}\n\t\tlast--;\n\t}\n\tfor (; last >= 0; last--) {\n\t\tto_move.push(children[last]);\n\t}\n\tlis.reverse();\n\t// We sort the nodes being moved to guarantee that their insertion order matches the claim order\n\tto_move.sort((a, b) => a.claim_order - b.claim_order);\n\t// Finally, we move the nodes\n\tfor (let i = 0, j = 0; i < to_move.length; i++) {\n\t\twhile (j < lis.length && to_move[i].claim_order >= lis[j].claim_order) {\n\t\t\tj++;\n\t\t}\n\t\tconst anchor = j < lis.length ? lis[j] : null;\n\t\ttarget.insertBefore(to_move[i], anchor);\n\t}\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @returns {void}\n */\nexport function append(target, node) {\n\ttarget.appendChild(node);\n}\n\n/**\n * @param {Node} target\n * @param {string} style_sheet_id\n * @param {string} styles\n * @returns {void}\n */\nexport function append_styles(target, style_sheet_id, styles) {\n\tconst append_styles_to = get_root_for_style(target);\n\tif (!append_styles_to.getElementById(style_sheet_id)) {\n\t\tconst style = element('style');\n\t\tstyle.id = style_sheet_id;\n\t\tstyle.textContent = styles;\n\t\tappend_stylesheet(append_styles_to, style);\n\t}\n}\n\n/**\n * @param {Node} node\n * @returns {ShadowRoot | Document}\n */\nexport function get_root_for_style(node) {\n\tif (!node) return document;\n\tconst root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n\tif (root && /** @type {ShadowRoot} */ (root).host) {\n\t\treturn /** @type {ShadowRoot} */ (root);\n\t}\n\treturn node.ownerDocument;\n}\n\n/**\n * @param {Node} node\n * @returns {CSSStyleSheet}\n */\nexport function append_empty_stylesheet(node) {\n\tconst style_element = element('style');\n\t// For transitions to work without 'style-src: unsafe-inline' Content Security Policy,\n\t// these empty tags need to be allowed with a hash as a workaround until we move to the Web Animations API.\n\t// Using the hash for the empty string (for an empty tag) works in all browsers except Safari.\n\t// So as a workaround for the workaround, when we append empty style tags we set their content to /* empty */.\n\t// The hash 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc=' will then work even in Safari.\n\tstyle_element.textContent = '/* empty */';\n\tappend_stylesheet(get_root_for_style(node), style_element);\n\treturn style_element.sheet;\n}\n\n/**\n * @param {ShadowRoot | Document} node\n * @param {HTMLStyleElement} style\n * @returns {CSSStyleSheet}\n */\nfunction append_stylesheet(node, style) {\n\tappend(/** @type {Document} */ (node).head || node, style);\n\treturn style.sheet;\n}\n\n/**\n * @param {NodeEx} target\n * @param {NodeEx} node\n * @returns {void}\n */\nexport function append_hydration(target, node) {\n\tif (is_hydrating) {\n\t\tinit_hydrate(target);\n\t\tif (\n\t\t\ttarget.actual_end_child === undefined ||\n\t\t\t(target.actual_end_child !== null && target.actual_end_child.parentNode !== target)\n\t\t) {\n\t\t\ttarget.actual_end_child = target.firstChild;\n\t\t}\n\t\t// Skip nodes of undefined ordering\n\t\twhile (target.actual_end_child !== null && target.actual_end_child.claim_order === undefined) {\n\t\t\ttarget.actual_end_child = target.actual_end_child.nextSibling;\n\t\t}\n\t\tif (node !== target.actual_end_child) {\n\t\t\t// We only insert if the ordering of this node should be modified or the parent node is not target\n\t\t\tif (node.claim_order !== undefined || node.parentNode !== target) {\n\t\t\t\ttarget.insertBefore(node, target.actual_end_child);\n\t\t\t}\n\t\t} else {\n\t\t\ttarget.actual_end_child = node.nextSibling;\n\t\t}\n\t} else if (node.parentNode !== target || node.nextSibling !== null) {\n\t\ttarget.appendChild(node);\n\t}\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @param {Node} [anchor]\n * @returns {void}\n */\nexport function insert(target, node, anchor) {\n\ttarget.insertBefore(node, anchor || null);\n}\n\n/**\n * @param {NodeEx} target\n * @param {NodeEx} node\n * @param {NodeEx} [anchor]\n * @returns {void}\n */\nexport function insert_hydration(target, node, anchor) {\n\tif (is_hydrating && !anchor) {\n\t\tappend_hydration(target, node);\n\t} else if (node.parentNode !== target || node.nextSibling != anchor) {\n\t\ttarget.insertBefore(node, anchor || null);\n\t}\n}\n\n/**\n * @param {Node} node\n * @returns {void}\n */\nexport function detach(node) {\n\tif (node.parentNode) {\n\t\tnode.parentNode.removeChild(node);\n\t}\n}\n\n/**\n * @returns {void} */\nexport function destroy_each(iterations, detaching) {\n\tfor (let i = 0; i < iterations.length; i += 1) {\n\t\tif (iterations[i]) iterations[i].d(detaching);\n\t}\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function element(name) {\n\treturn document.createElement(name);\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @param {string} is\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function element_is(name, is) {\n\treturn document.createElement(name, { is });\n}\n\n/**\n * @template T\n * @template {keyof T} K\n * @param {T} obj\n * @param {K[]} exclude\n * @returns {Pick>}\n */\nexport function object_without_properties(obj, exclude) {\n\tconst target = /** @type {Pick>} */ ({});\n\tfor (const k in obj) {\n\t\tif (\n\t\t\thas_prop(obj, k) &&\n\t\t\t// @ts-ignore\n\t\t\texclude.indexOf(k) === -1\n\t\t) {\n\t\t\t// @ts-ignore\n\t\t\ttarget[k] = obj[k];\n\t\t}\n\t}\n\treturn target;\n}\n\n/**\n * @template {keyof SVGElementTagNameMap} K\n * @param {K} name\n * @returns {SVGElement}\n */\nexport function svg_element(name) {\n\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n}\n\n/**\n * @param {string} data\n * @returns {Text}\n */\nexport function text(data) {\n\treturn document.createTextNode(data);\n}\n\n/**\n * @returns {Text} */\nexport function space() {\n\treturn text(' ');\n}\n\n/**\n * @returns {Text} */\nexport function empty() {\n\treturn text('');\n}\n\n/**\n * @param {string} content\n * @returns {Comment}\n */\nexport function comment(content) {\n\treturn document.createComment(content);\n}\n\n/**\n * @param {EventTarget} node\n * @param {string} event\n * @param {EventListenerOrEventListenerObject} handler\n * @param {boolean | AddEventListenerOptions | EventListenerOptions} [options]\n * @returns {() => void}\n */\nexport function listen(node, event, handler, options) {\n\tnode.addEventListener(event, handler, options);\n\treturn () => node.removeEventListener(event, handler, options);\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function prevent_default(fn) {\n\treturn function (event) {\n\t\tevent.preventDefault();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function stop_propagation(fn) {\n\treturn function (event) {\n\t\tevent.stopPropagation();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function stop_immediate_propagation(fn) {\n\treturn function (event) {\n\t\tevent.stopImmediatePropagation();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => void} */\nexport function self(fn) {\n\treturn function (event) {\n\t\t// @ts-ignore\n\t\tif (event.target === this) fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => void} */\nexport function trusted(fn) {\n\treturn function (event) {\n\t\t// @ts-ignore\n\t\tif (event.isTrusted) fn.call(this, event);\n\t};\n}\n\n/**\n * @param {Element} node\n * @param {string} attribute\n * @param {string} [value]\n * @returns {void}\n */\nexport function attr(node, attribute, value) {\n\tif (value == null) node.removeAttribute(attribute);\n\telse if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {{ [x: string]: string }} attributes\n * @returns {void}\n */\nexport function set_attributes(node, attributes) {\n\t// @ts-ignore\n\tconst descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n\tfor (const key in attributes) {\n\t\tif (attributes[key] == null) {\n\t\t\tnode.removeAttribute(key);\n\t\t} else if (key === 'style') {\n\t\t\tnode.style.cssText = attributes[key];\n\t\t} else if (key === '__value') {\n\t\t\t/** @type {any} */ (node).value = node[key] = attributes[key];\n\t\t} else if (\n\t\t\tdescriptors[key] &&\n\t\t\tdescriptors[key].set &&\n\t\t\talways_set_through_set_attribute.indexOf(key) === -1\n\t\t) {\n\t\t\tnode[key] = attributes[key];\n\t\t} else {\n\t\t\tattr(node, key, attributes[key]);\n\t\t}\n\t}\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {{ [x: string]: string }} attributes\n * @returns {void}\n */\nexport function set_svg_attributes(node, attributes) {\n\tfor (const key in attributes) {\n\t\tattr(node, key, attributes[key]);\n\t}\n}\n\n/**\n * @param {Record} data_map\n * @returns {void}\n */\nexport function set_custom_element_data_map(node, data_map) {\n\tObject.keys(data_map).forEach((key) => {\n\t\tset_custom_element_data(node, key, data_map[key]);\n\t});\n}\n\n/**\n * @returns {void} */\nexport function set_custom_element_data(node, prop, value) {\n\tconst lower = prop.toLowerCase(); // for backwards compatibility with existing behavior we do lowercase first\n\tif (lower in node) {\n\t\tnode[lower] = typeof node[lower] === 'boolean' && value === '' ? true : value;\n\t} else if (prop in node) {\n\t\tnode[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n\t} else {\n\t\tattr(node, prop, value);\n\t}\n}\n\n/**\n * @param {string} tag\n */\nexport function set_dynamic_element_data(tag) {\n\treturn /-/.test(tag) ? set_custom_element_data_map : set_attributes;\n}\n\n/**\n * @returns {void}\n */\nexport function xlink_attr(node, attribute, value) {\n\tnode.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\n\n/**\n * @param {HTMLElement} node\n * @returns {string}\n */\nexport function get_svelte_dataset(node) {\n\treturn node.dataset.svelteH;\n}\n\n/**\n * @returns {unknown[]} */\nexport function get_binding_group_value(group, __value, checked) {\n\tconst value = new Set();\n\tfor (let i = 0; i < group.length; i += 1) {\n\t\tif (group[i].checked) value.add(group[i].__value);\n\t}\n\tif (!checked) {\n\t\tvalue.delete(__value);\n\t}\n\treturn Array.from(value);\n}\n\n/**\n * @param {HTMLInputElement[]} group\n * @returns {{ p(...inputs: HTMLInputElement[]): void; r(): void; }}\n */\nexport function init_binding_group(group) {\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _inputs;\n\treturn {\n\t\t/* push */ p(...inputs) {\n\t\t\t_inputs = inputs;\n\t\t\t_inputs.forEach((input) => group.push(input));\n\t\t},\n\t\t/* remove */ r() {\n\t\t\t_inputs.forEach((input) => group.splice(group.indexOf(input), 1));\n\t\t}\n\t};\n}\n\n/**\n * @param {number[]} indexes\n * @returns {{ u(new_indexes: number[]): void; p(...inputs: HTMLInputElement[]): void; r: () => void; }}\n */\nexport function init_binding_group_dynamic(group, indexes) {\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _group = get_binding_group(group);\n\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _inputs;\n\n\tfunction get_binding_group(group) {\n\t\tfor (let i = 0; i < indexes.length; i++) {\n\t\t\tgroup = group[indexes[i]] = group[indexes[i]] || [];\n\t\t}\n\t\treturn group;\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction push() {\n\t\t_inputs.forEach((input) => _group.push(input));\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction remove() {\n\t\t_inputs.forEach((input) => _group.splice(_group.indexOf(input), 1));\n\t}\n\treturn {\n\t\t/* update */ u(new_indexes) {\n\t\t\tindexes = new_indexes;\n\t\t\tconst new_group = get_binding_group(group);\n\t\t\tif (new_group !== _group) {\n\t\t\t\tremove();\n\t\t\t\t_group = new_group;\n\t\t\t\tpush();\n\t\t\t}\n\t\t},\n\t\t/* push */ p(...inputs) {\n\t\t\t_inputs = inputs;\n\t\t\tpush();\n\t\t},\n\t\t/* remove */ r: remove\n\t};\n}\n\n/** @returns {number} */\nexport function to_number(value) {\n\treturn value === '' ? null : +value;\n}\n\n/** @returns {any[]} */\nexport function time_ranges_to_array(ranges) {\n\tconst array = [];\n\tfor (let i = 0; i < ranges.length; i += 1) {\n\t\tarray.push({ start: ranges.start(i), end: ranges.end(i) });\n\t}\n\treturn array;\n}\n\n/**\n * @param {Element} element\n * @returns {ChildNode[]}\n */\nexport function children(element) {\n\treturn Array.from(element.childNodes);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {void}\n */\nfunction init_claim_info(nodes) {\n\tif (nodes.claim_info === undefined) {\n\t\tnodes.claim_info = { last_index: 0, total_claimed: 0 };\n\t}\n}\n\n/**\n * @template {ChildNodeEx} R\n * @param {ChildNodeArray} nodes\n * @param {(node: ChildNodeEx) => node is R} predicate\n * @param {(node: ChildNodeEx) => ChildNodeEx | undefined} process_node\n * @param {() => R} create_node\n * @param {boolean} dont_update_last_index\n * @returns {R}\n */\nfunction claim_node(nodes, predicate, process_node, create_node, dont_update_last_index = false) {\n\t// Try to find nodes in an order such that we lengthen the longest increasing subsequence\n\tinit_claim_info(nodes);\n\tconst result_node = (() => {\n\t\t// We first try to find an element after the previous one\n\t\tfor (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n\t\t\tconst node = nodes[i];\n\t\t\tif (predicate(node)) {\n\t\t\t\tconst replacement = process_node(node);\n\t\t\t\tif (replacement === undefined) {\n\t\t\t\t\tnodes.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tnodes[i] = replacement;\n\t\t\t\t}\n\t\t\t\tif (!dont_update_last_index) {\n\t\t\t\t\tnodes.claim_info.last_index = i;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\t// Otherwise, we try to find one before\n\t\t// We iterate in reverse so that we don't go too far back\n\t\tfor (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n\t\t\tconst node = nodes[i];\n\t\t\tif (predicate(node)) {\n\t\t\t\tconst replacement = process_node(node);\n\t\t\t\tif (replacement === undefined) {\n\t\t\t\t\tnodes.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tnodes[i] = replacement;\n\t\t\t\t}\n\t\t\t\tif (!dont_update_last_index) {\n\t\t\t\t\tnodes.claim_info.last_index = i;\n\t\t\t\t} else if (replacement === undefined) {\n\t\t\t\t\t// Since we spliced before the last_index, we decrease it\n\t\t\t\t\tnodes.claim_info.last_index--;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\t// If we can't find any matching node, we create a new one\n\t\treturn create_node();\n\t})();\n\tresult_node.claim_order = nodes.claim_info.total_claimed;\n\tnodes.claim_info.total_claimed += 1;\n\treturn result_node;\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @param {(name: string) => Element | SVGElement} create_element\n * @returns {Element | SVGElement}\n */\nfunction claim_element_base(nodes, name, attributes, create_element) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Element | SVGElement} */\n\t\t(node) => node.nodeName === name,\n\t\t/** @param {Element} node */\n\t\t(node) => {\n\t\t\tconst remove = [];\n\t\t\tfor (let j = 0; j < node.attributes.length; j++) {\n\t\t\t\tconst attribute = node.attributes[j];\n\t\t\t\tif (!attributes[attribute.name]) {\n\t\t\t\t\tremove.push(attribute.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tremove.forEach((v) => node.removeAttribute(v));\n\t\t\treturn undefined;\n\t\t},\n\t\t() => create_element(name)\n\t);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @returns {Element | SVGElement}\n */\nexport function claim_element(nodes, name, attributes) {\n\treturn claim_element_base(nodes, name, attributes, element);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @returns {Element | SVGElement}\n */\nexport function claim_svg_element(nodes, name, attributes) {\n\treturn claim_element_base(nodes, name, attributes, svg_element);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {Text}\n */\nexport function claim_text(nodes, data) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Text} */\n\t\t(node) => node.nodeType === 3,\n\t\t/** @param {Text} node */\n\t\t(node) => {\n\t\t\tconst data_str = '' + data;\n\t\t\tif (node.data.startsWith(data_str)) {\n\t\t\t\tif (node.data.length !== data_str.length) {\n\t\t\t\t\treturn node.splitText(data_str.length);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.data = data_str;\n\t\t\t}\n\t\t},\n\t\t() => text(data),\n\t\ttrue // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n\t);\n}\n\n/**\n * @returns {Text} */\nexport function claim_space(nodes) {\n\treturn claim_text(nodes, ' ');\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {Comment}\n */\nexport function claim_comment(nodes, data) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Comment} */\n\t\t(node) => node.nodeType === 8,\n\t\t/** @param {Comment} node */\n\t\t(node) => {\n\t\t\tnode.data = '' + data;\n\t\t\treturn undefined;\n\t\t},\n\t\t() => comment(data),\n\t\ttrue\n\t);\n}\n\nfunction get_comment_idx(nodes, text, start) {\n\tfor (let i = start; i < nodes.length; i += 1) {\n\t\tconst node = nodes[i];\n\t\tif (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * @param {boolean} is_svg\n * @returns {HtmlTagHydration}\n */\nexport function claim_html_tag(nodes, is_svg) {\n\t// find html opening tag\n\tconst start_index = get_comment_idx(nodes, 'HTML_TAG_START', 0);\n\tconst end_index = get_comment_idx(nodes, 'HTML_TAG_END', start_index + 1);\n\tif (start_index === -1 || end_index === -1) {\n\t\treturn new HtmlTagHydration(is_svg);\n\t}\n\n\tinit_claim_info(nodes);\n\tconst html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n\tdetach(html_tag_nodes[0]);\n\tdetach(html_tag_nodes[html_tag_nodes.length - 1]);\n\tconst claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n\tif (claimed_nodes.length === 0) {\n\t\treturn new HtmlTagHydration(is_svg);\n\t}\n\tfor (const n of claimed_nodes) {\n\t\tn.claim_order = nodes.claim_info.total_claimed;\n\t\tnodes.claim_info.total_claimed += 1;\n\t}\n\treturn new HtmlTagHydration(is_svg, claimed_nodes);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nexport function set_data(text, data) {\n\tdata = '' + data;\n\tif (text.data === data) return;\n\ttext.data = /** @type {string} */ (data);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nexport function set_data_contenteditable(text, data) {\n\tdata = '' + data;\n\tif (text.wholeText === data) return;\n\ttext.data = /** @type {string} */ (data);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @param {string} attr_value\n * @returns {void}\n */\nexport function set_data_maybe_contenteditable(text, data, attr_value) {\n\tif (~contenteditable_truthy_values.indexOf(attr_value)) {\n\t\tset_data_contenteditable(text, data);\n\t} else {\n\t\tset_data(text, data);\n\t}\n}\n\n/**\n * @returns {void} */\nexport function set_input_value(input, value) {\n\tinput.value = value == null ? '' : value;\n}\n\n/**\n * @returns {void} */\nexport function set_input_type(input, type) {\n\ttry {\n\t\tinput.type = type;\n\t} catch (e) {\n\t\t// do nothing\n\t}\n}\n\n/**\n * @returns {void} */\nexport function set_style(node, key, value, important) {\n\tif (value == null) {\n\t\tnode.style.removeProperty(key);\n\t} else {\n\t\tnode.style.setProperty(key, value, important ? 'important' : '');\n\t}\n}\n\n/**\n * @returns {void} */\nexport function select_option(select, value, mounting) {\n\tfor (let i = 0; i < select.options.length; i += 1) {\n\t\tconst option = select.options[i];\n\t\tif (option.__value === value) {\n\t\t\toption.selected = true;\n\t\t\treturn;\n\t\t}\n\t}\n\tif (!mounting || value !== undefined) {\n\t\tselect.selectedIndex = -1; // no option should be selected\n\t}\n}\n\n/**\n * @returns {void} */\nexport function select_options(select, value) {\n\tfor (let i = 0; i < select.options.length; i += 1) {\n\t\tconst option = select.options[i];\n\t\toption.selected = ~value.indexOf(option.__value);\n\t}\n}\n\nexport function select_value(select) {\n\tconst selected_option = select.querySelector(':checked');\n\treturn selected_option && selected_option.__value;\n}\n\nexport function select_multiple_value(select) {\n\treturn [].map.call(select.querySelectorAll(':checked'), (option) => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\n\n/**\n * @type {boolean} */\nlet crossorigin;\n\n/**\n * @returns {boolean} */\nexport function is_crossorigin() {\n\tif (crossorigin === undefined) {\n\t\tcrossorigin = false;\n\t\ttry {\n\t\t\tif (typeof window !== 'undefined' && window.parent) {\n\t\t\t\tvoid window.parent.document;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tcrossorigin = true;\n\t\t}\n\t}\n\treturn crossorigin;\n}\n\n/**\n * @param {HTMLElement} node\n * @param {() => void} fn\n * @returns {() => void}\n */\nexport function add_iframe_resize_listener(node, fn) {\n\tconst computed_style = getComputedStyle(node);\n\tif (computed_style.position === 'static') {\n\t\tnode.style.position = 'relative';\n\t}\n\tconst iframe = element('iframe');\n\tiframe.setAttribute(\n\t\t'style',\n\t\t'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n\t\t\t'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;'\n\t);\n\tiframe.setAttribute('aria-hidden', 'true');\n\tiframe.tabIndex = -1;\n\tconst crossorigin = is_crossorigin();\n\n\t/**\n\t * @type {() => void}\n\t */\n\tlet unsubscribe;\n\tif (crossorigin) {\n\t\tiframe.src = \"data:text/html,\";\n\t\tunsubscribe = listen(\n\t\t\twindow,\n\t\t\t'message',\n\t\t\t/** @param {MessageEvent} event */ (event) => {\n\t\t\t\tif (event.source === iframe.contentWindow) fn();\n\t\t\t}\n\t\t);\n\t} else {\n\t\tiframe.src = 'about:blank';\n\t\tiframe.onload = () => {\n\t\t\tunsubscribe = listen(iframe.contentWindow, 'resize', fn);\n\t\t\t// make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n\t\t\t// see https://github.com/sveltejs/svelte/issues/4233\n\t\t\tfn();\n\t\t};\n\t}\n\tappend(node, iframe);\n\treturn () => {\n\t\tif (crossorigin) {\n\t\t\tunsubscribe();\n\t\t} else if (unsubscribe && iframe.contentWindow) {\n\t\t\tunsubscribe();\n\t\t}\n\t\tdetach(iframe);\n\t};\n}\nexport const resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({\n\tbox: 'content-box'\n});\nexport const resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({\n\tbox: 'border-box'\n});\nexport const resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton(\n\t{ box: 'device-pixel-content-box' }\n);\nexport { ResizeObserverSingleton };\n\n/**\n * @returns {void} */\nexport function toggle_class(element, name, toggle) {\n\t// The `!!` is required because an `undefined` flag means flipping the current state.\n\telement.classList.toggle(name, !!toggle);\n}\n\n/**\n * @template T\n * @param {string} type\n * @param {T} [detail]\n * @param {{ bubbles?: boolean, cancelable?: boolean }} [options]\n * @returns {CustomEvent}\n */\nexport function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n\treturn new CustomEvent(type, { detail, bubbles, cancelable });\n}\n\n/**\n * @param {string} selector\n * @param {HTMLElement} parent\n * @returns {ChildNodeArray}\n */\nexport function query_selector_all(selector, parent = document.body) {\n\treturn Array.from(parent.querySelectorAll(selector));\n}\n\n/**\n * @param {string} nodeId\n * @param {HTMLElement} head\n * @returns {any[]}\n */\nexport function head_selector(nodeId, head) {\n\tconst result = [];\n\tlet started = 0;\n\tfor (const node of head.childNodes) {\n\t\tif (node.nodeType === 8 /* comment node */) {\n\t\t\tconst comment = node.textContent.trim();\n\t\t\tif (comment === `HEAD_${nodeId}_END`) {\n\t\t\t\tstarted -= 1;\n\t\t\t\tresult.push(node);\n\t\t\t} else if (comment === `HEAD_${nodeId}_START`) {\n\t\t\t\tstarted += 1;\n\t\t\t\tresult.push(node);\n\t\t\t}\n\t\t} else if (started > 0) {\n\t\t\tresult.push(node);\n\t\t}\n\t}\n\treturn result;\n}\n/** */\nexport class HtmlTag {\n\t/**\n\t * @private\n\t * @default false\n\t */\n\tis_svg = false;\n\t/** parent for creating node */\n\te = undefined;\n\t/** html tag nodes */\n\tn = undefined;\n\t/** target */\n\tt = undefined;\n\t/** anchor */\n\ta = undefined;\n\tconstructor(is_svg = false) {\n\t\tthis.is_svg = is_svg;\n\t\tthis.e = this.n = null;\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tc(html) {\n\t\tthis.h(html);\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @param {HTMLElement | SVGElement} target\n\t * @param {HTMLElement | SVGElement} anchor\n\t * @returns {void}\n\t */\n\tm(html, target, anchor = null) {\n\t\tif (!this.e) {\n\t\t\tif (this.is_svg)\n\t\t\t\tthis.e = svg_element(/** @type {keyof SVGElementTagNameMap} */ (target.nodeName));\n\t\t\t/** #7364 target for may be provided as #document-fragment(11) */ else\n\t\t\t\tthis.e = element(\n\t\t\t\t\t/** @type {keyof HTMLElementTagNameMap} */ (\n\t\t\t\t\t\ttarget.nodeType === 11 ? 'TEMPLATE' : target.nodeName\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\tthis.t =\n\t\t\t\ttarget.tagName !== 'TEMPLATE'\n\t\t\t\t\t? target\n\t\t\t\t\t: /** @type {HTMLTemplateElement} */ (target).content;\n\t\t\tthis.c(html);\n\t\t}\n\t\tthis.i(anchor);\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\th(html) {\n\t\tthis.e.innerHTML = html;\n\t\tthis.n = Array.from(\n\t\t\tthis.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes\n\t\t);\n\t}\n\n\t/**\n\t * @returns {void} */\n\ti(anchor) {\n\t\tfor (let i = 0; i < this.n.length; i += 1) {\n\t\t\tinsert(this.t, this.n[i], anchor);\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tp(html) {\n\t\tthis.d();\n\t\tthis.h(html);\n\t\tthis.i(this.a);\n\t}\n\n\t/**\n\t * @returns {void} */\n\td() {\n\t\tthis.n.forEach(detach);\n\t}\n}\n\nexport class HtmlTagHydration extends HtmlTag {\n\t/** @type {Element[]} hydration claimed nodes */\n\tl = undefined;\n\n\tconstructor(is_svg = false, claimed_nodes) {\n\t\tsuper(is_svg);\n\t\tthis.e = this.n = null;\n\t\tthis.l = claimed_nodes;\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tc(html) {\n\t\tif (this.l) {\n\t\t\tthis.n = this.l;\n\t\t} else {\n\t\t\tsuper.c(html);\n\t\t}\n\t}\n\n\t/**\n\t * @returns {void} */\n\ti(anchor) {\n\t\tfor (let i = 0; i < this.n.length; i += 1) {\n\t\t\tinsert_hydration(this.t, this.n[i], anchor);\n\t\t}\n\t}\n}\n\n/**\n * @param {NamedNodeMap} attributes\n * @returns {{}}\n */\nexport function attribute_to_object(attributes) {\n\tconst result = {};\n\tfor (const attribute of attributes) {\n\t\tresult[attribute.name] = attribute.value;\n\t}\n\treturn result;\n}\n\nconst escaped = {\n\t'\"': '"',\n\t'&': '&',\n\t'<': '<'\n};\n\nconst regex_attribute_characters_to_escape = /[\"&<]/g;\n\n/**\n * Note that the attribute itself should be surrounded in double quotes\n * @param {any} attribute\n */\nfunction escape_attribute(attribute) {\n\treturn String(attribute).replace(regex_attribute_characters_to_escape, (match) => escaped[match]);\n}\n\n/**\n * @param {Record} attributes\n */\nexport function stringify_spread(attributes) {\n\tlet str = ' ';\n\tfor (const key in attributes) {\n\t\tif (attributes[key] != null) {\n\t\t\tstr += `${key}=\"${escape_attribute(attributes[key])}\" `;\n\t\t}\n\t}\n\n\treturn str;\n}\n\n/**\n * @param {HTMLElement} element\n * @returns {{}}\n */\nexport function get_custom_elements_slots(element) {\n\tconst result = {};\n\telement.childNodes.forEach(\n\t\t/** @param {Element} node */ (node) => {\n\t\t\tresult[node.slot || 'default'] = true;\n\t\t}\n\t);\n\treturn result;\n}\n\nexport function construct_svelte_component(component, props) {\n\treturn new component(props);\n}\n\n/**\n * @typedef {Node & {\n * \tclaim_order?: number;\n * \thydrate_init?: true;\n * \tactual_end_child?: NodeEx;\n * \tchildNodes: NodeListOf;\n * }} NodeEx\n */\n\n/** @typedef {ChildNode & NodeEx} ChildNodeEx */\n\n/** @typedef {NodeEx & { claim_order: number }} NodeEx2 */\n\n/**\n * @typedef {ChildNodeEx[] & {\n * \tclaim_info?: {\n * \t\tlast_index: number;\n * \t\ttotal_claimed: number;\n * \t};\n * }} ChildNodeArray\n */\n","import { custom_event } from './dom.js';\n\nexport let current_component;\n\n/** @returns {void} */\nexport function set_current_component(component) {\n\tcurrent_component = component;\n}\n\nexport function get_current_component() {\n\tif (!current_component) throw new Error('Function called outside component initialization');\n\treturn current_component;\n}\n\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs/svelte#beforeupdate\n * @param {() => any} fn\n * @returns {void}\n */\nexport function beforeUpdate(fn) {\n\tget_current_component().$$.before_update.push(fn);\n}\n\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * If a function is returned _synchronously_ from `onMount`, it will be called when the component is unmounted.\n *\n * `onMount` does not run inside a [server-side component](https://svelte.dev/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs/svelte#onmount\n * @template T\n * @param {() => import('./private.js').NotFunction | Promise> | (() => any)} fn\n * @returns {void}\n */\nexport function onMount(fn) {\n\tget_current_component().$$.on_mount.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n *\n * https://svelte.dev/docs/svelte#afterupdate\n * @param {() => any} fn\n * @returns {void}\n */\nexport function afterUpdate(fn) {\n\tget_current_component().$$.after_update.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs/svelte#ondestroy\n * @param {() => any} fn\n * @returns {void}\n */\nexport function onDestroy(fn) {\n\tget_current_component().$$.on_destroy.push(fn);\n}\n\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](https://svelte.dev/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument:\n * ```ts\n * const dispatch = createEventDispatcher<{\n * loaded: never; // does not take a detail argument\n * change: string; // takes a detail argument of type string, which is required\n * optional: number | null; // takes an optional detail argument of type number\n * }>();\n * ```\n *\n * https://svelte.dev/docs/svelte#createeventdispatcher\n * @template {Record} [EventMap=any]\n * @returns {import('./public.js').EventDispatcher}\n */\nexport function createEventDispatcher() {\n\tconst component = get_current_component();\n\treturn (type, detail, { cancelable = false } = {}) => {\n\t\tconst callbacks = component.$$.callbacks[type];\n\t\tif (callbacks) {\n\t\t\t// TODO are there situations where events could be dispatched\n\t\t\t// in a server (non-DOM) environment?\n\t\t\tconst event = custom_event(/** @type {string} */ (type), detail, { cancelable });\n\t\t\tcallbacks.slice().forEach((fn) => {\n\t\t\t\tfn.call(component, event);\n\t\t\t});\n\t\t\treturn !event.defaultPrevented;\n\t\t}\n\t\treturn true;\n\t};\n}\n\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#setcontext\n * @template T\n * @param {any} key\n * @param {T} context\n * @returns {T}\n */\nexport function setContext(key, context) {\n\tget_current_component().$$.context.set(key, context);\n\treturn context;\n}\n\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#getcontext\n * @template T\n * @param {any} key\n * @returns {T}\n */\nexport function getContext(key) {\n\treturn get_current_component().$$.context.get(key);\n}\n\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs/svelte#getallcontexts\n * @template {Map} [T=Map]\n * @returns {T}\n */\nexport function getAllContexts() {\n\treturn get_current_component().$$.context;\n}\n\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#hascontext\n * @param {any} key\n * @returns {boolean}\n */\nexport function hasContext(key) {\n\treturn get_current_component().$$.context.has(key);\n}\n\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\n/**\n * @param component\n * @param event\n * @returns {void}\n */\nexport function bubble(component, event) {\n\tconst callbacks = component.$$.callbacks[event.type];\n\tif (callbacks) {\n\t\t// @ts-ignore\n\t\tcallbacks.slice().forEach((fn) => fn.call(this, event));\n\t}\n}\n","import { Behavior, registerBehavior } from \"./index\";\n\nclass GlobalShortcuts extends Behavior {\n constructor(element) {\n super(element);\n\n document.addEventListener(\"keydown\", this.onKeyDown.bind(this));\n }\n\n onKeyDown(event) {\n // Skip if event occurred within an input element\n const targetNodeName = event.target.nodeName;\n const isInputTarget =\n targetNodeName === \"INPUT\" ||\n targetNodeName === \"SELECT\" ||\n targetNodeName === \"TEXTAREA\";\n\n if (isInputTarget) {\n return;\n }\n\n // Handle shortcuts for navigating bookmarks with arrow keys\n const isArrowUp = event.key === \"ArrowUp\";\n const isArrowDown = event.key === \"ArrowDown\";\n if (isArrowUp || isArrowDown) {\n event.preventDefault();\n\n // Detect current bookmark list item\n const path = event.composedPath();\n const currentItem = path.find(\n (item) => item.hasAttribute && item.hasAttribute(\"ld-bookmark-item\"),\n );\n\n // Find next item\n let nextItem;\n if (currentItem) {\n nextItem = isArrowUp\n ? currentItem.previousElementSibling\n : currentItem.nextElementSibling;\n } else {\n // Select first item\n nextItem = document.querySelector(\"[ld-bookmark-item]\");\n }\n // Focus first link\n if (nextItem) {\n nextItem.querySelector(\"a\").focus();\n }\n }\n\n // Handle shortcut for toggling all notes\n if (event.key === \"e\") {\n const list = document.querySelector(\".bookmark-list\");\n if (list) {\n list.classList.toggle(\"show-notes\");\n }\n }\n\n // Handle shortcut for focusing search input\n if (event.key === \"s\") {\n const searchInput = document.querySelector('input[type=\"search\"]');\n\n if (searchInput) {\n searchInput.focus();\n event.preventDefault();\n }\n }\n\n // Handle shortcut for adding new bookmark\n if (event.key === \"n\") {\n window.location.assign(\"/bookmarks/new\");\n }\n }\n}\n\nregisterBehavior(\"ld-global-shortcuts\", GlobalShortcuts);\n","import { run_all } from './utils.js';\nimport { current_component, set_current_component } from './lifecycle.js';\n\nexport const dirty_components = [];\nexport const intros = { enabled: false };\nexport const binding_callbacks = [];\n\nlet render_callbacks = [];\n\nconst flush_callbacks = [];\n\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\n\nlet update_scheduled = false;\n\n/** @returns {void} */\nexport function schedule_update() {\n\tif (!update_scheduled) {\n\t\tupdate_scheduled = true;\n\t\tresolved_promise.then(flush);\n\t}\n}\n\n/** @returns {Promise} */\nexport function tick() {\n\tschedule_update();\n\treturn resolved_promise;\n}\n\n/** @returns {void} */\nexport function add_render_callback(fn) {\n\trender_callbacks.push(fn);\n}\n\n/** @returns {void} */\nexport function add_flush_callback(fn) {\n\tflush_callbacks.push(fn);\n}\n\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\n\nlet flushidx = 0; // Do *not* move this inside the flush() function\n\n/** @returns {void} */\nexport function flush() {\n\t// Do not reenter flush while dirty components are updated, as this can\n\t// result in an infinite loop. Instead, let the inner flush handle it.\n\t// Reentrancy is ok afterwards for bindings etc.\n\tif (flushidx !== 0) {\n\t\treturn;\n\t}\n\tconst saved_component = current_component;\n\tdo {\n\t\t// first, call beforeUpdate functions\n\t\t// and update components\n\t\ttry {\n\t\t\twhile (flushidx < dirty_components.length) {\n\t\t\t\tconst component = dirty_components[flushidx];\n\t\t\t\tflushidx++;\n\t\t\t\tset_current_component(component);\n\t\t\t\tupdate(component.$$);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// reset dirty state to not end up in a deadlocked state and then rethrow\n\t\t\tdirty_components.length = 0;\n\t\t\tflushidx = 0;\n\t\t\tthrow e;\n\t\t}\n\t\tset_current_component(null);\n\t\tdirty_components.length = 0;\n\t\tflushidx = 0;\n\t\twhile (binding_callbacks.length) binding_callbacks.pop()();\n\t\t// then, once components are updated, call\n\t\t// afterUpdate functions. This may cause\n\t\t// subsequent updates...\n\t\tfor (let i = 0; i < render_callbacks.length; i += 1) {\n\t\t\tconst callback = render_callbacks[i];\n\t\t\tif (!seen_callbacks.has(callback)) {\n\t\t\t\t// ...so guard against infinite loops\n\t\t\t\tseen_callbacks.add(callback);\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\t\trender_callbacks.length = 0;\n\t} while (dirty_components.length);\n\twhile (flush_callbacks.length) {\n\t\tflush_callbacks.pop()();\n\t}\n\tupdate_scheduled = false;\n\tseen_callbacks.clear();\n\tset_current_component(saved_component);\n}\n\n/** @returns {void} */\nfunction update($$) {\n\tif ($$.fragment !== null) {\n\t\t$$.update();\n\t\trun_all($$.before_update);\n\t\tconst dirty = $$.dirty;\n\t\t$$.dirty = [-1];\n\t\t$$.fragment && $$.fragment.p($$.ctx, dirty);\n\t\t$$.after_update.forEach(add_render_callback);\n\t}\n}\n\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function flush_render_callbacks(fns) {\n\tconst filtered = [];\n\tconst targets = [];\n\trender_callbacks.forEach((c) => (fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)));\n\ttargets.forEach((c) => c());\n\trender_callbacks = filtered;\n}\n","import { identity as linear, is_function, noop, run_all } from './utils.js';\nimport { now } from './environment.js';\nimport { loop } from './loop.js';\nimport { create_rule, delete_rule } from './style_manager.js';\nimport { custom_event } from './dom.js';\nimport { add_render_callback } from './scheduler.js';\n\n/**\n * @type {Promise | null}\n */\nlet promise;\n\n/**\n * @returns {Promise}\n */\nfunction wait() {\n\tif (!promise) {\n\t\tpromise = Promise.resolve();\n\t\tpromise.then(() => {\n\t\t\tpromise = null;\n\t\t});\n\t}\n\treturn promise;\n}\n\n/**\n * @param {Element} node\n * @param {INTRO | OUTRO | boolean} direction\n * @param {'start' | 'end'} kind\n * @returns {void}\n */\nfunction dispatch(node, direction, kind) {\n\tnode.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\n\nconst outroing = new Set();\n\n/**\n * @type {Outro}\n */\nlet outros;\n\n/**\n * @returns {void} */\nexport function group_outros() {\n\toutros = {\n\t\tr: 0,\n\t\tc: [],\n\t\tp: outros // parent group\n\t};\n}\n\n/**\n * @returns {void} */\nexport function check_outros() {\n\tif (!outros.r) {\n\t\trun_all(outros.c);\n\t}\n\toutros = outros.p;\n}\n\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} [local]\n * @returns {void}\n */\nexport function transition_in(block, local) {\n\tif (block && block.i) {\n\t\toutroing.delete(block);\n\t\tblock.i(local);\n\t}\n}\n\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} local\n * @param {0 | 1} [detach]\n * @param {() => void} [callback]\n * @returns {void}\n */\nexport function transition_out(block, local, detach, callback) {\n\tif (block && block.o) {\n\t\tif (outroing.has(block)) return;\n\t\toutroing.add(block);\n\t\toutros.c.push(() => {\n\t\t\toutroing.delete(block);\n\t\t\tif (callback) {\n\t\t\t\tif (detach) block.d(1);\n\t\t\t\tcallback();\n\t\t\t}\n\t\t});\n\t\tblock.o(local);\n\t} else if (callback) {\n\t\tcallback();\n\t}\n}\n\n/**\n * @type {import('../transition/public.js').TransitionConfig}\n */\nconst null_transition = { duration: 0 };\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @returns {{ start(): void; invalidate(): void; end(): void; }}\n */\nexport function create_in_transition(node, fn, params) {\n\t/**\n\t * @type {TransitionOptions} */\n\tconst options = { direction: 'in' };\n\tlet config = fn(node, params, options);\n\tlet running = false;\n\tlet animation_name;\n\tlet task;\n\tlet uid = 0;\n\n\t/**\n\t * @returns {void} */\n\tfunction cleanup() {\n\t\tif (animation_name) delete_rule(node, animation_name);\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction go() {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\t\tif (css) animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n\t\ttick(0, 1);\n\t\tconst start_time = now() + delay;\n\t\tconst end_time = start_time + duration;\n\t\tif (task) task.abort();\n\t\trunning = true;\n\t\tadd_render_callback(() => dispatch(node, true, 'start'));\n\t\ttask = loop((now) => {\n\t\t\tif (running) {\n\t\t\t\tif (now >= end_time) {\n\t\t\t\t\ttick(1, 0);\n\t\t\t\t\tdispatch(node, true, 'end');\n\t\t\t\t\tcleanup();\n\t\t\t\t\treturn (running = false);\n\t\t\t\t}\n\t\t\t\tif (now >= start_time) {\n\t\t\t\t\tconst t = easing((now - start_time) / duration);\n\t\t\t\t\ttick(t, 1 - t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn running;\n\t\t});\n\t}\n\tlet started = false;\n\treturn {\n\t\tstart() {\n\t\t\tif (started) return;\n\t\t\tstarted = true;\n\t\t\tdelete_rule(node);\n\t\t\tif (is_function(config)) {\n\t\t\t\tconfig = config(options);\n\t\t\t\twait().then(go);\n\t\t\t} else {\n\t\t\t\tgo();\n\t\t\t}\n\t\t},\n\t\tinvalidate() {\n\t\t\tstarted = false;\n\t\t},\n\t\tend() {\n\t\t\tif (running) {\n\t\t\t\tcleanup();\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @returns {{ end(reset: any): void; }}\n */\nexport function create_out_transition(node, fn, params) {\n\t/** @type {TransitionOptions} */\n\tconst options = { direction: 'out' };\n\tlet config = fn(node, params, options);\n\tlet running = true;\n\tlet animation_name;\n\tconst group = outros;\n\tgroup.r += 1;\n\t/** @type {boolean} */\n\tlet original_inert_value;\n\n\t/**\n\t * @returns {void} */\n\tfunction go() {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\n\t\tif (css) animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n\n\t\tconst start_time = now() + delay;\n\t\tconst end_time = start_time + duration;\n\t\tadd_render_callback(() => dispatch(node, false, 'start'));\n\n\t\tif ('inert' in node) {\n\t\t\toriginal_inert_value = /** @type {HTMLElement} */ (node).inert;\n\t\t\tnode.inert = true;\n\t\t}\n\n\t\tloop((now) => {\n\t\t\tif (running) {\n\t\t\t\tif (now >= end_time) {\n\t\t\t\t\ttick(0, 1);\n\t\t\t\t\tdispatch(node, false, 'end');\n\t\t\t\t\tif (!--group.r) {\n\t\t\t\t\t\t// this will result in `end()` being called,\n\t\t\t\t\t\t// so we don't need to clean up here\n\t\t\t\t\t\trun_all(group.c);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (now >= start_time) {\n\t\t\t\t\tconst t = easing((now - start_time) / duration);\n\t\t\t\t\ttick(1 - t, t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn running;\n\t\t});\n\t}\n\n\tif (is_function(config)) {\n\t\twait().then(() => {\n\t\t\t// @ts-ignore\n\t\t\tconfig = config(options);\n\t\t\tgo();\n\t\t});\n\t} else {\n\t\tgo();\n\t}\n\n\treturn {\n\t\tend(reset) {\n\t\t\tif (reset && 'inert' in node) {\n\t\t\t\tnode.inert = original_inert_value;\n\t\t\t}\n\t\t\tif (reset && config.tick) {\n\t\t\t\tconfig.tick(1, 0);\n\t\t\t}\n\t\t\tif (running) {\n\t\t\t\tif (animation_name) delete_rule(node, animation_name);\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @param {boolean} intro\n * @returns {{ run(b: 0 | 1): void; end(): void; }}\n */\nexport function create_bidirectional_transition(node, fn, params, intro) {\n\t/**\n\t * @type {TransitionOptions} */\n\tconst options = { direction: 'both' };\n\tlet config = fn(node, params, options);\n\tlet t = intro ? 0 : 1;\n\n\t/**\n\t * @type {Program | null} */\n\tlet running_program = null;\n\n\t/**\n\t * @type {PendingProgram | null} */\n\tlet pending_program = null;\n\tlet animation_name = null;\n\n\t/** @type {boolean} */\n\tlet original_inert_value;\n\n\t/**\n\t * @returns {void} */\n\tfunction clear_animation() {\n\t\tif (animation_name) delete_rule(node, animation_name);\n\t}\n\n\t/**\n\t * @param {PendingProgram} program\n\t * @param {number} duration\n\t * @returns {Program}\n\t */\n\tfunction init(program, duration) {\n\t\tconst d = /** @type {Program['d']} */ (program.b - t);\n\t\tduration *= Math.abs(d);\n\t\treturn {\n\t\t\ta: t,\n\t\t\tb: program.b,\n\t\t\td,\n\t\t\tduration,\n\t\t\tstart: program.start,\n\t\t\tend: program.start + duration,\n\t\t\tgroup: program.group\n\t\t};\n\t}\n\n\t/**\n\t * @param {INTRO | OUTRO} b\n\t * @returns {void}\n\t */\n\tfunction go(b) {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\n\t\t/**\n\t\t * @type {PendingProgram} */\n\t\tconst program = {\n\t\t\tstart: now() + delay,\n\t\t\tb\n\t\t};\n\n\t\tif (!b) {\n\t\t\t// @ts-ignore todo: improve typings\n\t\t\tprogram.group = outros;\n\t\t\toutros.r += 1;\n\t\t}\n\n\t\tif ('inert' in node) {\n\t\t\tif (b) {\n\t\t\t\tif (original_inert_value !== undefined) {\n\t\t\t\t\t// aborted/reversed outro — restore previous inert value\n\t\t\t\t\tnode.inert = original_inert_value;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toriginal_inert_value = /** @type {HTMLElement} */ (node).inert;\n\t\t\t\tnode.inert = true;\n\t\t\t}\n\t\t}\n\n\t\tif (running_program || pending_program) {\n\t\t\tpending_program = program;\n\t\t} else {\n\t\t\t// if this is an intro, and there's a delay, we need to do\n\t\t\t// an initial tick and/or apply CSS animation immediately\n\t\t\tif (css) {\n\t\t\t\tclear_animation();\n\t\t\t\tanimation_name = create_rule(node, t, b, duration, delay, easing, css);\n\t\t\t}\n\t\t\tif (b) tick(0, 1);\n\t\t\trunning_program = init(program, duration);\n\t\t\tadd_render_callback(() => dispatch(node, b, 'start'));\n\t\t\tloop((now) => {\n\t\t\t\tif (pending_program && now > pending_program.start) {\n\t\t\t\t\trunning_program = init(pending_program, duration);\n\t\t\t\t\tpending_program = null;\n\t\t\t\t\tdispatch(node, running_program.b, 'start');\n\t\t\t\t\tif (css) {\n\t\t\t\t\t\tclear_animation();\n\t\t\t\t\t\tanimation_name = create_rule(\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\trunning_program.b,\n\t\t\t\t\t\t\trunning_program.duration,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\teasing,\n\t\t\t\t\t\t\tconfig.css\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (running_program) {\n\t\t\t\t\tif (now >= running_program.end) {\n\t\t\t\t\t\ttick((t = running_program.b), 1 - t);\n\t\t\t\t\t\tdispatch(node, running_program.b, 'end');\n\t\t\t\t\t\tif (!pending_program) {\n\t\t\t\t\t\t\t// we're done\n\t\t\t\t\t\t\tif (running_program.b) {\n\t\t\t\t\t\t\t\t// intro — we can tidy up immediately\n\t\t\t\t\t\t\t\tclear_animation();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// outro — needs to be coordinated\n\t\t\t\t\t\t\t\tif (!--running_program.group.r) run_all(running_program.group.c);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\trunning_program = null;\n\t\t\t\t\t} else if (now >= running_program.start) {\n\t\t\t\t\t\tconst p = now - running_program.start;\n\t\t\t\t\t\tt = running_program.a + running_program.d * easing(p / running_program.duration);\n\t\t\t\t\t\ttick(t, 1 - t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn !!(running_program || pending_program);\n\t\t\t});\n\t\t}\n\t}\n\treturn {\n\t\trun(b) {\n\t\t\tif (is_function(config)) {\n\t\t\t\twait().then(() => {\n\t\t\t\t\tconst opts = { direction: b ? 'in' : 'out' };\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconfig = config(opts);\n\t\t\t\t\tgo(b);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tgo(b);\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\tclear_animation();\n\t\t\trunning_program = pending_program = null;\n\t\t}\n\t};\n}\n\n/** @typedef {1} INTRO */\n/** @typedef {0} OUTRO */\n/** @typedef {{ direction: 'in' | 'out' | 'both' }} TransitionOptions */\n/** @typedef {(node: Element, params: any, options: TransitionOptions) => import('../transition/public.js').TransitionConfig} TransitionFn */\n\n/**\n * @typedef {Object} Outro\n * @property {number} r\n * @property {Function[]} c\n * @property {Object} p\n */\n\n/**\n * @typedef {Object} PendingProgram\n * @property {number} start\n * @property {INTRO|OUTRO} b\n * @property {Outro} [group]\n */\n\n/**\n * @typedef {Object} Program\n * @property {number} a\n * @property {INTRO|OUTRO} b\n * @property {1|-1} d\n * @property {number} duration\n * @property {number} start\n * @property {number} end\n * @property {Outro} [group]\n */\n","import { transition_in, transition_out } from './transitions.js';\nimport { run_all } from './utils.js';\n\n// general each functions:\n\nexport function ensure_array_like(array_like_or_iterator) {\n\treturn array_like_or_iterator?.length !== undefined\n\t\t? array_like_or_iterator\n\t\t: Array.from(array_like_or_iterator);\n}\n\n// keyed each functions:\n\n/** @returns {void} */\nexport function destroy_block(block, lookup) {\n\tblock.d(1);\n\tlookup.delete(block.key);\n}\n\n/** @returns {void} */\nexport function outro_and_destroy_block(block, lookup) {\n\ttransition_out(block, 1, 1, () => {\n\t\tlookup.delete(block.key);\n\t});\n}\n\n/** @returns {void} */\nexport function fix_and_destroy_block(block, lookup) {\n\tblock.f();\n\tdestroy_block(block, lookup);\n}\n\n/** @returns {void} */\nexport function fix_and_outro_and_destroy_block(block, lookup) {\n\tblock.f();\n\toutro_and_destroy_block(block, lookup);\n}\n\n/** @returns {any[]} */\nexport function update_keyed_each(\n\told_blocks,\n\tdirty,\n\tget_key,\n\tdynamic,\n\tctx,\n\tlist,\n\tlookup,\n\tnode,\n\tdestroy,\n\tcreate_each_block,\n\tnext,\n\tget_context\n) {\n\tlet o = old_blocks.length;\n\tlet n = list.length;\n\tlet i = o;\n\tconst old_indexes = {};\n\twhile (i--) old_indexes[old_blocks[i].key] = i;\n\tconst new_blocks = [];\n\tconst new_lookup = new Map();\n\tconst deltas = new Map();\n\tconst updates = [];\n\ti = n;\n\twhile (i--) {\n\t\tconst child_ctx = get_context(ctx, list, i);\n\t\tconst key = get_key(child_ctx);\n\t\tlet block = lookup.get(key);\n\t\tif (!block) {\n\t\t\tblock = create_each_block(key, child_ctx);\n\t\t\tblock.c();\n\t\t} else if (dynamic) {\n\t\t\t// defer updates until all the DOM shuffling is done\n\t\t\tupdates.push(() => block.p(child_ctx, dirty));\n\t\t}\n\t\tnew_lookup.set(key, (new_blocks[i] = block));\n\t\tif (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key]));\n\t}\n\tconst will_move = new Set();\n\tconst did_move = new Set();\n\t/** @returns {void} */\n\tfunction insert(block) {\n\t\ttransition_in(block, 1);\n\t\tblock.m(node, next);\n\t\tlookup.set(block.key, block);\n\t\tnext = block.first;\n\t\tn--;\n\t}\n\twhile (o && n) {\n\t\tconst new_block = new_blocks[n - 1];\n\t\tconst old_block = old_blocks[o - 1];\n\t\tconst new_key = new_block.key;\n\t\tconst old_key = old_block.key;\n\t\tif (new_block === old_block) {\n\t\t\t// do nothing\n\t\t\tnext = new_block.first;\n\t\t\to--;\n\t\t\tn--;\n\t\t} else if (!new_lookup.has(old_key)) {\n\t\t\t// remove old block\n\t\t\tdestroy(old_block, lookup);\n\t\t\to--;\n\t\t} else if (!lookup.has(new_key) || will_move.has(new_key)) {\n\t\t\tinsert(new_block);\n\t\t} else if (did_move.has(old_key)) {\n\t\t\to--;\n\t\t} else if (deltas.get(new_key) > deltas.get(old_key)) {\n\t\t\tdid_move.add(new_key);\n\t\t\tinsert(new_block);\n\t\t} else {\n\t\t\twill_move.add(old_key);\n\t\t\to--;\n\t\t}\n\t}\n\twhile (o--) {\n\t\tconst old_block = old_blocks[o];\n\t\tif (!new_lookup.has(old_block.key)) destroy(old_block, lookup);\n\t}\n\twhile (n) insert(new_blocks[n - 1]);\n\trun_all(updates);\n\treturn new_blocks;\n}\n\n/** @returns {void} */\nexport function validate_each_keys(ctx, list, get_context, get_key) {\n\tconst keys = new Map();\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst key = get_key(get_context(ctx, list, i));\n\t\tif (keys.has(key)) {\n\t\t\tlet value = '';\n\t\t\ttry {\n\t\t\t\tvalue = `with value '${String(key)}' `;\n\t\t\t} catch (e) {\n\t\t\t\t// can't stringify\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot have duplicate keys in a keyed each: Keys at index ${keys.get(\n\t\t\t\t\tkey\n\t\t\t\t)} and ${i} ${value}are duplicates`\n\t\t\t);\n\t\t}\n\t\tkeys.set(key, i);\n\t}\n}\n","import {\n\tadd_render_callback,\n\tflush,\n\tflush_render_callbacks,\n\tschedule_update,\n\tdirty_components\n} from './scheduler.js';\nimport { current_component, set_current_component } from './lifecycle.js';\nimport { blank_object, is_empty, is_function, run, run_all, noop } from './utils.js';\nimport {\n\tchildren,\n\tdetach,\n\tstart_hydrating,\n\tend_hydrating,\n\tget_custom_elements_slots,\n\tinsert,\n\telement,\n\tattr\n} from './dom.js';\nimport { transition_in } from './transitions.js';\n\n/** @returns {void} */\nexport function bind(component, name, callback) {\n\tconst index = component.$$.props[name];\n\tif (index !== undefined) {\n\t\tcomponent.$$.bound[index] = callback;\n\t\tcallback(component.$$.ctx[index]);\n\t}\n}\n\n/** @returns {void} */\nexport function create_component(block) {\n\tblock && block.c();\n}\n\n/** @returns {void} */\nexport function claim_component(block, parent_nodes) {\n\tblock && block.l(parent_nodes);\n}\n\n/** @returns {void} */\nexport function mount_component(component, target, anchor) {\n\tconst { fragment, after_update } = component.$$;\n\tfragment && fragment.m(target, anchor);\n\t// onMount happens before the initial afterUpdate\n\tadd_render_callback(() => {\n\t\tconst new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n\t\t// if the component was destroyed immediately\n\t\t// it will update the `$$.on_destroy` reference to `null`.\n\t\t// the destructured on_destroy may still reference to the old array\n\t\tif (component.$$.on_destroy) {\n\t\t\tcomponent.$$.on_destroy.push(...new_on_destroy);\n\t\t} else {\n\t\t\t// Edge case - component was destroyed immediately,\n\t\t\t// most likely as a result of a binding initialising\n\t\t\trun_all(new_on_destroy);\n\t\t}\n\t\tcomponent.$$.on_mount = [];\n\t});\n\tafter_update.forEach(add_render_callback);\n}\n\n/** @returns {void} */\nexport function destroy_component(component, detaching) {\n\tconst $$ = component.$$;\n\tif ($$.fragment !== null) {\n\t\tflush_render_callbacks($$.after_update);\n\t\trun_all($$.on_destroy);\n\t\t$$.fragment && $$.fragment.d(detaching);\n\t\t// TODO null out other refs, including component.$$ (but need to\n\t\t// preserve final state?)\n\t\t$$.on_destroy = $$.fragment = null;\n\t\t$$.ctx = [];\n\t}\n}\n\n/** @returns {void} */\nfunction make_dirty(component, i) {\n\tif (component.$$.dirty[0] === -1) {\n\t\tdirty_components.push(component);\n\t\tschedule_update();\n\t\tcomponent.$$.dirty.fill(0);\n\t}\n\tcomponent.$$.dirty[(i / 31) | 0] |= 1 << i % 31;\n}\n\n// TODO: Document the other params\n/**\n * @param {SvelteComponent} component\n * @param {import('./public.js').ComponentConstructorOptions} options\n *\n * @param {import('./utils.js')['not_equal']} not_equal Used to compare props and state values.\n * @param {(target: Element | ShadowRoot) => void} [append_styles] Function that appends styles to the DOM when the component is first initialised.\n * This will be the `add_css` function from the compiled component.\n *\n * @returns {void}\n */\nexport function init(\n\tcomponent,\n\toptions,\n\tinstance,\n\tcreate_fragment,\n\tnot_equal,\n\tprops,\n\tappend_styles = null,\n\tdirty = [-1]\n) {\n\tconst parent_component = current_component;\n\tset_current_component(component);\n\t/** @type {import('./private.js').T$$} */\n\tconst $$ = (component.$$ = {\n\t\tfragment: null,\n\t\tctx: [],\n\t\t// state\n\t\tprops,\n\t\tupdate: noop,\n\t\tnot_equal,\n\t\tbound: blank_object(),\n\t\t// lifecycle\n\t\ton_mount: [],\n\t\ton_destroy: [],\n\t\ton_disconnect: [],\n\t\tbefore_update: [],\n\t\tafter_update: [],\n\t\tcontext: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n\t\t// everything else\n\t\tcallbacks: blank_object(),\n\t\tdirty,\n\t\tskip_bound: false,\n\t\troot: options.target || parent_component.$$.root\n\t});\n\tappend_styles && append_styles($$.root);\n\tlet ready = false;\n\t$$.ctx = instance\n\t\t? instance(component, options.props || {}, (i, ret, ...rest) => {\n\t\t\t\tconst value = rest.length ? rest[0] : ret;\n\t\t\t\tif ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) {\n\t\t\t\t\tif (!$$.skip_bound && $$.bound[i]) $$.bound[i](value);\n\t\t\t\t\tif (ready) make_dirty(component, i);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t })\n\t\t: [];\n\t$$.update();\n\tready = true;\n\trun_all($$.before_update);\n\t// `false` as a special case of no DOM component\n\t$$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n\tif (options.target) {\n\t\tif (options.hydrate) {\n\t\t\tstart_hydrating();\n\t\t\t// TODO: what is the correct type here?\n\t\t\t// @ts-expect-error\n\t\t\tconst nodes = children(options.target);\n\t\t\t$$.fragment && $$.fragment.l(nodes);\n\t\t\tnodes.forEach(detach);\n\t\t} else {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t$$.fragment && $$.fragment.c();\n\t\t}\n\t\tif (options.intro) transition_in(component.$$.fragment);\n\t\tmount_component(component, options.target, options.anchor);\n\t\tend_hydrating();\n\t\tflush();\n\t}\n\tset_current_component(parent_component);\n}\n\nexport let SvelteElement;\n\nif (typeof HTMLElement === 'function') {\n\tSvelteElement = class extends HTMLElement {\n\t\t/** The Svelte component constructor */\n\t\t$$ctor;\n\t\t/** Slots */\n\t\t$$s;\n\t\t/** The Svelte component instance */\n\t\t$$c;\n\t\t/** Whether or not the custom element is connected */\n\t\t$$cn = false;\n\t\t/** Component props data */\n\t\t$$d = {};\n\t\t/** `true` if currently in the process of reflecting component props back to attributes */\n\t\t$$r = false;\n\t\t/** @type {Record} Props definition (name, reflected, type etc) */\n\t\t$$p_d = {};\n\t\t/** @type {Record} Event listeners */\n\t\t$$l = {};\n\t\t/** @type {Map} Event listener unsubscribe functions */\n\t\t$$l_u = new Map();\n\n\t\tconstructor($$componentCtor, $$slots, use_shadow_dom) {\n\t\t\tsuper();\n\t\t\tthis.$$ctor = $$componentCtor;\n\t\t\tthis.$$s = $$slots;\n\t\t\tif (use_shadow_dom) {\n\t\t\t\tthis.attachShadow({ mode: 'open' });\n\t\t\t}\n\t\t}\n\n\t\taddEventListener(type, listener, options) {\n\t\t\t// We can't determine upfront if the event is a custom event or not, so we have to\n\t\t\t// listen to both. If someone uses a custom event with the same name as a regular\n\t\t\t// browser event, this fires twice - we can't avoid that.\n\t\t\tthis.$$l[type] = this.$$l[type] || [];\n\t\t\tthis.$$l[type].push(listener);\n\t\t\tif (this.$$c) {\n\t\t\t\tconst unsub = this.$$c.$on(type, listener);\n\t\t\t\tthis.$$l_u.set(listener, unsub);\n\t\t\t}\n\t\t\tsuper.addEventListener(type, listener, options);\n\t\t}\n\n\t\tremoveEventListener(type, listener, options) {\n\t\t\tsuper.removeEventListener(type, listener, options);\n\t\t\tif (this.$$c) {\n\t\t\t\tconst unsub = this.$$l_u.get(listener);\n\t\t\t\tif (unsub) {\n\t\t\t\t\tunsub();\n\t\t\t\t\tthis.$$l_u.delete(listener);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tasync connectedCallback() {\n\t\t\tthis.$$cn = true;\n\t\t\tif (!this.$$c) {\n\t\t\t\t// We wait one tick to let possible child slot elements be created/mounted\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (!this.$$cn || this.$$c) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfunction create_slot(name) {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlet node;\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\tc: function create() {\n\t\t\t\t\t\t\t\tnode = element('slot');\n\t\t\t\t\t\t\t\tif (name !== 'default') {\n\t\t\t\t\t\t\t\t\tattr(node, 'name', name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * @param {HTMLElement} target\n\t\t\t\t\t\t\t * @param {HTMLElement} [anchor]\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tm: function mount(target, anchor) {\n\t\t\t\t\t\t\t\tinsert(target, node, anchor);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\td: function destroy(detaching) {\n\t\t\t\t\t\t\t\tif (detaching) {\n\t\t\t\t\t\t\t\t\tdetach(node);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn obj;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst $$slots = {};\n\t\t\t\tconst existing_slots = get_custom_elements_slots(this);\n\t\t\t\tfor (const name of this.$$s) {\n\t\t\t\t\tif (name in existing_slots) {\n\t\t\t\t\t\t$$slots[name] = [create_slot(name)];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const attribute of this.attributes) {\n\t\t\t\t\t// this.$$data takes precedence over this.attributes\n\t\t\t\t\tconst name = this.$$g_p(attribute.name);\n\t\t\t\t\tif (!(name in this.$$d)) {\n\t\t\t\t\t\tthis.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, 'toProp');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Port over props that were set programmatically before ce was initialized\n\t\t\t\tfor (const key in this.$$p_d) {\n\t\t\t\t\tif (!(key in this.$$d) && this[key] !== undefined) {\n\t\t\t\t\t\tthis.$$d[key] = this[key]; // don't transform, these were set through JavaScript\n\t\t\t\t\t\tdelete this[key]; // remove the property that shadows the getter/setter\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$c = new this.$$ctor({\n\t\t\t\t\ttarget: this.shadowRoot || this,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...this.$$d,\n\t\t\t\t\t\t$$slots,\n\t\t\t\t\t\t$$scope: {\n\t\t\t\t\t\t\tctx: []\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Reflect component props as attributes\n\t\t\t\tconst reflect_attributes = () => {\n\t\t\t\t\tthis.$$r = true;\n\t\t\t\t\tfor (const key in this.$$p_d) {\n\t\t\t\t\t\tthis.$$d[key] = this.$$c.$$.ctx[this.$$c.$$.props[key]];\n\t\t\t\t\t\tif (this.$$p_d[key].reflect) {\n\t\t\t\t\t\t\tconst attribute_value = get_custom_element_value(\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\tthis.$$d[key],\n\t\t\t\t\t\t\t\tthis.$$p_d,\n\t\t\t\t\t\t\t\t'toAttribute'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (attribute_value == null) {\n\t\t\t\t\t\t\t\tthis.removeAttribute(this.$$p_d[key].attribute || key);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.setAttribute(this.$$p_d[key].attribute || key, attribute_value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.$$r = false;\n\t\t\t\t};\n\t\t\t\tthis.$$c.$$.after_update.push(reflect_attributes);\n\t\t\t\treflect_attributes(); // once initially because after_update is added too late for first render\n\n\t\t\t\tfor (const type in this.$$l) {\n\t\t\t\t\tfor (const listener of this.$$l[type]) {\n\t\t\t\t\t\tconst unsub = this.$$c.$on(type, listener);\n\t\t\t\t\t\tthis.$$l_u.set(listener, unsub);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$l = {};\n\t\t\t}\n\t\t}\n\n\t\t// We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte\n\t\t// and setting attributes through setAttribute etc, this is helpful\n\t\tattributeChangedCallback(attr, _oldValue, newValue) {\n\t\t\tif (this.$$r) return;\n\t\t\tattr = this.$$g_p(attr);\n\t\t\tthis.$$d[attr] = get_custom_element_value(attr, newValue, this.$$p_d, 'toProp');\n\t\t\tthis.$$c?.$set({ [attr]: this.$$d[attr] });\n\t\t}\n\n\t\tdisconnectedCallback() {\n\t\t\tthis.$$cn = false;\n\t\t\t// In a microtask, because this could be a move within the DOM\n\t\t\tPromise.resolve().then(() => {\n\t\t\t\tif (!this.$$cn) {\n\t\t\t\t\tthis.$$c.$destroy();\n\t\t\t\t\tthis.$$c = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t$$g_p(attribute_name) {\n\t\t\treturn (\n\t\t\t\tObject.keys(this.$$p_d).find(\n\t\t\t\t\t(key) =>\n\t\t\t\t\t\tthis.$$p_d[key].attribute === attribute_name ||\n\t\t\t\t\t\t(!this.$$p_d[key].attribute && key.toLowerCase() === attribute_name)\n\t\t\t\t) || attribute_name\n\t\t\t);\n\t\t}\n\t};\n}\n\n/**\n * @param {string} prop\n * @param {any} value\n * @param {Record} props_definition\n * @param {'toAttribute' | 'toProp'} [transform]\n */\nfunction get_custom_element_value(prop, value, props_definition, transform) {\n\tconst type = props_definition[prop]?.type;\n\tvalue = type === 'Boolean' && typeof value !== 'boolean' ? value != null : value;\n\tif (!transform || !props_definition[prop]) {\n\t\treturn value;\n\t} else if (transform === 'toAttribute') {\n\t\tswitch (type) {\n\t\t\tcase 'Object':\n\t\t\tcase 'Array':\n\t\t\t\treturn value == null ? null : JSON.stringify(value);\n\t\t\tcase 'Boolean':\n\t\t\t\treturn value ? '' : null;\n\t\t\tcase 'Number':\n\t\t\t\treturn value == null ? null : value;\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t} else {\n\t\tswitch (type) {\n\t\t\tcase 'Object':\n\t\t\tcase 'Array':\n\t\t\t\treturn value && JSON.parse(value);\n\t\t\tcase 'Boolean':\n\t\t\t\treturn value; // conversion already handled above\n\t\t\tcase 'Number':\n\t\t\t\treturn value != null ? +value : value;\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t}\n}\n\n/**\n * @internal\n *\n * Turn a Svelte component into a custom element.\n * @param {import('./public.js').ComponentType} Component A Svelte component constructor\n * @param {Record} props_definition The props to observe\n * @param {string[]} slots The slots to create\n * @param {string[]} accessors Other accessors besides the ones for props the component has\n * @param {boolean} use_shadow_dom Whether to use shadow DOM\n * @param {(ce: new () => HTMLElement) => new () => HTMLElement} [extend]\n */\nexport function create_custom_element(\n\tComponent,\n\tprops_definition,\n\tslots,\n\taccessors,\n\tuse_shadow_dom,\n\textend\n) {\n\tlet Class = class extends SvelteElement {\n\t\tconstructor() {\n\t\t\tsuper(Component, slots, use_shadow_dom);\n\t\t\tthis.$$p_d = props_definition;\n\t\t}\n\t\tstatic get observedAttributes() {\n\t\t\treturn Object.keys(props_definition).map((key) =>\n\t\t\t\t(props_definition[key].attribute || key).toLowerCase()\n\t\t\t);\n\t\t}\n\t};\n\tObject.keys(props_definition).forEach((prop) => {\n\t\tObject.defineProperty(Class.prototype, prop, {\n\t\t\tget() {\n\t\t\t\treturn this.$$c && prop in this.$$c ? this.$$c[prop] : this.$$d[prop];\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tvalue = get_custom_element_value(prop, value, props_definition);\n\t\t\t\tthis.$$d[prop] = value;\n\t\t\t\tthis.$$c?.$set({ [prop]: value });\n\t\t\t}\n\t\t});\n\t});\n\taccessors.forEach((accessor) => {\n\t\tObject.defineProperty(Class.prototype, accessor, {\n\t\t\tget() {\n\t\t\t\treturn this.$$c?.[accessor];\n\t\t\t}\n\t\t});\n\t});\n\tif (extend) {\n\t\t// @ts-expect-error - assigning here is fine\n\t\tClass = extend(Class);\n\t}\n\tComponent.element = /** @type {any} */ (Class);\n\treturn Class;\n}\n\n/**\n * Base class for Svelte components. Used when dev=false.\n *\n * @template {Record} [Props=any]\n * @template {Record} [Events=any]\n */\nexport class SvelteComponent {\n\t/**\n\t * ### PRIVATE API\n\t *\n\t * Do not use, may change at any time\n\t *\n\t * @type {any}\n\t */\n\t$$ = undefined;\n\t/**\n\t * ### PRIVATE API\n\t *\n\t * Do not use, may change at any time\n\t *\n\t * @type {any}\n\t */\n\t$$set = undefined;\n\n\t/** @returns {void} */\n\t$destroy() {\n\t\tdestroy_component(this, 1);\n\t\tthis.$destroy = noop;\n\t}\n\n\t/**\n\t * @template {Extract} K\n\t * @param {K} type\n\t * @param {((e: Events[K]) => void) | null | undefined} callback\n\t * @returns {() => void}\n\t */\n\t$on(type, callback) {\n\t\tif (!is_function(callback)) {\n\t\t\treturn noop;\n\t\t}\n\t\tconst callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);\n\t\tcallbacks.push(callback);\n\t\treturn () => {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index !== -1) callbacks.splice(index, 1);\n\t\t};\n\t}\n\n\t/**\n\t * @param {Partial} props\n\t * @returns {void}\n\t */\n\t$set(props) {\n\t\tif (this.$$set && !is_empty(props)) {\n\t\t\tthis.$$.skip_bound = true;\n\t\t\tthis.$$set(props);\n\t\t\tthis.$$.skip_bound = false;\n\t\t}\n\t}\n}\n\n/**\n * @typedef {Object} CustomElementPropDefinition\n * @property {string} [attribute]\n * @property {boolean} [reflect]\n * @property {'String'|'Boolean'|'Number'|'Array'|'Object'} [type]\n */\n","export function debounce(callback, delay = 250) {\n let timeoutId;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n callback(...args);\n }, delay);\n };\n}\n\nexport function clampText(text, maxChars = 30) {\n if (!text || text.length <= 30) return text;\n\n return text.substr(0, maxChars) + \"...\";\n}\n\nexport function getCurrentWordBounds(input) {\n const text = input.value;\n const end = input.selectionStart;\n let start = end;\n\n let currentChar = text.charAt(start - 1);\n\n while (currentChar && currentChar !== \" \" && start > 0) {\n start--;\n currentChar = text.charAt(start - 1);\n }\n\n return { start, end };\n}\n\nexport function getCurrentWord(input) {\n const bounds = getCurrentWordBounds(input);\n\n return input.value.substring(bounds.start, bounds.end);\n}\n","\n\n\n\n\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.12';\nexport const PUBLIC_VERSION = '4';\n","export class ApiClient {\n constructor(baseUrl) {\n this.baseUrl = baseUrl;\n }\n\n listBookmarks(search, options = { limit: 100, offset: 0, path: \"\" }) {\n const query = [`limit=${options.limit}`, `offset=${options.offset}`];\n Object.keys(search).forEach((key) => {\n const value = search[key];\n if (value) {\n query.push(`${key}=${encodeURIComponent(value)}`);\n }\n });\n const queryString = query.join(\"&\");\n const url = `${this.baseUrl}bookmarks${options.path}/?${queryString}`;\n\n return fetch(url)\n .then((response) => response.json())\n .then((data) => data.results);\n }\n\n getTags(options = { limit: 100, offset: 0 }) {\n const url = `${this.baseUrl}tags/?limit=${options.limit}&offset=${options.offset}`;\n\n return fetch(url)\n .then((response) => response.json())\n .then((data) => data.results);\n }\n}\n","import { Behavior, registerBehavior } from \"./index\";\nimport TagAutoCompleteComponent from \"../components/TagAutocomplete.svelte\";\nimport { ApiClient } from \"../api\";\n\nclass TagAutocomplete extends Behavior {\n constructor(element) {\n super(element);\n const wrapper = document.createElement(\"div\");\n const apiBaseUrl = document.documentElement.dataset.apiBaseUrl || \"\";\n const apiClient = new ApiClient(apiBaseUrl);\n\n new TagAutoCompleteComponent({\n target: wrapper,\n props: {\n id: element.id,\n name: element.name,\n value: element.value,\n placeholder: element.getAttribute(\"placeholder\") || \"\",\n apiClient: apiClient,\n variant: element.getAttribute(\"variant\"),\n },\n });\n\n element.replaceWith(wrapper.firstElementChild);\n }\n}\n\nregisterBehavior(\"ld-tag-autocomplete\", TagAutocomplete);\n","const SEARCH_HISTORY_KEY = \"searchHistory\";\nconst MAX_ENTRIES = 30;\n\nexport class SearchHistory {\n getHistory() {\n const historyJson = localStorage.getItem(SEARCH_HISTORY_KEY);\n return historyJson\n ? JSON.parse(historyJson)\n : {\n recent: [],\n };\n }\n\n pushCurrent() {\n // Skip if browser is not compatible\n if (!window.URLSearchParams) return;\n const urlParams = new URLSearchParams(window.location.search);\n const searchParam = urlParams.get(\"q\");\n\n if (!searchParam) return;\n\n this.push(searchParam);\n }\n\n push(search) {\n const history = this.getHistory();\n\n history.recent.unshift(search);\n\n // Remove duplicates and clamp to max entries\n history.recent = history.recent.reduce((acc, cur) => {\n if (acc.length >= MAX_ENTRIES) return acc;\n if (acc.indexOf(cur) >= 0) return acc;\n acc.push(cur);\n return acc;\n }, []);\n\n const newHistoryJson = JSON.stringify(history);\n localStorage.setItem(SEARCH_HISTORY_KEY, newHistoryJson);\n }\n\n getRecentSearches(query, max) {\n const history = this.getHistory();\n\n return history.recent\n .filter(\n (search) =>\n !query || search.toLowerCase().indexOf(query.toLowerCase()) >= 0,\n )\n .slice(0, max);\n }\n}\n","\n\n\n\n\n"],"names":["behaviorRegistry","mutationObserver","MutationObserver","mutations","forEach","mutation","removedNodes","node","HTMLElement","isConnected","element","Object","keys","behaviorName","elements","Array","from","querySelectorAll","push","__behaviors","behavior","destroy","destroyBehaviors","addedNodes","applyBehaviors","observe","document","body","childList","subtree","Behavior","constructor","this","registerBehavior","name","container","behaviorNames","hasAttribute","some","b","behaviorInstance","fireEvents","events","split","eventName","targets","target","dispatchEvent","CustomEvent","interacting","super","notesToggle","querySelector","addEventListener","onToggleNotes","bind","titleAnchor","titleSpan","requestAnimationFrame","offsetWidth","dataset","tooltip","textContent","event","preventDefault","stopPropagation","classList","toggle","active","onToggleActive","onToggleAll","onToggleBookmark","onActionSelected","init","activeToggle","actionSelect","tagAutoComplete","selectAcross","allCheckbox","bookmarkCheckboxes","removeEventListener","checkbox","reset","totalHolder","total","bookmarksTotal","add","setTimeout","remove","allChecked","every","checked","updateSelectAcross","action","value","type","removeAttribute","onClick","createElement","className","icon","getAttribute","iconElement","createElementNS","style","width","height","innerHTML","append","question","innerText","buttonClasses","values","filter","cls","startsWith","join","cancelButton","nodeName","confirmButton","before","opened","onOutsideClick","close","open","contains","interval","parseInt","onFetch","onInterval","intervalId","setInterval","clearInterval","maybeEvent","url","html","fetch","then","response","text","select","options","dom","DOMParser","parseFromString","targetElement","strategy","parts","contents","children","parentElement","replaceChild","child","swap","onSubmit","formData","FormData","submitter","method","redirect","closest","Event","cancelable","fileInput","nextElementSibling","click","form","onClose","onKeyDown","modalOverlay","closeButton","targetNodeName","key","animationName","noop","run","fn","blank_object","create","run_all","fns","is_function","thing","safe_not_equal","a","appendChild","append_styles","style_sheet_id","styles","append_styles_to","root","getRootNode","ownerDocument","host","get_root_for_style","getElementById","id","head","sheet","append_stylesheet","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","i","length","d","data","createTextNode","space","listen","handler","prevent_default","call","attr","attribute","setAttribute","set_data","toggle_class","current_component","set_current_component","component","isArrowUp","isArrowDown","currentItem","composedPath","find","item","nextItem","previousElementSibling","focus","list","searchInput","window","location","assign","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","add_render_callback","seen_callbacks","Set","flushidx","flush","saved_component","update","$$","e","pop","callback","has","clear","fragment","before_update","dirty","p","ctx","after_update","outroing","ensure_array_like","array_like_or_iterator","undefined","destroy_component","filtered","c","indexOf","flush_render_callbacks","on_destroy","make_dirty","fill","instance","create_fragment","not_equal","props","parent_component","bound","on_mount","on_disconnect","context","Map","callbacks","skip_bound","ready","ret","rest","hydrate","nodes","childNodes","l","intro","block","delete","local","m","new_on_destroy","map","mount_component","SvelteComponent","$$set","$destroy","$on","index","splice","$set","obj","getCurrentWordBounds","input","end","selectionStart","start","currentChar","charAt","getCurrentWord","bounds","substring","t0_value","li","t0","input_1","input_1_value_value","input_1_placeholder_value","ul","div1","div0","$$props","placeholder","apiClient","variant","tags","isFocus","isOpen","suggestionList","suggestions","selectedIndex","$$invalidate","complete","suggestion","updateSelection","dir","newIndex","Math","max","selectedListItem","scrollIntoView","getTags","limit","offset","sort","left","right","toLowerCase","localeCompare","console","warn","word","tag","keyCode","$$value","__svelte","v","ApiClient","baseUrl","listBookmarks","search","path","query","encodeURIComponent","queryString","json","results","wrapper","apiBaseUrl","documentElement","TagAutoCompleteComponent","replaceWith","firstElementChild","SEARCH_HISTORY_KEY","SearchHistory","getHistory","historyJson","localStorage","getItem","JSON","parse","recent","pushCurrent","URLSearchParams","searchParam","get","history","unshift","reduce","acc","cur","newHistoryJson","stringify","setItem","getRecentSearches","slice","t_value","label","t","if_block0","create_if_block_2","each_value_2","if_block1","recentSearches","create_if_block_1","each_value_1","if_block2","bookmarks","create_if_block","each_value","searchHistory","mode","linkTarget","updateSuggestions","loadSuggestions","suggestionIndex","nextIndex","tagSuggestions","currentWord","searchTag","tagName","suggestionSearch","q","bookmark","maxChars","substr","clampText","title","website_title","debouncedLoadSuggestions","delay","timeoutId","args","clearTimeout","debounce","completeSuggestion","inputValue"],"mappings":"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","x_google_ignoreList":[8,9,10,12,13,14,15,18,19]}