{
  "version": 3,
  "sources": ["../../frontend/src/dom.js", "../../frontend/src/comments.js", "../../frontend/src/header.js", "../../frontend/src/hero.js", "../../frontend/src/storage.js", "../../frontend/src/program.js", "../../frontend/src/konami.js", "../../frontend/src/contentCard.js", "../../frontend/src/stats.js", "../../frontend/src/lightbox.js", "../../frontend/src/feedback.js", "../../frontend/src/index.js"],
  "sourcesContent": ["export const query = (selector, element = document) =>\n  element.querySelector(selector);\n\nexport const queryAll = (selector, element = document) => {\n  const nodeList = element.querySelectorAll(selector);\n  return Array.from(nodeList);\n};\n\nexport const ready = (onReady) => {\n  if (document.readyState === \"complete\") {\n    onReady();\n  } else {\n    window.addEventListener(\"load\", () => {\n      onReady();\n    });\n  }\n};\n", "import { query, queryAll, ready } from \"./dom\";\n\nconst elements = {\n  commentInput: () => query(\"#id_comment\"),\n  replyToButtons: () => queryAll(\".js-comment-reply\"),\n  replyToInput: () => query(\"#id_reply_to\"),\n  replyToText: () => query(\"#comment-replying-to\"),\n};\n\nconst onReplyClick = (event) => {\n  const id = event.target.dataset.id;\n  elements.replyToText().textContent = `Vastaamassa kommenttiin #${id}`;\n  elements.replyToInput().value = id;\n  location.href = \"#comment_form\";\n  elements.commentInput().focus();\n};\n\nexport const setup = () => {\n  elements.replyToButtons().forEach((elem) => {\n    elem.addEventListener(\"click\", onReplyClick);\n  });\n  const error = query(\"#comment_form .js-error\");\n  if (error) {\n    ready(() => {\n      error.scrollIntoView();\n    });\n  }\n};\n", "import { query } from \"./dom\";\n\nconst elements = {\n  html: () => query(\"html\"),\n  menuButton: () => query(\".js-header-menu-button\"),\n  nav: (type) => query(`.js-header-nav-${type}`),\n  profileButton: () => query(\".js-header-profile-button\"),\n  searchButton: () => query(\".js-header-search-button\"),\n  searchDialog: () => query(\"#search-dialog\"),\n  searchInput: () => query(\"#search-input\"),\n  searchForm: () => query(\"#search-form\"),\n  searchResults: () => query(\"#search-results\"),\n  searchClose: () => query(\"#search-close\"),\n};\n\nconst menuOpenAnimationLength = 600;\nlet toggleTimeout = null;\nconst isAdmin = window.__CONFIG__.user.isAdmin;\n\nconst toggleMenu = (type) => (event) => {\n  clearTimeout(toggleTimeout);\n  const nav = elements.nav(type);\n  const shouldOpen = !nav.classList.contains(\"header__nav--open\");\n  if (shouldOpen) {\n    nav.removeAttribute(\"hidden\");\n    if (type === \"menu\") {\n      elements.html().classList.add(\"u-no-scroll\");\n    }\n  } else {\n    if (type === \"menu\") {\n      elements.html().classList.remove(\"u-no-scroll\");\n    }\n    toggleTimeout = setTimeout(\n      () => (nav.hidden = true),\n      menuOpenAnimationLength,\n    );\n  }\n  setTimeout(() => {\n    nav.classList.toggle(\"header__nav--open\", shouldOpen);\n    if (type === \"profile\") {\n      nav.style.height =\n        shouldOpen ?\n          isAdmin ? \"104px\"\n          : \"72px\"\n        : \"0\";\n    }\n  }, 0);\n};\n\nfunction toggleSearch() {\n  const dialog = elements.searchDialog();\n  if (dialog.open) {\n    dialog.close();\n  } else {\n    dialog.showModal();\n    elements.searchInput().focus();\n  }\n}\n\nlet lastSearchT = 0; // Only ever consider the last search\nlet searchDebounceTimer = null;\n\nasync function executeSearch() {\n  const searchT = +new Date();\n  lastSearchT = Math.max(lastSearchT, searchT);\n  const url = new URL(\"/_search/\", window.location.origin);\n  for (const [key, v] of new FormData(elements.searchForm()).entries()) {\n    let value = String(v).trim();\n    if (value.length) {\n      url.searchParams.append(key, value);\n    }\n  }\n  if (!url.searchParams.has(\"q\")) {\n    elements.searchResults().innerHTML = \"\";\n    return;\n  }\n  const resp = await fetch(url);\n  if (!resp.ok) return;\n  if (searchT < lastSearchT) return;\n  const html = await resp.text();\n  elements.searchResults().innerHTML = html;\n}\n\nfunction startSearchDebounce() {\n  clearTimeout(searchDebounceTimer);\n  searchDebounceTimer = setTimeout(executeSearch, 200);\n}\n\nfunction searchDialogClick(event) {\n  const searchDialog = elements.searchDialog();\n  if (event.target === searchDialog) {\n    searchDialog.close();\n  }\n}\n\nexport const setup = () => {\n  elements.menuButton().addEventListener(\"click\", toggleMenu(\"menu\"));\n  elements.profileButton()?.addEventListener(\"click\", toggleMenu(\"profile\"));\n  elements.searchButton()?.addEventListener(\"click\", toggleSearch);\n  elements.searchClose()?.addEventListener(\"click\", toggleSearch);\n  elements.searchDialog()?.addEventListener(\"click\", searchDialogClick);\n  elements.searchInput()?.addEventListener(\"input\", startSearchDebounce);\n  elements.searchForm()?.addEventListener(\"change\", startSearchDebounce);\n};\n", "import { query } from \"./dom\";\n\nconst elements = {\n  canvas: () => query(\"#hero canvas\"),\n  image: () => query(\"#hero img\"),\n};\n\nconst containerMaxWidth = 1170;\n\nexport const setup = () => {\n  const viewportWidth = document.documentElement.clientWidth;\n  if (viewportWidth <= containerMaxWidth) return;\n\n  const canvas = elements.canvas();\n  const image = elements.image();\n  if (!canvas || !image) return;\n\n  const ctx = canvas.getContext(\"2d\");\n  const draw = () => {\n    const imageWidth = containerMaxWidth;\n    const imageHeight = 780;\n    canvas.height = imageHeight;\n    canvas.width = containerMaxWidth * 3;\n    ctx.drawImage(image, imageWidth, 0, imageWidth, imageHeight);\n\n    ctx.scale(-1, 1);\n    ctx.drawImage(image, -imageWidth, 0, imageWidth, imageHeight);\n    ctx.drawImage(image, -3 * imageWidth, 0, imageWidth, imageHeight);\n    image.hidden = true;\n  };\n\n  if (image.complete) {\n    draw();\n  } else {\n    image.addEventListener(\"load\", draw);\n  }\n};\n", "export const createStorage = (key) => ({\n  get: () => {\n    try {\n      const value = localStorage.getItem(key);\n      return value ? JSON.parse(value) : null;\n    } catch (e) {\n      console.error(`Unable to get item ${key} from local storage`, e);\n      return null;\n    }\n  },\n  set: (value) => {\n    try {\n      localStorage.setItem(key, JSON.stringify(value));\n    } catch (e) {\n      console.error(`Unable to set item ${key} to local storage`, e);\n    }\n  },\n});\n", "import { query, queryAll, ready } from \"./dom\";\nimport { createStorage } from \"./storage\";\n\nconst elements = {\n  pageOhjelma: () => query(\"#page-ohjelma\"),\n  viewPicker: () => query(\"#page-ohjelma #program-view-picker\"),\n  viewButtons: () => queryAll(\"#program-view-picker button\"),\n  filterStarred: () => query(\"#filter-starred\"),\n  filterPast: () => query(\"#filter-past\"),\n  noStarredMsg: () => query(\"#no-starred-programs\"),\n  filterStatus: () => query(\"#filter-status\"),\n  listArticles: () => queryAll(\"#program-list article[data-hide-after-date]\"),\n  listDayGroups: () =>\n    queryAll(\"#program-list > div > div[data-hide-after-date]\"),\n  tableCells: () => queryAll(\"#program-table td.ohj[data-starred]\"),\n  tableDayTables: () => queryAll(\"#program-table table[data-hide-after-date]\"),\n};\n\nconst programTabStorage = createStorage(\"programTab\");\nconst starredFilterStorage = createStorage(\"programFilterStarred\");\nconst pastFilterStorage = createStorage(\"programFilterPast\");\n\nlet selectedButton = \"\";\n\nconst filterState = {\n  starred: false,\n  past: false,\n};\n\nconst setTabStates = () => {\n  elements.viewButtons().forEach((button) => {\n    const isSelected = button.id === selectedButton;\n    button.setAttribute(\"aria-selected\", String(isSelected));\n    button.classList.toggle(\"bg-brand\", isSelected);\n    button.classList.toggle(\"text-white\", isSelected);\n    button.classList.toggle(\"border-transparent\", isSelected);\n    button.classList.toggle(\"bg-transparent\", !isSelected);\n\n    const targetTabId = button.getAttribute(\"aria-controls\");\n    const targetTab = document.getElementById(targetTabId);\n    if (isSelected) {\n      targetTab.removeAttribute(\"hidden\");\n      targetTab.style.display = null;\n    } else {\n      targetTab.setAttribute(\"hidden\", \"\");\n      targetTab.style.display = \"none\";\n    }\n    targetTab.classList.remove(\"hidden\", \"xl:block\", \"xl:hidden\");\n  });\n};\n\nconst scrollToCurrentDayInTable = ({ behavior = \"smooth\" } = {}) => {\n  if (selectedButton !== \"view-table\") return;\n\n  const today = new Intl.DateTimeFormat(\"sv\", {\n    timeZone: \"Europe/Helsinki\",\n  }).format(new Date());\n\n  const tablePanel = document.getElementById(\"program-table\");\n  if (!tablePanel) return;\n\n  const todayEl = tablePanel.querySelector(`[data-date=\"${today}\"]`);\n  if (todayEl) {\n    todayEl.scrollIntoView({ behavior, block: \"start\" });\n  }\n};\n\nconst handleViewButtonClick = (event) => {\n  selectedButton = event.target.id;\n  programTabStorage.set(selectedButton);\n  setTabStates();\n  scrollToCurrentDayInTable();\n};\n\nconst setupProgramViewButtons = () => {\n  const viewPicker = elements.viewPicker();\n  if (!viewPicker) return;\n\n  const isLargeViewport = window.innerWidth >= 1024;\n  selectedButton =\n    programTabStorage.get() || (isLargeViewport ? \"view-table\" : \"view-list\");\n\n  elements.viewButtons().forEach((button) => {\n    button.addEventListener(\"click\", handleViewButtonClick);\n  });\n  setTabStates();\n};\n\nconst setToggleState = (button, pressed) => {\n  button.setAttribute(\"aria-pressed\", String(pressed));\n  button.classList.toggle(\"border-brand\", pressed);\n  button.classList.toggle(\"text-brand\", pressed);\n};\n\nlet cachedDebugNow;\nconst getNow = () => {\n  if (cachedDebugNow === undefined) {\n    const pageEl = elements.pageOhjelma();\n    const raw = pageEl?.dataset.debugNow;\n    cachedDebugNow = raw ? new Date(raw) : null;\n  }\n  return cachedDebugNow || new Date();\n};\n\nconst getHideAfterTs = (el) => {\n  el._hideAfterTs ??= new Date(el.dataset.hideAfterDate).getTime();\n  return el._hideAfterTs;\n};\n\nconst applyFilters = () => {\n  const nowTs = getNow().getTime();\n  let hasAnyStarred = false;\n  let visibleCount = 0;\n\n  const articles = elements.listArticles();\n  for (const article of articles) {\n    const isPast = getHideAfterTs(article) < nowTs;\n    const isStarred = article.dataset.starred === \"1\";\n    const hide =\n      (!filterState.past && isPast) || (filterState.starred && !isStarred);\n    if (hide) {\n      article.classList.add(\"hidden\");\n      article.style.opacity = \"\";\n    } else {\n      const wasHidden = article.classList.contains(\"hidden\");\n      article.classList.remove(\"hidden\");\n      if (wasHidden) {\n        article.style.opacity = \"0\";\n        requestAnimationFrame(() => {\n          article.style.opacity = \"\";\n        });\n      }\n      if (isStarred) hasAnyStarred = true;\n      visibleCount++;\n    }\n  }\n\n  const dayGroups = elements.listDayGroups();\n  for (const group of dayGroups) {\n    const hasVisible = group.querySelector(\"article:not(.hidden)\");\n    group.classList.toggle(\"hidden\", !hasVisible);\n  }\n\n  const dayTables = elements.tableDayTables();\n  for (const table of dayTables) {\n    const isPast = getHideAfterTs(table) < nowTs;\n    table.classList.toggle(\"hidden\", !filterState.past && isPast);\n  }\n\n  const tableCells = elements.tableCells();\n  for (const cell of tableCells) {\n    const isStarred = cell.dataset.starred === \"1\";\n    const isPast = getHideAfterTs(cell) < nowTs;\n    const dim =\n      (filterState.starred && !isStarred) || (!filterState.past && isPast);\n    cell.style.opacity = dim ? \"0.3\" : \"\";\n    const link = cell.querySelector(\"a\");\n    if (link) link.tabIndex = dim ? -1 : 0;\n  }\n\n  const showNoStarredMsg = filterState.starred && !hasAnyStarred;\n  const noStarredMsg = elements.noStarredMsg();\n  if (noStarredMsg) {\n    noStarredMsg.classList.toggle(\"hidden\", !showNoStarredMsg);\n  }\n\n  const statusEl = elements.filterStatus();\n  if (statusEl) {\n    if (filterState.starred || !filterState.past) {\n      statusEl.textContent =\n        showNoStarredMsg && noStarredMsg ?\n          noStarredMsg.textContent.trim()\n        : `${visibleCount} ohjelmaa n\u00E4ytet\u00E4\u00E4n`;\n    } else {\n      statusEl.textContent = \"\";\n    }\n  }\n};\n\nconst wireFilterButton = (button, storage, stateKey) => {\n  filterState[stateKey] = storage.get() ?? false;\n  setToggleState(button, filterState[stateKey]);\n\n  button.addEventListener(\"click\", () => {\n    filterState[stateKey] = !filterState[stateKey];\n    setToggleState(button, filterState[stateKey]);\n    storage.set(filterState[stateKey]);\n    applyFilters();\n  });\n};\n\nconst setupFilterToggles = () => {\n  const filterStarredBtn = elements.filterStarred();\n  const filterPastBtn = elements.filterPast();\n\n  if (!filterStarredBtn && !filterPastBtn) return;\n\n  if (filterStarredBtn) {\n    wireFilterButton(filterStarredBtn, starredFilterStorage, \"starred\");\n  }\n  if (filterPastBtn) {\n    wireFilterButton(filterPastBtn, pastFilterStorage, \"past\");\n  } else {\n    filterState.past = true;\n  }\n\n  applyFilters();\n};\n\nconst setupCalendarFeedButton = () => {\n  const banner = query(\"#calendar-feed-banner\");\n  const btn = query(\"#calendar-feed-btn\");\n  const defaultState = query(\"#calendar-feed-default\");\n  const successState = query(\"#calendar-feed-success\");\n  if (!banner || !btn || !defaultState || !successState) return;\n  const { scheduleId } = banner.dataset;\n  btn.addEventListener(\"click\", async () => {\n    if (btn.disabled) return;\n    btn.disabled = true;\n    try {\n      const resp = await fetch(\n        `/api/schedule/calendar_feed_url/?schedule_id=${scheduleId}`,\n      );\n      if (!resp.ok) throw new Error(\"Failed to get feed URL\");\n      const data = await resp.json();\n      await navigator.clipboard.writeText(data.url);\n      defaultState.classList.replace(\"inline-flex\", \"hidden\");\n      successState.classList.replace(\"hidden\", \"inline-flex\");\n      setTimeout(() => {\n        successState.classList.replace(\"inline-flex\", \"hidden\");\n        defaultState.classList.replace(\"hidden\", \"inline-flex\");\n        btn.disabled = false;\n      }, 5000);\n    } catch {\n      const originalText = btn.textContent;\n      btn.textContent = \"Virhe!\";\n      setTimeout(() => {\n        btn.textContent = originalText;\n        btn.disabled = false;\n      }, 3000);\n    }\n  });\n};\n\nexport const setup = () => {\n  setupProgramViewButtons();\n  setupFilterToggles();\n  setupCalendarFeedButton();\n  ready(() => {\n    scrollToCurrentDayInTable();\n  });\n};\n", "function konamify() {\n  function walk(e) {\n    var a, s;\n    if (\n      (3 == e.nodeType &&\n        (e.nodeValue = e.nodeValue.replace(/cosplay/gi, \"seksiasu\")),\n      (a = e.firstChild))\n    )\n      for (; a; ) ((s = a.nextSibling), walk(a), (a = s));\n  }\n\n  walk(document.body);\n}\n\nexport function setup() {\n  document.addEventListener(\"keydown\", function (e) {\n    var q = (this.kq || []).concat(String.fromCharCode((e || event).keyCode));\n    this.kq =\n      \"&&((%'%'BA\".indexOf(q.join(\"\")) != 0 ? []\n      : 10 == q.length ? (konamify(), [])\n      : q;\n  });\n}\n", "import { queryAll, ready } from \"./dom\";\n\nconst elements = {\n  openLinks: () => queryAll(\".js-content-card-link\"),\n};\n\nconst onContentCardLinkClick = (event) => {\n  const details = event.target.parentNode;\n  const id = details.id;\n  const isOpening = !details.open;\n  if (!isOpening) return;\n\n  location.hash = `#${id}`;\n};\n\nfunction openBox(hash, scroll = false) {\n  const details = document.getElementById(hash.replace(\"#\", \"\"));\n  if (details) {\n    details.open = true;\n    if (scroll) {\n      details.scrollIntoView();\n    }\n  }\n}\n\nexport const setup = () => {\n  for (const openLink of elements.openLinks()) {\n    openLink.addEventListener(\"click\", onContentCardLinkClick);\n  }\n  ready(() => {\n    openBox(location.hash, true);\n    window.addEventListener(\"hashchange\", () => {\n      openBox(location.hash);\n    });\n  });\n};\n", "const consentKey = \"desu-analytics-consent\";\n\nfunction trySet(qs, key, setter) {\n  try {\n    let value = setter();\n    if (value) {\n      value = String(value).trim();\n      if (value) qs.set(key, value);\n    }\n  } catch (e) {}\n}\n\nfunction sendPixelRequest(extra = {}) {\n  const qs = new URLSearchParams();\n  for (const key in extra) {\n    if (extra[key]) qs.set(key, extra[key]);\n  }\n  trySet(qs, \"or\", () => window.screen.orientation.type);\n  trySet(qs, \"pl\", () => navigator.userAgentData.platform);\n  trySet(qs, \"pm\", () => (navigator.userAgentData.mobile ? \"1\" : null));\n  trySet(qs, \"pr\", () => window.devicePixelRatio);\n  trySet(qs, \"rs\", () => `${window.screen.width}x${window.screen.height}`);\n  trySet(qs, \"v\", () => \"1\");\n  trySet(qs, \"ws\", () => `${window.innerWidth}x${window.innerHeight}`);\n  const url = `/static/uwu.gif?${qs.toString()}`;\n  void fetch(url, { method: \"GET\", mode: \"no-cors\", credentials: \"omit\" });\n}\n\nfunction setAnalyticsConsent(consent) {\n  const data = JSON.stringify({ consent, time: Math.round(+new Date()) });\n  localStorage.setItem(consentKey, data);\n}\n\nfunction getAnalyticsConsentInfo() {\n  try {\n    const val = localStorage.getItem(consentKey);\n    return val === null ? null : JSON.parse(val);\n  } catch (e) {\n    // If `localStorage` is disabled, we assume no consent.\n    return { consent: false };\n  }\n}\n\nfunction fadeBoxIn(div) {\n  div.hidden = false;\n  div.animate(\n    [\n      { opacity: 0, transform: \"translateY(10px)\" },\n      { opacity: 1, transform: \"translateY(0)\" },\n    ],\n    { duration: 300, easing: \"ease-out\" },\n  );\n}\n\nfunction fadeBoxOut(div) {\n  div.animate(\n    [\n      { opacity: 1, transform: \"translateY(0)\" },\n      { opacity: 0, transform: \"translateY(-10px)\" },\n    ],\n    { duration: 300, easing: \"ease-out\" },\n  );\n  setTimeout(() => (div.hidden = true), 300);\n}\n\nfunction userVehementlyDeniesTracking() {\n  try {\n    if (\n      window.navigator.doNotTrack === \"1\" ||\n      window.navigator.doNotTrack === \"yes\"\n    ) {\n      return true;\n    }\n  } catch (e) {\n    // Ignore, property might not be available.\n  }\n  try {\n    if (window.navigator.globalPrivacyControl === true) {\n      return true;\n    }\n  } catch (e) {\n    // Ignore, property might not be available.\n  }\n  return false;\n}\n\nasync function showConsentBoxIfNeeded() {\n  const consentBoxWrapper = document.getElementById(\n    \"analytics-consent-wrapper\",\n  );\n  if (!consentBoxWrapper) {\n    // No consent box wrapper found on this page.\n    return;\n  }\n  if (getAnalyticsConsentInfo() !== null) {\n    // The user has already given or denied consent.\n    return;\n  }\n  if (userVehementlyDeniesTracking()) {\n    return;\n  }\n  const imageUrl = consentBoxWrapper.dataset.imgSource;\n  const res = await fetch(imageUrl);\n  if (!res.ok) {\n    return;\n  }\n  consentBoxWrapper.innerHTML = await res.text();\n  document.getElementById(\"analytics-consent-button-yes\").addEventListener(\n    \"click\",\n    () => {\n      fadeBoxOut(consentBoxWrapper);\n      setAnalyticsConsent(true);\n      sendPixelRequest({ init: 1 });\n    },\n    false,\n  );\n  document.getElementById(\"analytics-consent-button-no\").addEventListener(\n    \"click\",\n    () => {\n      fadeBoxOut(consentBoxWrapper);\n      setAnalyticsConsent(false);\n    },\n    false,\n  );\n  fadeBoxIn(consentBoxWrapper);\n}\n\nexport function setup() {\n  setTimeout(() => showConsentBoxIfNeeded(), 500);\n  if (Math.random() < 0.3) {\n    const consentInfo = getAnalyticsConsentInfo();\n    if (consentInfo?.consent) {\n      // Send a pixel request with a 30% chance, if we have consent.\n      setTimeout(() => sendPixelRequest({ ctm: consentInfo?.time }), 5000);\n    }\n  }\n}\n", "function lightboxify(parent) {\n  parent.querySelectorAll(\"img\").forEach(function (img, index) {\n    var link = document.createElement(\"a\");\n    link.href = img.src;\n    link.target = \"_blank\";\n    link.rel = \"noopener noreferrer\";\n    img.parentNode.insertBefore(link, img);\n    link.appendChild(img);\n\n    // Skip if the browser doesn't support popovers\n    if (!HTMLElement.prototype.hasOwnProperty(\"popover\")) {\n      return;\n    }\n\n    var popover = document.createElement(\"div\");\n    popover.popover = \"auto\";\n    popover.id = `image-popover-${index}`;\n    popover.classList.add(\n      \"backdrop:bg-black/50\",\n      \"backdrop:backdrop-blur-lg\",\n      \"w-fit\",\n      \"h-fit\",\n    );\n\n    var imgElement = document.createElement(\"img\");\n    imgElement.src = img.src;\n    imgElement.classList.add(\"max-h-screen\");\n    imgElement.addEventListener(\"click\", function () {\n      popover.hidePopover();\n    });\n    popover.appendChild(imgElement);\n\n    var closeButton = document.createElement(\"button\");\n    closeButton.textContent = \"\\u2715\";\n    closeButton.classList.add(\"fixed\", \"top-0\", \"right-0\", \"p-4\");\n    closeButton.addEventListener(\"click\", function () {\n      popover.hidePopover();\n    });\n    popover.appendChild(closeButton);\n\n    document.body.appendChild(popover);\n\n    link.addEventListener(\"click\", function (e) {\n      if (!e.ctrlKey && !e.metaKey && !e.shiftKey) {\n        e.preventDefault();\n        popover.showPopover();\n      }\n    });\n  });\n}\n\nexport function setup() {\n  document.querySelectorAll(\"[data-lightboxify]\").forEach(function (element) {\n    lightboxify(element);\n  });\n}\n", "import { query, queryAll } from \"./dom\";\n\nconst ENDPOINT = \"/api/feedback/\";\nconst STORE_KEY = \"desu-feedback-voted\";\n\nconst getCsrf = (el) => {\n  const cookie = document.cookie.match(/(?:^|;\\s*)csrftoken=([^;]+)/);\n  if (cookie) return cookie[1];\n  const input =\n    query(\"input[name=csrfmiddlewaretoken]\", el) ||\n    query(\"input[name=csrfmiddlewaretoken]\");\n  return input ? input.value : \"\";\n};\n\nconst votedSet = () => {\n  try {\n    return new Set(JSON.parse(localStorage.getItem(STORE_KEY) || \"[]\"));\n  } catch {\n    return new Set();\n  }\n};\n\nconst markVoted = (key) => {\n  const set = votedSet();\n  set.add(key);\n  try {\n    localStorage.setItem(STORE_KEY, JSON.stringify([...set]));\n  } catch {\n    // localStorage voi olla pois k\u00E4yt\u00F6st\u00E4; sivuutetaan\n  }\n};\n\nconst keyFor = (el) => `${el.dataset.feedbackType}:${el.dataset.feedbackId}`;\n\nconst toggle = (el, selector, visible) => {\n  const node = query(selector, el);\n  if (!node) return;\n  node.hidden = !visible;\n  node.classList.toggle(\"hidden\", !visible);\n};\n\nconst send = async (el, rating, reason, comment) => {\n  const response = await fetch(ENDPOINT, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      \"X-CSRFToken\": getCsrf(el),\n    },\n    body: JSON.stringify({\n      content_type: el.dataset.feedbackType,\n      object_id: Number(el.dataset.feedbackId),\n      rating,\n      reason,\n      comment,\n    }),\n  });\n  if (response.ok) {\n    markVoted(keyFor(el));\n    toggle(el, \".js-feedback-prompt\", false);\n    toggle(el, \".js-feedback-reason\", false);\n    toggle(el, \".js-feedback-thanks\", true);\n  }\n};\n\nconst wire = (el) => {\n  if (votedSet().has(keyFor(el))) {\n    toggle(el, \".js-feedback-prompt\", false);\n    toggle(el, \".js-feedback-thanks\", true);\n    return;\n  }\n  const up = query(\".js-feedback-up\", el);\n  if (up) up.addEventListener(\"click\", () => send(el, 1, \"\", \"\"));\n\n  const down = query(\".js-feedback-down\", el);\n  if (down) {\n    down.addEventListener(\"click\", () => {\n      toggle(el, \".js-feedback-prompt\", false);\n      toggle(el, \".js-feedback-reason\", true);\n    });\n  }\n\n  const reasonForm = query(\".js-feedback-reason\", el);\n  if (reasonForm) {\n    reasonForm.addEventListener(\"submit\", (event) => {\n      event.preventDefault();\n      const checked = reasonForm.querySelector(\"input[name=reason]:checked\");\n      const textarea = reasonForm.querySelector(\"textarea[name=comment]\");\n      send(\n        el,\n        -1,\n        checked ? checked.value : \"\",\n        textarea ? textarea.value : \"\",\n      );\n    });\n  }\n};\n\nexport const setup = () => {\n  queryAll(\"[data-feedback]\").forEach(wire);\n};\n", "import * as comments from \"./comments\";\nimport * as header from \"./header\";\nimport * as hero from \"./hero\";\nimport * as program from \"./program\";\nimport * as konami from \"./konami\";\nimport * as contentCard from \"./contentCard\";\nimport * as stats from \"./stats\";\nimport * as lightbox from \"./lightbox\";\nimport * as feedback from \"./feedback\";\n\nheader.setup();\nhero.setup();\ncomments.setup();\nprogram.setup();\nkonami.setup();\ncontentCard.setup();\nstats.setup();\nlightbox.setup();\nfeedback.setup();\n"],
  "mappings": "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",
  "names": ["query", "selector", "element", "queryAll", "nodeList", "ready", "onReady", "elements", "query", "queryAll", "onReplyClick", "event", "id", "setup", "elem", "error", "ready", "elements", "query", "type", "menuOpenAnimationLength", "toggleTimeout", "isAdmin", "toggleMenu", "event", "nav", "shouldOpen", "toggleSearch", "dialog", "lastSearchT", "searchDebounceTimer", "executeSearch", "searchT", "url", "key", "v", "value", "resp", "html", "startSearchDebounce", "searchDialogClick", "searchDialog", "setup", "elements", "query", "containerMaxWidth", "setup", "canvas", "image", "ctx", "draw", "imageWidth", "imageHeight", "createStorage", "key", "value", "e", "elements", "query", "queryAll", "programTabStorage", "createStorage", "starredFilterStorage", "pastFilterStorage", "selectedButton", "filterState", "setTabStates", "button", "isSelected", "targetTabId", "targetTab", "scrollToCurrentDayInTable", "behavior", "today", "tablePanel", "todayEl", "handleViewButtonClick", "event", "setupProgramViewButtons", "isLargeViewport", "setToggleState", "pressed", "cachedDebugNow", "getNow", "raw", "getHideAfterTs", "el", "applyFilters", "nowTs", "hasAnyStarred", "visibleCount", "articles", "article", "isPast", "isStarred", "wasHidden", "dayGroups", "group", "hasVisible", "dayTables", "table", "tableCells", "cell", "dim", "link", "showNoStarredMsg", "noStarredMsg", "statusEl", "wireFilterButton", "storage", "stateKey", "setupFilterToggles", "filterStarredBtn", "filterPastBtn", "setupCalendarFeedButton", "banner", "btn", "defaultState", "successState", "scheduleId", "resp", "data", "originalText", "setup", "ready", "konamify", "walk", "e", "a", "s", "setup", "q", "elements", "queryAll", "onContentCardLinkClick", "event", "details", "id", "openBox", "hash", "scroll", "setup", "openLink", "ready", "consentKey", "trySet", "qs", "key", "setter", "value", "sendPixelRequest", "extra", "url", "setAnalyticsConsent", "consent", "data", "getAnalyticsConsentInfo", "val", "fadeBoxIn", "div", "fadeBoxOut", "userVehementlyDeniesTracking", "showConsentBoxIfNeeded", "consentBoxWrapper", "imageUrl", "res", "setup", "consentInfo", "lightboxify", "parent", "img", "index", "link", "popover", "imgElement", "closeButton", "e", "setup", "element", "ENDPOINT", "STORE_KEY", "getCsrf", "el", "cookie", "input", "query", "votedSet", "markVoted", "key", "set", "keyFor", "toggle", "selector", "visible", "node", "send", "rating", "reason", "comment", "wire", "up", "down", "reasonForm", "event", "checked", "textarea", "setup", "queryAll", "setup"]
}
