@freshjuice/zest 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/zest.d.ts +7 -0
  2. package/dist/zest.de.js +658 -50
  3. package/dist/zest.de.js.map +1 -1
  4. package/dist/zest.de.min.js +1 -1
  5. package/dist/zest.en.js +658 -50
  6. package/dist/zest.en.js.map +1 -1
  7. package/dist/zest.en.min.js +1 -1
  8. package/dist/zest.es.js +658 -50
  9. package/dist/zest.es.js.map +1 -1
  10. package/dist/zest.es.min.js +1 -1
  11. package/dist/zest.esm.js +658 -50
  12. package/dist/zest.esm.js.map +1 -1
  13. package/dist/zest.esm.min.js +1 -1
  14. package/dist/zest.fr.js +658 -50
  15. package/dist/zest.fr.js.map +1 -1
  16. package/dist/zest.fr.min.js +1 -1
  17. package/dist/zest.headless.d.ts +7 -0
  18. package/dist/zest.headless.esm.js +612 -32
  19. package/dist/zest.headless.esm.js.map +1 -1
  20. package/dist/zest.headless.esm.min.js +1 -1
  21. package/dist/zest.it.js +658 -50
  22. package/dist/zest.it.js.map +1 -1
  23. package/dist/zest.it.min.js +1 -1
  24. package/dist/zest.ja.js +658 -50
  25. package/dist/zest.ja.js.map +1 -1
  26. package/dist/zest.ja.min.js +1 -1
  27. package/dist/zest.js +658 -50
  28. package/dist/zest.js.map +1 -1
  29. package/dist/zest.min.js +1 -1
  30. package/dist/zest.nl.js +658 -50
  31. package/dist/zest.nl.js.map +1 -1
  32. package/dist/zest.nl.min.js +1 -1
  33. package/dist/zest.pl.js +658 -50
  34. package/dist/zest.pl.js.map +1 -1
  35. package/dist/zest.pl.min.js +1 -1
  36. package/dist/zest.pt.js +658 -50
  37. package/dist/zest.pt.js.map +1 -1
  38. package/dist/zest.pt.min.js +1 -1
  39. package/dist/zest.ru.js +658 -50
  40. package/dist/zest.ru.js.map +1 -1
  41. package/dist/zest.ru.min.js +1 -1
  42. package/dist/zest.uk.js +658 -50
  43. package/dist/zest.uk.js.map +1 -1
  44. package/dist/zest.uk.min.js +1 -1
  45. package/dist/zest.zh.js +658 -50
  46. package/dist/zest.zh.js.map +1 -1
  47. package/dist/zest.zh.min.js +1 -1
  48. package/package.json +1 -1
  49. package/src/config/defaults.js +2 -1
  50. package/src/core/element-interceptor.js +374 -0
  51. package/src/core/network-interceptor.js +289 -0
  52. package/src/core-lifecycle.js +20 -1
  53. package/src/index.js +46 -18
  54. package/src/types/zest.d.ts +7 -0
  55. package/src/types/zest.headless.d.ts +7 -0
  56. package/zest.config.schema.json +26 -0
