{"version":3,"sources":[""],"sourcesContent":["// Scouting Ravels theme - progressive enhancement for the layout chrome.\n// No framework: Tailwind handles the styling, this file only toggles state.\n\n(function () {\n \"use strict\";\n\n // Mobile navigation: [data-nav-toggle=\"\"] shows/hides [data-nav-panel].\n function initNavToggles() {\n for (const toggle of document.querySelectorAll(\"[data-nav-toggle]\")) {\n const panel = document.getElementById(toggle.getAttribute(\"data-nav-toggle\"));\n\n if (!panel) {\n continue;\n }\n\n toggle.addEventListener(\"click\", function () {\n const isOpen = !panel.classList.contains(\"hidden\");\n\n panel.classList.toggle(\"hidden\", isOpen);\n toggle.setAttribute(\"aria-expanded\", String(!isOpen));\n });\n }\n }\n\n // Menu dropdowns: a [data-dropdown-toggle] link opens its sibling\n // [data-dropdown-panel] instead of navigating.\n function closeAllDropdowns(except) {\n for (const panel of document.querySelectorAll(\"[data-dropdown-panel][data-open]\")) {\n if (panel === except) {\n continue;\n }\n\n panel.removeAttribute(\"data-open\");\n\n const toggle = panel.parentElement?.querySelector(\"[data-dropdown-toggle]\");\n toggle?.setAttribute(\"aria-expanded\", \"false\");\n }\n }\n\n function initDropdowns() {\n for (const toggle of document.querySelectorAll(\"[data-dropdown-toggle]\")) {\n const panel = toggle.parentElement?.querySelector(\"[data-dropdown-panel]\");\n\n if (!panel) {\n continue;\n }\n\n toggle.addEventListener(\"click\", function (event) {\n event.preventDefault();\n\n const isOpen = panel.hasAttribute(\"data-open\");\n\n closeAllDropdowns(panel);\n\n if (isOpen) {\n panel.removeAttribute(\"data-open\");\n } else {\n panel.setAttribute(\"data-open\", \"\");\n }\n\n toggle.setAttribute(\"aria-expanded\", String(!isOpen));\n });\n }\n\n document.addEventListener(\"click\", function (event) {\n if (!event.target.closest(\"[data-dropdown-toggle], [data-dropdown-panel]\")) {\n closeAllDropdowns();\n }\n });\n\n document.addEventListener(\"keydown\", function (event) {\n if (event.key === \"Escape\") {\n closeAllDropdowns();\n }\n });\n }\n\n // Notification messages: manual dismiss plus optional auto-hide.\n function removeMessage(message) {\n message.remove();\n }\n\n function initMessages() {\n for (const message of document.querySelectorAll(\"[data-message]\")) {\n message.querySelector(\"[data-message-dismiss]\")\n ?.addEventListener(\"click\", () => removeMessage(message));\n\n const delay = Number.parseInt(message.getAttribute(\"data-message-delay\") ?? \"0\", 10);\n\n if (delay > 0) {\n setTimeout(() => removeMessage(message), delay);\n }\n }\n }\n\n // Archive anchors: /berichtenblad/archief#week-2026-09-14 has to open that week and\n // the season around it. A browser scrolls to a
but leaves it shut, so the\n // link would land on a closed box.\n function openDetailsAround(hash) {\n if (!hash || hash.length < 2) {\n return;\n }\n\n const target = document.getElementById(decodeURIComponent(hash.slice(1)));\n\n if (!target) {\n return;\n }\n\n for (let element = target; element; element = element.parentElement?.closest(\"details\")) {\n if (element.tagName === \"DETAILS\") {\n element.open = true;\n }\n }\n\n // Opening the ancestors moved everything, so the browser's own scroll is stale.\n target.scrollIntoView();\n }\n\n function initArchiveAnchors() {\n openDetailsAround(window.location.hash);\n\n window.addEventListener(\"hashchange\", () => openDetailsAround(window.location.hash));\n }\n\n // Cookie consent: [data-consent-banner] asks once, a [data-consent-choice] button\n // answers, [data-consent-open] asks again. The answer is kept for six months and\n // announced on every page as a \"consentchange\" event; loading or stopping a tracker\n // is left to the script that listens for it, so this file knows nothing about\n // Google. Without a banner nothing is announced, and no tracker ever starts.\n const consentKey = \"scoutingravels.consent\";\n const consentMaxAge = 182 * 24 * 60 * 60 * 1000;\n\n function readConsent() {\n try {\n const stored = JSON.parse(localStorage.getItem(consentKey) ?? \"null\");\n\n if (stored && (stored.analytics === \"granted\" || stored.analytics === \"denied\")\n && Date.now() - stored.date < consentMaxAge) {\n return stored.analytics;\n }\n } catch {\n // Storage blocked or unreadable: treat it as no answer, so the banner asks.\n }\n\n return null;\n }\n\n function writeConsent(analytics) {\n try {\n localStorage.setItem(consentKey, JSON.stringify({ analytics, date: Date.now() }));\n } catch {\n // Storage blocked: the answer holds for this page only.\n }\n }\n\n function announceConsent(analytics) {\n document.dispatchEvent(new CustomEvent(\"consentchange\", { detail: { analytics } }));\n }\n\n function initConsent() {\n const banner = document.querySelector(\"[data-consent-banner]\");\n\n if (!banner) {\n return;\n }\n\n for (const button of banner.querySelectorAll(\"[data-consent-choice]\")) {\n button.addEventListener(\"click\", function () {\n const analytics = button.getAttribute(\"data-consent-choice\");\n\n writeConsent(analytics);\n banner.hidden = true;\n announceConsent(analytics);\n });\n }\n\n for (const opener of document.querySelectorAll(\"[data-consent-open]\")) {\n opener.hidden = false;\n opener.addEventListener(\"click\", function () {\n banner.hidden = false;\n banner.querySelector(\"[data-consent-choice]\")?.focus();\n });\n }\n\n const stored = readConsent();\n\n if (stored) {\n announceConsent(stored);\n } else {\n banner.hidden = false;\n }\n }\n\n function init() {\n initNavToggles();\n initDropdowns();\n initMessages();\n initArchiveAnchors();\n initConsent();\n }\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init, { once: true });\n } else {\n init();\n }\n})();\n"],"names":["closeAllDropdowns","except","panel","document","querySelectorAll","removeAttribute","toggle","parentElement","querySelector","setAttribute","openDetailsAround","hash","length","target","getElementById","decodeURIComponent","slice","element","closest","tagName","open","scrollIntoView","consentKey","announceConsent","analytics","dispatchEvent","CustomEvent","detail","init","initNavToggles","getAttribute","addEventListener","isOpen","classList","contains","String","initDropdowns","event","preventDefault","hasAttribute","key","initMessages","message","removeMessage","remove","delay","Number","parseInt","setTimeout","window","location","initConsent","banner","button","writeConsent","localStorage","setItem","JSON","stringify","date","Date","now","hidden","opener","focus","stored","readConsent","parse","getItem","readyState","once"],"mappings":"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"}