@freshjuice/zest 0.1.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.
- package/LICENSE +21 -0
- package/README.md +312 -0
- package/dist/zest.de.js +2621 -0
- package/dist/zest.de.js.map +1 -0
- package/dist/zest.de.min.js +1 -0
- package/dist/zest.en.js +2621 -0
- package/dist/zest.en.js.map +1 -0
- package/dist/zest.en.min.js +1 -0
- package/dist/zest.es.js +2621 -0
- package/dist/zest.es.js.map +1 -0
- package/dist/zest.es.min.js +1 -0
- package/dist/zest.esm.js +3104 -0
- package/dist/zest.esm.js.map +1 -0
- package/dist/zest.esm.min.js +1 -0
- package/dist/zest.fr.js +2621 -0
- package/dist/zest.fr.js.map +1 -0
- package/dist/zest.fr.min.js +1 -0
- package/dist/zest.it.js +2621 -0
- package/dist/zest.it.js.map +1 -0
- package/dist/zest.it.min.js +1 -0
- package/dist/zest.ja.js +2621 -0
- package/dist/zest.ja.js.map +1 -0
- package/dist/zest.ja.min.js +1 -0
- package/dist/zest.js +3109 -0
- package/dist/zest.js.map +1 -0
- package/dist/zest.min.js +1 -0
- package/dist/zest.nl.js +2621 -0
- package/dist/zest.nl.js.map +1 -0
- package/dist/zest.nl.min.js +1 -0
- package/dist/zest.pl.js +2621 -0
- package/dist/zest.pl.js.map +1 -0
- package/dist/zest.pl.min.js +1 -0
- package/dist/zest.pt.js +2621 -0
- package/dist/zest.pt.js.map +1 -0
- package/dist/zest.pt.min.js +1 -0
- package/dist/zest.ru.js +2621 -0
- package/dist/zest.ru.js.map +1 -0
- package/dist/zest.ru.min.js +1 -0
- package/dist/zest.uk.js +2621 -0
- package/dist/zest.uk.js.map +1 -0
- package/dist/zest.uk.min.js +1 -0
- package/dist/zest.zh.js +2621 -0
- package/dist/zest.zh.js.map +1 -0
- package/dist/zest.zh.min.js +1 -0
- package/locales/de.json +40 -0
- package/locales/en.json +40 -0
- package/locales/es.json +40 -0
- package/locales/fr.json +40 -0
- package/locales/it.json +40 -0
- package/locales/ja.json +40 -0
- package/locales/nl.json +40 -0
- package/locales/pl.json +40 -0
- package/locales/pt.json +40 -0
- package/locales/ru.json +40 -0
- package/locales/uk.json +40 -0
- package/locales/zh.json +40 -0
- package/package.json +63 -0
- package/zest.config.schema.json +256 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zest.esm.js","sources":["../src/core/pattern-matcher.js","../src/core/cookie-interceptor.js","../src/core/storage-interceptor.js","../src/core/known-trackers.js","../src/core/script-blocker.js","../src/core/categories.js","../src/core/dnt.js","../src/i18n/translations.js","../src/config/defaults.js","../src/config/parser.js","../src/storage/consent-store.js","../src/storage/events.js","../src/ui/styles.js","../src/ui/banner.js","../src/ui/modal.js","../src/ui/widget.js","../src/index.js"],"sourcesContent":["/**\n * Pattern Matcher - Categorizes cookies and storage keys by pattern\n */\n\n/**\n * Default patterns for each category\n */\nexport const DEFAULT_PATTERNS = {\n essential: [\n /^zest_/,\n /^csrf/i,\n /^xsrf/i,\n /^session/i,\n /^__host-/i,\n /^__secure-/i\n ],\n functional: [\n /^lang/i,\n /^locale/i,\n /^theme/i,\n /^preferences/i,\n /^ui_/i\n ],\n analytics: [\n /^_ga/,\n /^_gid/,\n /^_gat/,\n /^_utm/,\n /^__utm/,\n /^plausible/i,\n /^_pk_/,\n /^matomo/i,\n /^_hj/,\n /^ajs_/\n ],\n marketing: [\n /^_fbp/,\n /^_fbc/,\n /^_gcl/,\n /^_ttp/,\n /^ads/i,\n /^doubleclick/i,\n /^__gads/,\n /^__gpi/,\n /^_pin_/,\n /^li_/\n ]\n};\n\nlet patterns = { ...DEFAULT_PATTERNS };\n\n/**\n * Set custom patterns\n */\nexport function setPatterns(customPatterns) {\n patterns = { ...DEFAULT_PATTERNS };\n for (const [category, regexList] of Object.entries(customPatterns)) {\n if (Array.isArray(regexList)) {\n patterns[category] = regexList.map(p =>\n p instanceof RegExp ? p : new RegExp(p)\n );\n }\n }\n}\n\n/**\n * Get current patterns\n */\nexport function getPatterns() {\n return { ...patterns };\n}\n\n/**\n * Determine category for a cookie/storage key name\n * @param {string} name - Cookie or storage key name\n * @returns {string} Category ID (defaults to 'marketing' for unknown)\n */\nexport function getCategoryForName(name) {\n for (const [category, regexList] of Object.entries(patterns)) {\n if (regexList.some(regex => regex.test(name))) {\n return category;\n }\n }\n // Unknown items default to marketing (strictest)\n return 'marketing';\n}\n\n/**\n * Parse cookie string to extract name\n * @param {string} cookieString - Full cookie string (e.g., \"name=value; path=/\")\n * @returns {string|null} Cookie name or null\n */\nexport function parseCookieName(cookieString) {\n const match = cookieString.match(/^([^=]+)/);\n return match ? match[1].trim() : null;\n}\n","/**\n * Cookie Interceptor - Intercepts document.cookie operations\n */\n\nimport { getCategoryForName, parseCookieName } from './pattern-matcher.js';\n\n// Store original descriptor\nlet originalCookieDescriptor = null;\n\n// Queue for blocked cookies\nconst cookieQueue = [];\n\n// Reference to consent checker function\nlet checkConsent = () => false;\n\n/**\n * Set the consent checker function\n */\nexport function setConsentChecker(fn) {\n checkConsent = fn;\n}\n\n/**\n * Get the original cookie descriptor\n */\nexport function getOriginalCookieDescriptor() {\n return originalCookieDescriptor;\n}\n\n/**\n * Get queued cookies\n */\nexport function getCookieQueue() {\n return [...cookieQueue];\n}\n\n/**\n * Clear the cookie queue\n */\nexport function clearCookieQueue() {\n cookieQueue.length = 0;\n}\n\n/**\n * Replay queued cookies for allowed categories\n */\nexport function replayCookies(allowedCategories) {\n const remaining = [];\n\n for (const item of cookieQueue) {\n if (allowedCategories.includes(item.category)) {\n // Set the cookie using original setter\n if (originalCookieDescriptor?.set) {\n originalCookieDescriptor.set.call(document, item.value);\n }\n } else {\n remaining.push(item);\n }\n }\n\n cookieQueue.length = 0;\n cookieQueue.push(...remaining);\n}\n\n/**\n * Start intercepting cookies\n */\nexport function interceptCookies() {\n // Store original\n originalCookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie');\n\n if (!originalCookieDescriptor) {\n console.warn('[Zest] Could not get cookie descriptor');\n return false;\n }\n\n Object.defineProperty(document, 'cookie', {\n get() {\n // Always allow reading\n return originalCookieDescriptor.get.call(document);\n },\n set(value) {\n const name = parseCookieName(value);\n if (!name) {\n return;\n }\n\n const category = getCategoryForName(name);\n\n if (checkConsent(category)) {\n // Consent given - set cookie\n originalCookieDescriptor.set.call(document, value);\n } else {\n // No consent - queue for later\n cookieQueue.push({\n value,\n name,\n category,\n timestamp: Date.now()\n });\n }\n },\n configurable: true\n });\n\n return true;\n}\n\n/**\n * Restore original cookie behavior\n */\nexport function restoreCookies() {\n if (originalCookieDescriptor) {\n Object.defineProperty(document, 'cookie', originalCookieDescriptor);\n }\n}\n","/**\n * Storage Interceptor - Intercepts localStorage and sessionStorage operations\n */\n\nimport { getCategoryForName } from './pattern-matcher.js';\n\n// Store originals\nlet originalLocalStorage = null;\nlet originalSessionStorage = null;\n\n// Queues for blocked operations\nconst localStorageQueue = [];\nconst sessionStorageQueue = [];\n\n// Reference to consent checker function\nlet checkConsent = () => false;\n\n/**\n * Set the consent checker function\n */\nexport function setConsentChecker(fn) {\n checkConsent = fn;\n}\n\n/**\n * Get original localStorage\n */\nexport function getOriginalLocalStorage() {\n return originalLocalStorage;\n}\n\n/**\n * Get original sessionStorage\n */\nexport function getOriginalSessionStorage() {\n return originalSessionStorage;\n}\n\n/**\n * Get queued localStorage operations\n */\nexport function getLocalStorageQueue() {\n return [...localStorageQueue];\n}\n\n/**\n * Get queued sessionStorage operations\n */\nexport function getSessionStorageQueue() {\n return [...sessionStorageQueue];\n}\n\n/**\n * Clear storage queues\n */\nexport function clearStorageQueues() {\n localStorageQueue.length = 0;\n sessionStorageQueue.length = 0;\n}\n\n/**\n * Create a proxy for storage API\n */\nfunction createStorageProxy(storage, queue, storageName) {\n return new Proxy(storage, {\n get(target, prop) {\n if (prop === 'setItem') {\n return (key, value) => {\n const category = getCategoryForName(key);\n\n if (checkConsent(category)) {\n target.setItem(key, value);\n } else {\n queue.push({\n key,\n value,\n category,\n timestamp: Date.now()\n });\n }\n };\n }\n\n // Allow all other operations\n const val = target[prop];\n return typeof val === 'function' ? val.bind(target) : val;\n }\n });\n}\n\n/**\n * Replay queued storage operations for allowed categories\n */\nexport function replayStorage(allowedCategories) {\n // Replay localStorage\n const remainingLocal = [];\n for (const item of localStorageQueue) {\n if (allowedCategories.includes(item.category)) {\n originalLocalStorage?.setItem(item.key, item.value);\n } else {\n remainingLocal.push(item);\n }\n }\n localStorageQueue.length = 0;\n localStorageQueue.push(...remainingLocal);\n\n // Replay sessionStorage\n const remainingSession = [];\n for (const item of sessionStorageQueue) {\n if (allowedCategories.includes(item.category)) {\n originalSessionStorage?.setItem(item.key, item.value);\n } else {\n remainingSession.push(item);\n }\n }\n sessionStorageQueue.length = 0;\n sessionStorageQueue.push(...remainingSession);\n}\n\n/**\n * Start intercepting storage APIs\n */\nexport function interceptStorage() {\n try {\n originalLocalStorage = window.localStorage;\n originalSessionStorage = window.sessionStorage;\n\n Object.defineProperty(window, 'localStorage', {\n value: createStorageProxy(originalLocalStorage, localStorageQueue, 'localStorage'),\n configurable: true,\n writable: false\n });\n\n Object.defineProperty(window, 'sessionStorage', {\n value: createStorageProxy(originalSessionStorage, sessionStorageQueue, 'sessionStorage'),\n configurable: true,\n writable: false\n });\n\n return true;\n } catch (e) {\n console.warn('[Zest] Could not intercept storage APIs:', e);\n return false;\n }\n}\n\n/**\n * Restore original storage APIs\n */\nexport function restoreStorage() {\n try {\n if (originalLocalStorage) {\n Object.defineProperty(window, 'localStorage', {\n value: originalLocalStorage,\n configurable: true,\n writable: false\n });\n }\n if (originalSessionStorage) {\n Object.defineProperty(window, 'sessionStorage', {\n value: originalSessionStorage,\n configurable: true,\n writable: false\n });\n }\n } catch (e) {\n console.warn('[Zest] Could not restore storage APIs:', e);\n }\n}\n","/**\n * Known Trackers - Lists of known tracking script domains by category\n */\n\n/**\n * Safe mode - Major, well-known trackers only\n */\nexport const SAFE_TRACKERS = {\n analytics: [\n 'google-analytics.com',\n 'www.google-analytics.com',\n 'analytics.google.com',\n 'googletagmanager.com',\n 'www.googletagmanager.com',\n 'plausible.io',\n 'cloudflareinsights.com',\n 'static.cloudflareinsights.com'\n ],\n marketing: [\n 'connect.facebook.net',\n 'www.facebook.com/tr',\n 'ads.google.com',\n 'www.googleadservices.com',\n 'googleads.g.doubleclick.net',\n 'pagead2.googlesyndication.com'\n ]\n};\n\n/**\n * Strict mode - Extended list including less common trackers\n */\nexport const STRICT_TRACKERS = {\n analytics: [\n ...SAFE_TRACKERS.analytics,\n 'analytics.tiktok.com',\n 'matomo.', // partial match\n 'hotjar.com',\n 'static.hotjar.com',\n 'script.hotjar.com',\n 'clarity.ms',\n 'www.clarity.ms',\n 'heapanalytics.com',\n 'cdn.heapanalytics.com',\n 'mixpanel.com',\n 'cdn.mxpnl.com',\n 'segment.com',\n 'cdn.segment.com',\n 'api.segment.io',\n 'fullstory.com',\n 'rs.fullstory.com',\n 'amplitude.com',\n 'cdn.amplitude.com',\n 'mouseflow.com',\n 'cdn.mouseflow.com',\n 'luckyorange.com',\n 'cdn.luckyorange.net',\n 'crazyegg.com',\n 'script.crazyegg.com'\n ],\n marketing: [\n ...SAFE_TRACKERS.marketing,\n 'snap.licdn.com',\n 'px.ads.linkedin.com',\n 'ads.linkedin.com',\n 'analytics.twitter.com',\n 'static.ads-twitter.com',\n 't.co',\n 'analytics.tiktok.com',\n 'ads.tiktok.com',\n 'sc-static.net', // Snapchat\n 'tr.snapchat.com',\n 'ct.pinterest.com',\n 'pintrk.com',\n 's.pinimg.com',\n 'widgets.pinterest.com',\n 'bat.bing.com',\n 'ads.yahoo.com',\n 'sp.analytics.yahoo.com',\n 'amazon-adsystem.com',\n 'z-na.amazon-adsystem.com',\n 'criteo.com',\n 'static.criteo.net',\n 'dis.criteo.com',\n 'taboola.com',\n 'cdn.taboola.com',\n 'trc.taboola.com',\n 'outbrain.com',\n 'widgets.outbrain.com',\n 'adroll.com',\n 's.adroll.com'\n ],\n functional: [\n 'cdn.onesignal.com',\n 'onesignal.com',\n 'pusher.com',\n 'js.pusher.com',\n 'intercom.io',\n 'widget.intercom.io',\n 'js.intercomcdn.com',\n 'crisp.chat',\n 'client.crisp.chat',\n 'cdn.livechatinc.com',\n 'livechatinc.com',\n 'tawk.to',\n 'embed.tawk.to',\n 'zendesk.com',\n 'static.zdassets.com'\n ]\n};\n\n/**\n * Check if a URL matches any tracker in the list\n */\nexport function matchesTrackerList(url, trackerList) {\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n const fullUrl = url.toLowerCase();\n\n for (const domain of trackerList) {\n // Support partial matches (e.g., \"matomo.\" matches \"analytics.matomo.cloud\")\n if (domain.endsWith('.')) {\n if (hostname.includes(domain.slice(0, -1))) {\n return true;\n }\n } else if (hostname === domain || hostname.endsWith('.' + domain)) {\n return true;\n } else if (fullUrl.includes(domain)) {\n return true;\n }\n }\n } catch (e) {\n // Invalid URL\n }\n return false;\n}\n\n/**\n * Get category for a script URL based on tracker lists\n */\nexport function getCategoryForScript(url, mode = 'safe') {\n const trackers = mode === 'strict' ? STRICT_TRACKERS : SAFE_TRACKERS;\n\n for (const [category, domains] of Object.entries(trackers)) {\n if (matchesTrackerList(url, domains)) {\n return category;\n }\n }\n\n return null;\n}\n\n/**\n * Check if URL is third-party (different domain)\n */\nexport function isThirdParty(url) {\n try {\n const scriptHost = new URL(url).hostname;\n const pageHost = window.location.hostname;\n\n // Remove www. for comparison\n const normalizeHost = (h) => h.replace(/^www\\./, '');\n\n return normalizeHost(scriptHost) !== normalizeHost(pageHost);\n } catch (e) {\n return false;\n }\n}\n","/**\n * Script Blocker - Blocks and manages consent-gated scripts\n *\n * Modes:\n * - manual: Only blocks scripts with data-consent-category attribute\n * - safe: Manual + known major trackers (Google, Facebook, etc.)\n * - strict: Safe + extended tracker list (Hotjar, Mixpanel, etc.)\n * - doomsday: Block ALL third-party scripts\n */\n\nimport { getCategoryForScript, isThirdParty } from './known-trackers.js';\n\n// Queue for blocked scripts\nconst scriptQueue = [];\n\n// MutationObserver instance\nlet observer = null;\n\n// Current blocking mode\nlet blockingMode = 'safe';\n\n// Custom blocked domains (user-defined)\nlet customBlockedDomains = [];\n\n// Reference to consent checker function\nlet checkConsent = () => false;\n\n/**\n * Set the consent checker function\n */\nexport function setConsentChecker(fn) {\n checkConsent = fn;\n}\n\n/**\n * Set blocking mode\n */\nexport function setBlockingMode(mode) {\n blockingMode = mode;\n}\n\n/**\n * Set custom blocked domains\n */\nexport function setCustomBlockedDomains(domains) {\n customBlockedDomains = domains || [];\n}\n\n/**\n * Get queued scripts\n */\nexport function getScriptQueue() {\n return [...scriptQueue];\n}\n\n/**\n * Clear the script queue\n */\nexport function clearScriptQueue() {\n scriptQueue.length = 0;\n}\n\n/**\n * Check if script URL matches custom blocked domains\n */\nfunction matchesCustomDomains(url) {\n if (!url || customBlockedDomains.length === 0) return null;\n\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n\n for (const entry of customBlockedDomains) {\n const domain = typeof entry === 'string' ? entry : entry.domain;\n const category = typeof entry === 'string' ? 'marketing' : (entry.category || 'marketing');\n\n if (hostname === domain || hostname.endsWith('.' + domain)) {\n return category;\n }\n }\n } catch (e) {\n // Invalid URL\n }\n\n return null;\n}\n\n/**\n * Determine if a script should be blocked and get its category\n */\nfunction getScriptBlockCategory(script) {\n // 1. Check for explicit data-consent-category attribute (always respected)\n const explicitCategory = script.getAttribute('data-consent-category');\n if (explicitCategory) {\n return explicitCategory;\n }\n\n // 2. Skip if script has data-zest-allow attribute\n if (script.hasAttribute('data-zest-allow')) {\n return null;\n }\n\n const src = script.src;\n\n // No src = inline script, only block if explicitly tagged\n if (!src) {\n return null;\n }\n\n // 3. Check custom blocked domains\n const customCategory = matchesCustomDomains(src);\n if (customCategory) {\n return customCategory;\n }\n\n // 4. Mode-based blocking\n switch (blockingMode) {\n case 'manual':\n // Only explicit tags, already checked above\n return null;\n\n case 'safe':\n case 'strict':\n // Check against known tracker lists\n return getCategoryForScript(src, blockingMode);\n\n case 'doomsday':\n // Block all third-party scripts\n if (isThirdParty(src)) {\n // Try to categorize, default to marketing\n return getCategoryForScript(src, 'strict') || 'marketing';\n }\n return null;\n\n default:\n return null;\n }\n}\n\n/**\n * Block a script element\n */\nfunction blockScript(script) {\n // Skip already processed scripts\n if (script.hasAttribute('data-zest-processed')) {\n return false;\n }\n\n const category = getScriptBlockCategory(script);\n\n if (!category) {\n script.setAttribute('data-zest-processed', 'allowed');\n return false;\n }\n\n if (checkConsent(category)) {\n // Consent already given - allow script\n script.setAttribute('data-zest-processed', 'allowed');\n return false;\n }\n\n // Store script info for later execution\n const scriptInfo = {\n category,\n src: script.src,\n inline: script.textContent,\n type: script.type,\n async: script.async,\n defer: script.defer,\n timestamp: Date.now()\n };\n\n // Mark as processed\n script.setAttribute('data-zest-processed', 'blocked');\n script.setAttribute('data-consent-category', category);\n\n // Disable the script\n script.type = 'text/plain';\n\n // If it has a src, also remove it to prevent loading\n if (script.src) {\n script.setAttribute('data-blocked-src', script.src);\n script.removeAttribute('src');\n }\n\n scriptQueue.push(scriptInfo);\n return true;\n}\n\n/**\n * Execute a queued script\n */\nfunction executeScript(scriptInfo) {\n const script = document.createElement('script');\n\n if (scriptInfo.src) {\n script.src = scriptInfo.src;\n } else if (scriptInfo.inline) {\n script.textContent = scriptInfo.inline;\n }\n\n if (scriptInfo.async) script.async = true;\n if (scriptInfo.defer) script.defer = true;\n\n script.setAttribute('data-zest-processed', 'executed');\n script.setAttribute('data-consent-executed', 'true');\n\n document.head.appendChild(script);\n}\n\n/**\n * Replay queued scripts for allowed categories\n */\nexport function replayScripts(allowedCategories) {\n const remaining = [];\n\n for (const scriptInfo of scriptQueue) {\n if (allowedCategories.includes(scriptInfo.category)) {\n executeScript(scriptInfo);\n } else {\n remaining.push(scriptInfo);\n }\n }\n\n scriptQueue.length = 0;\n scriptQueue.push(...remaining);\n\n // Also re-enable any blocked scripts in the DOM\n const blockedScripts = document.querySelectorAll('script[data-zest-processed=\"blocked\"]');\n blockedScripts.forEach(script => {\n const category = script.getAttribute('data-consent-category');\n if (allowedCategories.includes(category)) {\n // Clone and replace to execute\n const newScript = document.createElement('script');\n\n const blockedSrc = script.getAttribute('data-blocked-src');\n if (blockedSrc) {\n newScript.src = blockedSrc;\n } else {\n newScript.textContent = script.textContent;\n }\n\n if (script.async) newScript.async = true;\n if (script.defer) newScript.defer = true;\n\n newScript.setAttribute('data-zest-processed', 'executed');\n newScript.setAttribute('data-consent-executed', 'true');\n script.parentNode?.replaceChild(newScript, script);\n }\n });\n}\n\n/**\n * Process existing scripts in the DOM\n */\nfunction processExistingScripts() {\n const scripts = document.querySelectorAll('script:not([data-zest-processed])');\n scripts.forEach(blockScript);\n}\n\n/**\n * Handle mutations (new scripts added to DOM)\n */\nfunction handleMutations(mutations) {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node.nodeName === 'SCRIPT' && !node.hasAttribute('data-zest-processed')) {\n blockScript(node);\n }\n\n // Check child scripts\n if (node.querySelectorAll) {\n const scripts = node.querySelectorAll('script:not([data-zest-processed])');\n scripts.forEach(blockScript);\n }\n }\n }\n}\n\n/**\n * Start observing for new scripts\n */\nexport function startScriptBlocking(mode = 'safe', customDomains = []) {\n blockingMode = mode;\n customBlockedDomains = customDomains;\n\n // Process existing scripts\n processExistingScripts();\n\n // Watch for new scripts\n observer = new MutationObserver(handleMutations);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true\n });\n\n return true;\n}\n\n/**\n * Stop observing for new scripts\n */\nexport function stopScriptBlocking() {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n}\n","/**\n * Default consent categories\n */\nexport const DEFAULT_CATEGORIES = {\n essential: {\n id: 'essential',\n label: 'Essential',\n description: 'Required for the website to function properly. Cannot be disabled.',\n required: true,\n default: true\n },\n functional: {\n id: 'functional',\n label: 'Functional',\n description: 'Enable personalized features like language preferences and themes.',\n required: false,\n default: false\n },\n analytics: {\n id: 'analytics',\n label: 'Analytics',\n description: 'Help us understand how visitors interact with our website.',\n required: false,\n default: false\n },\n marketing: {\n id: 'marketing',\n label: 'Marketing',\n description: 'Used to deliver relevant advertisements and track campaign performance.',\n required: false,\n default: false\n }\n};\n\n/**\n * Default consent state\n */\nexport function getDefaultConsent() {\n return {\n essential: true,\n functional: false,\n analytics: false,\n marketing: false\n };\n}\n\n/**\n * Get all category IDs\n */\nexport function getCategoryIds() {\n return Object.keys(DEFAULT_CATEGORIES);\n}\n","/**\n * Do Not Track (DNT) Detection\n *\n * Detects browser DNT/GPC signals for privacy compliance\n */\n\n/**\n * Check if Do Not Track is enabled\n * Checks both DNT header and Global Privacy Control (GPC)\n */\nexport function isDoNotTrackEnabled() {\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n // Check DNT (Do Not Track)\n // Values: \"1\" = enabled, \"0\" = disabled, null/undefined = not set\n const dnt = navigator.doNotTrack ||\n window.doNotTrack ||\n navigator.msDoNotTrack;\n\n if (dnt === '1' || dnt === 'yes' || dnt === true) {\n return true;\n }\n\n // Check GPC (Global Privacy Control) - newer standard\n // https://globalprivacycontrol.org/\n if (navigator.globalPrivacyControl === true) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get DNT signal details for logging/debugging\n */\nexport function getDNTDetails() {\n if (typeof navigator === 'undefined') {\n return { enabled: false, source: null };\n }\n\n const dnt = navigator.doNotTrack ||\n window.doNotTrack ||\n navigator.msDoNotTrack;\n\n if (dnt === '1' || dnt === 'yes' || dnt === true) {\n return { enabled: true, source: 'dnt' };\n }\n\n if (navigator.globalPrivacyControl === true) {\n return { enabled: true, source: 'gpc' };\n }\n\n return { enabled: false, source: null };\n}\n","/**\n * Built-in translations for Zest\n * Language is auto-detected from <html lang=\"\"> or navigator.language\n */\n\nexport const translations = {\n en: {\n labels: {\n banner: {\n title: 'We value your privacy',\n 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.',\n acceptAll: 'Accept All',\n rejectAll: 'Reject All',\n settings: 'Settings'\n },\n modal: {\n title: 'Privacy Settings',\n description: 'Manage your cookie preferences. You can enable or disable different types of cookies below.',\n save: 'Save Preferences',\n acceptAll: 'Accept All',\n rejectAll: 'Reject All'\n },\n widget: {\n label: 'Cookie Settings'\n }\n },\n categories: {\n essential: {\n label: 'Essential',\n description: 'Required for the website to function properly. Cannot be disabled.'\n },\n functional: {\n label: 'Functional',\n description: 'Enable personalized features like language preferences and themes.'\n },\n analytics: {\n label: 'Analytics',\n description: 'Help us understand how visitors interact with our website.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Used to deliver relevant advertisements and track campaign performance.'\n }\n }\n },\n\n de: {\n labels: {\n banner: {\n title: 'Wir respektieren Ihre Privatsphäre',\n 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.',\n acceptAll: 'Alle akzeptieren',\n rejectAll: 'Alle ablehnen',\n settings: 'Einstellungen'\n },\n modal: {\n title: 'Datenschutzeinstellungen',\n description: 'Verwalten Sie Ihre Cookie-Einstellungen. Sie können verschiedene Arten von Cookies unten aktivieren oder deaktivieren.',\n save: 'Einstellungen speichern',\n acceptAll: 'Alle akzeptieren',\n rejectAll: 'Alle ablehnen'\n },\n widget: {\n label: 'Cookie-Einstellungen'\n }\n },\n categories: {\n essential: {\n label: 'Notwendig',\n description: 'Erforderlich für die ordnungsgemäße Funktion der Website. Können nicht deaktiviert werden.'\n },\n functional: {\n label: 'Funktional',\n description: 'Ermöglichen personalisierte Funktionen wie Spracheinstellungen und Designs.'\n },\n analytics: {\n label: 'Analytisch',\n description: 'Helfen uns zu verstehen, wie Besucher mit unserer Website interagieren.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Werden verwendet, um relevante Werbung anzuzeigen und die Kampagnenleistung zu messen.'\n }\n }\n },\n\n es: {\n labels: {\n banner: {\n title: 'Valoramos tu privacidad',\n description: 'Utilizamos cookies para mejorar tu experiencia de navegación, ofrecer contenido personalizado y analizar nuestro tráfico. Al hacer clic en \"Aceptar todo\", consientes el uso de cookies.',\n acceptAll: 'Aceptar todo',\n rejectAll: 'Rechazar todo',\n settings: 'Configuración'\n },\n modal: {\n title: 'Configuración de privacidad',\n description: 'Gestiona tus preferencias de cookies. Puedes activar o desactivar diferentes tipos de cookies a continuación.',\n save: 'Guardar preferencias',\n acceptAll: 'Aceptar todo',\n rejectAll: 'Rechazar todo'\n },\n widget: {\n label: 'Configuración de cookies'\n }\n },\n categories: {\n essential: {\n label: 'Esenciales',\n description: 'Necesarias para el funcionamiento del sitio web. No se pueden desactivar.'\n },\n functional: {\n label: 'Funcionales',\n description: 'Permiten funciones personalizadas como preferencias de idioma y temas.'\n },\n analytics: {\n label: 'Analíticas',\n description: 'Nos ayudan a entender cómo los visitantes interactúan con nuestro sitio web.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Se utilizan para mostrar anuncios relevantes y medir el rendimiento de las campañas.'\n }\n }\n },\n\n fr: {\n labels: {\n banner: {\n title: 'Nous respectons votre vie privée',\n description: 'Nous utilisons des cookies pour améliorer votre expérience de navigation, proposer du contenu personnalisé et analyser notre trafic. En cliquant sur « Tout accepter », vous consentez à l\\'utilisation de cookies.',\n acceptAll: 'Tout accepter',\n rejectAll: 'Tout refuser',\n settings: 'Paramètres'\n },\n modal: {\n title: 'Paramètres de confidentialité',\n description: 'Gérez vos préférences en matière de cookies. Vous pouvez activer ou désactiver différents types de cookies ci-dessous.',\n save: 'Enregistrer les préférences',\n acceptAll: 'Tout accepter',\n rejectAll: 'Tout refuser'\n },\n widget: {\n label: 'Paramètres des cookies'\n }\n },\n categories: {\n essential: {\n label: 'Essentiels',\n description: 'Nécessaires au bon fonctionnement du site. Ne peuvent pas être désactivés.'\n },\n functional: {\n label: 'Fonctionnels',\n description: 'Permettent des fonctionnalités personnalisées comme les préférences de langue et de thème.'\n },\n analytics: {\n label: 'Analytiques',\n description: 'Nous aident à comprendre comment les visiteurs interagissent avec notre site.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Utilisés pour afficher des publicités pertinentes et mesurer les performances des campagnes.'\n }\n }\n },\n\n it: {\n labels: {\n banner: {\n title: 'Rispettiamo la tua privacy',\n description: 'Utilizziamo i cookie per migliorare la tua esperienza di navigazione, fornire contenuti personalizzati e analizzare il nostro traffico. Cliccando su \"Accetta tutto\", acconsenti all\\'uso dei cookie.',\n acceptAll: 'Accetta tutto',\n rejectAll: 'Rifiuta tutto',\n settings: 'Impostazioni'\n },\n modal: {\n title: 'Impostazioni privacy',\n description: 'Gestisci le tue preferenze sui cookie. Puoi attivare o disattivare diversi tipi di cookie qui sotto.',\n save: 'Salva preferenze',\n acceptAll: 'Accetta tutto',\n rejectAll: 'Rifiuta tutto'\n },\n widget: {\n label: 'Impostazioni cookie'\n }\n },\n categories: {\n essential: {\n label: 'Essenziali',\n description: 'Necessari per il corretto funzionamento del sito. Non possono essere disattivati.'\n },\n functional: {\n label: 'Funzionali',\n description: 'Abilitano funzionalità personalizzate come preferenze di lingua e tema.'\n },\n analytics: {\n label: 'Analitici',\n description: 'Ci aiutano a capire come i visitatori interagiscono con il nostro sito.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Utilizzati per mostrare annunci pertinenti e misurare le prestazioni delle campagne.'\n }\n }\n },\n\n pt: {\n labels: {\n banner: {\n title: 'Valorizamos sua privacidade',\n description: 'Usamos cookies para melhorar sua experiência de navegação, fornecer conteúdo personalizado e analisar nosso tráfego. Ao clicar em \"Aceitar tudo\", você consente com o uso de cookies.',\n acceptAll: 'Aceitar tudo',\n rejectAll: 'Rejeitar tudo',\n settings: 'Configurações'\n },\n modal: {\n title: 'Configurações de privacidade',\n description: 'Gerencie suas preferências de cookies. Você pode ativar ou desativar diferentes tipos de cookies abaixo.',\n save: 'Salvar preferências',\n acceptAll: 'Aceitar tudo',\n rejectAll: 'Rejeitar tudo'\n },\n widget: {\n label: 'Configurações de cookies'\n }\n },\n categories: {\n essential: {\n label: 'Essenciais',\n description: 'Necessários para o funcionamento do site. Não podem ser desativados.'\n },\n functional: {\n label: 'Funcionais',\n description: 'Permitem recursos personalizados como preferências de idioma e tema.'\n },\n analytics: {\n label: 'Analíticos',\n description: 'Nos ajudam a entender como os visitantes interagem com nosso site.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Usados para exibir anúncios relevantes e medir o desempenho de campanhas.'\n }\n }\n },\n\n nl: {\n labels: {\n banner: {\n title: 'Wij respecteren uw privacy',\n description: 'Wij gebruiken cookies om uw browse-ervaring te verbeteren, gepersonaliseerde inhoud aan te bieden en ons verkeer te analyseren. Door op \"Alles accepteren\" te klikken, stemt u in met het gebruik van cookies.',\n acceptAll: 'Alles accepteren',\n rejectAll: 'Alles weigeren',\n settings: 'Instellingen'\n },\n modal: {\n title: 'Privacy-instellingen',\n description: 'Beheer uw cookievoorkeuren. U kunt hieronder verschillende soorten cookies in- of uitschakelen.',\n save: 'Voorkeuren opslaan',\n acceptAll: 'Alles accepteren',\n rejectAll: 'Alles weigeren'\n },\n widget: {\n label: 'Cookie-instellingen'\n }\n },\n categories: {\n essential: {\n label: 'Essentieel',\n description: 'Noodzakelijk voor de goede werking van de website. Kunnen niet worden uitgeschakeld.'\n },\n functional: {\n label: 'Functioneel',\n description: 'Maken gepersonaliseerde functies mogelijk zoals taal- en themavoorkeuren.'\n },\n analytics: {\n label: 'Analytisch',\n description: 'Helpen ons te begrijpen hoe bezoekers onze website gebruiken.'\n },\n marketing: {\n label: 'Marketing',\n description: 'Worden gebruikt om relevante advertenties te tonen en campagneprestaties te meten.'\n }\n }\n },\n\n pl: {\n labels: {\n banner: {\n title: 'Szanujemy Twoją prywatność',\n description: 'Używamy plików cookie, aby poprawić Twoje wrażenia z przeglądania, dostarczać spersonalizowane treści i analizować nasz ruch. Klikając „Zaakceptuj wszystko\", wyrażasz zgodę na używanie plików cookie.',\n acceptAll: 'Zaakceptuj wszystko',\n rejectAll: 'Odrzuć wszystko',\n settings: 'Ustawienia'\n },\n modal: {\n title: 'Ustawienia prywatności',\n description: 'Zarządzaj swoimi preferencjami dotyczącymi plików cookie. Możesz włączyć lub wyłączyć różne typy plików cookie poniżej.',\n save: 'Zapisz preferencje',\n acceptAll: 'Zaakceptuj wszystko',\n rejectAll: 'Odrzuć wszystko'\n },\n widget: {\n label: 'Ustawienia plików cookie'\n }\n },\n categories: {\n essential: {\n label: 'Niezbędne',\n description: 'Wymagane do prawidłowego działania strony. Nie można ich wyłączyć.'\n },\n functional: {\n label: 'Funkcjonalne',\n description: 'Umożliwiają spersonalizowane funkcje, takie jak preferencje językowe i motywy.'\n },\n analytics: {\n label: 'Analityczne',\n description: 'Pomagają nam zrozumieć, jak odwiedzający korzystają z naszej strony.'\n },\n marketing: {\n label: 'Marketingowe',\n description: 'Służą do wyświetlania odpowiednich reklam i mierzenia skuteczności kampanii.'\n }\n }\n },\n\n uk: {\n labels: {\n banner: {\n title: 'Ми цінуємо вашу конфіденційність',\n description: 'Ми використовуємо файли cookie для покращення вашого досвіду перегляду, надання персоналізованого контенту та аналізу нашого трафіку. Натискаючи «Прийняти все», ви погоджуєтесь на використання файлів cookie.',\n acceptAll: 'Прийняти все',\n rejectAll: 'Відхилити все',\n settings: 'Налаштування'\n },\n modal: {\n title: 'Налаштування конфіденційності',\n description: 'Керуйте своїми налаштуваннями файлів cookie. Ви можете ввімкнути або вимкнути різні типи файлів cookie нижче.',\n save: 'Зберегти налаштування',\n acceptAll: 'Прийняти все',\n rejectAll: 'Відхилити все'\n },\n widget: {\n label: 'Налаштування cookie'\n }\n },\n categories: {\n essential: {\n label: 'Необхідні',\n description: 'Потрібні для правильної роботи сайту. Не можуть бути вимкнені.'\n },\n functional: {\n label: 'Функціональні',\n description: 'Дозволяють персоналізовані функції, такі як мовні налаштування та теми.'\n },\n analytics: {\n label: 'Аналітичні',\n description: 'Допомагають нам зрозуміти, як відвідувачі взаємодіють з нашим сайтом.'\n },\n marketing: {\n label: 'Маркетингові',\n description: 'Використовуються для показу релевантної реклами та вимірювання ефективності кампаній.'\n }\n }\n },\n\n ru: {\n labels: {\n banner: {\n title: 'Мы ценим вашу конфиденциальность',\n description: 'Мы используем файлы cookie для улучшения вашего опыта просмотра, предоставления персонализированного контента и анализа нашего трафика. Нажимая «Принять все», вы соглашаетесь на использование файлов cookie.',\n acceptAll: 'Принять все',\n rejectAll: 'Отклонить все',\n settings: 'Настройки'\n },\n modal: {\n title: 'Настройки конфиденциальности',\n description: 'Управляйте своими настройками файлов cookie. Вы можете включить или отключить различные типы файлов cookie ниже.',\n save: 'Сохранить настройки',\n acceptAll: 'Принять все',\n rejectAll: 'Отклонить все'\n },\n widget: {\n label: 'Настройки cookie'\n }\n },\n categories: {\n essential: {\n label: 'Необходимые',\n description: 'Требуются для правильной работы сайта. Не могут быть отключены.'\n },\n functional: {\n label: 'Функциональные',\n description: 'Позволяют использовать персонализированные функции, такие как языковые настройки и темы.'\n },\n analytics: {\n label: 'Аналитические',\n description: 'Помогают нам понять, как посетители взаимодействуют с нашим сайтом.'\n },\n marketing: {\n label: 'Маркетинговые',\n description: 'Используются для показа релевантной рекламы и измерения эффективности кампаний.'\n }\n }\n },\n\n ja: {\n labels: {\n banner: {\n title: 'プライバシーを尊重します',\n description: '当サイトでは、ブラウジング体験の向上、パーソナライズされたコンテンツの提供、トラフィックの分析のためにCookieを使用しています。「すべて同意」をクリックすると、Cookieの使用に同意したことになります。',\n acceptAll: 'すべて同意',\n rejectAll: 'すべて拒否',\n settings: '設定'\n },\n modal: {\n title: 'プライバシー設定',\n description: 'Cookieの設定を管理できます。以下で各種Cookieを有効または無効にできます。',\n save: '設定を保存',\n acceptAll: 'すべて同意',\n rejectAll: 'すべて拒否'\n },\n widget: {\n label: 'Cookie設定'\n }\n },\n categories: {\n essential: {\n label: '必須',\n description: 'サイトの正常な動作に必要です。無効にすることはできません。'\n },\n functional: {\n label: '機能性',\n description: '言語設定やテーマなどのパーソナライズ機能を有効にします。'\n },\n analytics: {\n label: '分析',\n description: '訪問者がサイトをどのように利用しているかを理解するのに役立ちます。'\n },\n marketing: {\n label: 'マーケティング',\n description: '関連性の高い広告を表示し、キャンペーンの効果を測定するために使用されます。'\n }\n }\n },\n\n zh: {\n labels: {\n banner: {\n title: '我们重视您的隐私',\n description: '我们使用Cookie来改善您的浏览体验、提供个性化内容并分析我们的流量。点击\"全部接受\"即表示您同意我们使用Cookie。',\n acceptAll: '全部接受',\n rejectAll: '全部拒绝',\n settings: '设置'\n },\n modal: {\n title: '隐私设置',\n description: '管理您的Cookie偏好设置。您可以在下方启用或禁用不同类型的Cookie。',\n save: '保存设置',\n acceptAll: '全部接受',\n rejectAll: '全部拒绝'\n },\n widget: {\n label: 'Cookie设置'\n }\n },\n categories: {\n essential: {\n label: '必要',\n description: '网站正常运行所必需的。无法禁用。'\n },\n functional: {\n label: '功能性',\n description: '启用个性化功能,如语言偏好和主题设置。'\n },\n analytics: {\n label: '分析',\n description: '帮助我们了解访问者如何与网站互动。'\n },\n marketing: {\n label: '营销',\n description: '用于展示相关广告并衡量营销活动效果。'\n }\n }\n }\n};\n\n/**\n * Supported language codes\n */\nexport const supportedLanguages = Object.keys(translations);\n\n/**\n * Detect language from various sources\n * Priority: config.lang > <html lang=\"\"> > navigator.language > 'en'\n */\nexport function detectLanguage(configLang) {\n // 1. Explicit config\n if (configLang && configLang !== 'auto') {\n return normalizeLanguage(configLang);\n }\n\n // 2. HTML lang attribute\n const htmlLang = document.documentElement.lang;\n if (htmlLang) {\n const normalized = normalizeLanguage(htmlLang);\n if (translations[normalized]) {\n return normalized;\n }\n }\n\n // 3. Browser language\n if (typeof navigator !== 'undefined' && navigator.language) {\n const normalized = normalizeLanguage(navigator.language);\n if (translations[normalized]) {\n return normalized;\n }\n }\n\n // 4. Default to English\n return 'en';\n}\n\n/**\n * Normalize language code (e.g., 'en-US' -> 'en', 'es_MX' -> 'es')\n */\nfunction normalizeLanguage(lang) {\n if (!lang) return 'en';\n\n // ISO 639-1 language codes are always 2 characters\n const base = lang.slice(0, 2).toLowerCase();\n\n // Check if we support it\n if (translations[base]) {\n return base;\n }\n\n return 'en';\n}\n\n/**\n * Get translation for a language\n */\nexport function getTranslation(lang) {\n return translations[lang] || translations.en;\n}\n","/**\n * Default configuration values\n */\n\nimport { DEFAULT_CATEGORIES } from '../core/categories.js';\nimport { detectLanguage, getTranslation } from '../i18n/translations.js';\n\nexport const DEFAULTS = {\n // Language: 'auto' | 'en' | 'de' | 'es' | 'fr' | 'it' | 'pt' | 'nl' | 'pl' | 'uk' | 'ru' | 'ja' | 'zh'\n lang: 'auto',\n\n // UI positioning\n position: 'bottom', // 'bottom' | 'bottom-left' | 'bottom-right' | 'top'\n\n // Theming\n theme: 'auto', // 'light' | 'dark' | 'auto'\n accentColor: '#0071e3',\n\n // Categories\n categories: DEFAULT_CATEGORIES,\n\n // UI Labels\n labels: {\n banner: {\n title: 'We value your privacy',\n 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.',\n acceptAll: 'Accept All',\n rejectAll: 'Reject All',\n settings: 'Settings'\n },\n modal: {\n title: 'Privacy Settings',\n description: 'Manage your cookie preferences. You can enable or disable different types of cookies below.',\n save: 'Save Preferences',\n acceptAll: 'Accept All',\n rejectAll: 'Reject All'\n },\n widget: {\n label: 'Cookie Settings'\n }\n },\n\n // Behavior\n autoInit: true,\n showWidget: true,\n expiration: 365,\n\n // Do Not Track / Global Privacy Control\n // respectDNT: true = respect DNT/GPC signals\n // dntBehavior: 'reject' | 'preselect' | 'ignore'\n // - 'reject': auto-reject non-essential, don't show banner\n // - 'preselect': show banner with non-essential unchecked (same as normal)\n // - 'ignore': ignore DNT completely\n respectDNT: true,\n dntBehavior: 'reject',\n\n // Custom styles to inject into Shadow DOM\n customStyles: '',\n\n // Blocking mode: 'manual' | 'safe' | 'strict' | 'doomsday'\n mode: 'safe',\n\n // Custom domains to block (in addition to mode-based blocking)\n blockedDomains: [], // days\n\n // Links\n policyUrl: null,\n imprintUrl: null,\n\n // Callbacks\n callbacks: {\n onAccept: null,\n onReject: null,\n onChange: null,\n onReady: null\n }\n};\n\n/**\n * Merge user config with defaults (deep merge)\n */\nexport function mergeConfig(userConfig) {\n const config = { ...DEFAULTS };\n\n if (!userConfig) {\n userConfig = {};\n }\n\n // Simple properties\n const simpleKeys = ['lang', 'position', 'theme', 'accentColor', 'autoInit', 'showWidget', 'expiration', 'policyUrl', 'imprintUrl', 'customStyles', 'mode', 'blockedDomains', 'respectDNT', 'dntBehavior'];\n for (const key of simpleKeys) {\n if (userConfig[key] !== undefined) {\n config[key] = userConfig[key];\n }\n }\n\n // Detect language and get translations\n const detectedLang = detectLanguage(config.lang);\n config.lang = detectedLang;\n const translation = getTranslation(detectedLang);\n\n // Deep merge labels (translation < user config)\n const translationLabels = translation.labels || {};\n const userLabels = userConfig.labels || {};\n config.labels = {\n banner: {\n ...DEFAULTS.labels.banner,\n ...translationLabels.banner,\n ...userLabels.banner\n },\n modal: {\n ...DEFAULTS.labels.modal,\n ...translationLabels.modal,\n ...userLabels.modal\n },\n widget: {\n ...DEFAULTS.labels.widget,\n ...translationLabels.widget,\n ...userLabels.widget\n }\n };\n\n // Deep merge categories (translation < user config)\n const translationCategories = translation.categories || {};\n const userCategories = userConfig.categories || {};\n config.categories = { ...DEFAULTS.categories };\n for (const key of Object.keys(DEFAULTS.categories)) {\n config.categories[key] = {\n ...DEFAULTS.categories[key],\n ...translationCategories[key],\n ...userCategories[key]\n };\n }\n\n // Merge callbacks\n if (userConfig.callbacks) {\n config.callbacks = { ...DEFAULTS.callbacks, ...userConfig.callbacks };\n }\n\n // Patterns (for pattern matcher)\n if (userConfig.patterns) {\n config.patterns = userConfig.patterns;\n }\n\n return config;\n}\n","/**\n * Configuration Parser - Reads config from various sources\n */\n\nimport { mergeConfig } from './defaults.js';\n\n/**\n * Parse data attributes from script tag\n */\nfunction parseDataAttributes() {\n // Find the Zest script tag\n const script = document.currentScript ||\n document.querySelector('script[data-zest]') ||\n document.querySelector('script[src*=\"zest\"]');\n\n if (!script) {\n return {};\n }\n\n const config = {};\n\n // Position\n const position = script.getAttribute('data-position');\n if (position) config.position = position;\n\n // Theme\n const theme = script.getAttribute('data-theme');\n if (theme) config.theme = theme;\n\n // Accent color\n const accent = script.getAttribute('data-accent') || script.getAttribute('data-accent-color');\n if (accent) config.accentColor = accent;\n\n // Policy URL\n const policyUrl = script.getAttribute('data-policy-url') || script.getAttribute('data-privacy-url');\n if (policyUrl) config.policyUrl = policyUrl;\n\n // Imprint URL\n const imprintUrl = script.getAttribute('data-imprint-url');\n if (imprintUrl) config.imprintUrl = imprintUrl;\n\n // Show widget\n const showWidget = script.getAttribute('data-show-widget');\n if (showWidget !== null) config.showWidget = showWidget !== 'false';\n\n // Auto init\n const autoInit = script.getAttribute('data-auto-init');\n if (autoInit !== null) config.autoInit = autoInit !== 'false';\n\n // Expiration\n const expiration = script.getAttribute('data-expiration');\n if (expiration) config.expiration = parseInt(expiration, 10);\n\n return config;\n}\n\n/**\n * Parse window.ZestConfig object\n */\nfunction parseWindowConfig() {\n if (typeof window !== 'undefined' && window.ZestConfig) {\n return window.ZestConfig;\n }\n return {};\n}\n\n/**\n * Get final merged configuration\n * Priority: data attributes > window.ZestConfig > defaults\n */\nexport function getConfig() {\n const windowConfig = parseWindowConfig();\n const dataConfig = parseDataAttributes();\n\n // Merge: defaults < windowConfig < dataConfig\n return mergeConfig({\n ...windowConfig,\n ...dataConfig\n });\n}\n\n/**\n * Update configuration at runtime\n */\nlet currentConfig = null;\n\nexport function setConfig(config) {\n currentConfig = mergeConfig(config);\n return currentConfig;\n}\n\nexport function getCurrentConfig() {\n if (!currentConfig) {\n currentConfig = getConfig();\n }\n return currentConfig;\n}\n","/**\n * Consent Store - Manages consent state persistence\n */\n\nimport { getDefaultConsent } from '../core/categories.js';\nimport { getOriginalCookieDescriptor } from '../core/cookie-interceptor.js';\n\nconst COOKIE_NAME = 'zest_consent';\nconst CONSENT_VERSION = '1.0';\n\n// Current consent state\nlet consent = null;\n\n/**\n * Get the original cookie setter (bypasses interception)\n */\nfunction setRawCookie(value) {\n const descriptor = getOriginalCookieDescriptor();\n if (descriptor?.set) {\n descriptor.set.call(document, value);\n } else {\n // Fallback if interceptor not initialized yet\n document.cookie = value;\n }\n}\n\n/**\n * Get the original cookie getter\n */\nfunction getRawCookie() {\n const descriptor = getOriginalCookieDescriptor();\n if (descriptor?.get) {\n return descriptor.get.call(document);\n }\n return document.cookie;\n}\n\n/**\n * Load consent from cookie\n */\nexport function loadConsent() {\n try {\n const cookies = getRawCookie();\n const match = cookies.match(new RegExp(`${COOKIE_NAME}=([^;]+)`));\n\n if (match) {\n const data = JSON.parse(decodeURIComponent(match[1]));\n consent = data.categories || getDefaultConsent();\n return { ...consent };\n }\n } catch (e) {\n // Invalid or missing cookie\n }\n\n consent = getDefaultConsent();\n return { ...consent };\n}\n\n/**\n * Save consent to cookie\n */\nexport function saveConsent(expirationDays = 365) {\n if (!consent) {\n consent = getDefaultConsent();\n }\n\n const data = {\n version: CONSENT_VERSION,\n timestamp: Date.now(),\n categories: consent\n };\n\n const expires = new Date(Date.now() + expirationDays * 24 * 60 * 60 * 1000).toUTCString();\n const cookieValue = `${COOKIE_NAME}=${encodeURIComponent(JSON.stringify(data))}; expires=${expires}; path=/; SameSite=Lax`;\n\n setRawCookie(cookieValue);\n}\n\n/**\n * Get current consent state\n */\nexport function getConsent() {\n if (!consent) {\n consent = loadConsent();\n }\n return { ...consent };\n}\n\n/**\n * Update consent state\n */\nexport function updateConsent(newConsent, expirationDays = 365) {\n const previous = consent ? { ...consent } : getDefaultConsent();\n\n consent = {\n essential: true, // Always true\n functional: !!newConsent.functional,\n analytics: !!newConsent.analytics,\n marketing: !!newConsent.marketing\n };\n\n saveConsent(expirationDays);\n\n return { current: { ...consent }, previous };\n}\n\n/**\n * Check if specific category is allowed\n */\nexport function hasConsent(category) {\n if (!consent) {\n consent = loadConsent();\n }\n return consent[category] === true;\n}\n\n/**\n * Accept all categories\n */\nexport function acceptAll(expirationDays = 365) {\n return updateConsent({\n essential: true,\n functional: true,\n analytics: true,\n marketing: true\n }, expirationDays);\n}\n\n/**\n * Reject all (except essential)\n */\nexport function rejectAll(expirationDays = 365) {\n return updateConsent({\n essential: true,\n functional: false,\n analytics: false,\n marketing: false\n }, expirationDays);\n}\n\n/**\n * Reset consent (clear cookie)\n */\nexport function resetConsent() {\n setRawCookie(`${COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`);\n consent = null;\n}\n\n/**\n * Check if consent has been given (any decision made)\n */\nexport function hasConsentDecision() {\n try {\n const cookies = getRawCookie();\n return cookies.includes(COOKIE_NAME);\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Get consent proof for compliance\n */\nexport function getConsentProof() {\n try {\n const cookies = getRawCookie();\n const match = cookies.match(new RegExp(`${COOKIE_NAME}=([^;]+)`));\n\n if (match) {\n return JSON.parse(decodeURIComponent(match[1]));\n }\n } catch (e) {\n // Invalid cookie\n }\n\n return null;\n}\n","/**\n * Events - Custom event dispatching for consent changes\n */\n\n// Event names\nexport const EVENTS = {\n READY: 'zest:ready',\n CONSENT: 'zest:consent',\n REJECT: 'zest:reject',\n CHANGE: 'zest:change',\n SHOW: 'zest:show',\n HIDE: 'zest:hide'\n};\n\n/**\n * Dispatch a custom event\n */\nexport function emit(eventName, detail = {}) {\n const event = new CustomEvent(eventName, {\n detail,\n bubbles: true,\n cancelable: true\n });\n\n document.dispatchEvent(event);\n return event;\n}\n\n/**\n * Emit ready event\n */\nexport function emitReady(consent) {\n return emit(EVENTS.READY, { consent });\n}\n\n/**\n * Emit consent event (user accepted)\n */\nexport function emitConsent(consent, previous) {\n return emit(EVENTS.CONSENT, { consent, previous });\n}\n\n/**\n * Emit reject event (user rejected all)\n */\nexport function emitReject(consent) {\n return emit(EVENTS.REJECT, { consent });\n}\n\n/**\n * Emit change event (any consent change)\n */\nexport function emitChange(consent, previous) {\n return emit(EVENTS.CHANGE, { consent, previous });\n}\n\n/**\n * Emit show event (banner/modal shown)\n */\nexport function emitShow(type = 'banner') {\n return emit(EVENTS.SHOW, { type });\n}\n\n/**\n * Emit hide event (banner/modal hidden)\n */\nexport function emitHide(type = 'banner') {\n return emit(EVENTS.HIDE, { type });\n}\n\n/**\n * Subscribe to an event\n */\nexport function on(eventName, callback) {\n document.addEventListener(eventName, callback);\n return () => document.removeEventListener(eventName, callback);\n}\n\n/**\n * Subscribe to an event once\n */\nexport function once(eventName, callback) {\n document.addEventListener(eventName, callback, { once: true });\n}\n","/**\n * Styles - Shadow DOM encapsulated CSS with theming\n */\n\n/**\n * Generate CSS with custom properties\n */\nexport function generateStyles(config) {\n const accentColor = config.accentColor || '#4F46E5';\n\n return `\n:host {\n --zest-accent: ${accentColor};\n --zest-accent-hover: ${adjustColor(accentColor, -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${config.customStyles || ''}\n`;\n}\n\n/**\n * Adjust color brightness\n */\nfunction adjustColor(hex, percent) {\n const num = parseInt(hex.replace('#', ''), 16);\n const amt = Math.round(2.55 * percent);\n const R = Math.min(255, Math.max(0, (num >> 16) + amt));\n const G = Math.min(255, Math.max(0, ((num >> 8) & 0x00ff) + amt));\n const B = Math.min(255, Math.max(0, (num & 0x0000ff) + amt));\n return '#' + (0x1000000 + R * 0x10000 + G * 0x100 + B).toString(16).slice(1);\n}\n\n/**\n * Cookie icon SVG\n */\nexport const COOKIE_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>`;\n","/**\n * Banner - Main consent banner component\n */\n\nimport { generateStyles } from './styles.js';\nimport { getCurrentConfig } from '../config/parser.js';\n\nlet bannerElement = null;\nlet shadowRoot = null;\n\n/**\n * Create the banner HTML\n */\nfunction createBannerHTML(config) {\n const labels = config.labels.banner;\n const position = config.position || 'bottom';\n\n return `\n <div class=\"zest-banner zest-banner--${position}\" role=\"dialog\" aria-modal=\"false\" aria-label=\"${labels.title}\">\n <h2 class=\"zest-banner__title\">${labels.title}</h2>\n <p class=\"zest-banner__description\">${labels.description}</p>\n <div class=\"zest-banner__buttons\">\n <button type=\"button\" class=\"zest-btn zest-btn--primary\" data-action=\"accept-all\">\n ${labels.acceptAll}\n </button>\n <button type=\"button\" class=\"zest-btn zest-btn--secondary\" data-action=\"reject-all\">\n ${labels.rejectAll}\n </button>\n <button type=\"button\" class=\"zest-btn zest-btn--ghost\" data-action=\"settings\">\n ${labels.settings}\n </button>\n </div>\n </div>\n `;\n}\n\n/**\n * Create and mount the banner\n */\nexport function createBanner(callbacks = {}) {\n if (bannerElement) {\n return bannerElement;\n }\n\n const config = getCurrentConfig();\n\n // Create host element\n bannerElement = document.createElement('zest-banner');\n bannerElement.setAttribute('data-theme', config.theme || 'light');\n\n // Create shadow root\n shadowRoot = bannerElement.attachShadow({ mode: 'open' });\n\n // Add styles\n const styleEl = document.createElement('style');\n styleEl.textContent = generateStyles(config);\n shadowRoot.appendChild(styleEl);\n\n // Add banner HTML\n const container = document.createElement('div');\n container.innerHTML = createBannerHTML(config);\n shadowRoot.appendChild(container.firstElementChild);\n\n // Add event listeners\n const banner = shadowRoot.querySelector('.zest-banner');\n\n banner.addEventListener('click', (e) => {\n const action = e.target.dataset.action;\n if (!action) return;\n\n switch (action) {\n case 'accept-all':\n callbacks.onAcceptAll?.();\n break;\n case 'reject-all':\n callbacks.onRejectAll?.();\n break;\n case 'settings':\n callbacks.onSettings?.();\n break;\n }\n });\n\n // Keyboard handling\n banner.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n callbacks.onSettings?.();\n }\n });\n\n // Mount to document\n document.body.appendChild(bannerElement);\n\n // Focus first button for accessibility\n requestAnimationFrame(() => {\n const firstButton = shadowRoot.querySelector('button');\n firstButton?.focus();\n });\n\n return bannerElement;\n}\n\n/**\n * Show the banner\n */\nexport function showBanner(callbacks = {}) {\n if (!bannerElement) {\n createBanner(callbacks);\n } else {\n bannerElement.classList.remove('zest-hidden');\n }\n}\n\n/**\n * Hide the banner\n */\nexport function hideBanner() {\n if (bannerElement) {\n bannerElement.remove();\n bannerElement = null;\n shadowRoot = null;\n }\n}\n\n/**\n * Check if banner is visible\n */\nexport function isBannerVisible() {\n return bannerElement !== null && document.body.contains(bannerElement);\n}\n","/**\n * Modal - Settings modal component for category toggles\n */\n\nimport { generateStyles } from './styles.js';\nimport { getCurrentConfig } from '../config/parser.js';\nimport { DEFAULT_CATEGORIES } from '../core/categories.js';\n\nlet modalElement = null;\nlet shadowRoot = null;\nlet currentSelections = {};\n\n/**\n * Create category toggle HTML\n */\nfunction createCategoryHTML(category, isChecked, isRequired) {\n const disabled = isRequired ? 'disabled' : '';\n const checked = isChecked ? 'checked' : '';\n\n return `\n <div class=\"zest-category\">\n <div class=\"zest-category__header\">\n <div class=\"zest-category__info\">\n <span class=\"zest-category__label\">${category.label}</span>\n <p class=\"zest-category__description\">${category.description}</p>\n </div>\n <label class=\"zest-toggle\">\n <input\n type=\"checkbox\"\n class=\"zest-toggle__input\"\n data-category=\"${category.id}\"\n ${checked}\n ${disabled}\n aria-label=\"${category.label}\"\n >\n <span class=\"zest-toggle__slider\"></span>\n </label>\n </div>\n </div>\n `;\n}\n\n/**\n * Create the modal HTML\n */\nfunction createModalHTML(config, consent) {\n const labels = config.labels.modal;\n const categories = config.categories || DEFAULT_CATEGORIES;\n\n const categoriesHTML = Object.values(categories)\n .map(cat => createCategoryHTML(\n cat,\n consent[cat.id] ?? cat.default,\n cat.required\n ))\n .join('');\n\n const policyLink = config.policyUrl\n ? `<a href=\"${config.policyUrl}\" class=\"zest-link\" target=\"_blank\" rel=\"noopener\">Privacy Policy</a>`\n : '';\n\n return `\n <div class=\"zest-modal-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${labels.title}\">\n <div class=\"zest-modal\">\n <div class=\"zest-modal__header\">\n <h2 class=\"zest-modal__title\">${labels.title}</h2>\n <p class=\"zest-modal__description\">${labels.description} ${policyLink}</p>\n </div>\n <div class=\"zest-modal__body\">\n ${categoriesHTML}\n </div>\n <div class=\"zest-modal__footer\">\n <button type=\"button\" class=\"zest-btn zest-btn--primary\" data-action=\"save\">\n ${labels.save}\n </button>\n <button type=\"button\" class=\"zest-btn zest-btn--secondary\" data-action=\"accept-all\">\n ${labels.acceptAll}\n </button>\n <button type=\"button\" class=\"zest-btn zest-btn--ghost\" data-action=\"reject-all\">\n ${labels.rejectAll}\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\n/**\n * Get current selections from toggles\n */\nfunction getSelections() {\n if (!shadowRoot) return currentSelections;\n\n const toggles = shadowRoot.querySelectorAll('.zest-toggle__input');\n const selections = { essential: true };\n\n toggles.forEach(toggle => {\n const category = toggle.dataset.category;\n if (category && category !== 'essential') {\n selections[category] = toggle.checked;\n }\n });\n\n return selections;\n}\n\n/**\n * Create and show the modal\n */\nexport function showModal(consent = {}, callbacks = {}) {\n if (modalElement) {\n return modalElement;\n }\n\n const config = getCurrentConfig();\n currentSelections = { ...consent };\n\n // Create host element\n modalElement = document.createElement('zest-modal');\n modalElement.setAttribute('data-theme', config.theme || 'light');\n\n // Create shadow root\n shadowRoot = modalElement.attachShadow({ mode: 'open' });\n\n // Add styles\n const styleEl = document.createElement('style');\n styleEl.textContent = generateStyles(config);\n shadowRoot.appendChild(styleEl);\n\n // Add modal HTML\n const container = document.createElement('div');\n container.innerHTML = createModalHTML(config, consent);\n shadowRoot.appendChild(container.firstElementChild);\n\n // Add event listeners\n const modal = shadowRoot.querySelector('.zest-modal-overlay');\n\n // Button clicks\n modal.addEventListener('click', (e) => {\n const action = e.target.dataset.action;\n if (!action) {\n // Click on overlay background to close\n if (e.target === modal) {\n callbacks.onClose?.();\n }\n return;\n }\n\n switch (action) {\n case 'save':\n callbacks.onSave?.(getSelections());\n break;\n case 'accept-all':\n callbacks.onAcceptAll?.();\n break;\n case 'reject-all':\n callbacks.onRejectAll?.();\n break;\n }\n });\n\n // Keyboard handling\n modal.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n callbacks.onClose?.();\n }\n });\n\n // Track toggle changes\n shadowRoot.querySelectorAll('.zest-toggle__input').forEach(toggle => {\n toggle.addEventListener('change', () => {\n currentSelections = getSelections();\n });\n });\n\n // Mount to document\n document.body.appendChild(modalElement);\n\n // Trap focus\n requestAnimationFrame(() => {\n const firstButton = shadowRoot.querySelector('button');\n firstButton?.focus();\n });\n\n return modalElement;\n}\n\n/**\n * Hide the modal\n */\nexport function hideModal() {\n if (modalElement) {\n modalElement.remove();\n modalElement = null;\n shadowRoot = null;\n }\n}\n\n/**\n * Check if modal is visible\n */\nexport function isModalVisible() {\n return modalElement !== null && document.body.contains(modalElement);\n}\n\n/**\n * Get current modal selections\n */\nexport function getModalSelections() {\n return getSelections();\n}\n","/**\n * Widget - Minimal floating button to reopen settings\n */\n\nimport { generateStyles, COOKIE_ICON } from './styles.js';\nimport { getCurrentConfig } from '../config/parser.js';\n\nlet widgetElement = null;\nlet shadowRoot = null;\n\n/**\n * Create the widget HTML\n */\nfunction createWidgetHTML(config) {\n const labels = config.labels.widget;\n\n return `\n <div class=\"zest-widget\">\n <button type=\"button\" class=\"zest-widget__btn\" aria-label=\"${labels.label}\" title=\"${labels.label}\">\n <span class=\"zest-widget__icon\">${COOKIE_ICON}</span>\n </button>\n </div>\n `;\n}\n\n/**\n * Create and mount the widget\n */\nexport function createWidget(callbacks = {}) {\n if (widgetElement) {\n return widgetElement;\n }\n\n const config = getCurrentConfig();\n\n // Create host element\n widgetElement = document.createElement('zest-widget');\n widgetElement.setAttribute('data-theme', config.theme || 'light');\n\n // Create shadow root\n shadowRoot = widgetElement.attachShadow({ mode: 'open' });\n\n // Add styles\n const styleEl = document.createElement('style');\n styleEl.textContent = generateStyles(config);\n shadowRoot.appendChild(styleEl);\n\n // Add widget HTML\n const container = document.createElement('div');\n container.innerHTML = createWidgetHTML(config);\n shadowRoot.appendChild(container.firstElementChild);\n\n // Add event listener\n const button = shadowRoot.querySelector('.zest-widget__btn');\n button.addEventListener('click', () => {\n callbacks.onClick?.();\n });\n\n // Mount to document\n document.body.appendChild(widgetElement);\n\n return widgetElement;\n}\n\n/**\n * Show the widget\n */\nexport function showWidget(callbacks = {}) {\n if (!widgetElement) {\n createWidget(callbacks);\n } else {\n widgetElement.style.display = '';\n }\n}\n\n/**\n * Hide the widget\n */\nexport function hideWidget() {\n if (widgetElement) {\n widgetElement.style.display = 'none';\n }\n}\n\n/**\n * Remove the widget completely\n */\nexport function removeWidget() {\n if (widgetElement) {\n widgetElement.remove();\n widgetElement = null;\n shadowRoot = null;\n }\n}\n\n/**\n * Check if widget is visible\n */\nexport function isWidgetVisible() {\n return widgetElement !== null &&\n document.body.contains(widgetElement) &&\n widgetElement.style.display !== 'none';\n}\n","/**\n * Zest - Lightweight Cookie Consent Toolkit\n * Main entry point\n */\n\n// Core\nimport { interceptCookies, setConsentChecker as setCookieChecker, replayCookies, getOriginalCookieDescriptor } from './core/cookie-interceptor.js';\nimport { interceptStorage, setConsentChecker as setStorageChecker, replayStorage } from './core/storage-interceptor.js';\nimport { startScriptBlocking, setConsentChecker as setScriptChecker, replayScripts } from './core/script-blocker.js';\nimport { setPatterns } from './core/pattern-matcher.js';\nimport { getCategoryIds } from './core/categories.js';\nimport { isDoNotTrackEnabled, getDNTDetails } from './core/dnt.js';\n\n// Config\nimport { getConfig, setConfig, getCurrentConfig } from './config/parser.js';\n\n// Storage\nimport {\n loadConsent,\n getConsent,\n hasConsent,\n updateConsent,\n acceptAll as storeAcceptAll,\n rejectAll as storeRejectAll,\n resetConsent,\n hasConsentDecision,\n getConsentProof\n} from './storage/consent-store.js';\nimport { emitReady, emitConsent, emitReject, emitChange, emitShow, emitHide, EVENTS } from './storage/events.js';\n\n// UI\nimport { showBanner, hideBanner, isBannerVisible } from './ui/banner.js';\nimport { showModal, hideModal, isModalVisible } from './ui/modal.js';\nimport { showWidget, hideWidget, removeWidget, isWidgetVisible } from './ui/widget.js';\n\n// State\nlet initialized = false;\nlet config = null;\n\n/**\n * Consent checker function shared across interceptors\n */\nfunction checkConsent(category) {\n return hasConsent(category);\n}\n\n/**\n * Replay all queued items for newly allowed categories\n */\nfunction replayAll(allowedCategories) {\n replayCookies(allowedCategories);\n replayStorage(allowedCategories);\n replayScripts(allowedCategories);\n}\n\n/**\n * Handle accept all\n */\nfunction handleAcceptAll() {\n const result = storeAcceptAll(config.expiration);\n const categories = getCategoryIds();\n\n hideBanner();\n hideModal();\n\n replayAll(categories);\n\n if (config.showWidget) {\n showWidget({ onClick: handleShowSettings });\n }\n\n emitConsent(result.current, result.previous);\n emitChange(result.current, result.previous);\n config.callbacks?.onAccept?.(result.current);\n config.callbacks?.onChange?.(result.current);\n}\n\n/**\n * Handle reject all\n */\nfunction handleRejectAll() {\n const result = storeRejectAll(config.expiration);\n\n hideBanner();\n hideModal();\n\n if (config.showWidget) {\n showWidget({ onClick: handleShowSettings });\n }\n\n emitReject(result.current);\n emitChange(result.current, result.previous);\n config.callbacks?.onReject?.();\n config.callbacks?.onChange?.(result.current);\n}\n\n/**\n * Handle save preferences from modal\n */\nfunction handleSavePreferences(selections) {\n const result = updateConsent(selections, config.expiration);\n\n // Find newly allowed categories\n const newlyAllowed = Object.keys(result.current).filter(\n cat => result.current[cat] && !result.previous[cat]\n );\n\n if (newlyAllowed.length > 0) {\n replayAll(newlyAllowed);\n }\n\n hideModal();\n\n if (config.showWidget) {\n showWidget({ onClick: handleShowSettings });\n }\n\n // Determine if this was acceptance or rejection based on selections\n const hasNonEssential = Object.entries(selections)\n .some(([cat, val]) => cat !== 'essential' && val);\n\n if (hasNonEssential) {\n emitConsent(result.current, result.previous);\n } else {\n emitReject(result.current);\n }\n\n emitChange(result.current, result.previous);\n config.callbacks?.onChange?.(result.current);\n}\n\n/**\n * Handle show settings\n */\nfunction handleShowSettings() {\n hideBanner();\n hideWidget();\n\n showModal(getConsent(), {\n onSave: handleSavePreferences,\n onAcceptAll: handleAcceptAll,\n onRejectAll: handleRejectAll,\n onClose: handleCloseModal\n });\n\n emitShow('modal');\n}\n\n/**\n * Handle close modal\n */\nfunction handleCloseModal() {\n hideModal();\n emitHide('modal');\n\n // Show widget if consent was already given\n if (hasConsentDecision() && config.showWidget) {\n showWidget({ onClick: handleShowSettings });\n } else {\n // Show banner again if no decision made\n showBanner({\n onAcceptAll: handleAcceptAll,\n onRejectAll: handleRejectAll,\n onSettings: handleShowSettings\n });\n }\n}\n\n/**\n * Initialize Zest\n */\nfunction init(userConfig = {}) {\n if (initialized) {\n console.warn('[Zest] Already initialized');\n return Zest;\n }\n\n // Merge config\n config = setConfig(userConfig);\n\n // Set patterns if provided\n if (config.patterns) {\n setPatterns(config.patterns);\n }\n\n // Set up consent checkers\n setCookieChecker(checkConsent);\n setStorageChecker(checkConsent);\n setScriptChecker(checkConsent);\n\n // Start interception\n interceptCookies();\n interceptStorage();\n startScriptBlocking(config.mode, config.blockedDomains);\n\n // Load saved consent\n const consent = loadConsent();\n\n initialized = true;\n\n // Check Do Not Track / Global Privacy Control\n const dntEnabled = isDoNotTrackEnabled();\n let dntApplied = false;\n\n if (dntEnabled && config.respectDNT && config.dntBehavior !== 'ignore') {\n if (config.dntBehavior === 'reject' && !hasConsentDecision()) {\n // Auto-reject non-essential cookies silently\n const result = storeRejectAll(config.expiration);\n dntApplied = true;\n\n // Emit events\n emitReject(result.current);\n emitChange(result.current, result.previous);\n config.callbacks?.onReject?.();\n config.callbacks?.onChange?.(result.current);\n }\n // 'preselect' behavior is handled by default (banner shows with defaults off)\n }\n\n // Emit ready event\n emitReady(consent);\n config.callbacks?.onReady?.(consent);\n\n // Show UI based on consent state\n if (!hasConsentDecision() && !dntApplied) {\n // No consent decision yet - show banner\n showBanner({\n onAcceptAll: handleAcceptAll,\n onRejectAll: handleRejectAll,\n onSettings: handleShowSettings\n });\n emitShow('banner');\n } else {\n // Consent already given (or DNT auto-rejected) - show widget for reopening settings\n if (config.showWidget) {\n showWidget({ onClick: handleShowSettings });\n }\n }\n\n return Zest;\n}\n\n/**\n * Public API\n */\nconst Zest = {\n // Initialization\n init,\n\n // Banner control\n show() {\n if (!initialized) {\n console.warn('[Zest] Not initialized. Call Zest.init() first.');\n return;\n }\n hideModal();\n hideWidget();\n showBanner({\n onAcceptAll: handleAcceptAll,\n onRejectAll: handleRejectAll,\n onSettings: handleShowSettings\n });\n emitShow('banner');\n },\n\n hide() {\n hideBanner();\n emitHide('banner');\n },\n\n // Settings modal\n showSettings() {\n if (!initialized) {\n console.warn('[Zest] Not initialized. Call Zest.init() first.');\n return;\n }\n handleShowSettings();\n },\n\n hideSettings() {\n hideModal();\n emitHide('modal');\n },\n\n // Consent management\n getConsent,\n hasConsent,\n hasConsentDecision,\n getConsentProof,\n\n // DNT detection\n isDoNotTrackEnabled,\n getDNTDetails,\n\n // Accept/Reject programmatically\n acceptAll() {\n if (!initialized) {\n console.warn('[Zest] Not initialized. Call Zest.init() first.');\n return;\n }\n handleAcceptAll();\n },\n\n rejectAll() {\n if (!initialized) {\n console.warn('[Zest] Not initialized. Call Zest.init() first.');\n return;\n }\n handleRejectAll();\n },\n\n // Reset and show banner again\n reset() {\n resetConsent();\n hideModal();\n removeWidget();\n\n if (initialized) {\n showBanner({\n onAcceptAll: handleAcceptAll,\n onRejectAll: handleRejectAll,\n onSettings: handleShowSettings\n });\n emitShow('banner');\n }\n },\n\n // Config\n getConfig: getCurrentConfig,\n\n // Events\n EVENTS\n};\n\n// Auto-init if config present\nif (typeof window !== 'undefined') {\n // Make Zest available globally\n window.Zest = Zest;\n\n const autoInit = () => {\n const cfg = getConfig();\n if (cfg.autoInit !== false) {\n init(window.ZestConfig);\n }\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', autoInit);\n } else {\n autoInit();\n }\n}\n\nexport default Zest;\n"],"names":["checkConsent","setConsentChecker","shadowRoot","storeAcceptAll","storeRejectAll","setCookieChecker","setStorageChecker","setScriptChecker"],"mappings":"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AI,EAAE,EAAE,IAAI,EAAE,CAAC;AACpC;;AAEA;AACA;AACA;AACO,SAAS,QAAQ,CAAC,IAAI,GAAG,QAAQ,EAAE;AAC1C,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AACpC;;ACpEA;AACA;AACA;;AAEA;AACA;AACA;AACO,SAAS,cAAc,CAAC,MAAM,EAAE;AACvC,EAAE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS;;AAErD,EAAE,OAAO;AACT;AACA,iBAAiB,EAAE,WAAW,CAAC;AAC/B,uBAAuB,EAAE,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={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 t={...e};function n(e){for(const[n,o]of Object.entries(t))if(o.some(t=>t.test(e)))return n;return"marketing"}let o=null;const a=[];let i=()=>!1;function s(){return o}let r=null,c=null;const l=[],d=[];let u=()=>!1;function p(e,t,o){return new Proxy(e,{get(e,o){if("setItem"===o)return(o,a)=>{const i=n(o);u(i)?e.setItem(o,a):t.push({key:o,value:a,category:i,timestamp:Date.now()})};const a=e[o];return"function"==typeof a?a.bind(e):a}})}const m={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"]},g={analytics:[...m.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:[...m.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 b(e,t){try{const n=new URL(e).hostname.toLowerCase(),o=e.toLowerCase();for(const e of t)if(e.endsWith(".")){if(n.includes(e.slice(0,-1)))return!0}else{if(n===e||n.endsWith("."+e))return!0;if(o.includes(e))return!0}}catch(e){}return!1}function f(e,t="safe"){const n="strict"===t?g:m;for(const[t,o]of Object.entries(n))if(b(e,o))return t;return null}const z=[];let y=null,k="safe",h=[],v=()=>!1;function w(e){const t=e.getAttribute("data-consent-category");if(t)return t;if(e.hasAttribute("data-zest-allow"))return null;const n=e.src;if(!n)return null;const o=function(e){if(!e||0===h.length)return null;try{const t=new URL(e).hostname.toLowerCase();for(const e of h){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}(n);if(o)return o;switch(k){case"manual":default:return null;case"safe":case"strict":return f(n,k);case"doomsday":return 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}}(n)?f(n,"strict")||"marketing":null}}function x(e){if(e.hasAttribute("data-zest-processed"))return!1;const t=w(e);if(!t)return e.setAttribute("data-zest-processed","allowed"),!1;if(v(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,timestamp:Date.now()};return e.setAttribute("data-zest-processed","blocked"),e.setAttribute("data-consent-category",t),e.type="text/plain",e.src&&(e.setAttribute("data-blocked-src",e.src),e.removeAttribute("src")),z.push(n),!0}function A(e){const t=document.createElement("script");e.src?t.src=e.src:e.inline&&(t.textContent=e.inline),e.async&&(t.async=!0),e.defer&&(t.defer=!0),t.setAttribute("data-zest-processed","executed"),t.setAttribute("data-consent-executed","true"),document.head.appendChild(t)}function _(e){for(const t of e)for(const e of t.addedNodes)if("SCRIPT"!==e.nodeName||e.hasAttribute("data-zest-processed")||x(e),e.querySelectorAll){e.querySelectorAll("script:not([data-zest-processed])").forEach(x)}}function j(e="safe",t=[]){return k=e,h=t,document.querySelectorAll("script:not([data-zest-processed])").forEach(x),y=new MutationObserver(_),y.observe(document.documentElement,{childList:!0,subtree:!0}),!0}const C={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 E(){if("undefined"==typeof navigator)return!1;const e=navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack;return"1"===e||"yes"===e||!0===e||!0===navigator.globalPrivacyControl}const S={en:{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"}},categories:{essential:{label:"Essential",description:"Required for the website to function properly. Cannot be disabled."},functional:{label:"Functional",description:"Enable personalized features like language preferences and themes."},analytics:{label:"Analytics",description:"Help us understand how visitors interact with our website."},marketing:{label:"Marketing",description:"Used to deliver relevant advertisements and track campaign performance."}}},de:{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."}}},es:{labels:{banner:{title:"Valoramos tu privacidad",description:'Utilizamos cookies para mejorar tu experiencia de navegación, ofrecer contenido personalizado y analizar nuestro tráfico. Al hacer clic en "Aceptar todo", consientes el uso de cookies.',acceptAll:"Aceptar todo",rejectAll:"Rechazar todo",settings:"Configuración"},modal:{title:"Configuración de privacidad",description:"Gestiona tus preferencias de cookies. Puedes activar o desactivar diferentes tipos de cookies a continuación.",save:"Guardar preferencias",acceptAll:"Aceptar todo",rejectAll:"Rechazar todo"},widget:{label:"Configuración de cookies"}},categories:{essential:{label:"Esenciales",description:"Necesarias para el funcionamiento del sitio web. No se pueden desactivar."},functional:{label:"Funcionales",description:"Permiten funciones personalizadas como preferencias de idioma y temas."},analytics:{label:"Analíticas",description:"Nos ayudan a entender cómo los visitantes interactúan con nuestro sitio web."},marketing:{label:"Marketing",description:"Se utilizan para mostrar anuncios relevantes y medir el rendimiento de las campañas."}}},fr:{labels:{banner:{title:"Nous respectons votre vie privée",description:"Nous utilisons des cookies pour améliorer votre expérience de navigation, proposer du contenu personnalisé et analyser notre trafic. En cliquant sur « Tout accepter », vous consentez à l'utilisation de cookies.",acceptAll:"Tout accepter",rejectAll:"Tout refuser",settings:"Paramètres"},modal:{title:"Paramètres de confidentialité",description:"Gérez vos préférences en matière de cookies. Vous pouvez activer ou désactiver différents types de cookies ci-dessous.",save:"Enregistrer les préférences",acceptAll:"Tout accepter",rejectAll:"Tout refuser"},widget:{label:"Paramètres des cookies"}},categories:{essential:{label:"Essentiels",description:"Nécessaires au bon fonctionnement du site. Ne peuvent pas être désactivés."},functional:{label:"Fonctionnels",description:"Permettent des fonctionnalités personnalisées comme les préférences de langue et de thème."},analytics:{label:"Analytiques",description:"Nous aident à comprendre comment les visiteurs interagissent avec notre site."},marketing:{label:"Marketing",description:"Utilisés pour afficher des publicités pertinentes et mesurer les performances des campagnes."}}},it:{labels:{banner:{title:"Rispettiamo la tua privacy",description:'Utilizziamo i cookie per migliorare la tua esperienza di navigazione, fornire contenuti personalizzati e analizzare il nostro traffico. Cliccando su "Accetta tutto", acconsenti all\'uso dei cookie.',acceptAll:"Accetta tutto",rejectAll:"Rifiuta tutto",settings:"Impostazioni"},modal:{title:"Impostazioni privacy",description:"Gestisci le tue preferenze sui cookie. Puoi attivare o disattivare diversi tipi di cookie qui sotto.",save:"Salva preferenze",acceptAll:"Accetta tutto",rejectAll:"Rifiuta tutto"},widget:{label:"Impostazioni cookie"}},categories:{essential:{label:"Essenziali",description:"Necessari per il corretto funzionamento del sito. Non possono essere disattivati."},functional:{label:"Funzionali",description:"Abilitano funzionalità personalizzate come preferenze di lingua e tema."},analytics:{label:"Analitici",description:"Ci aiutano a capire come i visitatori interagiscono con il nostro sito."},marketing:{label:"Marketing",description:"Utilizzati per mostrare annunci pertinenti e misurare le prestazioni delle campagne."}}},pt:{labels:{banner:{title:"Valorizamos sua privacidade",description:'Usamos cookies para melhorar sua experiência de navegação, fornecer conteúdo personalizado e analisar nosso tráfego. Ao clicar em "Aceitar tudo", você consente com o uso de cookies.',acceptAll:"Aceitar tudo",rejectAll:"Rejeitar tudo",settings:"Configurações"},modal:{title:"Configurações de privacidade",description:"Gerencie suas preferências de cookies. Você pode ativar ou desativar diferentes tipos de cookies abaixo.",save:"Salvar preferências",acceptAll:"Aceitar tudo",rejectAll:"Rejeitar tudo"},widget:{label:"Configurações de cookies"}},categories:{essential:{label:"Essenciais",description:"Necessários para o funcionamento do site. Não podem ser desativados."},functional:{label:"Funcionais",description:"Permitem recursos personalizados como preferências de idioma e tema."},analytics:{label:"Analíticos",description:"Nos ajudam a entender como os visitantes interagem com nosso site."},marketing:{label:"Marketing",description:"Usados para exibir anúncios relevantes e medir o desempenho de campanhas."}}},nl:{labels:{banner:{title:"Wij respecteren uw privacy",description:'Wij gebruiken cookies om uw browse-ervaring te verbeteren, gepersonaliseerde inhoud aan te bieden en ons verkeer te analyseren. Door op "Alles accepteren" te klikken, stemt u in met het gebruik van cookies.',acceptAll:"Alles accepteren",rejectAll:"Alles weigeren",settings:"Instellingen"},modal:{title:"Privacy-instellingen",description:"Beheer uw cookievoorkeuren. U kunt hieronder verschillende soorten cookies in- of uitschakelen.",save:"Voorkeuren opslaan",acceptAll:"Alles accepteren",rejectAll:"Alles weigeren"},widget:{label:"Cookie-instellingen"}},categories:{essential:{label:"Essentieel",description:"Noodzakelijk voor de goede werking van de website. Kunnen niet worden uitgeschakeld."},functional:{label:"Functioneel",description:"Maken gepersonaliseerde functies mogelijk zoals taal- en themavoorkeuren."},analytics:{label:"Analytisch",description:"Helpen ons te begrijpen hoe bezoekers onze website gebruiken."},marketing:{label:"Marketing",description:"Worden gebruikt om relevante advertenties te tonen en campagneprestaties te meten."}}},pl:{labels:{banner:{title:"Szanujemy Twoją prywatność",description:'Używamy plików cookie, aby poprawić Twoje wrażenia z przeglądania, dostarczać spersonalizowane treści i analizować nasz ruch. Klikając „Zaakceptuj wszystko", wyrażasz zgodę na używanie plików cookie.',acceptAll:"Zaakceptuj wszystko",rejectAll:"Odrzuć wszystko",settings:"Ustawienia"},modal:{title:"Ustawienia prywatności",description:"Zarządzaj swoimi preferencjami dotyczącymi plików cookie. Możesz włączyć lub wyłączyć różne typy plików cookie poniżej.",save:"Zapisz preferencje",acceptAll:"Zaakceptuj wszystko",rejectAll:"Odrzuć wszystko"},widget:{label:"Ustawienia plików cookie"}},categories:{essential:{label:"Niezbędne",description:"Wymagane do prawidłowego działania strony. Nie można ich wyłączyć."},functional:{label:"Funkcjonalne",description:"Umożliwiają spersonalizowane funkcje, takie jak preferencje językowe i motywy."},analytics:{label:"Analityczne",description:"Pomagają nam zrozumieć, jak odwiedzający korzystają z naszej strony."},marketing:{label:"Marketingowe",description:"Służą do wyświetlania odpowiednich reklam i mierzenia skuteczności kampanii."}}},uk:{labels:{banner:{title:"Ми цінуємо вашу конфіденційність",description:"Ми використовуємо файли cookie для покращення вашого досвіду перегляду, надання персоналізованого контенту та аналізу нашого трафіку. Натискаючи «Прийняти все», ви погоджуєтесь на використання файлів cookie.",acceptAll:"Прийняти все",rejectAll:"Відхилити все",settings:"Налаштування"},modal:{title:"Налаштування конфіденційності",description:"Керуйте своїми налаштуваннями файлів cookie. Ви можете ввімкнути або вимкнути різні типи файлів cookie нижче.",save:"Зберегти налаштування",acceptAll:"Прийняти все",rejectAll:"Відхилити все"},widget:{label:"Налаштування cookie"}},categories:{essential:{label:"Необхідні",description:"Потрібні для правильної роботи сайту. Не можуть бути вимкнені."},functional:{label:"Функціональні",description:"Дозволяють персоналізовані функції, такі як мовні налаштування та теми."},analytics:{label:"Аналітичні",description:"Допомагають нам зрозуміти, як відвідувачі взаємодіють з нашим сайтом."},marketing:{label:"Маркетингові",description:"Використовуються для показу релевантної реклами та вимірювання ефективності кампаній."}}},ru:{labels:{banner:{title:"Мы ценим вашу конфиденциальность",description:"Мы используем файлы cookie для улучшения вашего опыта просмотра, предоставления персонализированного контента и анализа нашего трафика. Нажимая «Принять все», вы соглашаетесь на использование файлов cookie.",acceptAll:"Принять все",rejectAll:"Отклонить все",settings:"Настройки"},modal:{title:"Настройки конфиденциальности",description:"Управляйте своими настройками файлов cookie. Вы можете включить или отключить различные типы файлов cookie ниже.",save:"Сохранить настройки",acceptAll:"Принять все",rejectAll:"Отклонить все"},widget:{label:"Настройки cookie"}},categories:{essential:{label:"Необходимые",description:"Требуются для правильной работы сайта. Не могут быть отключены."},functional:{label:"Функциональные",description:"Позволяют использовать персонализированные функции, такие как языковые настройки и темы."},analytics:{label:"Аналитические",description:"Помогают нам понять, как посетители взаимодействуют с нашим сайтом."},marketing:{label:"Маркетинговые",description:"Используются для показа релевантной рекламы и измерения эффективности кампаний."}}},ja:{labels:{banner:{title:"プライバシーを尊重します",description:"当サイトでは、ブラウジング体験の向上、パーソナライズされたコンテンツの提供、トラフィックの分析のためにCookieを使用しています。「すべて同意」をクリックすると、Cookieの使用に同意したことになります。",acceptAll:"すべて同意",rejectAll:"すべて拒否",settings:"設定"},modal:{title:"プライバシー設定",description:"Cookieの設定を管理できます。以下で各種Cookieを有効または無効にできます。",save:"設定を保存",acceptAll:"すべて同意",rejectAll:"すべて拒否"},widget:{label:"Cookie設定"}},categories:{essential:{label:"必須",description:"サイトの正常な動作に必要です。無効にすることはできません。"},functional:{label:"機能性",description:"言語設定やテーマなどのパーソナライズ機能を有効にします。"},analytics:{label:"分析",description:"訪問者がサイトをどのように利用しているかを理解するのに役立ちます。"},marketing:{label:"マーケティング",description:"関連性の高い広告を表示し、キャンペーンの効果を測定するために使用されます。"}}},zh:{labels:{banner:{title:"我们重视您的隐私",description:'我们使用Cookie来改善您的浏览体验、提供个性化内容并分析我们的流量。点击"全部接受"即表示您同意我们使用Cookie。',acceptAll:"全部接受",rejectAll:"全部拒绝",settings:"设置"},modal:{title:"隐私设置",description:"管理您的Cookie偏好设置。您可以在下方启用或禁用不同类型的Cookie。",save:"保存设置",acceptAll:"全部接受",rejectAll:"全部拒绝"},widget:{label:"Cookie设置"}},categories:{essential:{label:"必要",description:"网站正常运行所必需的。无法禁用。"},functional:{label:"功能性",description:"启用个性化功能,如语言偏好和主题设置。"},analytics:{label:"分析",description:"帮助我们了解访问者如何与网站互动。"},marketing:{label:"营销",description:"用于展示相关广告并衡量营销活动效果。"}}}};function N(e){if(!e)return"en";const t=e.slice(0,2).toLowerCase();return S[t]?t:"en"}const R={lang:"auto",position:"bottom",theme:"auto",accentColor:"#0071e3",categories:C,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:"",mode:"safe",blockedDomains:[],policyUrl:null,imprintUrl:null,callbacks:{onAccept:null,onReject:null,onChange:null,onReady:null}};function M(e){const t={...R};e||(e={});const n=["lang","position","theme","accentColor","autoInit","showWidget","expiration","policyUrl","imprintUrl","customStyles","mode","blockedDomains","respectDNT","dntBehavior"];for(const o of n)void 0!==e[o]&&(t[o]=e[o]);const o=function(e){if(e&&"auto"!==e)return N(e);const t=document.documentElement.lang;if(t){const e=N(t);if(S[e])return e}if("undefined"!=typeof navigator&&navigator.language){const e=N(navigator.language);if(S[e])return e}return"en"}(t.lang);t.lang=o;const a=S[o]||S.en;const i=a.labels||{},s=e.labels||{};t.labels={banner:{...R.labels.banner,...i.banner,...s.banner},modal:{...R.labels.modal,...i.modal,...s.modal},widget:{...R.labels.widget,...i.widget,...s.widget}};const r=a.categories||{},c=e.categories||{};t.categories={...R.categories};for(const e of Object.keys(R.categories))t.categories[e]={...R.categories[e],...r[e],...c[e]};return e.callbacks&&(t.callbacks={...R.callbacks,...e.callbacks}),e.patterns&&(t.patterns=e.patterns),t}function T(){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 a=e.getAttribute("data-accent")||e.getAttribute("data-accent-color");a&&(t.accentColor=a);const i=e.getAttribute("data-policy-url")||e.getAttribute("data-privacy-url");i&&(t.policyUrl=i);const s=e.getAttribute("data-imprint-url");s&&(t.imprintUrl=s);const r=e.getAttribute("data-show-widget");null!==r&&(t.showWidget="false"!==r);const c=e.getAttribute("data-auto-init");null!==c&&(t.autoInit="false"!==c);const l=e.getAttribute("data-expiration");return l&&(t.expiration=parseInt(l,10)),t}();return M({...e,...t})}let U=null;function $(){return U||(U=T()),U}const D="zest_consent";let W=null;function P(e){const t=s();t?.set?t.set.call(document,e):document.cookie=e}function I(){const e=s();return e?.get?e.get.call(document):document.cookie}function q(){try{const e=I().match(RegExp(D+"=([^;]+)"));if(e){const t=JSON.parse(decodeURIComponent(e[1]));return W=t.categories||{essential:!0,functional:!1,analytics:!1,marketing:!1},{...W}}}catch(e){}return W={essential:!0,functional:!1,analytics:!1,marketing:!1},{...W}}function O(){return W||(W=q()),{...W}}function L(e,t=365){const n=W?{...W}:{essential:!0,functional:!1,analytics:!1,marketing:!1};return W={essential:!0,functional:!!e.functional,analytics:!!e.analytics,marketing:!!e.marketing},function(e=365){W||(W={essential:!0,functional:!1,analytics:!1,marketing:!1});const t={version:"1.0",timestamp:Date.now(),categories:W},n=new Date(Date.now()+24*e*60*60*1e3).toUTCString();P(`${D}=${encodeURIComponent(JSON.stringify(t))}; expires=${n}; path=/; SameSite=Lax`)}(t),{current:{...W},previous:n}}function Z(e){return W||(W=q()),!0===W[e]}function F(e=365){return L({functional:!1,analytics:!1,marketing:!1},e)}function H(){try{return I().includes(D)}catch(e){return!1}}const Y={READY:"zest:ready",CONSENT:"zest:consent",REJECT:"zest:reject",CHANGE:"zest:change",SHOW:"zest:show",HIDE:"zest:hide"};function B(e,t={}){const n=new CustomEvent(e,{detail:t,bubbles:!0,cancelable:!0});return document.dispatchEvent(n),n}function G(e,t){return B(Y.CONSENT,{consent:e,previous:t})}function V(e){return B(Y.REJECT,{consent:e})}function J(e,t){return B(Y.CHANGE,{consent:e,previous:t})}function K(e="banner"){return B(Y.SHOW,{type:e})}function X(e="banner"){return B(Y.HIDE,{type:e})}function Q(e){const t=e.accentColor||"#4F46E5";return`\n:host {\n --zest-accent: ${t};\n --zest-accent-hover: ${function(e,t){const n=parseInt(e.replace("#",""),16),o=Math.round(2.55*t);return"#"+(16777216+65536*Math.min(255,Math.max(0,(n>>16)+o))+256*Math.min(255,Math.max(0,(n>>8&255)+o))+Math.min(255,Math.max(0,(255&n)+o))).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${e.customStyles||""}\n`}let ee=null,te=null;function ne(e={}){ee?ee.classList.remove("zest-hidden"):function(e={}){if(ee)return ee;const t=$();ee=document.createElement("zest-banner"),ee.setAttribute("data-theme",t.theme||"light"),te=ee.attachShadow({mode:"open"});const n=document.createElement("style");n.textContent=Q(t),te.appendChild(n);const o=document.createElement("div");o.innerHTML=function(e){const t=e.labels.banner;return`\n <div class="zest-banner zest-banner--${e.position||"bottom"}" role="dialog" aria-modal="false" aria-label="${t.title}">\n <h2 class="zest-banner__title">${t.title}</h2>\n <p class="zest-banner__description">${t.description}</p>\n <div class="zest-banner__buttons">\n <button type="button" class="zest-btn zest-btn--primary" data-action="accept-all">\n ${t.acceptAll}\n </button>\n <button type="button" class="zest-btn zest-btn--secondary" data-action="reject-all">\n ${t.rejectAll}\n </button>\n <button type="button" class="zest-btn zest-btn--ghost" data-action="settings">\n ${t.settings}\n </button>\n </div>\n </div>\n `}(t),te.appendChild(o.firstElementChild);const a=te.querySelector(".zest-banner");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(ee),requestAnimationFrame(()=>{const e=te.querySelector("button");e?.focus()})}(e)}function oe(){ee&&(ee.remove(),ee=null,te=null)}let ae=null,ie=null,se={};function re(){if(!ie)return se;const e=ie.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 ce(e={},t={}){if(ae)return ae;const n=$();se={...e},ae=document.createElement("zest-modal"),ae.setAttribute("data-theme",n.theme||"light"),ie=ae.attachShadow({mode:"open"});const o=document.createElement("style");o.textContent=Q(n),ie.appendChild(o);const a=document.createElement("div");a.innerHTML=function(e,t){const n=e.labels.modal,o=Object.values(e.categories||C).map(e=>{return`\n <div class="zest-category">\n <div class="zest-category__header">\n <div class="zest-category__info">\n <span class="zest-category__label">${(n=e).label}</span>\n <p class="zest-category__description">${n.description}</p>\n </div>\n <label class="zest-toggle">\n <input\n type="checkbox"\n class="zest-toggle__input"\n data-category="${n.id}"\n ${t[e.id]??e.default?"checked":""}\n ${e.required?"disabled":""}\n aria-label="${n.label}"\n >\n <span class="zest-toggle__slider"></span>\n </label>\n </div>\n </div>\n `;var n}).join("");return`\n <div class="zest-modal-overlay" role="dialog" aria-modal="true" aria-label="${n.title}">\n <div class="zest-modal">\n <div class="zest-modal__header">\n <h2 class="zest-modal__title">${n.title}</h2>\n <p class="zest-modal__description">${n.description} ${e.policyUrl?`<a href="${e.policyUrl}" class="zest-link" target="_blank" rel="noopener">Privacy Policy</a>`:""}</p>\n </div>\n <div class="zest-modal__body">\n ${o}\n </div>\n <div class="zest-modal__footer">\n <button type="button" class="zest-btn zest-btn--primary" data-action="save">\n ${n.save}\n </button>\n <button type="button" class="zest-btn zest-btn--secondary" data-action="accept-all">\n ${n.acceptAll}\n </button>\n <button type="button" class="zest-btn zest-btn--ghost" data-action="reject-all">\n ${n.rejectAll}\n </button>\n </div>\n </div>\n </div>\n `}(n,e),ie.appendChild(a.firstElementChild);const i=ie.querySelector(".zest-modal-overlay");return i.addEventListener("click",e=>{const n=e.target.dataset.action;if(n)switch(n){case"save":t.onSave?.(re());break;case"accept-all":t.onAcceptAll?.();break;case"reject-all":t.onRejectAll?.()}else e.target===i&&t.onClose?.()}),i.addEventListener("keydown",e=>{"Escape"===e.key&&t.onClose?.()}),ie.querySelectorAll(".zest-toggle__input").forEach(e=>{e.addEventListener("change",()=>{se=re()})}),document.body.appendChild(ae),requestAnimationFrame(()=>{const e=ie.querySelector("button");e?.focus()}),ae}function le(){ae&&(ae.remove(),ae=null,ie=null)}let de=null,ue=null;function pe(e={}){de?de.style.display="":function(e={}){if(de)return de;const t=$();de=document.createElement("zest-widget"),de.setAttribute("data-theme",t.theme||"light"),ue=de.attachShadow({mode:"open"});const n=document.createElement("style");n.textContent=Q(t),ue.appendChild(n);const o=document.createElement("div");o.innerHTML=function(e){const t=e.labels.widget;return`\n <div class="zest-widget">\n <button type="button" class="zest-widget__btn" aria-label="${t.label}" title="${t.label}">\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 `}(t),ue.appendChild(o.firstElementChild),ue.querySelector(".zest-widget__btn").addEventListener("click",()=>{e.onClick?.()}),document.body.appendChild(de)}(e)}function me(){de&&(de.style.display="none")}let ge=!1,be=null;function fe(e){return Z(e)}function ze(e){!function(e){const t=[];for(const n of a)e.includes(n.category)?o?.set&&o.set.call(document,n.value):t.push(n);a.length=0,a.push(...t)}(e),function(e){const t=[];for(const n of l)e.includes(n.category)?r?.setItem(n.key,n.value):t.push(n);l.length=0,l.push(...t);const n=[];for(const t of d)e.includes(t.category)?c?.setItem(t.key,t.value):n.push(t);d.length=0,d.push(...n)}(e),function(e){const t=[];for(const n of z)e.includes(n.category)?A(n):t.push(n);z.length=0,z.push(...t),document.querySelectorAll('script[data-zest-processed="blocked"]').forEach(t=>{const n=t.getAttribute("data-consent-category");if(e.includes(n)){const e=document.createElement("script"),n=t.getAttribute("data-blocked-src");n?e.src=n:e.textContent=t.textContent,t.async&&(e.async=!0),t.defer&&(e.defer=!0),e.setAttribute("data-zest-processed","executed"),e.setAttribute("data-consent-executed","true"),t.parentNode?.replaceChild(e,t)}})}(e)}function ye(){const e=function(e=365){return L({functional:!0,analytics:!0,marketing:!0},e)}(be.expiration),t=Object.keys(C);oe(),le(),ze(t),be.showWidget&&pe({onClick:ve}),G(e.current,e.previous),J(e.current,e.previous),be.callbacks?.onAccept?.(e.current),be.callbacks?.onChange?.(e.current)}function ke(){const e=F(be.expiration);oe(),le(),be.showWidget&&pe({onClick:ve}),V(e.current),J(e.current,e.previous),be.callbacks?.onReject?.(),be.callbacks?.onChange?.(e.current)}function he(e){const t=L(e,be.expiration),n=Object.keys(t.current).filter(e=>t.current[e]&&!t.previous[e]);n.length>0&&ze(n),le(),be.showWidget&&pe({onClick:ve});Object.entries(e).some(([e,t])=>"essential"!==e&&t)?G(t.current,t.previous):V(t.current),J(t.current,t.previous),be.callbacks?.onChange?.(t.current)}function ve(){oe(),me(),ce(O(),{onSave:he,onAcceptAll:ye,onRejectAll:ke,onClose:we}),K("modal")}function we(){le(),X("modal"),H()&&be.showWidget?pe({onClick:ve}):ne({onAcceptAll:ye,onRejectAll:ke,onSettings:ve})}function xe(s={}){if(ge)return console.warn("[Zest] Already initialized"),Ae;be=function(e){return U=M(e),U}(s),be.patterns&&function(n){t={...e};for(const[e,o]of Object.entries(n))Array.isArray(o)&&(t[e]=o.map(e=>e instanceof RegExp?e:RegExp(e)))}(be.patterns),i=fe,function(e){u=e}(fe),function(e){v=e}(fe),o=Object.getOwnPropertyDescriptor(Document.prototype,"cookie"),o?Object.defineProperty(document,"cookie",{get:()=>o.get.call(document),set(e){const t=function(e){const t=e.match(/^([^=]+)/);return t?t[1].trim():null}(e);if(!t)return;const s=n(t);i(s)?o.set.call(document,e):a.push({value:e,name:t,category:s,timestamp:Date.now()})},configurable:!0}):console.warn("[Zest] Could not get cookie descriptor"),function(){try{return r=window.localStorage,c=window.sessionStorage,Object.defineProperty(window,"localStorage",{value:p(r,l),configurable:!0,writable:!1}),Object.defineProperty(window,"sessionStorage",{value:p(c,d),configurable:!0,writable:!1}),!0}catch(e){return console.warn("[Zest] Could not intercept storage APIs:",e),!1}}(),j(be.mode,be.blockedDomains);const m=q();ge=!0;let g=!1;if(E()&&be.respectDNT&&"ignore"!==be.dntBehavior&&"reject"===be.dntBehavior&&!H()){const e=F(be.expiration);g=!0,V(e.current),J(e.current,e.previous),be.callbacks?.onReject?.(),be.callbacks?.onChange?.(e.current)}return function(e){B(Y.READY,{consent:e})}(m),be.callbacks?.onReady?.(m),H()||g?be.showWidget&&pe({onClick:ve}):(ne({onAcceptAll:ye,onRejectAll:ke,onSettings:ve}),K("banner")),Ae}const Ae={init:xe,show(){ge?(le(),me(),ne({onAcceptAll:ye,onRejectAll:ke,onSettings:ve}),K("banner")):console.warn("[Zest] Not initialized. Call Zest.init() first.")},hide(){oe(),X("banner")},showSettings(){ge?ve():console.warn("[Zest] Not initialized. Call Zest.init() first.")},hideSettings(){le(),X("modal")},getConsent:O,hasConsent:Z,hasConsentDecision:H,getConsentProof:function(){try{const e=I().match(RegExp(D+"=([^;]+)"));if(e)return JSON.parse(decodeURIComponent(e[1]))}catch(e){}return null},isDoNotTrackEnabled:E,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(){ge?ye():console.warn("[Zest] Not initialized. Call Zest.init() first.")},rejectAll(){ge?ke():console.warn("[Zest] Not initialized. Call Zest.init() first.")},reset(){P(D+"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"),W=null,le(),de&&(de.remove(),de=null,ue=null),ge&&(ne({onAcceptAll:ye,onRejectAll:ke,onSettings:ve}),K("banner"))},getConfig:$,EVENTS:Y};if("undefined"!=typeof window){window.Zest=Ae;const e=()=>{!1!==T().autoInit&&xe(window.ZestConfig)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}export{Ae as default};
|