{"version":3,"file":"_page.svelte-CotIxFN7.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/(app)/articles/_page.svelte.js"],"sourcesContent":["import { c as create_ssr_component, s as spread, b as escape_object, d as add_attribute, e as escape, a as escape_attribute_value, v as validate_component, h as each } from \"../../../../chunks/ssr.js\";\nimport { T as Table, a as Table_header, b as Table_row, c as Table_head, d as Table_body, e as Table_cell } from \"../../../../chunks/table-row.js\";\nimport \"clsx\";\nimport { dequal } from \"dequal\";\nimport { i as isHTMLElement, q as getElementByMeltId, r as isElement, t as isHTMLLabelElement, w as withGet, o as omit, c as createElHelpers, v as isObject, x as stripValues, m as makeElement, j as disabledAttr, a as executeCallbacks, b as addMeltEventListener, k as kbd, y as isHTMLButtonElement, F as FIRST_LAST_KEYS, d as isElementDisabled, u as useEscapeKeydown, s as styleToString, e as effect, z as createHiddenInput, f as safeOnMount, g as isBrowser, A as isHTMLInputElement, n as noop, h as addEventListener, B as isTouch, C as removeUndefined, p as portalAttr, D as isDocument, l as is_void, E as buttonVariants } from \"../../../../chunks/index3.js\";\nimport { b as get_store_value, c as compute_rest_props, a as subscribe, s as setContext, g as getContext } from \"../../../../chunks/lifecycle.js\";\nimport { w as writable, d as derived, a as readonly } from \"../../../../chunks/index2.js\";\nimport { t as tick } from \"../../../../chunks/scheduler.js\";\nimport { o as overridable, t as toWritableStores, c as createBitAttrs, r as removeUndefined$1, g as getOptionUpdater, a as createDispatcher, f as toast } from \"../../../../chunks/Toaster.svelte_svelte_type_style_lang.js\";\nimport { g as generateIds, c as createTypeaheadSearch, d as derivedVisible, x as last, y as back, z as forward, A as prev, B as next, u as usePopper, a as getPortalDestination, C as generateId, k as addHighlight, r as removeHighlight, f as removeScroll, E as toggle, b as usePortal, F as useFloating, G as getCtx$3, l as generateId$1, m as getPositioningUpdater, D as Dialog_portal$1, n as Dialog_overlay$1, o as fade, p as Dialog_content$1, q as Dialog_close, X, v as Dialog, w as Dialog_trigger, H as scale } from \"../../../../chunks/x.js\";\nimport { c as cn, f as flyAndScale, B as Button } from \"../../../../chunks/button.js\";\nimport { tv } from \"tailwind-variants\";\nimport { c as createLabel, F as Form_field, C as Control, a as Form_label, b as Form_description, d as Form_field_errors, S as Switch, I as Input$1, L as Label, T as Textarea } from \"../../../../chunks/textarea.js\";\nimport { p as page } from \"../../../../chunks/stores.js\";\nimport { s as superForm } from \"../../../../chunks/formData.js\";\nimport \"just-clone\";\nimport \"ts-deepmerge\";\nimport \"../../../../chunks/index.js\";\nimport \"devalue\";\nimport \"memoize-weak\";\nimport { z as zodClient } from \"../../../../chunks/zod.js\";\nimport { c as createFormSchema, e as editFormSchema } from \"../../../../chunks/schema2.js\";\nimport { I as Icon } from \"../../../../chunks/Icon.js\";\nimport \"../../../../chunks/config.js\";\nfunction getOptions(el) {\n return Array.from(el.querySelectorAll('[role=\"option\"]:not([data-disabled])')).filter((el2) => isHTMLElement(el2));\n}\nfunction makeHull(points) {\n const newPoints = points.slice();\n newPoints.sort(POINT_COMPARATOR);\n return makeHullPresorted(newPoints);\n}\nfunction makeHullPresorted(points) {\n if (points.length <= 1)\n return points.slice();\n const upperHull = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1];\n const r = upperHull[upperHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x))\n upperHull.pop();\n else\n break;\n }\n upperHull.push(p);\n }\n upperHull.pop();\n const lowerHull = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i];\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1];\n const r = lowerHull[lowerHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x))\n lowerHull.pop();\n else\n break;\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n if (upperHull.length == 1 && lowerHull.length == 1 && upperHull[0].x == lowerHull[0].x && upperHull[0].y == lowerHull[0].y)\n return upperHull;\n else\n return upperHull.concat(lowerHull);\n}\nfunction POINT_COMPARATOR(a, b) {\n if (a.x < b.x)\n return -1;\n else if (a.x > b.x)\n return 1;\n else if (a.y < b.y)\n return -1;\n else if (a.y > b.y)\n return 1;\n else\n return 0;\n}\nfunction getPointsFromEl(el) {\n const rect = el.getBoundingClientRect();\n return [\n { x: rect.left, y: rect.top },\n { x: rect.right, y: rect.top },\n { x: rect.right, y: rect.bottom },\n { x: rect.left, y: rect.bottom }\n ];\n}\nfunction makeHullFromElements(els) {\n const points = els.flatMap((el) => getPointsFromEl(el));\n return makeHull(points);\n}\nfunction pointInPolygon(point, polygon) {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n const intersect = yi > point.y !== yj > point.y && point.x < (xj - xi) * (point.y - yi) / (yj - yi) + xi;\n if (intersect)\n inside = !inside;\n }\n return inside;\n}\nfunction createClickOutsideIgnore(meltId) {\n return (e) => {\n const target = e.target;\n const triggerEl = getElementByMeltId(meltId);\n if (!triggerEl || !isElement(target))\n return false;\n const id = triggerEl.id;\n if (isHTMLLabelElement(target) && id === target.htmlFor) {\n return true;\n }\n if (target.closest(`label[for=\"${id}\"]`)) {\n return true;\n }\n return false;\n };\n}\nconst INTERACTION_KEYS = [kbd.ARROW_LEFT, kbd.ESCAPE, kbd.ARROW_RIGHT, kbd.SHIFT, kbd.CAPS_LOCK, kbd.CONTROL, kbd.ALT, kbd.META, kbd.ENTER, kbd.F1, kbd.F2, kbd.F3, kbd.F4, kbd.F5, kbd.F6, kbd.F7, kbd.F8, kbd.F9, kbd.F10, kbd.F11, kbd.F12];\nconst defaults$2 = {\n positioning: {\n placement: \"bottom\",\n sameWidth: true\n },\n scrollAlignment: \"nearest\",\n loop: true,\n defaultOpen: false,\n closeOnOutsideClick: true,\n preventScroll: true,\n closeOnEscape: true,\n forceVisible: false,\n portal: void 0,\n builder: \"listbox\",\n disabled: false,\n required: false,\n name: void 0,\n typeahead: true,\n highlightOnHover: true,\n onOutsideClick: void 0\n};\nconst listboxIdParts = [\"trigger\", \"menu\", \"label\"];\nfunction createListbox(props) {\n const withDefaults = { ...defaults$2, ...props };\n const activeTrigger = withGet(writable(null));\n const highlightedItem = withGet(writable(null));\n const selectedWritable = withDefaults.selected ?? writable(withDefaults.defaultSelected);\n const selected = overridable(selectedWritable, withDefaults?.onSelectedChange);\n const highlighted = derived(highlightedItem, ($highlightedItem) => $highlightedItem ? getOptionProps($highlightedItem) : void 0);\n const openWritable = withDefaults.open ?? writable(withDefaults.defaultOpen);\n const open = overridable(openWritable, withDefaults?.onOpenChange);\n const options = toWritableStores({\n ...omit(withDefaults, \"open\", \"defaultOpen\", \"builder\", \"ids\"),\n multiple: withDefaults.multiple ?? false\n });\n const { scrollAlignment, loop, closeOnOutsideClick, closeOnEscape, preventScroll, portal, forceVisible, positioning, multiple, arrowSize, disabled, required, typeahead, name: nameProp, highlightOnHover, onOutsideClick } = options;\n const { name: name2, selector: selector2 } = createElHelpers(withDefaults.builder);\n const ids = toWritableStores({ ...generateIds(listboxIdParts), ...withDefaults.ids });\n const { handleTypeaheadSearch } = createTypeaheadSearch({\n onMatch: (element) => {\n highlightedItem.set(element);\n element.scrollIntoView({ block: scrollAlignment.get() });\n },\n getCurrentItem() {\n return highlightedItem.get();\n }\n });\n function getOptionProps(el) {\n const value = el.getAttribute(\"data-value\");\n const label2 = el.getAttribute(\"data-label\");\n const disabled2 = el.hasAttribute(\"data-disabled\");\n return {\n value: value ? JSON.parse(value) : value,\n label: label2 ?? el.textContent ?? void 0,\n disabled: disabled2 ? true : false\n };\n }\n const setOption = (newOption) => {\n selected.update(($option) => {\n const $multiple = multiple.get();\n if ($multiple) {\n const optionArr = Array.isArray($option) ? [...$option] : [];\n return toggle(newOption, optionArr, (itemA, itemB) => dequal(itemA.value, itemB.value));\n }\n return newOption;\n });\n };\n function selectItem(item) {\n const props2 = getOptionProps(item);\n setOption(props2);\n }\n async function openMenu() {\n open.set(true);\n const triggerEl = document.getElementById(ids.trigger.get());\n if (!triggerEl)\n return;\n if (triggerEl !== activeTrigger.get())\n activeTrigger.set(triggerEl);\n await tick();\n const menuElement = document.getElementById(ids.menu.get());\n if (!isHTMLElement(menuElement))\n return;\n const selectedItem = menuElement.querySelector(\"[aria-selected=true]\");\n if (!isHTMLElement(selectedItem))\n return;\n highlightedItem.set(selectedItem);\n }\n function closeMenu() {\n open.set(false);\n highlightedItem.set(null);\n }\n const isVisible = derivedVisible({ open, forceVisible, activeTrigger });\n const isSelected = derived([selected], ([$selected]) => {\n return (value) => {\n if (Array.isArray($selected)) {\n return $selected.some((o) => dequal(o.value, value));\n }\n if (isObject(value)) {\n return dequal($selected?.value, stripValues(value, void 0));\n }\n return dequal($selected?.value, value);\n };\n });\n const isHighlighted = derived([highlighted], ([$value]) => {\n return (item) => {\n return dequal($value?.value, item);\n };\n });\n const trigger = makeElement(name2(\"trigger\"), {\n stores: [open, highlightedItem, disabled, ids.menu, ids.trigger, ids.label],\n returned: ([$open, $highlightedItem, $disabled, $menuId, $triggerId, $labelId]) => {\n return {\n \"aria-activedescendant\": $highlightedItem?.id,\n \"aria-autocomplete\": \"list\",\n \"aria-controls\": $menuId,\n \"aria-expanded\": $open,\n \"aria-labelledby\": $labelId,\n // autocomplete: 'off',\n id: $triggerId,\n role: \"combobox\",\n disabled: disabledAttr($disabled),\n type: withDefaults.builder === \"select\" ? \"button\" : void 0\n };\n },\n action: (node) => {\n const isInput = isHTMLInputElement(node);\n const unsubscribe = executeCallbacks(\n addMeltEventListener(node, \"click\", () => {\n node.focus();\n const $open = open.get();\n if ($open) {\n closeMenu();\n } else {\n openMenu();\n }\n }),\n // Handle all input key events including typing, meta, and navigation.\n addMeltEventListener(node, \"keydown\", (e) => {\n const $open = open.get();\n if (!$open) {\n if (INTERACTION_KEYS.includes(e.key)) {\n return;\n }\n if (e.key === kbd.TAB) {\n return;\n }\n if (e.key === kbd.BACKSPACE && isInput && node.value === \"\") {\n return;\n }\n if (e.key === kbd.SPACE && isHTMLButtonElement(node)) {\n return;\n }\n openMenu();\n tick().then(() => {\n const $selectedItem = selected.get();\n if ($selectedItem)\n return;\n const menuEl = document.getElementById(ids.menu.get());\n if (!isHTMLElement(menuEl))\n return;\n const enabledItems = Array.from(menuEl.querySelectorAll(`${selector2(\"item\")}:not([data-disabled]):not([data-hidden])`)).filter((item) => isHTMLElement(item));\n if (!enabledItems.length)\n return;\n if (e.key === kbd.ARROW_DOWN) {\n highlightedItem.set(enabledItems[0]);\n enabledItems[0].scrollIntoView({ block: scrollAlignment.get() });\n } else if (e.key === kbd.ARROW_UP) {\n highlightedItem.set(last(enabledItems));\n last(enabledItems).scrollIntoView({ block: scrollAlignment.get() });\n }\n });\n }\n if (e.key === kbd.TAB) {\n closeMenu();\n return;\n }\n if (e.key === kbd.ENTER && !e.isComposing || e.key === kbd.SPACE && isHTMLButtonElement(node)) {\n e.preventDefault();\n const $highlightedItem = highlightedItem.get();\n if ($highlightedItem) {\n selectItem($highlightedItem);\n }\n if (!multiple.get()) {\n closeMenu();\n }\n }\n if (e.key === kbd.ARROW_UP && e.altKey) {\n closeMenu();\n }\n if (FIRST_LAST_KEYS.includes(e.key)) {\n e.preventDefault();\n const menuElement = document.getElementById(ids.menu.get());\n if (!isHTMLElement(menuElement))\n return;\n const itemElements = getOptions(menuElement);\n if (!itemElements.length)\n return;\n const candidateNodes = itemElements.filter((opt) => !isElementDisabled(opt) && opt.dataset.hidden === void 0);\n const $currentItem = highlightedItem.get();\n const currentIndex = $currentItem ? candidateNodes.indexOf($currentItem) : -1;\n const $loop = loop.get();\n const $scrollAlignment = scrollAlignment.get();\n let nextItem;\n switch (e.key) {\n case kbd.ARROW_DOWN:\n nextItem = next(candidateNodes, currentIndex, $loop);\n break;\n case kbd.ARROW_UP:\n nextItem = prev(candidateNodes, currentIndex, $loop);\n break;\n case kbd.PAGE_DOWN:\n nextItem = forward(candidateNodes, currentIndex, 10, $loop);\n break;\n case kbd.PAGE_UP:\n nextItem = back(candidateNodes, currentIndex, 10, $loop);\n break;\n case kbd.HOME:\n nextItem = candidateNodes[0];\n break;\n case kbd.END:\n nextItem = last(candidateNodes);\n break;\n default:\n return;\n }\n highlightedItem.set(nextItem);\n nextItem?.scrollIntoView({ block: $scrollAlignment });\n } else if (typeahead.get()) {\n const menuEl = document.getElementById(ids.menu.get());\n if (!isHTMLElement(menuEl))\n return;\n handleTypeaheadSearch(e.key, getOptions(menuEl));\n }\n })\n );\n let unsubEscapeKeydown = noop;\n const escape2 = useEscapeKeydown(node, {\n handler: closeMenu,\n enabled: derived([open, closeOnEscape], ([$open, $closeOnEscape]) => {\n return $open && $closeOnEscape;\n })\n });\n if (escape2 && escape2.destroy) {\n unsubEscapeKeydown = escape2.destroy;\n }\n return {\n destroy() {\n unsubscribe();\n unsubEscapeKeydown();\n }\n };\n }\n });\n const menu = makeElement(name2(\"menu\"), {\n stores: [isVisible, ids.menu],\n returned: ([$isVisible, $menuId]) => {\n return {\n hidden: $isVisible ? void 0 : true,\n id: $menuId,\n role: \"listbox\",\n style: styleToString({ display: $isVisible ? void 0 : \"none\" })\n };\n },\n action: (node) => {\n let unsubPopper = noop;\n const unsubscribe = executeCallbacks(\n // Bind the popper portal to the input element.\n effect([isVisible, portal, closeOnOutsideClick, positioning, activeTrigger], ([$isVisible, $portal, $closeOnOutsideClick, $positioning, $activeTrigger]) => {\n unsubPopper();\n if (!$isVisible || !$activeTrigger)\n return;\n tick().then(() => {\n unsubPopper();\n const ignoreHandler = createClickOutsideIgnore(ids.trigger.get());\n unsubPopper = usePopper(node, {\n anchorElement: $activeTrigger,\n open,\n options: {\n floating: $positioning,\n focusTrap: null,\n modal: {\n closeOnInteractOutside: $closeOnOutsideClick,\n onClose: closeMenu,\n open: $isVisible,\n shouldCloseOnInteractOutside: (e) => {\n onOutsideClick.get()?.(e);\n if (e.defaultPrevented)\n return false;\n const target = e.target;\n if (!isElement(target))\n return false;\n if (target === $activeTrigger || $activeTrigger.contains(target)) {\n return false;\n }\n if (ignoreHandler(e))\n return false;\n return true;\n }\n },\n escapeKeydown: null,\n portal: getPortalDestination(node, $portal)\n }\n }).destroy;\n });\n })\n );\n return {\n destroy: () => {\n unsubscribe();\n unsubPopper();\n }\n };\n }\n });\n const { elements: { root: labelBuilder } } = createLabel();\n const { action: labelAction } = get_store_value(labelBuilder);\n const label = makeElement(name2(\"label\"), {\n stores: [ids.label, ids.trigger],\n returned: ([$labelId, $triggerId]) => {\n return {\n id: $labelId,\n for: $triggerId\n };\n },\n action: labelAction\n });\n const option = makeElement(name2(\"option\"), {\n stores: [isSelected],\n returned: ([$isSelected]) => (props2) => {\n const selected2 = $isSelected(props2.value);\n return {\n \"data-value\": JSON.stringify(props2.value),\n \"data-label\": props2.label,\n \"data-disabled\": disabledAttr(props2.disabled),\n \"aria-disabled\": props2.disabled ? true : void 0,\n \"aria-selected\": selected2,\n \"data-selected\": selected2 ? \"\" : void 0,\n id: generateId(),\n role: \"option\"\n };\n },\n action: (node) => {\n const unsubscribe = executeCallbacks(addMeltEventListener(node, \"click\", (e) => {\n if (isElementDisabled(node)) {\n e.preventDefault();\n return;\n }\n selectItem(node);\n if (!multiple.get()) {\n closeMenu();\n }\n }), effect(highlightOnHover, ($highlightOnHover) => {\n if (!$highlightOnHover)\n return;\n const unsub = executeCallbacks(addMeltEventListener(node, \"mouseover\", () => {\n highlightedItem.set(node);\n }), addMeltEventListener(node, \"mouseleave\", () => {\n highlightedItem.set(null);\n }));\n return unsub;\n }));\n return { destroy: unsubscribe };\n }\n });\n const group = makeElement(name2(\"group\"), {\n returned: () => {\n return (groupId) => ({\n role: \"group\",\n \"aria-labelledby\": groupId\n });\n }\n });\n const groupLabel = makeElement(name2(\"group-label\"), {\n returned: () => {\n return (groupId) => ({\n id: groupId\n });\n }\n });\n const hiddenInput = createHiddenInput({\n value: derived([selected], ([$selected]) => {\n const value = Array.isArray($selected) ? $selected.map((o) => o.value) : $selected?.value;\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }),\n name: readonly(nameProp),\n required,\n prefix: withDefaults.builder\n });\n const arrow = makeElement(name2(\"arrow\"), {\n stores: arrowSize,\n returned: ($arrowSize) => ({\n \"data-arrow\": true,\n style: styleToString({\n position: \"absolute\",\n width: `var(--arrow-size, ${$arrowSize}px)`,\n height: `var(--arrow-size, ${$arrowSize}px)`\n })\n })\n });\n safeOnMount(() => {\n if (!isBrowser)\n return;\n const menuEl = document.getElementById(ids.menu.get());\n const triggerEl = document.getElementById(ids.trigger.get());\n if (triggerEl) {\n activeTrigger.set(triggerEl);\n }\n if (!menuEl)\n return;\n const selectedEl = menuEl.querySelector(\"[data-selected]\");\n if (!isHTMLElement(selectedEl))\n return;\n });\n effect([highlightedItem], ([$highlightedItem]) => {\n if (!isBrowser)\n return;\n const menuElement = document.getElementById(ids.menu.get());\n if (!isHTMLElement(menuElement))\n return;\n getOptions(menuElement).forEach((node) => {\n if (node === $highlightedItem) {\n addHighlight(node);\n } else {\n removeHighlight(node);\n }\n });\n });\n effect([open], ([$open]) => {\n if (!isBrowser)\n return;\n let unsubScroll = noop;\n if (preventScroll.get() && $open) {\n unsubScroll = removeScroll();\n }\n return () => {\n unsubScroll();\n };\n });\n return {\n ids,\n elements: {\n trigger,\n group,\n option,\n menu,\n groupLabel,\n label,\n hiddenInput,\n arrow\n },\n states: {\n open,\n selected,\n highlighted,\n highlightedItem\n },\n helpers: {\n isSelected,\n isHighlighted,\n closeMenu\n },\n options\n };\n}\nfunction getPageItems({ page: page2 = 1, totalPages, siblingCount = 1 }) {\n const pageItems = [];\n const pagesToShow = /* @__PURE__ */ new Set([1, totalPages]);\n const firstItemWithSiblings = 3 + siblingCount;\n const lastItemWithSiblings = totalPages - 2 - siblingCount;\n if (firstItemWithSiblings > lastItemWithSiblings) {\n for (let p = 2; p <= totalPages - 1; p++) {\n pagesToShow.add(p);\n }\n } else if (page2 < firstItemWithSiblings) {\n for (let p = 2; p <= Math.min(firstItemWithSiblings, totalPages); p++) {\n pagesToShow.add(p);\n }\n } else if (page2 > lastItemWithSiblings) {\n for (let p = totalPages - 1; p >= Math.max(lastItemWithSiblings, 2); p--) {\n pagesToShow.add(p);\n }\n } else {\n for (let p = Math.max(page2 - siblingCount, 2); p <= Math.min(page2 + siblingCount, totalPages); p++) {\n pagesToShow.add(p);\n }\n }\n const addPage = (value) => {\n pageItems.push({ type: \"page\", value, key: `page-${value}` });\n };\n const addEllipsis = () => {\n pageItems.push({ type: \"ellipsis\", key: `ellipsis-${pageItems.length}` });\n };\n let lastNumber = 0;\n for (const page3 of Array.from(pagesToShow).sort((a, b) => a - b)) {\n if (page3 - lastNumber > 1) {\n addEllipsis();\n }\n addPage(page3);\n lastNumber = page3;\n }\n return pageItems;\n}\nconst defaults$1 = {\n perPage: 1,\n siblingCount: 1,\n defaultPage: 1\n};\nconst { name: name$1, selector } = createElHelpers(\"pagination\");\nfunction createPagination(props) {\n const withDefaults = { ...defaults$1, ...props };\n const pageWritable = withDefaults.page ?? writable(withDefaults.defaultPage);\n const page2 = overridable(pageWritable, withDefaults?.onPageChange);\n const options = toWritableStores(omit(withDefaults, \"page\", \"onPageChange\", \"defaultPage\"));\n const { perPage, siblingCount, count } = options;\n const totalPages = withGet.derived([count, perPage], ([$count, $perPage]) => {\n return Math.ceil($count / $perPage);\n });\n const range = derived([page2, perPage, count], ([$page, $perPage, $count]) => {\n const start = ($page - 1) * $perPage;\n const end = Math.min(start + $perPage, $count);\n return { start, end };\n });\n const root = makeElement(name$1(), {\n returned: () => ({\n \"data-scope\": \"pagination\"\n })\n });\n const pages = derived([page2, totalPages, siblingCount], ([$page, $totalPages, $siblingCount]) => {\n return getPageItems({ page: $page, totalPages: $totalPages, siblingCount: $siblingCount });\n });\n const keydown = (e) => {\n const thisEl = e.target;\n if (!isHTMLElement(thisEl))\n return;\n const rootEl = thisEl.closest('[data-scope=\"pagination\"]');\n if (!isHTMLElement(rootEl))\n return;\n const triggers = Array.from(rootEl.querySelectorAll(selector(\"page\"))).filter((el) => isHTMLElement(el));\n const prevButton2 = rootEl.querySelector(selector(\"prev\"));\n const nextButton2 = rootEl.querySelector(selector(\"next\"));\n if (isHTMLElement(prevButton2)) {\n triggers.unshift(prevButton2);\n }\n if (isHTMLElement(nextButton2)) {\n triggers.push(nextButton2);\n }\n const index = triggers.indexOf(thisEl);\n if (e.key === kbd.ARROW_LEFT && index !== 0) {\n e.preventDefault();\n triggers[index - 1].focus();\n } else if (e.key === kbd.ARROW_RIGHT && index !== triggers.length - 1) {\n e.preventDefault();\n triggers[index + 1].focus();\n } else if (e.key === kbd.HOME) {\n e.preventDefault();\n triggers[0].focus();\n } else if (e.key === kbd.END) {\n e.preventDefault();\n triggers[triggers.length - 1].focus();\n }\n };\n const pageTrigger = makeElement(name$1(\"page\"), {\n stores: page2,\n returned: ($page) => {\n return (pageItem) => {\n return {\n \"aria-label\": `Page ${pageItem.value}`,\n \"data-value\": pageItem.value,\n \"data-selected\": pageItem.value === $page ? \"\" : void 0\n };\n };\n },\n action: (node) => {\n const unsub = executeCallbacks(addMeltEventListener(node, \"click\", () => {\n const value = node.dataset.value;\n if (!value || Number.isNaN(+value))\n return;\n page2.set(Number(value));\n }), addMeltEventListener(node, \"keydown\", keydown));\n return {\n destroy: unsub\n };\n }\n });\n const prevButton = makeElement(name$1(\"prev\"), {\n stores: page2,\n returned: ($page) => {\n return {\n \"aria-label\": \"Previous\",\n disabled: $page <= 1\n };\n },\n action: (node) => {\n const unsub = executeCallbacks(addMeltEventListener(node, \"click\", () => {\n page2.update((p) => Math.max(p - 1, 1));\n }), addMeltEventListener(node, \"keydown\", keydown));\n return {\n destroy: unsub\n };\n }\n });\n const nextButton = makeElement(name$1(\"next\"), {\n stores: [page2, totalPages],\n returned: ([$page, $totalPages]) => {\n return {\n \"aria-label\": \"Next\",\n disabled: $page >= $totalPages\n };\n },\n action: (node) => {\n const unsub = executeCallbacks(addMeltEventListener(node, \"click\", () => {\n const $totalPages = totalPages.get();\n page2.update((p) => Math.min(p + 1, $totalPages));\n }), addMeltEventListener(node, \"keydown\", keydown));\n return {\n destroy: unsub\n };\n }\n });\n return {\n elements: {\n root,\n pageTrigger,\n prevButton,\n nextButton\n },\n states: {\n range: readonly(range),\n page: page2,\n pages: readonly(pages),\n totalPages: readonly(totalPages)\n },\n options\n };\n}\nfunction createSelect(props) {\n const listbox = createListbox({ ...props, builder: \"select\" });\n const selectedLabel = derived(listbox.states.selected, ($selected) => {\n if (Array.isArray($selected)) {\n return $selected.map((o) => o.label).join(\", \");\n }\n return $selected?.label ?? \"\";\n });\n return {\n ...listbox,\n elements: {\n ...listbox.elements\n },\n states: {\n ...listbox.states,\n selectedLabel\n }\n };\n}\nconst defaults = {\n positioning: {\n placement: \"bottom\"\n },\n arrowSize: 8,\n defaultOpen: false,\n closeOnPointerDown: true,\n openDelay: 1e3,\n closeDelay: 0,\n forceVisible: false,\n portal: void 0,\n closeOnEscape: true,\n disableHoverableContent: false,\n group: void 0\n};\nconst { name } = createElHelpers(\"tooltip\");\nconst groupMap = /* @__PURE__ */ new Map();\nconst tooltipIdParts = [\"trigger\", \"content\"];\nfunction createTooltip(props) {\n const withDefaults = { ...defaults, ...props };\n const options = toWritableStores(omit(withDefaults, \"open\", \"ids\"));\n const { positioning, arrowSize, closeOnPointerDown, openDelay, closeDelay, forceVisible, portal, closeOnEscape, disableHoverableContent, group } = options;\n const openWritable = withDefaults.open ?? writable(withDefaults.defaultOpen);\n const open = overridable(openWritable, withDefaults?.onOpenChange);\n const openReason = writable(null);\n const ids = toWritableStores({ ...generateIds(tooltipIdParts), ...withDefaults.ids });\n let clickedTrigger = false;\n const getEl = (part) => {\n if (!isBrowser)\n return null;\n return document.getElementById(ids[part].get());\n };\n let openTimeout = null;\n let closeTimeout = null;\n function openTooltip(reason) {\n if (closeTimeout) {\n window.clearTimeout(closeTimeout);\n closeTimeout = null;\n }\n if (!openTimeout) {\n openTimeout = window.setTimeout(() => {\n open.set(true);\n openReason.update((prev2) => prev2 ?? reason);\n openTimeout = null;\n }, openDelay.get());\n }\n }\n function closeTooltip(isBlur) {\n if (openTimeout) {\n window.clearTimeout(openTimeout);\n openTimeout = null;\n }\n if (isBlur && isMouseInTooltipArea) {\n openReason.set(\"pointer\");\n return;\n }\n if (!closeTimeout) {\n closeTimeout = window.setTimeout(() => {\n open.set(false);\n openReason.set(null);\n if (isBlur)\n clickedTrigger = false;\n closeTimeout = null;\n }, closeDelay.get());\n }\n }\n const isVisible = derived([open, forceVisible], ([$open, $forceVisible]) => {\n return $open || $forceVisible;\n });\n const trigger = makeElement(name(\"trigger\"), {\n stores: [ids.content, ids.trigger, open],\n returned: ([$contentId, $triggerId, $open]) => {\n return {\n \"aria-describedby\": $contentId,\n id: $triggerId,\n \"data-state\": $open ? \"open\" : \"closed\"\n };\n },\n action: (node) => {\n const keydownHandler = (e) => {\n if (closeOnEscape.get() && e.key === kbd.ESCAPE) {\n if (openTimeout) {\n window.clearTimeout(openTimeout);\n openTimeout = null;\n }\n open.set(false);\n }\n };\n const unsub = executeCallbacks(addMeltEventListener(node, \"pointerdown\", () => {\n const $closeOnPointerDown = closeOnPointerDown.get();\n if (!$closeOnPointerDown)\n return;\n open.set(false);\n clickedTrigger = true;\n if (openTimeout) {\n window.clearTimeout(openTimeout);\n openTimeout = null;\n }\n }), addMeltEventListener(node, \"pointerenter\", (e) => {\n if (isTouch(e))\n return;\n openTooltip(\"pointer\");\n }), addMeltEventListener(node, \"pointerleave\", (e) => {\n if (isTouch(e))\n return;\n if (openTimeout) {\n window.clearTimeout(openTimeout);\n openTimeout = null;\n }\n }), addMeltEventListener(node, \"focus\", () => {\n if (clickedTrigger)\n return;\n openTooltip(\"focus\");\n }), addMeltEventListener(node, \"blur\", () => closeTooltip(true)), addMeltEventListener(node, \"keydown\", keydownHandler), addEventListener(document, \"keydown\", keydownHandler));\n return {\n destroy: unsub\n };\n }\n });\n const content = makeElement(name(\"content\"), {\n stores: [isVisible, open, portal, ids.content],\n returned: ([$isVisible, $open, $portal, $contentId]) => {\n return removeUndefined({\n role: \"tooltip\",\n hidden: $isVisible ? void 0 : true,\n tabindex: -1,\n style: $isVisible ? void 0 : styleToString({ display: \"none\" }),\n id: $contentId,\n \"data-portal\": portalAttr($portal),\n \"data-state\": $open ? \"open\" : \"closed\"\n });\n },\n action: (node) => {\n let unsubFloating = noop;\n let unsubPortal = noop;\n const unsubDerived = effect([isVisible, positioning, portal], ([$isVisible, $positioning, $portal]) => {\n unsubPortal();\n unsubFloating();\n const triggerEl = getEl(\"trigger\");\n if (!$isVisible || !triggerEl)\n return;\n tick().then(() => {\n unsubPortal();\n unsubFloating();\n const portalDest = getPortalDestination(node, $portal);\n if (portalDest)\n unsubPortal = usePortal(node, portalDest).destroy;\n unsubFloating = useFloating(triggerEl, node, $positioning).destroy;\n });\n });\n function handleScroll(e) {\n if (!open.get())\n return;\n const target = e.target;\n if (!isElement(target) && !isDocument(target))\n return;\n const triggerEl = getEl(\"trigger\");\n if (triggerEl && target.contains(triggerEl)) {\n closeTooltip();\n }\n }\n const unsubEvents = executeCallbacks(addMeltEventListener(node, \"pointerenter\", () => openTooltip(\"pointer\")), addMeltEventListener(node, \"pointerdown\", () => openTooltip(\"pointer\")), addEventListener(window, \"scroll\", handleScroll, { capture: true }));\n return {\n destroy() {\n unsubEvents();\n unsubPortal();\n unsubFloating();\n unsubDerived();\n }\n };\n }\n });\n const arrow = makeElement(name(\"arrow\"), {\n stores: arrowSize,\n returned: ($arrowSize) => ({\n \"data-arrow\": true,\n style: styleToString({\n position: \"absolute\",\n width: `var(--arrow-size, ${$arrowSize}px)`,\n height: `var(--arrow-size, ${$arrowSize}px)`\n })\n })\n });\n let isMouseInTooltipArea = false;\n effect(open, ($open) => {\n const currentGroup = group.get();\n if (currentGroup === void 0 || currentGroup === false) {\n return;\n }\n if (!$open) {\n if (groupMap.get(currentGroup) === open) {\n groupMap.delete(currentGroup);\n }\n return;\n }\n const currentOpen = groupMap.get(currentGroup);\n currentOpen?.set(false);\n groupMap.set(currentGroup, open);\n });\n effect([open, openReason], ([$open, $openReason]) => {\n if (!$open || !isBrowser)\n return;\n return executeCallbacks(addEventListener(document, \"mousemove\", (e) => {\n const contentEl = getEl(\"content\");\n const triggerEl = getEl(\"trigger\");\n if (!contentEl || !triggerEl)\n return;\n const polygonElements = disableHoverableContent.get() ? [triggerEl] : [triggerEl, contentEl];\n const polygon = makeHullFromElements(polygonElements);\n isMouseInTooltipArea = pointInPolygon({\n x: e.clientX,\n y: e.clientY\n }, polygon);\n if ($openReason !== \"pointer\")\n return;\n if (!isMouseInTooltipArea) {\n closeTooltip();\n }\n }));\n });\n return {\n ids,\n elements: {\n trigger,\n content,\n arrow\n },\n states: { open },\n options\n };\n}\nfunction arraysAreEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n return arr1.every((value, index) => value === arr2[index]);\n}\nconst Dialog_title$1 = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let builder;\n let $$restProps = compute_rest_props($$props, [\"level\", \"asChild\", \"id\", \"el\"]);\n let $title, $$unsubscribe_title;\n let { level = \"h2\" } = $$props;\n let { asChild = false } = $$props;\n let { id = void 0 } = $$props;\n let { el = void 0 } = $$props;\n const { elements: { title }, ids, getAttrs } = getCtx$3();\n $$unsubscribe_title = subscribe(title, (value) => $title = value);\n const attrs = getAttrs(\"title\");\n if ($$props.level === void 0 && $$bindings.level && level !== void 0)\n $$bindings.level(level);\n if ($$props.asChild === void 0 && $$bindings.asChild && asChild !== void 0)\n $$bindings.asChild(asChild);\n if ($$props.id === void 0 && $$bindings.id && id !== void 0)\n $$bindings.id(id);\n if ($$props.el === void 0 && $$bindings.el && el !== void 0)\n $$bindings.el(el);\n {\n if (id) {\n ids.title.set(id);\n }\n }\n builder = $title;\n {\n Object.assign(builder, attrs);\n }\n $$unsubscribe_title();\n return `${asChild ? `${slots.default ? slots.default({ builder }) : ``}` : `${((tag) => {\n return tag ? `<${level}${spread([escape_object(builder), escape_object($$restProps)], {})}${add_attribute(\"this\", el, 0)}>${is_void(tag) ? \"\" : `${slots.default ? slots.default({ builder }) : ``}`}${is_void(tag) ? \"\" : `${tag}>`}` : \"\";\n })(level)}`}`;\n});\nconst Dialog_description$1 = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let builder;\n let $$restProps = compute_rest_props($$props, [\"asChild\", \"id\", \"el\"]);\n let $description, $$unsubscribe_description;\n let { asChild = false } = $$props;\n let { id = void 0 } = $$props;\n let { el = void 0 } = $$props;\n const { elements: { description }, ids, getAttrs } = getCtx$3();\n $$unsubscribe_description = subscribe(description, (value) => $description = value);\n const attrs = getAttrs(\"description\");\n if ($$props.asChild === void 0 && $$bindings.asChild && asChild !== void 0)\n $$bindings.asChild(asChild);\n if ($$props.id === void 0 && $$bindings.id && id !== void 0)\n $$bindings.id(id);\n if ($$props.el === void 0 && $$bindings.el && el !== void 0)\n $$bindings.el(el);\n {\n if (id) {\n ids.description.set(id);\n }\n }\n builder = $description;\n {\n Object.assign(builder, attrs);\n }\n $$unsubscribe_description();\n return `${asChild ? `${slots.default ? slots.default({ builder }) : ``}` : `
${escape(tip)}
`;\n }\n })}`;\n }\n })}`;\n});\ntv({\n base: \"inline-flex select-none items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n variants: {\n variant: {\n default: \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive: \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\"\n }\n },\n defaultVariants: {\n variant: \"default\"\n }\n});\nconst Dialog_title = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let $$restProps = compute_rest_props($$props, [\"class\"]);\n let { class: className = void 0 } = $$props;\n if ($$props.class === void 0 && $$bindings.class && className !== void 0)\n $$bindings.class(className);\n return `${validate_component(Dialog_title$1, \"DialogPrimitive.Title\").$$render(\n $$result,\n Object.assign(\n {},\n {\n class: cn(\"text-lg font-semibold leading-none tracking-tight\", className)\n },\n $$restProps\n ),\n {},\n {\n default: () => {\n return `${slots.default ? slots.default({}) : ``}`;\n }\n }\n )}`;\n});\nconst Dialog_portal = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let $$restProps = compute_rest_props($$props, []);\n return `${validate_component(Dialog_portal$1, \"DialogPrimitive.Portal\").$$render($$result, Object.assign({}, $$restProps), {}, {\n default: () => {\n return `${slots.default ? slots.default({}) : ``}`;\n }\n })}`;\n});\nconst Dialog_footer = create_ssr_component(($$result, $$props, $$bindings, slots) => {\n let $$restProps = compute_rest_props($$props, [\"class\"]);\n let { class: className = void 0 } = $$props;\n if ($$props.class === void 0 && $$bindings.class && className !== void 0)\n $$bindings.class(className);\n return `You don't have any articles yet. Start by making one!
`}