{"version":3,"sources":["jsdelivr-header.js","/gh/miikka-werkamo/evastebanneri@1.0.3/banner.js"],"names":[],"mappings":"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","file":"/gh/miikka-werkamo/evastebanneri@1.0.3/banner.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /gh/miikka-werkamo/evastebanneri@1.0.3/banner.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*!\n * Simple Consent Banner v1.0.2\n * Yes/no cookie consent for Webflow sites.\n *\n * - Blocks scripts marked  <script type=\"text/plain\" data-consent-script>\n *   and iframes marked     <iframe data-consent-src=\"...\"> until the visitor accepts.\n * - Sends Google Consent Mode v2 signals (default denied, granted on accept).\n * - Banner UI is built and styled in Webflow; this script only finds it by attributes:\n *     data-consent=\"banner\"   the banner wrapper (set to Display: None in Webflow)\n *     data-consent=\"accept\"   the accept button\n *     data-consent=\"decline\"  the decline button\n *     data-consent=\"open\"     optional link/button that re-opens the banner\n *   Optional on the wrapper: data-consent-display=\"flex\" (display value used when shown, default \"block\")\n */\n(function () {\n  'use strict';\n\n  var VERSION = 1;                    // bump this to ask every visitor again\n  var STORAGE_KEY = 'consent-banner';\n  var ACCEPT_DAYS = 365;              // how long a \"yes\" is remembered\n  var DECLINE_DAYS = 180;             // how long a \"no\" is remembered\n\n  var activated = false;              // blocked scripts already un-blocked on this page view\n\n  /* ---- Google Consent Mode v2 ---- */\n  window.dataLayer = window.dataLayer || [];\n  function gtag() { window.dataLayer.push(arguments); }\n  gtag('consent', 'default', {\n    ad_storage: 'denied',\n    ad_user_data: 'denied',\n    ad_personalization: 'denied',\n    analytics_storage: 'denied'\n  });\n\n  /* ---- stored choice ---- */\n  function readChoice() {\n    try {\n      var data = JSON.parse(localStorage.getItem(STORAGE_KEY));\n      if (!data || data.v !== VERSION || Date.now() > data.exp) return null;\n      return data.choice; // 'yes' | 'no'\n    } catch (e) { return null; }\n  }\n\n  function saveChoice(choice) {\n    var days = choice === 'yes' ? ACCEPT_DAYS : DECLINE_DAYS;\n    try {\n      localStorage.setItem(STORAGE_KEY, JSON.stringify({\n        v: VERSION,\n        choice: choice,\n        exp: Date.now() + days * 864e5\n      }));\n    } catch (e) { /* private mode etc. — banner will just show again */ }\n  }\n\n  /* ---- banner element ---- */\n  function banner() { return document.querySelector('[data-consent=\"banner\"]'); }\n\n  function showBanner() {\n    var b = banner();\n    if (b) b.style.display = b.getAttribute('data-consent-display') || 'block';\n  }\n\n  function hideBanner() {\n    var b = banner();\n    if (b) b.style.display = 'none';\n  }\n\n  /* ---- consent granted: signal Google + un-block scripts and iframes ---- */\n  function grant() {\n    gtag('consent', 'update', {\n      ad_storage: 'granted',\n      ad_user_data: 'granted',\n      ad_personalization: 'granted',\n      analytics_storage: 'granted'\n    });\n\n    var blocked = document.querySelectorAll('script[type=\"text/plain\"][data-consent-script]');\n    for (var i = 0; i < blocked.length; i++) {\n      var old = blocked[i];\n      var s = document.createElement('script');\n      for (var j = 0; j < old.attributes.length; j++) {\n        var a = old.attributes[j];\n        if (a.name !== 'type' && a.name !== 'data-consent-script') s.setAttribute(a.name, a.value);\n      }\n      s.text = old.text;\n      old.parentNode.replaceChild(s, old);\n    }\n\n    var frames = document.querySelectorAll('iframe[data-consent-src]');\n    for (var k = 0; k < frames.length; k++) {\n      frames[k].src = frames[k].getAttribute('data-consent-src');\n    }\n\n    activated = true;\n  }\n\n  /* ---- best-effort cleanup of common tracking cookies and storage on decline ---- */\n  function cleanupCookies() {\n    var prefixes = ['_ga', '_gid', '_gcl', '_fbp', '_fbc', '_ttp', '_tt_enable_cookie',\n                    'ttcsid', 'tt_', '_pin_', '_scid', '_uetsid', '_uetvid', 'li_'];\n    function tracked(name) {\n      return prefixes.some(function (p) { return name.indexOf(p) === 0; });\n    }\n\n    var names = document.cookie.split(';').map(function (c) {\n      return c.split('=')[0].trim();\n    });\n    var host = location.hostname;\n    var domains = [''];\n    var parts = host.split('.');\n    for (var i = 0; i < parts.length - 1; i++) {\n      domains.push(parts.slice(i).join('.'));\n    }\n    names.forEach(function (name) {\n      if (!tracked(name)) return;\n      domains.forEach(function (d) {\n        document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/' +\n          (d ? '; domain=' + d : '');\n      });\n    });\n\n    // trackers (e.g. TikTok) also stash session data in web storage\n    [localStorage, sessionStorage].forEach(function (store) {\n      try {\n        Object.keys(store).forEach(function (key) {\n          if (key !== STORAGE_KEY && tracked(key)) store.removeItem(key);\n        });\n      } catch (e) {}\n    });\n  }\n\n  /* ---- button actions ---- */\n  function accept() {\n    saveChoice('yes');\n    grant();\n    hideBanner();\n  }\n\n  function decline() {\n    saveChoice('no');\n    hideBanner();\n    cleanupCookies();\n    gtag('consent', 'update', {\n      ad_storage: 'denied',\n      ad_user_data: 'denied',\n      ad_personalization: 'denied',\n      analytics_storage: 'denied'\n    });\n    // If tracking was already running on this page view (visitor changed their mind),\n    // reload so nothing keeps tracking.\n    if (activated) location.reload();\n  }\n\n  document.addEventListener('click', function (e) {\n    var t = e.target && e.target.closest ? e.target.closest('[data-consent]') : null;\n    if (!t) return;\n    var role = t.getAttribute('data-consent');\n    if (role === 'accept') { e.preventDefault(); accept(); }\n    else if (role === 'decline') { e.preventDefault(); decline(); }\n    else if (role === 'open') { e.preventDefault(); showBanner(); }\n  });\n\n  /* ---- init ---- */\n  function init() {\n    var choice = readChoice();\n    if (choice === 'yes') grant();\n    else if (choice === null) showBanner();\n    // choice === 'no': banner stays hidden, nothing loads\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n\n  // tiny debug/utility API\n  window.consentBanner = {\n    open: showBanner,\n    choice: readChoice,\n    reset: function () { localStorage.removeItem(STORAGE_KEY); showBanner(); }\n  };\n})();\n"]}