@@ -1 +1 @@
1
- var Zest=function(){"use strict";const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"};function t(t){if(null==t)return"";return("string"==typeof t?t:t+"").replace(/[&<>"'`]/g,t=>e[t])}const n=new Set(["transparent","black","white","red","green","blue","yellow","orange","purple","pink","gray","grey","brown","cyan","magenta","silver","gold","navy","teal","maroon","olive","lime","aqua","fuchsia","indigo","violet","crimson","coral","salmon","tomato"]);const o=[/(\([^)]*[+*][^)]*\)|\[[^\]]*\]|\\w|\\d|\\s)\s*[+*]/,/\(\?[=!][^)]*[+*][^)]*\)[+*]/];function s(e,t){if(e instanceof RegExp)return e;if("string"!=typeof e)return null;if(e.length>500)return null;for(const t of o)if(t.test(e))return null;try{return RegExp(e,t)}catch(e){return null}}const a=new Set(["__proto__","constructor","prototype"]);function r(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return null;const n={version:"string"==typeof e.version?e.version:null,timestamp:"number"==typeof e.timestamp&&Number.isFinite(e.timestamp)?e.timestamp:null,categories:{}},o=e.categories;if(!o||"object"!=typeof o||Array.isArray(o))return null;for(const e of t)a.has(e)||Object.prototype.hasOwnProperty.call(o,e)&&(n.categories[e]=!0===o[e]);return t.includes("essential")&&(n.categories.essential=!0),n}function i(e,...t){if("function"==typeof e)try{return e(...t)}catch(e){try{console.error("[Zest] User callback threw:",e)}catch(e){}return}}const c={essential:[/^zest_/,/^csrf/i,/^xsrf/i,/^session/i,/^__host-/i,/^__secure-/i],functional:[/^lang/i,/^locale/i,/^theme/i,/^preferences/i,/^ui_/i],analytics:[/^_ga/,/^_gid/,/^_gat/,/^_utm/,/^__utm/,/^plausible/i,/^_pk_/,/^matomo/i,/^_hj/,/^ajs_/],marketing:[/^_fbp/,/^_fbc/,/^_gcl/,/^_ttp/,/^ads/i,/^doubleclick/i,/^__gads/,/^__gpi/,/^_pin_/,/^li_/]};let l={...c};function d(e){return(e+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function u(e){for(const[t,n]of Object.entries(l))if(n.some(t=>t.test(e)))return t;return"marketing"}let p=null;const f=[];let g=()=>!1;function m(){return p}let b=null,h=null;const y=[],z=[];let w=()=>!1;function x(e,t,n){return new Proxy(e,{get(e,n){if("setItem"===n)return(n,o)=>{const s=u(n);w(s)?e.setItem(n,o):200>t.length&&t.push({key:n,value:o,category:s,timestamp:Date.now()})};const o=e[n];return"function"==typeof o?o.bind(e):o}})}const v={analytics:["google-analytics.com","www.google-analytics.com","analytics.google.com","googletagmanager.com","www.googletagmanager.com","plausible.io","cloudflareinsights.com","static.cloudflareinsights.com"],marketing:["connect.facebook.net","www.facebook.com/tr","ads.google.com","www.googleadservices.com","googleads.g.doubleclick.net","pagead2.googlesyndication.com"]},k={analytics:[...v.analytics,"analytics.tiktok.com","matomo.","hotjar.com","static.hotjar.com","script.hotjar.com","clarity.ms","www.clarity.ms","heapanalytics.com","cdn.heapanalytics.com","mixpanel.com","cdn.mxpnl.com","segment.com","cdn.segment.com","api.segment.io","fullstory.com","rs.fullstory.com","amplitude.com","cdn.amplitude.com","mouseflow.com","cdn.mouseflow.com","luckyorange.com","cdn.luckyorange.net","crazyegg.com","script.crazyegg.com"],marketing:[...v.marketing,"snap.licdn.com","px.ads.linkedin.com","ads.linkedin.com","analytics.twitter.com","static.ads-twitter.com","t.co","analytics.tiktok.com","ads.tiktok.com","sc-static.net","tr.snapchat.com","ct.pinterest.com","pintrk.com","s.pinimg.com","widgets.pinterest.com","bat.bing.com","ads.yahoo.com","sp.analytics.yahoo.com","amazon-adsystem.com","z-na.amazon-adsystem.com","criteo.com","static.criteo.net","dis.criteo.com","taboola.com","cdn.taboola.com","trc.taboola.com","outbrain.com","widgets.outbrain.com","adroll.com","s.adroll.com"],functional:["cdn.onesignal.com","onesignal.com","pusher.com","js.pusher.com","intercom.io","widget.intercom.io","js.intercomcdn.com","crisp.chat","client.crisp.chat","cdn.livechatinc.com","livechatinc.com","tawk.to","embed.tawk.to","zendesk.com","static.zdassets.com"]};function _(e,t){let n;try{n=new URL(e)}catch(e){return!1}const o=n.hostname.toLowerCase(),s=n.pathname.toLowerCase();for(const e of t){if("string"!=typeof e)continue;const t=e.toLowerCase();if(t.endsWith(".")){const e=t.slice(0,-1);if(o.split(".").some(t=>t===e)||o.startsWith(t))return!0;continue}const n=t.indexOf("/");if(-1!==n){const e=t.slice(0,n),a=t.slice(n);if((o===e||o.endsWith("."+e))&&s.startsWith(a))return!0;continue}if(o===t||o.endsWith("."+t))return!0}return!1}function A(e,t="safe"){const n="strict"===t?k:v;for(const[t,o]of Object.entries(n))if(_(e,o))return t;return null}const C=new Set(["functional","analytics","marketing"]),S=[];let E=null,j="safe",$=[],M=()=>!1;function L(e){if(e.hasAttribute("data-zest-allow"))return null;const t=e.getAttribute("data-consent-category"),n=t&&C.has(t)?t:null,o=e.src;if(!o)return n;const s=function(e){if(!e||0===$.length)return null;try{const t=new URL(e).hostname.toLowerCase();for(const e of $){const n="string"==typeof e?e:e.domain,o="string"==typeof e?"marketing":e.category||"marketing";if(t===n||t.endsWith("."+n))return o}}catch(e){}return null}(o);let a=null;switch(j){case"manual":break;case"safe":case"strict":a=A(o,j);break;case"doomsday":(function(e){try{const t=new URL(e).hostname,n=window.location.hostname,o=e=>e.replace(/^www\./,"");return o(t)!==o(n)}catch(e){return!1}})(o)&&(a=A(o,"strict")||"marketing")}return a||s||n}function N(e){if(e.hasAttribute("data-zest-processed"))return!1;const t=L(e);if(!t)return e.setAttribute("data-zest-processed","allowed"),!1;if(M(t))return e.setAttribute("data-zest-processed","allowed"),!1;const n={category:t,src:e.src||"",inline:e.textContent,type:e.type,async:e.async,defer:e.defer,element:e,timestamp:Date.now()};return e.setAttribute("data-zest-processed","blocked"),e.setAttribute("data-consent-category",t),e.type="text/plain",e.src&&e.removeAttribute("src"),500>S.length&&S.push(n),!0}function R(e){for(const t of e)for(const e of t.addedNodes)if("SCRIPT"!==e.nodeName||e.hasAttribute("data-zest-processed")||N(e),e.querySelectorAll){e.querySelectorAll("script:not([data-zest-processed])").forEach(N)}}function D(e="safe",t=[]){return j=e,$=t,document.querySelectorAll("script:not([data-zest-processed])").forEach(N),E=new MutationObserver(R),E.observe(document.documentElement,{childList:!0,subtree:!0}),!0}const W={essential:{id:"essential",label:"Essential",description:"Required for the website to function properly. Cannot be disabled.",required:!0,default:!0},functional:{id:"functional",label:"Functional",description:"Enable personalized features like language preferences and themes.",required:!1,default:!1},analytics:{id:"analytics",label:"Analytics",description:"Help us understand how visitors interact with our website.",required:!1,default:!1},marketing:{id:"marketing",label:"Marketing",description:"Used to deliver relevant advertisements and track campaign performance.",required:!1,default:!1}};function O(){return Object.keys(W)}function q(){if("undefined"==typeof navigator)return!1;const e=navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack;return"1"===e||"yes"===e||!0===e||!0===navigator.globalPrivacyControl}function I(e,t,n){const o=n?"default":"update";t.consentModeGoogle&&function(e,t){if(window.dataLayer=window.dataLayer||[],"function"==typeof window.gtag)window.gtag("consent",e,t);else{function n(){window.dataLayer.push(arguments)}n("consent",e,t)}}(o,function(e){const t=e=>e?"granted":"denied";return{ad_storage:t(e.marketing),ad_user_data:t(e.marketing),ad_personalization:t(e.marketing),analytics_storage:t(e.analytics),functionality_storage:"granted",personalization_storage:t(e.functional)}}(e)),t.consentModeMicrosoft&&function(e,t){window.uetq=window.uetq||[],window.uetq.push("consent",e,t)}(o,function(e){return{ad_storage:e.marketing?"granted":"denied"}}(e))}const P={labels:{banner:{title:"Wir respektieren Ihre Privatsphäre",description:'Wir verwenden Cookies, um Ihr Surferlebnis zu verbessern, personalisierte Inhalte bereitzustellen und unseren Datenverkehr zu analysieren. Mit einem Klick auf „Alle akzeptieren" stimmen Sie der Verwendung von Cookies zu.',acceptAll:"Alle akzeptieren",rejectAll:"Alle ablehnen",settings:"Einstellungen"},modal:{title:"Datenschutzeinstellungen",description:"Verwalten Sie Ihre Cookie-Einstellungen. Sie können verschiedene Arten von Cookies unten aktivieren oder deaktivieren.",save:"Einstellungen speichern",acceptAll:"Alle akzeptieren",rejectAll:"Alle ablehnen"},widget:{label:"Cookie-Einstellungen"}},categories:{essential:{label:"Notwendig",description:"Erforderlich für die ordnungsgemäße Funktion der Website. Können nicht deaktiviert werden."},functional:{label:"Funktional",description:"Ermöglichen personalisierte Funktionen wie Spracheinstellungen und Designs."},analytics:{label:"Analytisch",description:"Helfen uns zu verstehen, wie Besucher mit unserer Website interagieren."},marketing:{label:"Marketing",description:"Werden verwendet, um relevante Werbung anzuzeigen und die Kampagnenleistung zu messen."}}};const T={lang:"auto",position:"bottom",theme:"auto",accentColor:"#0071e3",categories:W,labels:{banner:{title:"We value your privacy",description:'We use cookies to enhance your browsing experience, serve personalized content, and analyze our traffic. By clicking "Accept All", you consent to our use of cookies.',acceptAll:"Accept All",rejectAll:"Reject All",settings:"Settings"},modal:{title:"Privacy Settings",description:"Manage your cookie preferences. You can enable or disable different types of cookies below.",save:"Save Preferences",acceptAll:"Accept All",rejectAll:"Reject All"},widget:{label:"Cookie Settings"}},autoInit:!0,showWidget:!0,expiration:365,respectDNT:!0,dntBehavior:"reject",customStyles:"",consentModeGoogle:!1,consentModeMicrosoft:!1,mode:"safe",intercept:{cookies:!0,storage:!0,scripts:!0},essentialKeys:[],essentialPatterns:[],blockedDomains:[],policyUrl:null,imprintUrl:null,callbacks:{onAccept:null,onReject:null,onChange:null,onReady:null}};function Z(e){const t={...T};e||(e={});const n=["lang","position","theme","accentColor","autoInit","showWidget","expiration","policyUrl","imprintUrl","customStyles","mode","blockedDomains","respectDNT","dntBehavior","consentModeGoogle","consentModeMicrosoft"];for(const o of n)void 0!==e[o]&&(t[o]=e[o]);t.lang="de";const o=P,s=o.labels||{},a=e.labels||{};t.labels={banner:{...T.labels.banner,...s.banner,...a.banner},modal:{...T.labels.modal,...s.modal,...a.modal},widget:{...T.labels.widget,...s.widget,...a.widget}};const r=o.categories||{},i=e.categories||{};t.categories={...T.categories};for(const e of Object.keys(T.categories))t.categories[e]={...T.categories[e],...r[e],...i[e]};return e.callbacks&&(t.callbacks={...T.callbacks,...e.callbacks}),e.patterns&&(t.patterns=e.patterns),e.intercept&&"object"==typeof e.intercept&&(t.intercept={...T.intercept,...e.intercept}),Array.isArray(e.essentialKeys)&&(t.essentialKeys=e.essentialKeys.filter(e=>"string"==typeof e&&e.length>0&&200>=e.length)),Array.isArray(e.essentialPatterns)&&(t.essentialPatterns=e.essentialPatterns.filter(e=>"string"==typeof e&&e.length>0&&500>=e.length)),t}function U(){const e="undefined"!=typeof window&&window.ZestConfig?window.ZestConfig:{},t=function(){const e=document.currentScript||document.querySelector("script[data-zest]")||document.querySelector('script[src*="zest"]');if(!e)return{};const t={},n=e.getAttribute("data-position");n&&(t.position=n);const o=e.getAttribute("data-theme");o&&(t.theme=o);const s=e.getAttribute("data-accent")||e.getAttribute("data-accent-color");s&&(t.accentColor=s);const a=e.getAttribute("data-policy-url")||e.getAttribute("data-privacy-url");a&&(t.policyUrl=a);const r=e.getAttribute("data-imprint-url");r&&(t.imprintUrl=r);const i=e.getAttribute("data-show-widget");null!==i&&(t.showWidget="false"!==i);const c=e.getAttribute("data-auto-init");null!==c&&(t.autoInit="false"!==c);const l=e.getAttribute("data-expiration");l&&(t.expiration=parseInt(l,10));const d=e.getAttribute("data-consent-mode-google");null!==d&&(t.consentModeGoogle="false"!==d);const u=e.getAttribute("data-consent-mode-microsoft");return null!==u&&(t.consentModeMicrosoft="false"!==u),t}();return Z({...e,...t})}let H=null;function Y(){return H||(H=U()),H}const F="zest_consent";function B(){try{return"undefined"!=typeof location&&"https:"===location.protocol?"; Secure":""}catch(e){return""}}let K=null;function G(e){const t=m();t?.set?t.set.call(document,e):document.cookie=e}function J(){const e=m();return e?.get?e.get.call(document):document.cookie}function X(){try{const e=J().match(RegExp(F+"=([^;]+)"));if(e){const t=r(JSON.parse(decodeURIComponent(e[1])),O());if(t&&t.categories)return K={essential:!0,functional:!1,analytics:!1,marketing:!1,...t.categories},{...K}}}catch(e){}return K={essential:!0,functional:!1,analytics:!1,marketing:!1},{...K}}function V(){return K||(K=X()),{...K}}function Q(e,t=365){const n=K?{...K}:{essential:!0,functional:!1,analytics:!1,marketing:!1};return K={essential:!0,functional:!!e.functional,analytics:!!e.analytics,marketing:!!e.marketing},function(e=365){K||(K={essential:!0,functional:!1,analytics:!1,marketing:!1});const t={version:"1.0",timestamp:Date.now(),categories:K},n=new Date(Date.now()+24*e*60*60*1e3).toUTCString();G(`${F}=${encodeURIComponent(JSON.stringify(t))}; expires=${n}; path=/; SameSite=Lax${B()}`)}(t),{current:{...K},previous:n}}function ee(e){return K||(K=X()),!0===K[e]}function te(e=365){return Q({functional:!1,analytics:!1,marketing:!1},e)}function ne(){try{return J().includes(F)}catch(e){return!1}}const oe={READY:"zest:ready",CONSENT:"zest:consent",REJECT:"zest:reject",CHANGE:"zest:change",SHOW:"zest:show",HIDE:"zest:hide"};function se(e,t={}){const n=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return document.dispatchEvent(n),n}function ae(e,t){return se(oe.CONSENT,{consent:e,previous:t})}function re(e){return se(oe.REJECT,{consent:e})}function ie(e,t){return se(oe.CHANGE,{consent:e,previous:t})}function ce(e="banner"){return se(oe.SHOW,{type:e})}function le(e="banner"){return se(oe.HIDE,{type:e})}let de=!1,ue=null;function pe(e){return ee(e)}function fe(e){!function(e){const t=[];for(const n of f)e.includes(n.category)?p?.set&&p.set.call(document,n.value):t.push(n);f.length=0,f.push(...t)}(e),function(e){const t=[];for(const n of y)e.includes(n.category)?b?.setItem(n.key,n.value):t.push(n);y.length=0,y.push(...t);const n=[];for(const t of z)e.includes(t.category)?h?.setItem(t.key,t.value):n.push(t);z.length=0,z.push(...n)}(e),function(e){const t=[];for(const n of S){if(!e.includes(n.category)){t.push(n);continue}const o=document.createElement("script");n.src?o.src=n.src:n.inline&&(o.textContent=n.inline),n.async&&(o.async=!0),n.defer&&(o.defer=!0),n.type&&"text/plain"!==n.type&&(o.type=n.type),o.setAttribute("data-zest-processed","executed"),o.setAttribute("data-consent-executed","true");const s=n.element;s&&s.isConnected&&s.parentNode?s.parentNode.replaceChild(o,s):document.head.appendChild(o)}S.length=0,S.push(...t)}(e)}function ge(e={}){if(de)return{alreadyInitialized:!0,config:ue,consent:X(),hasDecision:ne(),dntApplied:!1};H=Z(e),ue=H,I({functional:!1,analytics:!1,marketing:!1},ue,!0),ue.patterns&&function(e){if(l={...c},e&&"object"==typeof e)for(const[t,n]of Object.entries(e)){if(!Array.isArray(n))continue;const e=[];for(const t of n){const n=s(t);if(n)e.push(n);else try{console.warn("[Zest] Rejected unsafe pattern:",t)}catch(e){}}l[t]=e}}(ue.patterns),(Array.isArray(ue.essentialKeys)&&ue.essentialKeys.length>0||Array.isArray(ue.essentialPatterns)&&ue.essentialPatterns.length>0)&&function(e,{keys:t=[],patternStrings:n=[]}={}){l[e]||(l[e]=[]);for(const n of t){if("string"!=typeof n||!n)continue;const t=s(`^${d(n)}$`);t&&l[e].push(t)}for(const t of n){if("string"!=typeof t||!t)continue;const n=s(t);n&&l[e].push(n)}}("essential",{keys:ue.essentialKeys,patternStrings:ue.essentialPatterns}),g=pe,function(e){w=e}(pe),function(e){M=e}(pe);const t=ue.intercept||{cookies:!0,storage:!0,scripts:!0};!1!==t.cookies&&(p=Object.getOwnPropertyDescriptor(Document.prototype,"cookie"),p?Object.defineProperty(document,"cookie",{get:()=>p.get.call(document),set(e){const t=function(e){const t=e.match(/^([^=]+)/);return t?t[1].trim():null}(e);if(!t)return;const n=u(t);g(n)?p.set.call(document,e):100>f.length&&f.push({value:e,name:t,category:n,timestamp:Date.now()})},configurable:!1}):console.warn("[Zest] Could not get cookie descriptor")),!1!==t.storage&&function(){try{return b=window.localStorage,h=window.sessionStorage,Object.defineProperty(window,"localStorage",{value:x(b,y),configurable:!0,writable:!1}),Object.defineProperty(window,"sessionStorage",{value:x(h,z),configurable:!0,writable:!1}),!0}catch(e){return console.warn("[Zest] Could not intercept storage APIs:",e),!1}}(),!1!==t.scripts&&D(ue.mode,ue.blockedDomains);const n=X();de=!0,ne()&&I(n,ue,!1);let o=!1;if(q()&&ue.respectDNT&&"ignore"!==ue.dntBehavior&&"reject"===ue.dntBehavior&&!ne()){const e=te(ue.expiration);o=!0,I(e.current,ue,!1),re(e.current),ie(e.current,e.previous),i(ue.callbacks?.onReject),i(ue.callbacks?.onChange,e.current)}return function(e){se(oe.READY,{consent:e})}(n),i(ue.callbacks?.onReady,n),{alreadyInitialized:!1,config:ue,consent:n,hasDecision:ne(),dntApplied:o}}function me(){if(!de)return null;const e=function(e=365){return Q({functional:!0,analytics:!0,marketing:!0},e)}(ue.expiration);return I(e.current,ue,!1),fe(O()),ae(e.current,e.previous),ie(e.current,e.previous),i(ue.callbacks?.onAccept,e.current),i(ue.callbacks?.onChange,e.current),e}function be(){G(`${F}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; SameSite=Lax${B()}`),K=null}function he(){return de}function ye(){return ue}const ze="#4F46E5";function we(e){const t=function(e){if("string"!=typeof e)return null;const t=e.trim();return/^#[0-9a-fA-F]{3,8}$/.test(t)||n.has(t.toLowerCase())||/^(rgb|rgba|hsl|hsla)\(\s*[\d.,%\s/]+\s*\)$/i.test(t)?t:null}(e.accentColor)||ze,o=function(e){if("string"!=typeof e||0===e.length)return"";if(e.length>2e4)return"";let t=e.replace(/\/\*[\s\S]*?\*\//g,"");return t=t.replace(/@import\s+[^;]+;?/gi,""),t=t.replace(/@charset\s+[^;]+;?/gi,""),t=t.replace(/url\(\s*(['"]?)([^)'"]+)\1\s*\)/gi,(e,t,n)=>{const o=n.trim().toLowerCase();return o.startsWith("https:")||o.startsWith("data:image/")||o.startsWith("/")||o.startsWith("#")?e:"url(#)"}),t=t.replace(/\.zest-btn--secondary\s*\{[^}]*\}/gi,""),t=t.replace(/\[data-action\s*=\s*["']reject-all["']\]\s*\{[^}]*\}/gi,""),t=t.replace(/\[data-action\s*=\s*["']accept-all["']\]\s*\{[^}]*\}/gi,""),t=t.replace(/expression\s*\([^)]*\)/gi,""),t=t.replace(/-moz-binding\s*:[^;}]*/gi,""),t}(e.customStyles);return`\n:host {\n --zest-accent: ${t};\n --zest-accent-hover: ${function(e,t){"string"==typeof e&&/^#[0-9a-fA-F]{3,8}$/.test(e.trim())||(e=ze);let n=e.trim().replace("#","");3===n.length&&(n=n.split("").map(e=>e+e).join(""));8===n.length&&(n=n.slice(0,6));6!==n.length&&(n="4F46E5");const o=parseInt(n,16),s=Math.round(2.55*t);return"#"+(16777216+65536*Math.min(255,Math.max(0,(o>>16)+s))+256*Math.min(255,Math.max(0,(o>>8&255)+s))+Math.min(255,Math.max(0,(255&o)+s))).toString(16).slice(1)}(t,-15)};\n --zest-bg: #ffffff;\n --zest-bg-secondary: #f3f4f6;\n --zest-text: #1f2937;\n --zest-text-secondary: #6b7280;\n --zest-border: #e5e7eb;\n --zest-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n --zest-radius: 12px;\n --zest-radius-sm: 8px;\n --zest-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\n\n font-family: var(--zest-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--zest-text);\n box-sizing: border-box;\n}\n\n:host([data-theme="dark"]) {\n --zest-bg: #1f2937;\n --zest-bg-secondary: #374151;\n --zest-text: #f9fafb;\n --zest-text-secondary: #9ca3af;\n --zest-border: #4b5563;\n --zest-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.3);\n}\n\n@media (prefers-color-scheme: dark) {\n :host([data-theme="auto"]) {\n --zest-bg: #1f2937;\n --zest-bg-secondary: #374151;\n --zest-text: #f9fafb;\n --zest-text-secondary: #9ca3af;\n --zest-border: #4b5563;\n --zest-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.3);\n }\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n/* Banner */\n.zest-banner {\n position: fixed;\n z-index: 999999;\n max-width: 480px;\n padding: 20px;\n background: var(--zest-bg);\n border-radius: var(--zest-radius);\n box-shadow: var(--zest-shadow);\n animation: zest-slide-in 0.3s ease-out;\n}\n\n.zest-banner--bottom {\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.zest-banner--bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.zest-banner--bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.zest-banner--top {\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n@keyframes zest-slide-in {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n.zest-banner--bottom-left {\n animation-name: zest-slide-in-left;\n}\n\n@keyframes zest-slide-in-left {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.zest-banner--bottom-right {\n animation-name: zest-slide-in-right;\n}\n\n@keyframes zest-slide-in-right {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .zest-banner,\n .zest-modal {\n animation: none;\n }\n}\n\n.zest-banner__title {\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--zest-text);\n}\n\n.zest-banner__description {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: var(--zest-text-secondary);\n}\n\n.zest-banner__buttons {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Buttons */\n.zest-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 10px 16px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n border: none;\n border-radius: var(--zest-radius-sm);\n cursor: pointer;\n transition: background-color 0.15s ease, transform 0.1s ease;\n}\n\n.zest-btn:hover {\n transform: translateY(-1px);\n}\n\n.zest-btn:active {\n transform: translateY(0);\n}\n\n.zest-btn:focus-visible {\n outline: 2px solid var(--zest-accent);\n outline-offset: 2px;\n}\n\n.zest-btn--primary {\n background: var(--zest-accent);\n color: #ffffff;\n}\n\n.zest-btn--primary:hover {\n background: var(--zest-accent-hover);\n}\n\n.zest-btn--secondary {\n background: var(--zest-bg-secondary);\n color: var(--zest-text);\n}\n\n.zest-btn--secondary:hover {\n background: var(--zest-border);\n}\n\n.zest-btn--ghost {\n background: transparent;\n color: var(--zest-text-secondary);\n}\n\n.zest-btn--ghost:hover {\n background: var(--zest-bg-secondary);\n color: var(--zest-text);\n}\n\n/* Modal */\n.zest-modal-overlay {\n position: fixed;\n inset: 0;\n z-index: 999998;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n background: rgba(0, 0, 0, 0.5);\n animation: zest-fade-in 0.2s ease-out;\n}\n\n@keyframes zest-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.zest-modal {\n width: 100%;\n max-width: 500px;\n max-height: 90vh;\n overflow-y: auto;\n background: var(--zest-bg);\n border-radius: var(--zest-radius);\n box-shadow: var(--zest-shadow);\n animation: zest-modal-in 0.3s ease-out;\n}\n\n@keyframes zest-modal-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.zest-modal__header {\n padding: 20px 20px 0;\n}\n\n.zest-modal__title {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--zest-text);\n}\n\n.zest-modal__description {\n margin: 0;\n font-size: 14px;\n color: var(--zest-text-secondary);\n}\n\n.zest-modal__body {\n padding: 20px;\n}\n\n.zest-modal__footer {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 0 20px 20px;\n}\n\n/* Categories */\n.zest-category {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--zest-bg-secondary);\n border-radius: var(--zest-radius-sm);\n}\n\n.zest-category:last-child {\n margin-bottom: 0;\n}\n\n.zest-category__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.zest-category__info {\n flex: 1;\n}\n\n.zest-category__label {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--zest-text);\n}\n\n.zest-category__description {\n margin: 4px 0 0;\n font-size: 13px;\n color: var(--zest-text-secondary);\n}\n\n/* Toggle Switch */\n.zest-toggle {\n position: relative;\n width: 44px;\n height: 24px;\n flex-shrink: 0;\n}\n\n.zest-toggle__input {\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n margin: 0;\n}\n\n.zest-toggle__input:disabled {\n cursor: not-allowed;\n}\n\n.zest-toggle__slider {\n position: absolute;\n inset: 0;\n background: var(--zest-border);\n border-radius: 12px;\n transition: background-color 0.2s ease;\n pointer-events: none;\n}\n\n.zest-toggle__slider::before {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: 20px;\n height: 20px;\n background: #ffffff;\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.zest-toggle__input:checked + .zest-toggle__slider {\n background: var(--zest-accent);\n}\n\n.zest-toggle__input:checked + .zest-toggle__slider::before {\n transform: translateX(20px);\n}\n\n.zest-toggle__input:focus-visible + .zest-toggle__slider {\n outline: 2px solid var(--zest-accent);\n outline-offset: 2px;\n}\n\n.zest-toggle__input:disabled + .zest-toggle__slider {\n opacity: 0.6;\n}\n\n/* Widget */\n.zest-widget {\n position: fixed;\n z-index: 999997;\n bottom: 20px;\n left: 20px;\n}\n\n.zest-widget__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n padding: 0;\n background: var(--zest-bg);\n border: 1px solid var(--zest-border);\n border-radius: 50%;\n box-shadow: var(--zest-shadow);\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n}\n\n.zest-widget__btn:hover {\n transform: scale(1.05);\n box-shadow: 0 12px 28px -5px rgba(0, 0, 0, 0.15);\n}\n\n.zest-widget__btn:focus-visible {\n outline: 2px solid var(--zest-accent);\n outline-offset: 2px;\n}\n\n.zest-widget__icon {\n width: 24px;\n height: 24px;\n fill: var(--zest-text);\n}\n\n/* Link */\n.zest-link {\n color: var(--zest-accent);\n text-decoration: none;\n}\n\n.zest-link:hover {\n text-decoration: underline;\n}\n\n/* Mobile */\n@media (max-width: 480px) {\n .zest-banner {\n left: 10px;\n right: 10px;\n max-width: none;\n transform: none;\n }\n\n .zest-banner--bottom,\n .zest-banner--bottom-left,\n .zest-banner--bottom-right {\n bottom: 10px;\n }\n\n .zest-banner--top {\n top: 10px;\n transform: none;\n }\n\n @keyframes zest-slide-in {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .zest-banner__buttons {\n flex-direction: column;\n }\n\n .zest-btn {\n width: 100%;\n }\n\n .zest-modal-overlay {\n padding: 10px;\n }\n\n .zest-widget {\n bottom: 10px;\n left: 10px;\n }\n}\n\n/* Hidden utility */\n.zest-hidden {\n display: none !important;\n}\n${o}\n`}let xe=null,ve=null;const ke=new Set(["bottom","bottom-left","bottom-right","top"]);function _e(e={}){if(xe)return xe;const n=Y();xe=document.createElement("zest-banner"),xe.setAttribute("data-theme",n.theme||"light"),ve=xe.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=we(n),ve.appendChild(o);const s=document.createElement("div");s.innerHTML=function(e){const n=e.labels.banner,o=e.position||"bottom";return`\n <div class="zest-banner zest-banner--${ke.has(o)?o:"bottom"}" role="dialog" aria-modal="false" aria-label="${t(n.title)}">\n <h2 class="zest-banner__title">${t(n.title)}</h2>\n <p class="zest-banner__description">${t(n.description)}</p>\n <div class="zest-banner__buttons">\n <button type="button" class="zest-btn zest-btn--primary" data-action="accept-all">\n ${t(n.acceptAll)}\n </button>\n <button type="button" class="zest-btn zest-btn--secondary" data-action="reject-all">\n ${t(n.rejectAll)}\n </button>\n <button type="button" class="zest-btn zest-btn--ghost" data-action="settings">\n ${t(n.settings)}\n </button>\n </div>\n </div>\n `}(n),ve.appendChild(s.firstElementChild);const a=ve.querySelector(".zest-banner");return a.addEventListener("click",t=>{const n=t.target.dataset.action;if(n)switch(n){case"accept-all":e.onAcceptAll?.();break;case"reject-all":e.onRejectAll?.();break;case"settings":e.onSettings?.()}}),a.addEventListener("keydown",t=>{"Escape"===t.key&&e.onSettings?.()}),document.body.appendChild(xe),requestAnimationFrame(()=>{const e=ve.querySelector("button");e?.focus()}),xe}function Ae(e={}){xe?xe.classList.remove("zest-hidden"):_e(e)}function Ce(){xe&&(xe.remove(),xe=null,ve=null)}let Se=null,Ee=null,je={};function $e(e,n){const o=e.labels.modal,s=Object.values(e.categories||W).map(e=>function(e,n,o){const s=o?"disabled":"",a=n?"checked":"",r=t(e.id),i=t(e.label);return`\n <div class="zest-category">\n <div class="zest-category__header">\n <div class="zest-category__info">\n <span class="zest-category__label">${i}</span>\n <p class="zest-category__description">${t(e.description)}</p>\n </div>\n <label class="zest-toggle">\n <input\n type="checkbox"\n class="zest-toggle__input"\n data-category="${r}"\n ${a}\n ${s}\n aria-label="${i}"\n >\n <span class="zest-toggle__slider"></span>\n </label>\n </div>\n </div>\n `}(e,n[e.id]??e.default,e.required)).join(""),a=e.policyUrl?function(e){if("string"!=typeof e||0===e.length)return null;const t=e.trim();if(0===t.length)return null;if(/^[/?#]/.test(t))return t;const n=t.match(/^([a-z][a-z0-9+.-]*):/i);if(!n)return t;const o=n[1].toLowerCase();return"http"===o||"https"===o||"mailto"===o||"tel"===o?t:null}(e.policyUrl):null,r=a?`<a href="${t(a)}" class="zest-link" target="_blank" rel="noopener noreferrer">Privacy Policy</a>`:"";return`\n <div class="zest-modal-overlay" role="dialog" aria-modal="true" aria-label="${t(o.title)}">\n <div class="zest-modal">\n <div class="zest-modal__header">\n <h2 class="zest-modal__title">${t(o.title)}</h2>\n <p class="zest-modal__description">${t(o.description)} ${r}</p>\n </div>\n <div class="zest-modal__body">\n ${s}\n </div>\n <div class="zest-modal__footer">\n <button type="button" class="zest-btn zest-btn--primary" data-action="save">\n ${t(o.save)}\n </button>\n <button type="button" class="zest-btn zest-btn--secondary" data-action="accept-all">\n ${t(o.acceptAll)}\n </button>\n <button type="button" class="zest-btn zest-btn--ghost" data-action="reject-all">\n ${t(o.rejectAll)}\n </button>\n </div>\n </div>\n </div>\n `}function Me(){if(!Ee)return je;const e=Ee.querySelectorAll(".zest-toggle__input"),t={essential:!0};return e.forEach(e=>{const n=e.dataset.category;n&&"essential"!==n&&(t[n]=e.checked)}),t}function Le(){Se&&(Se.remove(),Se=null,Ee=null)}let Ne=null,Re=null;function De(e={}){if(Ne)return Ne;const n=Y();Ne=document.createElement("zest-widget"),Ne.setAttribute("data-theme",n.theme||"light"),Re=Ne.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=we(n),Re.appendChild(o);const s=document.createElement("div");s.innerHTML=function(e){const n=t(e.labels.widget.label);return`\n <div class="zest-widget">\n <button type="button" class="zest-widget__btn" aria-label="${n}" title="${n}">\n <span class="zest-widget__icon"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10c0-.728-.078-1.437-.225-2.12a1 1 0 0 0-1.482-.63 3 3 0 0 1-4.086-3.72 1 1 0 0 0-.793-1.263A10.05 10.05 0 0 0 12 2zm0 2c.178 0 .354.006.528.017a5 5 0 0 0 5.955 5.955c.011.174.017.35.017.528 0 4.418-3.582 8-8 8s-8-3.582-8-8 3.582-8 8-8zm-4 6a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zm5 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-2 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z"/></svg></span>\n </button>\n </div>\n `}(n),Re.appendChild(s.firstElementChild);return Re.querySelector(".zest-widget__btn").addEventListener("click",()=>{e.onClick?.()}),document.body.appendChild(Ne),Ne}function We(e={}){Ne?Ne.style.display="":De(e)}function Oe(){Ne&&(Ne.style.display="none")}function qe(){me();const e=ye();Ce(),Le(),e?.showWidget&&We({onClick:Te})}function Ie(){!function(){if(!de)return null;const e=te(ue.expiration);I(e.current,ue,!1),re(e.current),ie(e.current,e.previous),i(ue.callbacks?.onReject),i(ue.callbacks?.onChange,e.current)}();const e=ye();Ce(),Le(),e?.showWidget&&We({onClick:Te})}function Pe(e){!function(e){if(!de)return null;const t=Q(e,ue.expiration);I(t.current,ue,!1);const n=Object.keys(t.current).filter(e=>t.current[e]&&!t.previous[e]);n.length>0&&fe(n),Object.entries(e||{}).some(([e,t])=>"essential"!==e&&t)?ae(t.current,t.previous):re(t.current),ie(t.current,t.previous),i(ue.callbacks?.onChange,t.current)}(e);const t=ye();Le(),t?.showWidget&&We({onClick:Te})}function Te(){Ce(),Oe(),function(e={},t={}){if(Se)return Se;const n=Y();je={...e},Se=document.createElement("zest-modal"),Se.setAttribute("data-theme",n.theme||"light"),Ee=Se.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=we(n),Ee.appendChild(o);const s=document.createElement("div");s.innerHTML=$e(n,e),Ee.appendChild(s.firstElementChild);const a=Ee.querySelector(".zest-modal-overlay");a.addEventListener("click",e=>{const n=e.target.dataset.action;if(n)switch(n){case"save":t.onSave?.(Me());break;case"accept-all":t.onAcceptAll?.();break;case"reject-all":t.onRejectAll?.()}else e.target===a&&t.onClose?.()}),a.addEventListener("keydown",e=>{"Escape"===e.key&&t.onClose?.()}),Ee.querySelectorAll(".zest-toggle__input").forEach(e=>{e.addEventListener("change",()=>{je=Me()})}),document.body.appendChild(Se),requestAnimationFrame(()=>{const e=Ee.querySelector("button");e?.focus()})}(V(),{onSave:Pe,onAcceptAll:qe,onRejectAll:Ie,onClose:Ze}),ce("modal")}function Ze(){Le(),le("modal");const e=ye();ne()&&e?.showWidget?We({onClick:Te}):Ae({onAcceptAll:qe,onRejectAll:Ie,onSettings:Te})}function Ue(e={}){const{alreadyInitialized:t,hasDecision:n,dntApplied:o}=ge(e);if(t)return console.warn("[Zest] Already initialized"),He;const s=ye();return n||o?s?.showWidget&&We({onClick:Te}):(Ae({onAcceptAll:qe,onRejectAll:Ie,onSettings:Te}),ce("banner")),He}const He={init:Ue,show(){he()?(Le(),Oe(),Ae({onAcceptAll:qe,onRejectAll:Ie,onSettings:Te}),ce("banner")):console.warn("[Zest] Not initialized. Call Zest.init() first.")},hide(){Ce(),le("banner")},showSettings(){he()?Te():console.warn("[Zest] Not initialized. Call Zest.init() first.")},hideSettings(){Le(),le("modal")},getConsent:V,hasConsent:ee,hasConsentDecision:ne,getConsentProof:function(){try{const e=J().match(RegExp(F+"=([^;]+)"));if(e){return r(JSON.parse(decodeURIComponent(e[1])),O())}}catch(e){}return null},isDoNotTrackEnabled:q,getDNTDetails:function(){if("undefined"==typeof navigator)return{enabled:!1,source:null};const e=navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack;return"1"===e||"yes"===e||!0===e?{enabled:!0,source:"dnt"}:!0===navigator.globalPrivacyControl?{enabled:!0,source:"gpc"}:{enabled:!1,source:null}},acceptAll(){he()?qe():console.warn("[Zest] Not initialized. Call Zest.init() first.")},rejectAll(){he()?Ie():console.warn("[Zest] Not initialized. Call Zest.init() first.")},reset(){be(),Le(),Ne&&(Ne.remove(),Ne=null,Re=null),he()&&(Ae({onAcceptAll:qe,onRejectAll:Ie,onSettings:Te}),ce("banner"))},getConfig:Y,on:function(e,t){return document.addEventListener(e,t),()=>document.removeEventListener(e,t)},once:function(e,t){document.addEventListener(e,t,{once:!0})},EVENTS:oe};if("undefined"!=typeof window){try{Object.defineProperty(window,"Zest",{value:Object.freeze(He),writable:!1,configurable:!1,enumerable:!0})}catch(e){window.Zest=He}const e=()=>{!1!==U().autoInit&&Ue(window.ZestConfig)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}return He}();
1
+ var Zest=function(){"use strict";const t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"};function e(e){if(null==e)return"";return("string"==typeof e?e:e+"").replace(/[&<>"'`]/g,e=>t[e])}const n=new Set(["transparent","black","white","red","green","blue","yellow","orange","purple","pink","gray","grey","brown","cyan","magenta","silver","gold","navy","teal","maroon","olive","lime","aqua","fuchsia","indigo","violet","crimson","coral","salmon","tomato"]);const o=[/(\([^)]*[+*][^)]*\)|\[[^\]]*\]|\\w|\\d|\\s)\s*[+*]/,/\(\?[=!][^)]*[+*][^)]*\)[+*]/];function r(t,e){if(t instanceof RegExp)return t;if("string"!=typeof t)return null;if(t.length>500)return null;for(const e of o)if(e.test(t))return null;try{return RegExp(t,e)}catch(t){return null}}const s=new Set(["__proto__","constructor","prototype"]);function a(t,e){if(!t||"object"!=typeof t||Array.isArray(t))return null;const n={version:"string"==typeof t.version?t.version:null,timestamp:"number"==typeof t.timestamp&&Number.isFinite(t.timestamp)?t.timestamp:null,categories:{}},o=t.categories;if(!o||"object"!=typeof o||Array.isArray(o))return null;for(const t of e)s.has(t)||Object.prototype.hasOwnProperty.call(o,t)&&(n.categories[t]=!0===o[t]);return e.includes("essential")&&(n.categories.essential=!0),n}function i(t,...e){if("function"==typeof t)try{return t(...e)}catch(t){try{console.error("[Zest] User callback threw:",t)}catch(t){}return}}const c={essential:[/^zest_/,/^csrf/i,/^xsrf/i,/^session/i,/^__host-/i,/^__secure-/i],functional:[/^lang/i,/^locale/i,/^theme/i,/^preferences/i,/^ui_/i],analytics:[/^_ga/,/^_gid/,/^_gat/,/^_utm/,/^__utm/,/^plausible/i,/^_pk_/,/^matomo/i,/^_hj/,/^ajs_/],marketing:[/^_fbp/,/^_fbc/,/^_gcl/,/^_ttp/,/^ads/i,/^doubleclick/i,/^__gads/,/^__gpi/,/^_pin_/,/^li_/]};let l={...c};function u(t){return(t+"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function d(t){for(const[e,n]of Object.entries(l))if(n.some(e=>e.test(t)))return e;return"marketing"}let f=null;const p=[];let g=()=>!1;function m(){return f}let b=null,y=null;const h=[],w=[];let z=()=>!1;function v(t,e,n){return new Proxy(t,{get(t,n){if("setItem"===n)return(n,o)=>{const r=d(n);z(r)?t.setItem(n,o):200>e.length&&e.push({key:n,value:o,category:r,timestamp:Date.now()})};const o=t[n];return"function"==typeof o?o.bind(t):o}})}const k={analytics:["google-analytics.com","www.google-analytics.com","analytics.google.com","googletagmanager.com","www.googletagmanager.com","plausible.io","cloudflareinsights.com","static.cloudflareinsights.com"],marketing:["connect.facebook.net","www.facebook.com/tr","ads.google.com","www.googleadservices.com","googleads.g.doubleclick.net","pagead2.googlesyndication.com"]},x={analytics:[...k.analytics,"analytics.tiktok.com","matomo.","hotjar.com","static.hotjar.com","script.hotjar.com","clarity.ms","www.clarity.ms","heapanalytics.com","cdn.heapanalytics.com","mixpanel.com","cdn.mxpnl.com","segment.com","cdn.segment.com","api.segment.io","fullstory.com","rs.fullstory.com","amplitude.com","cdn.amplitude.com","mouseflow.com","cdn.mouseflow.com","luckyorange.com","cdn.luckyorange.net","crazyegg.com","script.crazyegg.com"],marketing:[...k.marketing,"snap.licdn.com","px.ads.linkedin.com","ads.linkedin.com","analytics.twitter.com","static.ads-twitter.com","t.co","analytics.tiktok.com","ads.tiktok.com","sc-static.net","tr.snapchat.com","ct.pinterest.com","pintrk.com","s.pinimg.com","widgets.pinterest.com","bat.bing.com","ads.yahoo.com","sp.analytics.yahoo.com","amazon-adsystem.com","z-na.amazon-adsystem.com","criteo.com","static.criteo.net","dis.criteo.com","taboola.com","cdn.taboola.com","trc.taboola.com","outbrain.com","widgets.outbrain.com","adroll.com","s.adroll.com"],functional:["cdn.onesignal.com","onesignal.com","pusher.com","js.pusher.com","intercom.io","widget.intercom.io","js.intercomcdn.com","crisp.chat","client.crisp.chat","cdn.livechatinc.com","livechatinc.com","tawk.to","embed.tawk.to","zendesk.com","static.zdassets.com"]};function _(t,e){let n;try{n=new URL(t)}catch(t){return!1}const o=n.hostname.toLowerCase(),r=n.pathname.toLowerCase();for(const t of e){if("string"!=typeof t)continue;const e=t.toLowerCase();if(e.endsWith(".")){const t=e.slice(0,-1);if(o.split(".").some(e=>e===t)||o.startsWith(e))return!0;continue}const n=e.indexOf("/");if(-1!==n){const t=e.slice(0,n),s=e.slice(n);if((o===t||o.endsWith("."+t))&&r.startsWith(s))return!0;continue}if(o===e||o.endsWith("."+e))return!0}return!1}function A(t,e="safe"){const n="strict"===e?x:k;for(const[e,o]of Object.entries(n))if(_(t,o))return e;return null}function C(t){try{const e=new URL(t).hostname,n=window.location.hostname,o=t=>t.replace(/^www\./,"");return o(e)!==o(n)}catch(t){return!1}}const E=new Set(["functional","analytics","marketing"]),S=[];let j=null,L="safe",M=[],R=()=>!1;function $(t){if(t.hasAttribute("data-zest-allow"))return null;const e=t.getAttribute("data-consent-category"),n=e&&E.has(e)?e:null,o=t.src;if(!o)return n;const r=function(t){if(!t||0===M.length)return null;try{const e=new URL(t).hostname.toLowerCase();for(const t of M){const n="string"==typeof t?t:t.domain,o="string"==typeof t?"marketing":t.category||"marketing";if(e===n||e.endsWith("."+n))return o}}catch(t){}return null}(o);let s=null;switch(L){case"manual":break;case"safe":case"strict":s=A(o,L);break;case"doomsday":C(o)&&(s=A(o,"strict")||"marketing")}return s||r||n}function N(t){if(t.hasAttribute("data-zest-processed"))return!1;const e=$(t);if(!e)return t.setAttribute("data-zest-processed","allowed"),!1;if(R(e))return t.setAttribute("data-zest-processed","allowed"),!1;const n={category:e,src:t.src||"",inline:t.textContent,type:t.type,async:t.async,defer:t.defer,element:t,timestamp:Date.now()};return t.setAttribute("data-zest-processed","blocked"),t.setAttribute("data-consent-category",e),t.type="text/plain",t.src&&t.removeAttribute("src"),500>S.length&&S.push(n),!0}function O(t){for(const e of t)for(const t of e.addedNodes)if("SCRIPT"!==t.nodeName||t.hasAttribute("data-zest-processed")||N(t),t.querySelectorAll){t.querySelectorAll("script:not([data-zest-processed])").forEach(N)}}function T(t="safe",e=[]){return L=t,M=e,document.querySelectorAll("script:not([data-zest-processed])").forEach(N),j=new MutationObserver(O),j.observe(document.documentElement,{childList:!0,subtree:!0}),!0}let D=null,P=null,I=null,W=null,q="safe",H=[],U=!1,Z=()=>!1;const B=new Set(["functional","analytics","marketing"]);function F(t){if(!t)return null;let e;try{e=new URL(t,location.href).hostname}catch(t){return null}const n=function(t){if(!t||0===H.length)return null;const e=t.toLowerCase();for(const t of H){const n=("string"==typeof t?t:t?.domain||"").toLowerCase();if(!n)continue;const o="string"==typeof t?"marketing":B.has(t?.category)?t.category:"marketing";if(e===n||e.endsWith("."+n))return o}return null}(e);if(n)return n;switch(q){case"manual":default:return null;case"safe":case"strict":return A(t,q);case"doomsday":return C(t)?A(t,"strict")||"marketing":null}}function Y(t){const e=F(t);return e?Z(e)?null:e:null}function K(){"undefined"!=typeof window&&"function"==typeof window.fetch&&(D=window.fetch.bind(window),window.fetch=function(t,e){const n=function(t){try{if("string"==typeof t)return new URL(t,location.href).href;if(t&&"object"==typeof t){if("string"==typeof t.url)return new URL(t.url,location.href).href;if("string"==typeof t.href)return t.href}}catch(t){}return null}(t);return Y(n)?Promise.resolve("function"==typeof Response?new Response(null,{status:204,statusText:"Blocked by Zest"}):{ok:!1,status:204,statusText:"Blocked by Zest",json:()=>Promise.resolve({}),text:()=>Promise.resolve(""),arrayBuffer:()=>Promise.resolve(new ArrayBuffer(0))}):D(t,e)})}const G=Symbol("zestUrl");function X(t="safe",e=[]){return q=t,H=Array.isArray(e)?e:[],U||(K(),function(){if("undefined"==typeof XMLHttpRequest)return;const t=XMLHttpRequest.prototype;P=t.open,I=t.send,t.open=function(t,e,...n){return this[G]="string"==typeof e?e:e&&e.href||"",P.call(this,t,e,...n)},t.send=function(t){if(Y(this[G])){const t=this;return void queueMicrotask(()=>{try{Object.defineProperty(t,"readyState",{value:4,configurable:!0}),Object.defineProperty(t,"status",{value:0,configurable:!0})}catch(t){}try{t.dispatchEvent(new Event("error")),t.dispatchEvent(new Event("loadend"))}catch(t){}})}return I.call(this,t)}}(),"undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon&&(W=navigator.sendBeacon.bind(navigator),navigator.sendBeacon=function(t,e){return!Y("string"==typeof t?t:t&&t.href||"")&&W(t,e)}),U=!0),!0}const J=[];let V="safe",Q=[],tt=!1,et=()=>!1;const nt=new Set(["functional","analytics","marketing"]),ot={script:"src",link:"href",img:"src",iframe:"src"};function rt(t){if(!t)return null;let e;try{e=new URL(t,location.href).hostname}catch(t){return null}const n=function(t){if(!t||0===Q.length)return null;const e=t.toLowerCase();for(const t of Q){const n=("string"==typeof t?t:t?.domain||"").toLowerCase();if(!n)continue;const o="string"==typeof t?"marketing":nt.has(t?.category)?t.category:"marketing";if(e===n||e.endsWith("."+n))return o}return null}(e);if(n)return n;switch(V){case"manual":default:return null;case"safe":case"strict":return A(t,V);case"doomsday":return C(t)?A(t,"strict")||"marketing":null}}function st(t){const e=rt(t);return e?et(e)?null:e:null}function at(t,e){if("function"!=typeof t||!t.prototype)return null;const n=t.prototype,o=Object.getOwnPropertyDescriptor(n,e);return o&&"function"==typeof o.set?(Object.defineProperty(n,e,{configurable:!0,enumerable:o.enumerable,get:o.get,set(t){if("string"==typeof t){const n=st(t);if(n)return void(500>J.length&&J.push({element:this,setter:o.set,prop:e,value:t,category:n,method:"property"}))}return o.set.call(this,t)}}),o):null}function it(t="safe",e=[]){return V=t,Q=Array.isArray(e)?e:[],tt||("undefined"!=typeof HTMLScriptElement&&at(HTMLScriptElement,"src"),"undefined"!=typeof HTMLLinkElement&&at(HTMLLinkElement,"href"),"undefined"!=typeof HTMLImageElement&&at(HTMLImageElement,"src"),"undefined"!=typeof HTMLIFrameElement&&at(HTMLIFrameElement,"src"),function(){if("undefined"==typeof Element||!Element.prototype)return null;const t=Element.prototype.setAttribute;Element.prototype.setAttribute=function(e,n){if("string"!=typeof e||"string"!=typeof n||!this||!this.tagName)return t.call(this,e,n);const o=this.tagName.toLowerCase(),r=ot[o];if(!r)return t.call(this,e,n);if(e.toLowerCase()!==r)return t.call(this,e,n);const s=st(n);if(!s)return t.call(this,e,n);500>J.length&&J.push({element:this,setter:t,prop:e,value:n,category:s,method:"attribute"})}}(),function(){if("undefined"==typeof window||"function"!=typeof window.Image)return null;const t=window.Image;function e(e,n){return 2>arguments.length?new t:new t(e,n)}e.prototype=t.prototype;for(const n of Object.keys(t))try{e[n]=t[n]}catch(t){}try{Object.defineProperty(window,"Image",{configurable:!0,writable:!0,value:e})}catch(t){window.Image=e}}(),tt=!0),!0}const ct={essential:{id:"essential",label:"Essential",description:"Required for the website to function properly. Cannot be disabled.",required:!0,default:!0},functional:{id:"functional",label:"Functional",description:"Enable personalized features like language preferences and themes.",required:!1,default:!1},analytics:{id:"analytics",label:"Analytics",description:"Help us understand how visitors interact with our website.",required:!1,default:!1},marketing:{id:"marketing",label:"Marketing",description:"Used to deliver relevant advertisements and track campaign performance.",required:!1,default:!1}};function lt(){return Object.keys(ct)}function ut(){if("undefined"==typeof navigator)return!1;const t=navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack;return"1"===t||"yes"===t||!0===t||!0===navigator.globalPrivacyControl}function dt(t,e,n){const o=n?"default":"update";e.consentModeGoogle&&function(t,e){if(window.dataLayer=window.dataLayer||[],"function"==typeof window.gtag)window.gtag("consent",t,e);else{function n(){window.dataLayer.push(arguments)}n("consent",t,e)}}(o,function(t){const e=t=>t?"granted":"denied";return{ad_storage:e(t.marketing),ad_user_data:e(t.marketing),ad_personalization:e(t.marketing),analytics_storage:e(t.analytics),functionality_storage:"granted",personalization_storage:e(t.functional)}}(t)),e.consentModeMicrosoft&&function(t,e){window.uetq=window.uetq||[],window.uetq.push("consent",t,e)}(o,function(t){return{ad_storage:t.marketing?"granted":"denied"}}(t))}const ft={labels:{banner:{title:"Wir respektieren Ihre Privatsphäre",description:'Wir verwenden Cookies, um Ihr Surferlebnis zu verbessern, personalisierte Inhalte bereitzustellen und unseren Datenverkehr zu analysieren. Mit einem Klick auf „Alle akzeptieren" stimmen Sie der Verwendung von Cookies zu.',acceptAll:"Alle akzeptieren",rejectAll:"Alle ablehnen",settings:"Einstellungen"},modal:{title:"Datenschutzeinstellungen",description:"Verwalten Sie Ihre Cookie-Einstellungen. Sie können verschiedene Arten von Cookies unten aktivieren oder deaktivieren.",save:"Einstellungen speichern",acceptAll:"Alle akzeptieren",rejectAll:"Alle ablehnen"},widget:{label:"Cookie-Einstellungen"}},categories:{essential:{label:"Notwendig",description:"Erforderlich für die ordnungsgemäße Funktion der Website. Können nicht deaktiviert werden."},functional:{label:"Funktional",description:"Ermöglichen personalisierte Funktionen wie Spracheinstellungen und Designs."},analytics:{label:"Analytisch",description:"Helfen uns zu verstehen, wie Besucher mit unserer Website interagieren."},marketing:{label:"Marketing",description:"Werden verwendet, um relevante Werbung anzuzeigen und die Kampagnenleistung zu messen."}}};const pt={lang:"auto",position:"bottom",theme:"auto",accentColor:"#0071e3",categories:ct,labels:{banner:{title:"We value your privacy",description:'We use cookies to enhance your browsing experience, serve personalized content, and analyze our traffic. By clicking "Accept All", you consent to our use of cookies.',acceptAll:"Accept All",rejectAll:"Reject All",settings:"Settings"},modal:{title:"Privacy Settings",description:"Manage your cookie preferences. You can enable or disable different types of cookies below.",save:"Save Preferences",acceptAll:"Accept All",rejectAll:"Reject All"},widget:{label:"Cookie Settings"}},autoInit:!0,showWidget:!0,expiration:365,respectDNT:!0,dntBehavior:"reject",customStyles:"",consentModeGoogle:!1,consentModeMicrosoft:!1,mode:"safe",intercept:{cookies:!0,storage:!0,scripts:!0,network:!0},essentialKeys:[],essentialPatterns:[],blockedDomains:[],policyUrl:null,imprintUrl:null,callbacks:{onAccept:null,onReject:null,onChange:null,onReady:null}};function gt(t){const e={...pt};t||(t={});const n=["lang","position","theme","accentColor","autoInit","showWidget","expiration","policyUrl","imprintUrl","customStyles","mode","blockedDomains","respectDNT","dntBehavior","consentModeGoogle","consentModeMicrosoft"];for(const o of n)void 0!==t[o]&&(e[o]=t[o]);e.lang="de";const o=ft,r=o.labels||{},s=t.labels||{};e.labels={banner:{...pt.labels.banner,...r.banner,...s.banner},modal:{...pt.labels.modal,...r.modal,...s.modal},widget:{...pt.labels.widget,...r.widget,...s.widget}};const a=o.categories||{},i=t.categories||{};e.categories={...pt.categories};for(const t of Object.keys(pt.categories))e.categories[t]={...pt.categories[t],...a[t],...i[t]};return t.callbacks&&(e.callbacks={...pt.callbacks,...t.callbacks}),t.patterns&&(e.patterns=t.patterns),t.intercept&&"object"==typeof t.intercept&&(e.intercept={...pt.intercept,...t.intercept}),Array.isArray(t.essentialKeys)&&(e.essentialKeys=t.essentialKeys.filter(t=>"string"==typeof t&&t.length>0&&200>=t.length)),Array.isArray(t.essentialPatterns)&&(e.essentialPatterns=t.essentialPatterns.filter(t=>"string"==typeof t&&t.length>0&&500>=t.length)),e}function mt(){const t="undefined"!=typeof window&&window.ZestConfig?window.ZestConfig:{},e=function(){const t=document.currentScript||document.querySelector("script[data-zest]")||document.querySelector('script[src*="zest"]');if(!t)return{};const e={},n=t.getAttribute("data-position");n&&(e.position=n);const o=t.getAttribute("data-theme");o&&(e.theme=o);const r=t.getAttribute("data-accent")||t.getAttribute("data-accent-color");r&&(e.accentColor=r);const s=t.getAttribute("data-policy-url")||t.getAttribute("data-privacy-url");s&&(e.policyUrl=s);const a=t.getAttribute("data-imprint-url");a&&(e.imprintUrl=a);const i=t.getAttribute("data-show-widget");null!==i&&(e.showWidget="false"!==i);const c=t.getAttribute("data-auto-init");null!==c&&(e.autoInit="false"!==c);const l=t.getAttribute("data-expiration");l&&(e.expiration=parseInt(l,10));const u=t.getAttribute("data-consent-mode-google");null!==u&&(e.consentModeGoogle="false"!==u);const d=t.getAttribute("data-consent-mode-microsoft");return null!==d&&(e.consentModeMicrosoft="false"!==d),e}();return gt({...t,...e})}let bt=null;function yt(){return bt||(bt=mt()),bt}const ht="zest_consent";function wt(){try{return"undefined"!=typeof location&&"https:"===location.protocol?"; Secure":""}catch(t){return""}}let zt=null;function vt(t){const e=m();e?.set?e.set.call(document,t):document.cookie=t}function kt(){const t=m();return t?.get?t.get.call(document):document.cookie}function xt(){try{const t=kt().match(RegExp(ht+"=([^;]+)"));if(t){const e=a(JSON.parse(decodeURIComponent(t[1])),lt());if(e&&e.categories)return zt={essential:!0,functional:!1,analytics:!1,marketing:!1,...e.categories},{...zt}}}catch(t){}return zt={essential:!0,functional:!1,analytics:!1,marketing:!1},{...zt}}function _t(){return zt||(zt=xt()),{...zt}}function At(t,e=365){const n=zt?{...zt}:{essential:!0,functional:!1,analytics:!1,marketing:!1};return zt={essential:!0,functional:!!t.functional,analytics:!!t.analytics,marketing:!!t.marketing},function(t=365){zt||(zt={essential:!0,functional:!1,analytics:!1,marketing:!1});const e={version:"1.0",timestamp:Date.now(),categories:zt},n=new Date(Date.now()+24*t*60*60*1e3).toUTCString();vt(`${ht}=${encodeURIComponent(JSON.stringify(e))}; expires=${n}; path=/; SameSite=Lax${wt()}`)}(e),{current:{...zt},previous:n}}function Ct(t){return zt||(zt=xt()),!0===zt[t]}function Et(t=365){return At({functional:!1,analytics:!1,marketing:!1},t)}function St(){try{return kt().includes(ht)}catch(t){return!1}}const jt={READY:"zest:ready",CONSENT:"zest:consent",REJECT:"zest:reject",CHANGE:"zest:change",SHOW:"zest:show",HIDE:"zest:hide"};function Lt(t,e={}){const n=new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0});return document.dispatchEvent(n),n}function Mt(t,e){return Lt(jt.CONSENT,{consent:t,previous:e})}function Rt(t){return Lt(jt.REJECT,{consent:t})}function $t(t,e){return Lt(jt.CHANGE,{consent:t,previous:e})}function Nt(t="banner"){return Lt(jt.SHOW,{type:t})}function Ot(t="banner"){return Lt(jt.HIDE,{type:t})}let Tt=!1,Dt=null;function Pt(t){return Ct(t)}function It(t){!function(t){const e=[];for(const n of p)t.includes(n.category)?f?.set&&f.set.call(document,n.value):e.push(n);p.length=0,p.push(...e)}(t),function(t){const e=[];for(const n of h)t.includes(n.category)?b?.setItem(n.key,n.value):e.push(n);h.length=0,h.push(...e);const n=[];for(const e of w)t.includes(e.category)?y?.setItem(e.key,e.value):n.push(e);w.length=0,w.push(...n)}(t),function(t){const e=[];for(const n of S){if(!t.includes(n.category)){e.push(n);continue}const o=document.createElement("script");n.src?o.src=n.src:n.inline&&(o.textContent=n.inline),n.async&&(o.async=!0),n.defer&&(o.defer=!0),n.type&&"text/plain"!==n.type&&(o.type=n.type),o.setAttribute("data-zest-processed","executed"),o.setAttribute("data-consent-executed","true");const r=n.element;r&&r.isConnected&&r.parentNode?r.parentNode.replaceChild(o,r):document.head.appendChild(o)}S.length=0,S.push(...e)}(t),function(t){if(!Array.isArray(t)||0===J.length)return;const e=[];for(const n of J){if(!t.includes(n.category)){e.push(n);continue}const o=n.element;if(o&&o.isConnected)try{"attribute"===n.method?n.setter.call(o,n.prop,n.value):n.setter.call(o,n.value)}catch(t){}}J.length=0,J.push(...e)}(t)}function Wt(t={}){if(Tt)return{alreadyInitialized:!0,config:Dt,consent:xt(),hasDecision:St(),dntApplied:!1};bt=gt(t),Dt=bt,dt({functional:!1,analytics:!1,marketing:!1},Dt,!0),Dt.patterns&&function(t){if(l={...c},t&&"object"==typeof t)for(const[e,n]of Object.entries(t)){if(!Array.isArray(n))continue;const t=[];for(const e of n){const n=r(e);if(n)t.push(n);else try{console.warn("[Zest] Rejected unsafe pattern:",e)}catch(t){}}l[e]=t}}(Dt.patterns),(Array.isArray(Dt.essentialKeys)&&Dt.essentialKeys.length>0||Array.isArray(Dt.essentialPatterns)&&Dt.essentialPatterns.length>0)&&function(t,{keys:e=[],patternStrings:n=[]}={}){l[t]||(l[t]=[]);for(const n of e){if("string"!=typeof n||!n)continue;const e=r(`^${u(n)}$`);e&&l[t].push(e)}for(const e of n){if("string"!=typeof e||!e)continue;const n=r(e);n&&l[t].push(n)}}("essential",{keys:Dt.essentialKeys,patternStrings:Dt.essentialPatterns}),g=Pt,function(t){z=t}(Pt),function(t){R=t}(Pt),function(t){Z=t}(Pt),function(t){et=t}(Pt);const e=Dt.intercept||{cookies:!0,storage:!0,scripts:!0,network:!0};!1!==e.cookies&&(f=Object.getOwnPropertyDescriptor(Document.prototype,"cookie"),f?Object.defineProperty(document,"cookie",{get:()=>f.get.call(document),set(t){const e=function(t){const e=t.match(/^([^=]+)/);return e?e[1].trim():null}(t);if(!e)return;const n=d(e);g(n)?f.set.call(document,t):100>p.length&&p.push({value:t,name:e,category:n,timestamp:Date.now()})},configurable:!1}):console.warn("[Zest] Could not get cookie descriptor")),!1!==e.storage&&function(){try{return b=window.localStorage,y=window.sessionStorage,Object.defineProperty(window,"localStorage",{value:v(b,h),configurable:!0,writable:!1}),Object.defineProperty(window,"sessionStorage",{value:v(y,w),configurable:!0,writable:!1}),!0}catch(t){return console.warn("[Zest] Could not intercept storage APIs:",t),!1}}(),!1!==e.scripts&&(it(Dt.mode,Dt.blockedDomains),T(Dt.mode,Dt.blockedDomains)),!1!==e.network&&X(Dt.mode,Dt.blockedDomains);const n=xt();Tt=!0,St()&&dt(n,Dt,!1);let o=!1;if(ut()&&Dt.respectDNT&&"ignore"!==Dt.dntBehavior&&"reject"===Dt.dntBehavior&&!St()){const t=Et(Dt.expiration);o=!0,dt(t.current,Dt,!1),Rt(t.current),$t(t.current,t.previous),i(Dt.callbacks?.onReject),i(Dt.callbacks?.onChange,t.current)}return function(t){Lt(jt.READY,{consent:t})}(n),i(Dt.callbacks?.onReady,n),{alreadyInitialized:!1,config:Dt,consent:n,hasDecision:St(),dntApplied:o}}function qt(){if(!Tt)return null;const t=function(t=365){return At({functional:!0,analytics:!0,marketing:!0},t)}(Dt.expiration);return dt(t.current,Dt,!1),It(lt()),Mt(t.current,t.previous),$t(t.current,t.previous),i(Dt.callbacks?.onAccept,t.current),i(Dt.callbacks?.onChange,t.current),t}function Ht(){vt(`${ht}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; SameSite=Lax${wt()}`),zt=null}function Ut(){return Tt}function Zt(){return Dt}const Bt="#4F46E5";function Ft(t){const e=function(t){if("string"!=typeof t)return null;const e=t.trim();return/^#[0-9a-fA-F]{3,8}$/.test(e)||n.has(e.toLowerCase())||/^(rgb|rgba|hsl|hsla)\(\s*[\d.,%\s/]+\s*\)$/i.test(e)?e:null}(t.accentColor)||Bt,o=function(t){if("string"!=typeof t||0===t.length)return"";if(t.length>2e4)return"";let e=t.replace(/\/\*[\s\S]*?\*\//g,"");return e=e.replace(/@import\s+[^;]+;?/gi,""),e=e.replace(/@charset\s+[^;]+;?/gi,""),e=e.replace(/url\(\s*(['"]?)([^)'"]+)\1\s*\)/gi,(t,e,n)=>{const o=n.trim().toLowerCase();return o.startsWith("https:")||o.startsWith("data:image/")||o.startsWith("/")||o.startsWith("#")?t:"url(#)"}),e=e.replace(/\.zest-btn--secondary\s*\{[^}]*\}/gi,""),e=e.replace(/\[data-action\s*=\s*["']reject-all["']\]\s*\{[^}]*\}/gi,""),e=e.replace(/\[data-action\s*=\s*["']accept-all["']\]\s*\{[^}]*\}/gi,""),e=e.replace(/expression\s*\([^)]*\)/gi,""),e=e.replace(/-moz-binding\s*:[^;}]*/gi,""),e}(t.customStyles);return`\n:host {\n --zest-accent: ${e};\n --zest-accent-hover: ${function(t,e){"string"==typeof t&&/^#[0-9a-fA-F]{3,8}$/.test(t.trim())||(t=Bt);let n=t.trim().replace("#","");3===n.length&&(n=n.split("").map(t=>t+t).join(""));8===n.length&&(n=n.slice(0,6));6!==n.length&&(n="4F46E5");const o=parseInt(n,16),r=Math.round(2.55*e);return"#"+(16777216+65536*Math.min(255,Math.max(0,(o>>16)+r))+256*Math.min(255,Math.max(0,(o>>8&255)+r))+Math.min(255,Math.max(0,(255&o)+r))).toString(16).slice(1)}(e,-15)};\n --zest-bg: #ffffff;\n --zest-bg-secondary: #f3f4f6;\n --zest-text: #1f2937;\n --zest-text-secondary: #6b7280;\n --zest-border: #e5e7eb;\n --zest-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n --zest-radius: 12px;\n --zest-radius-sm: 8px;\n --zest-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\n\n font-family: var(--zest-font);\n font-size: 14px;\n line-height: 1.5;\n color: var(--zest-text);\n box-sizing: border-box;\n}\n\n:host([data-theme="dark"]) {\n --zest-bg: #1f2937;\n --zest-bg-secondary: #374151;\n --zest-text: #f9fafb;\n --zest-text-secondary: #9ca3af;\n --zest-border: #4b5563;\n --zest-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.3);\n}\n\n@media (prefers-color-scheme: dark) {\n :host([data-theme="auto"]) {\n --zest-bg: #1f2937;\n --zest-bg-secondary: #374151;\n --zest-text: #f9fafb;\n --zest-text-secondary: #9ca3af;\n --zest-border: #4b5563;\n --zest-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.3);\n }\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n/* Banner */\n.zest-banner {\n position: fixed;\n z-index: 999999;\n max-width: 480px;\n padding: 20px;\n background: var(--zest-bg);\n border-radius: var(--zest-radius);\n box-shadow: var(--zest-shadow);\n animation: zest-slide-in 0.3s ease-out;\n}\n\n.zest-banner--bottom {\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.zest-banner--bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.zest-banner--bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.zest-banner--top {\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n}\n\n@keyframes zest-slide-in {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n.zest-banner--bottom-left {\n animation-name: zest-slide-in-left;\n}\n\n@keyframes zest-slide-in-left {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.zest-banner--bottom-right {\n animation-name: zest-slide-in-right;\n}\n\n@keyframes zest-slide-in-right {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .zest-banner,\n .zest-modal {\n animation: none;\n }\n}\n\n.zest-banner__title {\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--zest-text);\n}\n\n.zest-banner__description {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: var(--zest-text-secondary);\n}\n\n.zest-banner__buttons {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Buttons */\n.zest-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 10px 16px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n border: none;\n border-radius: var(--zest-radius-sm);\n cursor: pointer;\n transition: background-color 0.15s ease, transform 0.1s ease;\n}\n\n.zest-btn:hover {\n transform: translateY(-1px);\n}\n\n.zest-btn:active {\n transform: translateY(0);\n}\n\n.zest-btn:focus-visible {\n outline: 2px solid var(--zest-accent);\n outline-offset: 2px;\n}\n\n.zest-btn--primary {\n background: var(--zest-accent);\n color: #ffffff;\n}\n\n.zest-btn--primary:hover {\n background: var(--zest-accent-hover);\n}\n\n.zest-btn--secondary {\n background: var(--zest-bg-secondary);\n color: var(--zest-text);\n}\n\n.zest-btn--secondary:hover {\n background: var(--zest-border);\n}\n\n.zest-btn--ghost {\n background: transparent;\n color: var(--zest-text-secondary);\n}\n\n.zest-btn--ghost:hover {\n background: var(--zest-bg-secondary);\n color: var(--zest-text);\n}\n\n/* Modal */\n.zest-modal-overlay {\n position: fixed;\n inset: 0;\n z-index: 999998;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n background: rgba(0, 0, 0, 0.5);\n animation: zest-fade-in 0.2s ease-out;\n}\n\n@keyframes zest-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.zest-modal {\n width: 100%;\n max-width: 500px;\n max-height: 90vh;\n overflow-y: auto;\n background: var(--zest-bg);\n border-radius: var(--zest-radius);\n box-shadow: var(--zest-shadow);\n animation: zest-modal-in 0.3s ease-out;\n}\n\n@keyframes zest-modal-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.zest-modal__header {\n padding: 20px 20px 0;\n}\n\n.zest-modal__title {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--zest-text);\n}\n\n.zest-modal__description {\n margin: 0;\n font-size: 14px;\n color: var(--zest-text-secondary);\n}\n\n.zest-modal__body {\n padding: 20px;\n}\n\n.zest-modal__footer {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 0 20px 20px;\n}\n\n/* Categories */\n.zest-category {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--zest-bg-secondary);\n border-radius: var(--zest-radius-sm);\n}\n\n.zest-category:last-child {\n margin-bottom: 0;\n}\n\n.zest-category__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.zest-category__info {\n flex: 1;\n}\n\n.zest-category__label {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--zest-text);\n}\n\n.zest-category__description {\n margin: 4px 0 0;\n font-size: 13px;\n color: var(--zest-text-secondary);\n}\n\n/* Toggle Switch */\n.zest-toggle {\n position: relative;\n width: 44px;\n height: 24px;\n flex-shrink: 0;\n}\n\n.zest-toggle__input {\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n margin: 0;\n}\n\n.zest-toggle__input:disabled {\n cursor: not-allowed;\n}\n\n.zest-toggle__slider {\n position: absolute;\n inset: 0;\n background: var(--zest-border);\n border-radius: 12px;\n transition: background-color 0.2s ease;\n pointer-events: none;\n}\n\n.zest-toggle__slider::before {\n content: '';\n position: absolute;\n top: 2px;\n left: 2px;\n width: 20px;\n height: 20px;\n background: #ffffff;\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.zest-toggle__input:checked + .zest-toggle__slider {\n background: var(--zest-accent);\n}\n\n.zest-toggle__input:checked + .zest-toggle__slider::before {\n transform: translateX(20px);\n}\n\n.zest-toggle__input:focus-visible + .zest-toggle__slider {\n outline: 2px solid var(--zest-accent);\n outline-offset: 2px;\n}\n\n.zest-toggle__input:disabled + .zest-toggle__slider {\n opacity: 0.6;\n}\n\n/* Widget */\n.zest-widget {\n position: fixed;\n z-index: 999997;\n bottom: 20px;\n left: 20px;\n}\n\n.zest-widget__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n padding: 0;\n background: var(--zest-bg);\n border: 1px solid var(--zest-border);\n border-radius: 50%;\n box-shadow: var(--zest-shadow);\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n}\n\n.zest-widget__btn:hover {\n transform: scale(1.05);\n box-shadow: 0 12px 28px -5px rgba(0, 0, 0, 0.15);\n}\n\n.zest-widget__btn:focus-visible {\n outline: 2px solid var(--zest-accent);\n outline-offset: 2px;\n}\n\n.zest-widget__icon {\n width: 24px;\n height: 24px;\n fill: var(--zest-text);\n}\n\n/* Link */\n.zest-link {\n color: var(--zest-accent);\n text-decoration: none;\n}\n\n.zest-link:hover {\n text-decoration: underline;\n}\n\n/* Mobile */\n@media (max-width: 480px) {\n .zest-banner {\n left: 10px;\n right: 10px;\n max-width: none;\n transform: none;\n }\n\n .zest-banner--bottom,\n .zest-banner--bottom-left,\n .zest-banner--bottom-right {\n bottom: 10px;\n }\n\n .zest-banner--top {\n top: 10px;\n transform: none;\n }\n\n @keyframes zest-slide-in {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .zest-banner__buttons {\n flex-direction: column;\n }\n\n .zest-btn {\n width: 100%;\n }\n\n .zest-modal-overlay {\n padding: 10px;\n }\n\n .zest-widget {\n bottom: 10px;\n left: 10px;\n }\n}\n\n/* Hidden utility */\n.zest-hidden {\n display: none !important;\n}\n${o}\n`}let Yt=null,Kt=null;const Gt=new Set(["bottom","bottom-left","bottom-right","top"]);function Xt(t={}){if(Yt)return Yt;const n=yt();Yt=document.createElement("zest-banner"),Yt.setAttribute("data-theme",n.theme||"light"),Kt=Yt.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=Ft(n),Kt.appendChild(o);const r=document.createElement("div");r.innerHTML=function(t){const n=t.labels.banner,o=t.position||"bottom";return`\n <div class="zest-banner zest-banner--${Gt.has(o)?o:"bottom"}" role="dialog" aria-modal="false" aria-label="${e(n.title)}">\n <h2 class="zest-banner__title">${e(n.title)}</h2>\n <p class="zest-banner__description">${e(n.description)}</p>\n <div class="zest-banner__buttons">\n <button type="button" class="zest-btn zest-btn--primary" data-action="accept-all">\n ${e(n.acceptAll)}\n </button>\n <button type="button" class="zest-btn zest-btn--secondary" data-action="reject-all">\n ${e(n.rejectAll)}\n </button>\n <button type="button" class="zest-btn zest-btn--ghost" data-action="settings">\n ${e(n.settings)}\n </button>\n </div>\n </div>\n `}(n),Kt.appendChild(r.firstElementChild);const s=Kt.querySelector(".zest-banner");return s.addEventListener("click",e=>{const n=e.target.dataset.action;if(n)switch(n){case"accept-all":t.onAcceptAll?.();break;case"reject-all":t.onRejectAll?.();break;case"settings":t.onSettings?.()}}),s.addEventListener("keydown",e=>{"Escape"===e.key&&t.onSettings?.()}),document.body.appendChild(Yt),requestAnimationFrame(()=>{const t=Kt.querySelector("button");t?.focus()}),Yt}function Jt(t={}){Yt?Yt.classList.remove("zest-hidden"):Xt(t)}function Vt(){Yt&&(Yt.remove(),Yt=null,Kt=null)}let Qt=null,te=null,ee={};function ne(t,n){const o=t.labels.modal,r=Object.values(t.categories||ct).map(t=>function(t,n,o){const r=o?"disabled":"",s=n?"checked":"",a=e(t.id),i=e(t.label);return`\n <div class="zest-category">\n <div class="zest-category__header">\n <div class="zest-category__info">\n <span class="zest-category__label">${i}</span>\n <p class="zest-category__description">${e(t.description)}</p>\n </div>\n <label class="zest-toggle">\n <input\n type="checkbox"\n class="zest-toggle__input"\n data-category="${a}"\n ${s}\n ${r}\n aria-label="${i}"\n >\n <span class="zest-toggle__slider"></span>\n </label>\n </div>\n </div>\n `}(t,n[t.id]??t.default,t.required)).join(""),s=t.policyUrl?function(t){if("string"!=typeof t||0===t.length)return null;const e=t.trim();if(0===e.length)return null;if(/^[/?#]/.test(e))return e;const n=e.match(/^([a-z][a-z0-9+.-]*):/i);if(!n)return e;const o=n[1].toLowerCase();return"http"===o||"https"===o||"mailto"===o||"tel"===o?e:null}(t.policyUrl):null,a=s?`<a href="${e(s)}" class="zest-link" target="_blank" rel="noopener noreferrer">Privacy Policy</a>`:"";return`\n <div class="zest-modal-overlay" role="dialog" aria-modal="true" aria-label="${e(o.title)}">\n <div class="zest-modal">\n <div class="zest-modal__header">\n <h2 class="zest-modal__title">${e(o.title)}</h2>\n <p class="zest-modal__description">${e(o.description)} ${a}</p>\n </div>\n <div class="zest-modal__body">\n ${r}\n </div>\n <div class="zest-modal__footer">\n <button type="button" class="zest-btn zest-btn--primary" data-action="save">\n ${e(o.save)}\n </button>\n <button type="button" class="zest-btn zest-btn--secondary" data-action="accept-all">\n ${e(o.acceptAll)}\n </button>\n <button type="button" class="zest-btn zest-btn--ghost" data-action="reject-all">\n ${e(o.rejectAll)}\n </button>\n </div>\n </div>\n </div>\n `}function oe(){if(!te)return ee;const t=te.querySelectorAll(".zest-toggle__input"),e={essential:!0};return t.forEach(t=>{const n=t.dataset.category;n&&"essential"!==n&&(e[n]=t.checked)}),e}function re(){Qt&&(Qt.remove(),Qt=null,te=null)}let se=null,ae=null;function ie(t={}){if(se)return se;const n=yt();se=document.createElement("zest-widget"),se.setAttribute("data-theme",n.theme||"light"),ae=se.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=Ft(n),ae.appendChild(o);const r=document.createElement("div");r.innerHTML=function(t){const n=e(t.labels.widget.label);return`\n <div class="zest-widget">\n <button type="button" class="zest-widget__btn" aria-label="${n}" title="${n}">\n <span class="zest-widget__icon"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10c0-.728-.078-1.437-.225-2.12a1 1 0 0 0-1.482-.63 3 3 0 0 1-4.086-3.72 1 1 0 0 0-.793-1.263A10.05 10.05 0 0 0 12 2zm0 2c.178 0 .354.006.528.017a5 5 0 0 0 5.955 5.955c.011.174.017.35.017.528 0 4.418-3.582 8-8 8s-8-3.582-8-8 3.582-8 8-8zm-4 6a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zm5 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-2 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z"/></svg></span>\n </button>\n </div>\n `}(n),ae.appendChild(r.firstElementChild);return ae.querySelector(".zest-widget__btn").addEventListener("click",()=>{t.onClick?.()}),document.body.appendChild(se),se}function ce(t={}){se?se.style.display="":ie(t)}function le(){se&&(se.style.display="none")}function ue(){qt();const t=Zt();Vt(),re(),t?.showWidget&&ce({onClick:pe})}function de(){!function(){if(!Tt)return null;const t=Et(Dt.expiration);dt(t.current,Dt,!1),Rt(t.current),$t(t.current,t.previous),i(Dt.callbacks?.onReject),i(Dt.callbacks?.onChange,t.current)}();const t=Zt();Vt(),re(),t?.showWidget&&ce({onClick:pe})}function fe(t){!function(t){if(!Tt)return null;const e=At(t,Dt.expiration);dt(e.current,Dt,!1);const n=Object.keys(e.current).filter(t=>e.current[t]&&!e.previous[t]);n.length>0&&It(n),Object.entries(t||{}).some(([t,e])=>"essential"!==t&&e)?Mt(e.current,e.previous):Rt(e.current),$t(e.current,e.previous),i(Dt.callbacks?.onChange,e.current)}(t);const e=Zt();re(),e?.showWidget&&ce({onClick:pe})}function pe(){Vt(),le(),function(t={},e={}){if(Qt)return Qt;const n=yt();ee={...t},Qt=document.createElement("zest-modal"),Qt.setAttribute("data-theme",n.theme||"light"),te=Qt.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=Ft(n),te.appendChild(o);const r=document.createElement("div");r.innerHTML=ne(n,t),te.appendChild(r.firstElementChild);const s=te.querySelector(".zest-modal-overlay");s.addEventListener("click",t=>{const n=t.target.dataset.action;if(n)switch(n){case"save":e.onSave?.(oe());break;case"accept-all":e.onAcceptAll?.();break;case"reject-all":e.onRejectAll?.()}else t.target===s&&e.onClose?.()}),s.addEventListener("keydown",t=>{"Escape"===t.key&&e.onClose?.()}),te.querySelectorAll(".zest-toggle__input").forEach(t=>{t.addEventListener("change",()=>{ee=oe()})}),document.body.appendChild(Qt),requestAnimationFrame(()=>{const t=te.querySelector("button");t?.focus()})}(_t(),{onSave:fe,onAcceptAll:ue,onRejectAll:de,onClose:ge}),Nt("modal")}function ge(){re(),Ot("modal");const t=Zt();St()&&t?.showWidget?ce({onClick:pe}):Jt({onAcceptAll:ue,onRejectAll:de,onSettings:pe})}let me=!1;function be(){if(me)return;if(!document||!document.body)return void document.addEventListener("DOMContentLoaded",be,{once:!0});me=!0;const t=Zt();St()?t?.showWidget&&ce({onClick:pe}):(Jt({onAcceptAll:ue,onRejectAll:de,onSettings:pe}),Nt("banner"))}function ye(t={}){return Wt(t),be(),he}const he={init:ye,show(){Ut()?(re(),le(),Jt({onAcceptAll:ue,onRejectAll:de,onSettings:pe}),Nt("banner")):console.warn("[Zest] Not initialized. Call Zest.init() first.")},hide(){Vt(),Ot("banner")},showSettings(){Ut()?pe():console.warn("[Zest] Not initialized. Call Zest.init() first.")},hideSettings(){re(),Ot("modal")},getConsent:_t,hasConsent:Ct,hasConsentDecision:St,getConsentProof:function(){try{const t=kt().match(RegExp(ht+"=([^;]+)"));if(t){return a(JSON.parse(decodeURIComponent(t[1])),lt())}}catch(t){}return null},isDoNotTrackEnabled:ut,getDNTDetails:function(){if("undefined"==typeof navigator)return{enabled:!1,source:null};const t=navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack;return"1"===t||"yes"===t||!0===t?{enabled:!0,source:"dnt"}:!0===navigator.globalPrivacyControl?{enabled:!0,source:"gpc"}:{enabled:!1,source:null}},acceptAll(){Ut()?ue():console.warn("[Zest] Not initialized. Call Zest.init() first.")},rejectAll(){Ut()?de():console.warn("[Zest] Not initialized. Call Zest.init() first.")},reset(){Ht(),re(),se&&(se.remove(),se=null,ae=null),Ut()&&(Jt({onAcceptAll:ue,onRejectAll:de,onSettings:pe}),Nt("banner"))},getConfig:yt,on:function(t,e){return document.addEventListener(t,e),()=>document.removeEventListener(t,e)},once:function(t,e){document.addEventListener(t,e,{once:!0})},EVENTS:jt};if("undefined"!=typeof window){try{Object.defineProperty(window,"Zest",{value:Object.freeze(he),writable:!1,configurable:!1,enumerable:!0})}catch(t){window.Zest=he}!1!==mt().autoInit&&ye(window.ZestConfig)}return he}();