{"version":3,"sources":["../../../../../src/main/resources/assets/scripts/main.ts"],"sourcesContent":["/* Upvote (poeng) på artikler — én stemme per nettleser, toggle som Reddit */\nconst upvoteKey = (articleId: string) => `upvoted:${articleId}`;\n\nfunction markVotedButtons() {\n  document.querySelectorAll<HTMLElement>(\"[data-upvote]\").forEach((btn) => {\n    const id = btn.dataset.articleId;\n    if (id && localStorage.getItem(upvoteKey(id)) === \"1\") {\n      btn.classList.add(\"voted\");\n    }\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", markVotedButtons);\ndocument.addEventListener(\"turbo:load\", markVotedButtons);\n\ndocument.addEventListener(\"click\", async (event) => {\n  const button = (event.target as HTMLElement).closest<HTMLButtonElement>(\"[data-upvote]\");\n  if (!button) return;\n\n  event.preventDefault();\n\n  const articleId = button.dataset.articleId;\n  const serviceUrl = button.dataset.serviceUrl;\n  if (!articleId || !serviceUrl) return;\n\n  const key = upvoteKey(articleId);\n  const up = localStorage.getItem(key) !== \"1\"; // ikke stemt → gi poeng, ellers fjern\n\n  button.disabled = true;\n  try {\n    const response = await fetch(serviceUrl, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ contentId: articleId, up }),\n    });\n\n    const data = await response.json();\n    if (typeof data.count === \"number\") {\n      const countEl = button.querySelector(\"[data-upvote-count]\");\n      if (countEl) countEl.textContent = String(data.count);\n\n      if (up) {\n        localStorage.setItem(key, \"1\");\n        button.classList.add(\"voted\");\n      } else {\n        localStorage.removeItem(key);\n        button.classList.remove(\"voted\");\n      }\n    }\n  } catch (error) {\n    console.error(\"Upvote failed:\", error);\n  } finally {\n    button.disabled = false;\n  }\n});\n\n/* Inline front-end editor — kun for innloggede admins, lagrer til kladd */\ntype EditItem = { keep: number } | { text: TextBlockPayload };\ntype TextBlockPayload = {\n  title?: string;\n  text?: string;\n  width?: string;\n  theme?: string;\n  marginBottom?: string;\n};\n\nfunction urlWithoutEdit(): string {\n  const url = new URL(window.location.href);\n  url.searchParams.delete(\"edit\");\n  return url.pathname + (url.search ? url.search : \"\") + url.hash;\n}\n\nfunction collectBlocks(root: HTMLElement): EditItem[] {\n  const items: EditItem[] = [];\n  root.querySelectorAll<HTMLElement>(\".editable-block\").forEach((block) => {\n    if (block.dataset.blockType === \"blocks-text\") {\n      const title = block.querySelector<HTMLElement>(\"[data-block-title]\");\n      const body = block.querySelector<HTMLElement>(\"[data-block-text]\");\n      items.push({\n        text: {\n          title: title?.textContent?.trim() || undefined,\n          text: body?.innerHTML ?? \"\",\n          width: block.dataset.width ?? \"content\",\n          theme: block.dataset.theme ?? \"none\",\n          marginBottom: block.dataset.margin ?? \"md\",\n        },\n      });\n    } else if (block.dataset.blockIndex !== undefined) {\n      items.push({ keep: Number(block.dataset.blockIndex) });\n    }\n  });\n  return items;\n}\n\nfunction showEditToast(message: string) {\n  const toast = document.createElement(\"div\");\n  toast.className = \"edit-toast\";\n  toast.textContent = message;\n  document.body.appendChild(toast);\n  requestAnimationFrame(() => toast.classList.add(\"is-visible\"));\n  setTimeout(() => {\n    toast.classList.remove(\"is-visible\");\n    setTimeout(() => toast.remove(), 300);\n  }, 2200);\n}\n\nfunction initEditor() {\n  const body = document.body;\n  if (!body.dataset.editMode) return;\n\n  const container = document.querySelector<HTMLElement>(\"[data-blocks-edit]\");\n  const addBtn = container?.querySelector<HTMLButtonElement>(\"[data-block-add]\");\n  const template = document.querySelector<HTMLTemplateElement>(\"#new-text-block-template\");\n\n  // Legg til ny tekstblokk\n  addBtn?.addEventListener(\"click\", () => {\n    if (!template || !container) return;\n    const fragment = template.content.cloneNode(true) as DocumentFragment;\n    container.insertBefore(fragment, addBtn);\n    const added = addBtn.previousElementSibling?.querySelector<HTMLElement>(\"[data-block-text]\");\n    added?.focus();\n  });\n\n  // Fjern blokk (event delegation)\n  container?.addEventListener(\"click\", (event) => {\n    const remove = (event.target as HTMLElement).closest<HTMLElement>(\"[data-block-remove]\");\n    if (remove) remove.closest(\".editable-block\")?.remove();\n  });\n\n  // Avbryt\n  document.querySelector<HTMLElement>(\"[data-edit-cancel]\")?.addEventListener(\"click\", () => {\n    window.location.assign(urlWithoutEdit());\n  });\n\n  const saveBtn = document.querySelector<HTMLButtonElement>(\"[data-edit-save]\");\n  const publishBtn = document.querySelector<HTMLButtonElement>(\"[data-edit-publish]\");\n  const actionButtons = [saveBtn, publishBtn].filter((b): b is HTMLButtonElement => !!b);\n\n  // Lagre (kladd) og Publiser (kladd → master) deler samme lagre-kall.\n  async function submit(button: HTMLButtonElement, publish: boolean, pendingLabel: string) {\n    if (!container) return;\n    const contentId = body.dataset.contentId;\n    const serviceUrl = body.dataset.editServiceUrl;\n    if (!contentId || !serviceUrl) return;\n\n    const originals = actionButtons.map((b) => b.textContent);\n    actionButtons.forEach((b) => (b.disabled = true));\n    button.textContent = pendingLabel;\n\n    const restore = () => {\n      actionButtons.forEach((b, i) => {\n        b.disabled = false;\n        b.textContent = originals[i];\n      });\n    };\n\n    try {\n      const response = await fetch(serviceUrl, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ contentId, blocks: collectBlocks(container), publish }),\n      });\n      const data = await response.json();\n      if (data.ok) {\n        restore();\n        showEditToast(publish ? \"Publisert\" : \"Arkivert\");\n      } else {\n        console.error(\"Lagring feilet:\", data.error);\n        restore();\n        alert(\"Lagring feilet: \" + (data.error ?? \"ukjent feil\"));\n      }\n    } catch (error) {\n      console.error(\"Lagring feilet:\", error);\n      restore();\n      alert(\"Lagring feilet.\");\n    }\n  }\n\n  saveBtn?.addEventListener(\"click\", () => submit(saveBtn, false, \"Lagrer …\"));\n  publishBtn?.addEventListener(\"click\", () => submit(publishBtn, true, \"Publiserer …\"));\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", initEditor);\ndocument.addEventListener(\"turbo:load\", initEditor);\n\n/* Spons en kaffe — faste beløp, redirect til Stripe Checkout */\ndocument.addEventListener(\"click\", async (event) => {\n  const tier = (event.target as HTMLElement).closest<HTMLButtonElement>(\"[data-coffee-amount]\");\n  if (!tier) return;\n\n  event.preventDefault();\n\n  const wrap = tier.closest<HTMLElement>(\"[data-coffee]\");\n  const serviceUrl = wrap?.dataset.serviceUrl;\n  const amount = tier.dataset.coffeeAmount;\n  if (!wrap || !serviceUrl || !amount) return;\n\n  const buttons = wrap.querySelectorAll<HTMLButtonElement>(\"[data-coffee-amount]\");\n  buttons.forEach((b) => (b.disabled = true));\n\n  try {\n    const response = await fetch(serviceUrl, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({\n        amount: Number(amount),\n        // Takkesiden fra nettstedsinnstillingene, ellers kort takkemelding på forsiden\n        successUrl: wrap.dataset.successUrl\n          ? `${window.location.origin}${wrap.dataset.successUrl}`\n          : `${window.location.origin}/?coffee=takk`,\n        cancelUrl: window.location.href,\n      }),\n    });\n\n    const data = await response.json();\n    if (data.sessionUrl) {\n      window.location.href = data.sessionUrl;\n    } else {\n      console.error(\"Coffee checkout error:\", data.error);\n      buttons.forEach((b) => (b.disabled = false));\n    }\n  } catch (error) {\n    console.error(\"Coffee checkout failed:\", error);\n    buttons.forEach((b) => (b.disabled = false));\n  }\n});\n\n/* Takk-melding etter fullført kaffe-sponsing */\nfunction showCoffeeThanks() {\n  const params = new URLSearchParams(window.location.search);\n  if (params.get(\"coffee\") !== \"takk\") return;\n\n  const toast = document.createElement(\"div\");\n  toast.className = \"coffee-thanks\";\n  toast.textContent = \"Takk for kaffen! ☕\";\n  document.body.appendChild(toast);\n  setTimeout(() => toast.remove(), 5000);\n\n  params.delete(\"coffee\");\n  const query = params.toString();\n  window.history.replaceState({}, \"\", window.location.pathname + (query ? `?${query}` : \"\"));\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", showCoffeeThanks);\ndocument.addEventListener(\"turbo:load\", showCoffeeThanks);\n\ndocument.addEventListener(\"submit\", async (event) => {\n  const form = (event.target as HTMLElement).closest<HTMLFormElement>(\"[data-product-id]\");\n  if (!form) return;\n\n  event.preventDefault();\n\n  const productId = form.dataset.productId;\n  const serviceUrl = form.dataset.serviceUrl;\n  if (!productId || !serviceUrl) return;\n\n  const formData = new FormData(form);\n  const button = form.querySelector<HTMLButtonElement>(\"button[type=submit]\");\n  if (button) button.disabled = true;\n\n  const successUrl = form.dataset.successUrl ? `${window.location.origin}${form.dataset.successUrl}` : undefined;\n  const cancelUrl = form.dataset.cancelUrl ? `${window.location.origin}${form.dataset.cancelUrl}` : undefined;\n\n  try {\n    const response = await fetch(serviceUrl, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({\n        contentId: productId,\n        size: formData.get(\"size\"),\n        variant: formData.get(\"variant\"),\n        successUrl,\n        cancelUrl,\n      }),\n    });\n\n    const data = await response.json();\n\n    if (data.sessionUrl) {\n      window.location.href = data.sessionUrl;\n    } else {\n      console.error(\"Stripe checkout error:\", data.error);\n      if (data.error) alert(data.error);\n      if (button) button.disabled = false;\n    }\n  } catch (error) {\n    console.error(\"Checkout request failed:\", error);\n    if (button) button.disabled = false;\n  }\n});\n\n// Product-list hover: on hover switch to the next image immediately, then advance\n// through the remaining images every 2s; reset to the first image on mouse-out.\nconst HOVER_CYCLE_MS = 2000;\n\nfunction initProductHoverCycle(): void {\n  const figures = document.querySelectorAll<HTMLElement>(\"[data-hover-cycle]\");\n  figures.forEach((figure) => {\n    if (figure.dataset.hoverCycleInit) return;\n    figure.dataset.hoverCycleInit = \"1\";\n\n    const slides = Array.from(figure.querySelectorAll<HTMLImageElement>(\".slide\"));\n    if (slides.length < 2) return;\n\n    let index = 0;\n    let timer: number | undefined;\n\n    const show = (next: number): void => {\n      slides[index].classList.remove(\"is-active\");\n      index = (next + slides.length) % slides.length;\n      slides[index].classList.add(\"is-active\");\n    };\n\n    figure.addEventListener(\"mouseenter\", () => {\n      show(index + 1);\n      timer = window.setInterval(() => show(index + 1), HOVER_CYCLE_MS);\n    });\n\n    figure.addEventListener(\"mouseleave\", () => {\n      if (timer) {\n        clearInterval(timer);\n        timer = undefined;\n      }\n      show(0);\n    });\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", initProductHoverCycle);\ndocument.addEventListener(\"turbo:load\", initProductHoverCycle);\n"],"mappings":"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","names":["upvoteKey","articleId","markVotedButtons","btn","id","event","button","serviceUrl","key","up","data","countEl","error","urlWithoutEdit","url","collectBlocks","root","items","block","title","body","showEditToast","message","toast","initEditor","container","addBtn","template","fragment","remove","saveBtn","publishBtn","actionButtons","b","submit","publish","pendingLabel","contentId","originals","restore","i","tier","wrap","amount","buttons","showCoffeeThanks","params","query","form","productId","formData","successUrl","cancelUrl","HOVER_CYCLE_MS","initProductHoverCycle","figure","slides","index","timer","show","next"]}