@easy-cookie/core 0.1.0 → 0.1.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/engine/utils/constants.js","../src/engine/core/global.js","../src/engine/utils/collections.js","../src/engine/utils/dom.js","../src/engine/utils/type-guards.js","../src/engine/utils/categories.js","../src/engine/utils/debug.js","../src/engine/utils/events.js","../src/engine/utils/scripts.js","../src/engine/utils/data-buttons.js","../src/engine/utils/focus-trap.js","../src/engine/utils/svg-icons.js","../src/engine/utils/gui-manager.js","../src/engine/core/modals/preferencesModal.js","../src/engine/core/modals/consentModal.js","../src/engine/utils/language.js","../src/engine/core/modals/index.js","../src/engine/utils/safe-run.js","../src/engine/utils/localstorage.js","../src/engine/utils/cookies.js","../src/engine/core/config-init.js","../src/engine/core/api.js","../src/shared/defaults.ts","../src/shared/config.ts","../src/shared/cookie.ts","../src/runtime/embeds.ts","../src/runtime/log.ts","../src/runtime/ui.ts","../src/runtime/translate.ts","../src/runtime/index.ts","../src/shared/head.ts"],"sourcesContent":["import { createEasyCookie } from './runtime';\n\nexport * from './shared';\nexport { createEasyCookie };\n\n/** The page-wide easy-cookie instance (the engine is a singleton). */\nconst EasyCookie = createEasyCookie();\nexport default EasyCookie;\nexport { EasyCookie };\n","export const COOKIE_NAME = 'cc_cookie';\n\nexport const OPT_IN_MODE = 'opt-in';\nexport const OPT_OUT_MODE = 'opt-out';\n\nexport const TOGGLE_CONSENT_MODAL_CLASS = 'show--consent';\nexport const TOGGLE_PREFERENCES_MODAL_CLASS = 'show--preferences';\nexport const TOGGLE_DISABLE_INTERACTION_CLASS = 'disable--interaction';\n\nexport const SCRIPT_TAG_SELECTOR = 'data-category';\n\nexport const DIV_TAG = 'div';\nexport const BUTTON_TAG = 'button';\n\nexport const ARIA_HIDDEN = 'aria-hidden';\nexport const BTN_GROUP_CLASS = 'btn-group';\nexport const CLICK_EVENT = 'click';\nexport const DATA_ROLE = 'data-role';\n\nexport const CONSENT_MODAL_NAME = 'consentModal';\nexport const PREFERENCES_MODAL_NAME = 'preferencesModal';","import { COOKIE_NAME, OPT_IN_MODE } from '../utils/constants';\n\n/**\n * @typedef {import('../../types')} CookieConsent\n *\n * @typedef {CookieConsent} Api\n * @typedef {CookieConsent.CookieConsentConfig} UserConfig\n * @typedef {CookieConsent.Category} Category\n * @typedef {CookieConsent.Service} Service\n * @typedef {Object.<string, Service>} Services\n * @typedef {CookieConsent.AutoClear} AutoClear\n * @typedef {CookieConsent.GuiOptions} GuiOptions\n * @typedef {GuiOptions['consentModal']} GuiModalOption\n * @typedef {CookieConsent.CookieConsentConfig['language']} Language\n * @typedef {CookieConsent.Translation} Translation\n * @typedef {CookieConsent.ConsentModalOptions} ConsentModalOptions\n * @typedef {CookieConsent.PreferencesModalOptions} PreferencesModalOptions\n * @typedef {CookieConsent.CookieTable} CookieTable\n * @typedef {CookieConsent.Section} Section\n * @typedef {CookieConsent.CookieValue} CookieValue\n * @typedef {CookieConsent.UserPreferences} UserPreferences\n */\n\n/**\n * Internal state for each script tag\n * @typedef {Object} ScriptInfo\n * @property {HTMLScriptElement} _script\n * @property {string} _categoryName\n * @property {string} [_serviceName]\n * @property {boolean} _executed\n * @property {boolean} _runOnDisable\n */\n\n/**\n * Pointers to main dom elements\n * @typedef {Object} DomElements\n * @property {Document} _document\n * @property {HTMLElement} _htmlDom\n *\n * @property {HTMLElement} _ccMain\n * @property {HTMLElement} _cmContainer\n * @property {HTMLElement} _pmContainer\n *\n * @property {HTMLElement} _cm\n * @property {HTMLElement} _cmBody\n * @property {HTMLElement} _cmTexts\n * @property {HTMLElement} _cmTitle\n * @property {HTMLElement} _cmDescription\n * @property {HTMLElement} _cmBtns\n * @property {HTMLElement} _cmBtnGroup\n * @property {HTMLElement} _cmBtnGroup2\n * @property {HTMLElement} _cmAcceptAllBtn\n * @property {HTMLElement} _cmAcceptNecessaryBtn\n * @property {HTMLElement} _cmShowPreferencesBtn\n * @property {HTMLElement} _cmFooterLinksGroup\n * @property {HTMLElement} _cmCloseIconBtn\n *\n * @property {HTMLElement} _pm\n * @property {HTMLElement} _pmHeader\n * @property {HTMLElement} _pmTitle\n * @property {HTMLElement} _pmCloseBtn\n * @property {HTMLElement} _pmBody\n * @property {HTMLElement} _pmNewBody\n * @property {HTMLElement} _pmSections\n * @property {HTMLElement} _pmFooter\n * @property {HTMLElement} _pmBtnGroup1\n * @property {HTMLElement} _pmBtnGroup2\n * @property {HTMLElement} _pmAcceptAllBtn\n * @property {HTMLElement} _pmAcceptNecessaryBtn\n * @property {HTMLElement} _pmSavePreferencesBtn\n *\n * @property {Object.<string, HTMLInputElement>} _categoryCheckboxInputs\n * @property {Object.<string, ServiceToggle>} _serviceCheckboxInputs\n *\n * // Used to properly restore focus when modal is closed\n * @property {HTMLSpanElement} _focusSpan\n * @property {HTMLSpanElement} _pmFocusSpan\n */\n\n/**\n * @typedef {Object} CustomCallbacks\n * @property {Function} _onFirstConsent\n * @property {Function} _onConsent\n * @property {Function} _onChange\n * @property {Function} _onModalShow\n * @property {Function} _onModalHide\n * @property {Function} _onModalReady\n */\n\n/**\n * Pointers to all services toggles relative to a category\n * @typedef {Object.<string, HTMLInputElement>} ServiceToggle\n */\n\nexport class GlobalState {\n constructor() {\n\n /**\n * Default config. options\n * @type {CookieConsent.CookieConsentConfig}\n */\n this._config = {\n mode: OPT_IN_MODE,\n revision: 0,\n\n //{{START: GUI}}\n autoShow: true,\n lazyHtmlGeneration: true,\n //{{END: GUI}}\n\n autoClearCookies: true,\n manageScriptTags: true,\n hideFromBots: true,\n respectGpc: false,\n\n cookie: {\n name: COOKIE_NAME,\n expiresAfterDays: 182,\n domain: '',\n path: '/',\n secure: true,\n sameSite: 'Lax'\n }\n };\n\n this._state = {\n /**\n * @type {UserConfig}\n */\n _userConfig: {},\n\n _currentLanguageCode: '',\n\n /**\n * @type {Object.<string, Translation>}\n */\n _allTranslations: {},\n\n /**\n * @type {Translation}\n */\n _currentTranslation: {},\n\n /**\n * Internal state variables\n * @type {CookieValue}\n */\n _savedCookieContent : {},\n\n /**\n * Store all event data-cc event listeners\n * (so that they can be removed on .reset())\n *\n * @type {{\n * _element: HTMLElement,\n * _event: string,\n * _listener: Function\n * }[]}\n */\n _dataEventListeners: [],\n\n _disablePageInteraction: false,\n\n /**\n * @type {any}\n */\n _cookieData : null,\n\n /**\n * @type {Date}\n */\n _consentTimestamp: null,\n\n /**\n * @type {Date}\n */\n _lastConsentTimestamp: null,\n\n /**\n * @type {string}\n */\n _consentId: '',\n\n _invalidConsent : true,\n\n //{{START: GUI}}\n _consentModalExists : false,\n _consentModalVisible : false,\n\n _preferencesModalVisible : false,\n _preferencesModalExists: false,\n\n /**\n * @type {HTMLElement[]}\n */\n _currentModalFocusableElements: [],\n //{{END: GUI}}\n\n _revisionEnabled : false,\n _validRevision : true,\n\n /**\n * Array containing the last changed categories (enabled/disabled)\n * @type {string[]}\n */\n _lastChangedCategoryNames : [],\n\n _reloadPage : false,\n\n /**\n * @type {CookieConsent.AcceptType}\n */\n _acceptType: '',\n\n /**\n * Object containing all user's defined categories\n * @type {Object.<string, Category>}\n */\n _allDefinedCategories: false,\n\n /**\n * Stores all available categories\n * @type {string[]}\n */\n _allCategoryNames: [],\n\n /**\n * Contains all accepted categories\n * @type {string[]}\n */\n _acceptedCategories : [],\n\n /**\n * Keep track of readonly toggles\n * @type {string[]}\n */\n _readOnlyCategories : [],\n\n /**\n * Contains all categories enabled by default\n * @type {string[]}\n */\n _defaultEnabledCategories : [],\n\n /**\n * Don't run plugin if bot detected\n * (to avoid indexing its text content)\n */\n _botAgentDetected : false,\n\n /**\n * Save reference to the last focused element on the page\n * (used later to restore focus when both modals are closed)\n */\n\n //{{START: GUI}}\n\n /** @type {HTMLElement} **/_lastFocusedElemBeforeModal: false,\n /** @type {HTMLElement} **/_lastFocusedModalElement: false,\n\n /**\n * Both of the arrays below have the same structure:\n * [0]: first focusable element inside modal\n * [1]: last focusable element inside modal\n */\n\n /** @type {HTMLElement[]} **/ _cmFocusableElements : [],\n /** @type {HTMLElement[]} **/ _pmFocusableElements : [],\n\n /**\n * Keep track of enabled/disabled categories\n * @type {boolean[]}\n */\n _allToggleStates : [],\n\n //{{END: GUI}}\n\n /**\n * @type {Object.<string, Services>}\n */\n _allDefinedServices: {},\n\n /**\n * @type {Object.<string, string[]>}\n */\n _acceptedServices: {},\n\n /**\n * Keep track of the current state of the services\n * (may not be the same as enabledServices)\n *\n * @type {Object.<string, string[]>}\n */\n _enabledServices: {},\n\n /**\n * @type {Object.<string, string[]>}\n */\n _lastChangedServices: {},\n\n /**\n * @type {Object.<string, string[]>}\n */\n _lastEnabledServices: {},\n\n /**\n * @type {ScriptInfo[]}\n */\n _allScriptTags: []\n };\n\n /**\n * Pointers to main dom elements\n * @type {DomElements}\n */\n this._dom = {\n _categoryCheckboxInputs: {},\n _serviceCheckboxInputs: {}\n };\n\n /**\n * Callback functions\n * @type {CustomCallbacks}\n */\n this._callbacks = {};\n\n this._customEvents = {\n _onFirstConsent: 'cc:onFirstConsent',\n _onConsent: 'cc:onConsent',\n _onChange: 'cc:onChange',\n //{{START: GUI}}\n _onModalShow: 'cc:onModalShow',\n _onModalHide: 'cc:onModalHide',\n _onModalReady: 'cc:onModalReady'\n //{{END: GUI}}\n };\n }\n}\n\nexport const globalObj = new GlobalState();","/**\n * Helper indexOf\n * @param {any[]|string} el\n * @param {any} value\n */\nexport const indexOf = (el, value) => el.indexOf(value);\n\n/**\n * Returns true if el. (array or string) contains the specified value\n * @param {any[]|string} el\n */\nexport const elContains = (el, value) => indexOf(el, value) !== -1;\n\nexport const getKeys = obj => Object.keys(obj);\n\n/**\n * Return array without duplicates\n * @param {any[]} arr\n */\nexport const unique = (arr) => Array.from(new Set(arr));\n\nexport const deepCopy = (el) => {\n if (typeof el !== 'object' || el === null)\n return el;\n\n if (el instanceof Date)\n return new Date(el.getTime());\n\n let clone = Array.isArray(el) ? [] : {};\n\n for (let key in el) {\n let value = el[key];\n clone[key] = deepCopy(value);\n }\n\n return clone;\n};\n\n/**\n * Symmetric difference between 2 arrays\n * @param {any[]} arr1\n * @param {any[]} arr2\n */\nexport const arrayDiff = (arr1, arr2) => {\n const a = arr1 || [];\n const b = arr2 || [];\n\n return a\n .filter(x => !elContains(b, x))\n .concat(b.filter(x => !elContains(a, x)));\n};\n","import { globalObj } from '../core/global';\nimport { BUTTON_TAG, TOGGLE_DISABLE_INTERACTION_CLASS } from './constants';\n\nexport const getActiveElement = () => document.activeElement;\n\n/**\n * @param {Event} e\n */\nexport const preventDefault = (e) => e.preventDefault();\n\n/**\n * @param {Element} el\n * @param {string} selector\n */\nexport const querySelectorAll = (el, selector) => el.querySelectorAll(selector);\n\n/**\n * @param {HTMLInputElement} input\n */\nexport const dispatchInputChangeEvent = (input) => input.dispatchEvent(new Event('change'));\n\n/**\n * @param {keyof HTMLElementTagNameMap} type\n * @param {string} [className]\n */\nexport const createNode = (type, className) => {\n const el = document.createElement(type);\n\n if (type === BUTTON_TAG) {\n el.type = type;\n }\n\n className && addClass(el, className);\n\n return el;\n};\n\n/**\n * @param {HTMLElement} el\n * @param {string} attribute\n * @param {string} value\n */\nexport const setAttribute = (el, attribute, value) => el.setAttribute(attribute, value);\n\n/**\n * @param {HTMLElement} el\n * @param {string} attribute\n * @param {boolean} [prependData]\n */\nexport const removeAttribute = (el, attribute, prependData) => {\n el.removeAttribute(prependData\n ? 'data-' + attribute\n : attribute\n );\n};\n\n/**\n * @param {HTMLElement} el\n * @param {string} attribute\n * @param {boolean} [prependData]\n * @returns {string}\n */\nexport const getAttribute = (el, attribute, prependData) => {\n return el.getAttribute(prependData\n ? 'data-' + attribute\n : attribute\n );\n};\n\n/**\n * @param {Node} parent\n * @param {Node} child\n */\nexport const appendChild = (parent, child) => parent.appendChild(child);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const addClass = (elem, className) => elem.classList.add(className);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const addClassCm = (elem, className) => addClass(elem, 'cm__' + className);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const addClassPm = (elem, className) => addClass(elem, 'pm__' + className);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const removeClass = (el, className) => el.classList.remove(className);\n\n/**\n * @param {HTMLElement} el\n * @param {string} className\n */\nexport const hasClass = (el, className) => el.classList.contains(className);\n\n/**\n * Add event listener to dom object (cross browser function)\n * @param {Element} elem\n * @param {keyof WindowEventMap} event\n * @param {EventListener} fn\n * @param {boolean} [saveListener]\n */\nexport const addEvent = (elem, event, fn, saveListener) => {\n elem.addEventListener(event, fn);\n\n /**\n * Keep track of specific event listeners\n * that must be removed on `.reset()`\n */\n if (saveListener) {\n globalObj._state._dataEventListeners.push({\n _element: elem,\n _event: event,\n _listener: fn\n });\n }\n};\n\n/**\n * @param {HTMLElement} el\n * @param {boolean} [toggleTabIndex]\n * @param {boolean} [preventScroll]\n */\nexport const focus = (el, toggleTabIndex, preventScroll) => {\n if (!el) return;\n\n /**\n * Momentarily add the `tabindex` attribute to fix\n * a bug with focus restoration in chrome\n */\n toggleTabIndex && (el.tabIndex = -1);\n\n el.focus({ preventScroll });\n\n /**\n * Remove the `tabindex` attribute so\n * that the html markup is valid again\n */\n toggleTabIndex && el.removeAttribute('tabindex');\n};\n\n/**\n * Run `fn` in a new task, once the browser had the chance to paint\n * @param {Function} fn\n */\nexport const afterPaint = (fn) => requestAnimationFrame(() => setTimeout(fn));\n\n/**\n * Elements that get the modal state classes: <html> (page styles, e.g. the\n * scroll lock) and the root element (styles inside a shadow root)\n * @returns {HTMLElement[]}\n */\nexport const getStateClassElements = () => {\n const { _htmlDom, _rootEl } = globalObj._dom;\n\n return [...new Set([_htmlDom, _rootEl])].filter(el => el);\n};\n\n/**\n * @param {string} className\n * @param {boolean} [enable]\n * @param {HTMLElement[]} [elements]\n */\nexport const toggleStateClass = (className, enable, elements = getStateClassElements()) => {\n for (const el of elements)\n el.classList.toggle(className, !!enable);\n};\n\nlet disableInteractionTimeout;\n\n/**\n * @param {boolean} [enable]\n */\nexport const toggleDisableInteraction = (enable) => {\n clearTimeout(disableInteractionTimeout);\n\n const elements = getStateClassElements();\n\n if (enable) {\n toggleStateClass(TOGGLE_DISABLE_INTERACTION_CLASS, true, elements);\n }else {\n disableInteractionTimeout = setTimeout(() => {\n toggleStateClass(TOGGLE_DISABLE_INTERACTION_CLASS, false, elements);\n }, 500);\n }\n};\n","export const isArray = el => Array.isArray(el);\n\nexport const isString = el => typeof el === 'string';\n\nexport const isObject = el => !!el && typeof el === 'object' && !isArray(el);\n\nexport const isFunction = el => typeof el === 'function';\n","import { globalObj } from '../core/global';\nimport {\n arrayDiff,\n deepCopy,\n elContains,\n getKeys,\n unique\n} from './collections';\nimport { dispatchInputChangeEvent } from './dom';\nimport { isArray, isObject, isString } from './type-guards';\n\n/**\n * Store categories and services' config. details\n * @param {string[]} allCategoryNames\n */\nexport const fetchCategoriesAndServices = (allCategoryNames) => {\n const {\n _allDefinedCategories,\n _allDefinedServices,\n _acceptedServices,\n _enabledServices,\n _readOnlyCategories\n } = globalObj._state;\n\n for (let categoryName of allCategoryNames) {\n\n const currCategory = _allDefinedCategories[categoryName];\n const services = currCategory.services || {};\n const serviceNames = isObject(services) && getKeys(services) || [];\n\n _allDefinedServices[categoryName] = {};\n _acceptedServices[categoryName] = [];\n _enabledServices[categoryName] = [];\n\n /**\n * Keep track of readOnly categories\n */\n if (currCategory.readOnly) {\n _readOnlyCategories.push(categoryName);\n _acceptedServices[categoryName] = serviceNames;\n }\n\n globalObj._dom._serviceCheckboxInputs[categoryName] = {};\n\n for (let serviceName of serviceNames) {\n const service = services[serviceName];\n service._enabled = false;\n _allDefinedServices[categoryName][serviceName] = service;\n }\n }\n};\n\n/**\n * Obtain accepted and rejected services, consistent with the categories' state:\n * only the services of an accepted category are accepted, and nothing is rejected\n * until the consent is valid\n * @returns {{accepted: Object.<string, string[]>, rejected: Object.<string, string[]>}}\n */\nexport const getCurrentServicesState = () => {\n const accepted = {};\n const rejected = {};\n\n const {\n _invalidConsent,\n _allCategoryNames,\n _allDefinedServices,\n _acceptedCategories,\n _acceptedServices\n } = globalObj._state;\n\n for (const categoryName of _allCategoryNames) {\n accepted[categoryName] = elContains(_acceptedCategories, categoryName)\n ? _acceptedServices[categoryName]\n : [];\n\n rejected[categoryName] = _invalidConsent\n ? []\n : arrayDiff(accepted[categoryName], getKeys(_allDefinedServices[categoryName]));\n }\n\n return { accepted, rejected };\n};\n\nexport const retrieveCategoriesFromModal = () => {\n const toggles = globalObj._dom._categoryCheckboxInputs;\n\n if (!toggles)\n return [];\n\n let enabledCategories = [];\n\n for (let categoryName in toggles) {\n if (toggles[categoryName].checked) {\n enabledCategories.push(categoryName);\n }\n }\n\n return enabledCategories;\n};\n\n/**\n * @param {string[]|string} categories - Categories to accept\n * @param {string[]} [excludedCategories]\n */\nexport const resolveEnabledCategories = (categories, excludedCategories) => {\n const {\n _allCategoryNames,\n _acceptedCategories,\n _readOnlyCategories,\n _preferencesModalExists,\n _enabledServices,\n _defaultEnabledCategories,\n _allDefinedServices,\n _invalidConsent\n } = globalObj._state;\n\n /**\n * @type {string[]}\n */\n let enabledCategories = [];\n\n if (!categories) {\n // The default categories apply only until the user makes a choice\n enabledCategories = _invalidConsent\n ? [..._acceptedCategories, ..._defaultEnabledCategories]\n : [..._acceptedCategories];\n //{{START: GUI}}\n if (_preferencesModalExists) {\n const toggles = globalObj._dom._categoryCheckboxInputs;\n\n // Categories without a toggle keep their current state\n enabledCategories = [\n ...retrieveCategoriesFromModal(),\n ...enabledCategories.filter(categoryName => !toggles[categoryName])\n ];\n }\n //{{END: GUI}}\n } else {\n if (isArray(categories)) {\n enabledCategories.push(...categories);\n } else if (isString(categories)) {\n enabledCategories = categories === 'all'\n ? _allCategoryNames\n : [categories];\n }\n }\n\n // Remove invalid and excluded categories\n enabledCategories = enabledCategories.filter(category =>\n elContains(_allCategoryNames, category) &&\n !elContains(excludedCategories, category)\n );\n\n /**\n * If there are services, turn them all on or off\n */\n if (categories) {\n for (const categoryName of _allCategoryNames) {\n _enabledServices[categoryName] = elContains(enabledCategories, categoryName)\n ? getKeys(_allDefinedServices[categoryName])\n : [];\n }\n }\n\n // Add back all the categories set as \"readonly/required\"\n enabledCategories.push(..._readOnlyCategories);\n\n setAcceptedCategories(enabledCategories);\n};\n\n/**\n * @param {string} [relativeCategory]\n */\nexport const resolveEnabledServices = (relativeCategory) => {\n const state = globalObj._state;\n\n const {\n _enabledServices,\n _readOnlyCategories,\n _acceptedServices,\n _allDefinedServices,\n _allCategoryNames\n } = state;\n\n const categoriesToConsider = relativeCategory\n ? [relativeCategory]\n : _allCategoryNames;\n\n /**\n * Save previously enabled services to calculate later on which of them was changed\n */\n state._lastEnabledServices = deepCopy(_acceptedServices);\n\n for (const categoryName of categoriesToConsider) {\n const services = _allDefinedServices[categoryName];\n const serviceNames = getKeys(services);\n\n /**\n * Stop here if there are no services\n */\n if (serviceNames.length === 0)\n continue;\n\n // If category is marked as readOnly enable all its services\n _acceptedServices[categoryName] = unique(elContains(_readOnlyCategories, categoryName)\n ? serviceNames\n : _enabledServices[categoryName] || []\n );\n }\n};\n\n/**\n * True if the browser's Global Privacy Control signal must be honored:\n * `respectGpc` is enabled and there is no valid consent yet to override it\n */\nexport const isGpcOptOutActive = () => globalObj._config.respectGpc\n && globalObj._state._invalidConsent\n && navigator.globalPrivacyControl === true;\n\n/**\n * True if the toggle of the category (or of one of its services) should be checked.\n * Without `useAcceptedState`, the defaults are used.\n * @param {string} categoryName\n * @param {string} [serviceName]\n * @param {boolean} [useAcceptedState]\n */\nexport const isToggleChecked = (categoryName, serviceName, useAcceptedState) => {\n const state = globalObj._state;\n\n if (state._allDefinedCategories[categoryName].readOnly)\n return true;\n\n if (!useAcceptedState)\n return elContains(state._defaultEnabledCategories, categoryName);\n\n return serviceName\n ? elContains(state._acceptedServices[categoryName], serviceName)\n : elContains(state._acceptedCategories, categoryName);\n};\n\n/**\n * Tick/untick all the modal's toggles and reset the enabled services to match\n * @param {boolean} [useAcceptedState]\n */\nexport const syncModalToggles = (useAcceptedState) => {\n const { _categoryCheckboxInputs, _serviceCheckboxInputs } = globalObj._dom;\n\n for (const categoryName in _categoryCheckboxInputs) {\n const enabledServices = [];\n\n _categoryCheckboxInputs[categoryName].checked = isToggleChecked(categoryName, '', useAcceptedState);\n\n for (const serviceName in _serviceCheckboxInputs[categoryName]) {\n const serviceInput = _serviceCheckboxInputs[categoryName][serviceName];\n\n serviceInput.checked = isToggleChecked(categoryName, serviceName, useAcceptedState);\n serviceInput.checked && enabledServices.push(serviceName);\n }\n\n globalObj._state._enabledServices[categoryName] = enabledServices;\n }\n};\n\n/**\n * Update services state internally and tick/untick checkboxes\n * @param {string|string[]} service\n * @param {string} category\n */\nexport const updateModalToggles = (service, category) => {\n const state = globalObj._state;\n const {\n _allDefinedServices,\n _enabledServices,\n _preferencesModalExists\n } = state;\n\n const servicesInputs = globalObj._dom._serviceCheckboxInputs[category] || {};\n const categoryInput = globalObj._dom._categoryCheckboxInputs[category];\n const allServiceNames = getKeys(_allDefinedServices[category]);\n\n // Clear previously enabled services\n _enabledServices[category] = [];\n\n if (isString(service)) {\n if (service === 'all') {\n\n // Enable all services\n _enabledServices[category].push(...allServiceNames);\n\n if (_preferencesModalExists) {\n for (let serviceName in servicesInputs) {\n servicesInputs[serviceName].checked = true;\n dispatchInputChangeEvent(servicesInputs[serviceName]);\n }\n }\n\n } else {\n\n // Enable only one service (if valid) and disable all the others\n if (elContains(allServiceNames, service))\n _enabledServices[category].push(service);\n\n if (_preferencesModalExists) {\n for (let serviceName in servicesInputs) {\n servicesInputs[serviceName].checked = service === serviceName;\n dispatchInputChangeEvent(servicesInputs[serviceName]);\n }\n }\n }\n } else if (isArray(service)) {\n for (let serviceName of allServiceNames) {\n const validService = elContains(service, serviceName);\n const serviceInput = servicesInputs[serviceName];\n validService && _enabledServices[category].push(serviceName);\n\n if (serviceInput) {\n serviceInput.checked = validService;\n dispatchInputChangeEvent(serviceInput);\n }\n }\n }\n\n const uncheckCategory = _enabledServices[category].length === 0;\n\n /**\n * Remove/add the category from acceptedCategories\n */\n state._acceptedCategories = uncheckCategory\n ? state._acceptedCategories.filter(cat => cat !== category)\n : unique([...state._acceptedCategories, category]);\n\n /**\n * If there are no services enabled in the\n * current category, uncheck the category\n */\n if (categoryInput) {\n categoryInput.checked = !uncheckCategory;\n dispatchInputChangeEvent(categoryInput);\n }\n};\n\n/**\n * Calculate \"accept type\"\n * @returns {'all'|'custom'|'necessary'} accept type\n */\nexport const resolveAcceptType = () => {\n let type = 'custom';\n\n const { _acceptedCategories, _allCategoryNames, _readOnlyCategories } = globalObj._state;\n const nAcceptedCategories = _acceptedCategories.length;\n\n if (nAcceptedCategories === _allCategoryNames.length)\n type = 'all';\n else if (nAcceptedCategories === _readOnlyCategories.length)\n type = 'necessary';\n\n return type;\n};\n\n/**\n * Note: getUserPreferences() depends on \"acceptType\"\n * @param {string[]} acceptedCategories\n */\nexport const setAcceptedCategories = (acceptedCategories) => {\n globalObj._state._acceptedCategories = unique(acceptedCategories);\n globalObj._state._acceptType = resolveAcceptType();\n};\n\n/**\n * This callback type is called `requestCallback` and is displayed as a global symbol.\n *\n * @callback createModal\n * @param {import('../core/global').Api} api\n */\n\n/**\n * Obtain accepted and rejected categories\n * @returns {{accepted: string[], rejected: string[]}}\n */\nexport const getCurrentCategoriesState = () => {\n const {\n _invalidConsent,\n _acceptedCategories,\n _allCategoryNames\n } = globalObj._state;\n\n return {\n accepted: _acceptedCategories,\n rejected: _invalidConsent\n ? []\n : _allCategoryNames.filter(category =>\n !elContains(_acceptedCategories, category)\n )\n };\n};\n","/**\n * Helper console.log function\n * @param {any} [params]\n */\nexport const debug = (...params) => {\n console.log(...params);\n};\n","import { globalObj } from '../core/global';\nimport { deepCopy } from './collections';\nimport { isFunction } from './type-guards';\n\n/**\n * @param {string} eventName\n */\nconst dispatchPluginEvent = (eventName, data) => dispatchEvent(new CustomEvent(eventName, {detail: data}));\n\n/**\n * Fire custom event\n * @param {string} eventName\n * @param {string} [modalName]\n * @param {HTMLElement} [modal]\n */\nexport const fireEvent = (eventName, modalName, modal) => {\n const {\n _onChange,\n _onConsent,\n _onFirstConsent,\n _onModalHide,\n _onModalReady,\n _onModalShow\n } = globalObj._callbacks;\n\n const events = globalObj._customEvents;\n\n //{{START: GUI}}\n if (modalName) {\n const modalParams = { modalName };\n\n if (eventName === events._onModalShow) {\n isFunction(_onModalShow) && _onModalShow(modalParams);\n } else if (eventName === events._onModalHide) {\n isFunction(_onModalHide) && _onModalHide(modalParams);\n } else {\n modalParams.modal = modal;\n isFunction(_onModalReady) && _onModalReady(modalParams);\n }\n\n return dispatchPluginEvent(eventName, modalParams);\n }\n //{{END: GUI}}\n\n const params = {\n cookie: globalObj._state._savedCookieContent\n };\n\n if (eventName === events._onFirstConsent) {\n isFunction(_onFirstConsent) && _onFirstConsent(deepCopy(params));\n } else if (eventName === events._onConsent) {\n isFunction(_onConsent) && _onConsent(deepCopy(params));\n } else {\n params.changedCategories = globalObj._state._lastChangedCategoryNames;\n params.changedServices = globalObj._state._lastChangedServices;\n isFunction(_onChange) && _onChange(deepCopy(params));\n }\n\n dispatchPluginEvent(eventName, deepCopy(params));\n};\n","import { globalObj } from '../core/global';\nimport { isGpcOptOutActive } from './categories';\nimport { elContains } from './collections';\nimport {\n createNode,\n getAttribute,\n querySelectorAll,\n removeAttribute,\n setAttribute\n} from './dom';\nimport { isFunction } from './type-guards';\nimport { SCRIPT_TAG_SELECTOR, OPT_OUT_MODE } from './constants';\n\n/**\n * @param {string} type\n */\nconst validMimeType = type => ['text/javascript', 'module'].includes(type);\n\n/**\n * This function handles the loading/activation logic of the already\n * existing scripts based on the current accepted cookie categories\n */\nexport const manageExistingScripts = () => {\n const {\n _acceptedCategories,\n _acceptedServices,\n _lastChangedServices,\n _allCategoryNames,\n _allDefinedServices,\n _allScriptTags,\n _lastChangedCategoryNames,\n } = globalObj._state;\n\n /**\n * Automatically Enable/Disable internal services\n */\n for (const categoryName of _allCategoryNames) {\n const changedServices = _lastChangedServices[categoryName];\n\n // Nothing changed (e.g. readOnly services on the first consent):\n // check the accepted services that are not enabled yet\n const lastChangedServices = changedServices && changedServices.length > 0\n ? changedServices\n : _acceptedServices[categoryName] || [];\n\n for (const serviceName of lastChangedServices) {\n const service = _allDefinedServices[categoryName][serviceName];\n\n if (!service)\n continue;\n\n const { onAccept, onReject } = service;\n\n if (\n !service._enabled\n && elContains(_acceptedServices[categoryName], serviceName)\n ) {\n service._enabled = true;\n isFunction(onAccept) && onAccept();\n }\n\n else if (\n service._enabled\n && !elContains(_acceptedServices[categoryName], serviceName)\n ) {\n service._enabled = false;\n isFunction(onReject) && onReject();\n }\n }\n }\n\n if (!globalObj._config.manageScriptTags)\n return;\n\n const scripts = _allScriptTags;\n\n /**\n * Load scripts (sequentially), using a recursive function\n * which loops through the scripts array\n * @param {import('../core/global').ScriptInfo[]} scripts scripts to load\n * @param {number} index current script to load\n */\n const loadScriptsHelper = (scripts, index) => {\n if (index >= scripts.length)\n return;\n\n const currScriptInfo = _allScriptTags[index];\n\n /**\n * Skip script if it was already executed\n */\n if (currScriptInfo._executed)\n return loadScriptsHelper(scripts, index+1);\n\n const currScript = currScriptInfo._script;\n const currScriptCategory = currScriptInfo._categoryName;\n const currScriptService = currScriptInfo._serviceName;\n const categoryAccepted = elContains(_acceptedCategories, currScriptCategory);\n const serviceAccepted = currScriptService\n ? elContains(_acceptedServices[currScriptCategory], currScriptService)\n : false;\n\n const categoryWasJustEnabled = () => !currScriptService\n && !currScriptInfo._runOnDisable\n && categoryAccepted;\n\n const serviceWasJustEnabled = () => currScriptService\n && !currScriptInfo._runOnDisable\n && serviceAccepted;\n\n const categoryWasJustDisabled = () => !currScriptService\n && currScriptInfo._runOnDisable\n && !categoryAccepted\n && elContains(_lastChangedCategoryNames, currScriptCategory);\n\n const serviceWasJustDisabled = () => currScriptService\n && currScriptInfo._runOnDisable\n && !serviceAccepted\n && elContains(_lastChangedServices[currScriptCategory] || [], currScriptService);\n\n const shouldRunScript =\n categoryWasJustEnabled()\n || categoryWasJustDisabled()\n || serviceWasJustEnabled()\n || serviceWasJustDisabled();\n\n if (shouldRunScript) {\n currScriptInfo._executed = true;\n const dataType = getAttribute(currScript, 'type', true);\n\n removeAttribute(currScript, 'type', !!dataType);\n removeAttribute(currScript, SCRIPT_TAG_SELECTOR);\n\n // Get current script data-src (if there is one)\n let src = getAttribute(currScript, 'src', true);\n\n // Some scripts (like ga) might throw warning if data-src is present\n src && removeAttribute(currScript, 'src', true);\n\n /**\n * Fresh script\n * @type {HTMLScriptElement}\n */\n const freshScript = createNode('script');\n\n freshScript.textContent = currScript.innerHTML;\n\n // Copy attributes over to the new \"revived\" script; properties are\n // preferred since some values (e.g. `nonce`) are hidden from attributes\n for (const {nodeName} of currScript.attributes) {\n setAttribute(\n freshScript,\n nodeName,\n currScript[nodeName] || getAttribute(currScript, nodeName)\n );\n }\n\n /**\n * Set custom type\n */\n dataType && (freshScript.type = dataType);\n\n // Set src (if data-src found)\n src\n ? (freshScript.src = src)\n : (src = currScript.src);\n\n const externalScript = !!src && (dataType ? validMimeType(dataType) : true);\n\n // If script has valid \"src\" attribute\n // try loading it sequentially\n if (externalScript) {\n // load script sequentially => the next script will not be loaded\n // until the current's script onload event triggers\n freshScript.onload = freshScript.onerror = () => {\n loadScriptsHelper(scripts, ++index);\n };\n }\n\n // Replace current \"sleeping\" script with the new \"revived\" one\n currScript.replaceWith(freshScript);\n\n /**\n * If we managed to get here and src is still set, it means that\n * the script is loading/loaded sequentially so don't go any further\n */\n if (externalScript)\n return;\n }\n\n\n // Go to next script right away\n loadScriptsHelper(scripts, ++index);\n };\n\n loadScriptsHelper(scripts, 0);\n};\n\n/**\n * Keep track of categories enabled by default (useful when mode==OPT_OUT_MODE)\n */\nexport const retrieveEnabledCategoriesAndServices = () => {\n const state = globalObj._state;\n\n for (const categoryName of state._allCategoryNames) {\n const category = state._allDefinedCategories[categoryName];\n\n if (category.readOnly || (category.enabled && !isGpcOptOutActive())) {\n state._defaultEnabledCategories.push(categoryName);\n const services = state._allDefinedServices[categoryName] || {};\n\n for (let serviceName in services) {\n state._enabledServices[categoryName].push(serviceName);\n if (\n state._userConfig.mode === OPT_OUT_MODE\n && !elContains(state._acceptedServices[categoryName], serviceName)\n ) {\n state._acceptedServices[categoryName].push(serviceName);\n }\n }\n }\n }\n};\n\n/**\n * Retrieves all script elements with 'data-category' attribute\n * and save the following attributes: category-name and service\n */\nexport const retrieveScriptElements = () => {\n if (!globalObj._config.manageScriptTags)\n return;\n\n const state = globalObj._state;\n\n /**\n * @type {NodeListOf<HTMLScriptElement>}\n */\n const scripts = querySelectorAll(document, 'script[' + SCRIPT_TAG_SELECTOR +']');\n\n for (const scriptTag of scripts) {\n let scriptCategoryName = getAttribute(scriptTag, SCRIPT_TAG_SELECTOR);\n let scriptServiceName = scriptTag.dataset.service || '';\n let runOnDisable = false;\n\n /**\n * Remove the '!' char if it is present\n */\n if (scriptCategoryName && scriptCategoryName.charAt(0) === '!') {\n scriptCategoryName = scriptCategoryName.slice(1);\n runOnDisable = true;\n }\n\n if (scriptServiceName.charAt(0) === '!') {\n scriptServiceName = scriptServiceName.slice(1);\n runOnDisable = true;\n }\n\n if (elContains(state._allCategoryNames, scriptCategoryName)) {\n state._allScriptTags.push({\n _script: scriptTag,\n _executed: false,\n _runOnDisable: runOnDisable,\n _categoryName: scriptCategoryName,\n _serviceName: scriptServiceName\n });\n\n if (scriptServiceName) {\n const categoryServices = state._allDefinedServices[scriptCategoryName];\n if (!categoryServices[scriptServiceName]) {\n categoryServices[scriptServiceName] = {\n _enabled: false\n };\n }\n }\n }\n }\n};\n","import { globalObj } from '../core/global';\nimport { CLICK_EVENT } from './constants';\nimport {\n addEvent,\n preventDefault,\n querySelectorAll,\n setAttribute\n} from './dom';\n\n/**\n * Add an onClick listeners to all html elements with data-cc attribute\n * @param {HTMLElement} [elem]\n * @param {import('../core/global').Api} api\n * @param {createModal} [createPreferencesModal]\n */\nexport const addDataButtonListeners = (elem, api, createPreferencesModal, createMainContainer) => {\n const ACCEPT_PREFIX = 'accept-';\n\n const {\n show,\n showPreferences,\n hide,\n hidePreferences,\n acceptCategory\n } = api;\n\n const rootEl = elem || document;\n const getElements = dataRole => querySelectorAll(rootEl, `[data-cc=\"${dataRole}\"]`);\n\n /**\n * Helper function: accept and then hide modals\n * @param {Event} event source event\n * @param {string|string[]} [acceptType]\n */\n const acceptAction = (event, acceptType) => {\n preventDefault(event);\n acceptCategory(acceptType);\n hidePreferences();\n hide();\n };\n\n const\n showPreferencesModalElements = getElements('show-preferencesModal'),\n showConsentModalElements = getElements('show-consentModal'),\n acceptAllElements = getElements(ACCEPT_PREFIX + 'all'),\n acceptNecessaryElements = getElements(ACCEPT_PREFIX + 'necessary'),\n acceptCustomElements = getElements(ACCEPT_PREFIX + 'custom'),\n createPreferencesModalOnHover = globalObj._config.lazyHtmlGeneration;\n\n //{{START: GUI}}\n for (const el of showPreferencesModalElements) {\n setAttribute(el, 'aria-haspopup', 'dialog');\n addEvent(el, CLICK_EVENT, (event) => {\n preventDefault(event);\n showPreferences();\n }, true);\n\n if (createPreferencesModalOnHover) {\n addEvent(el, 'mouseenter', (event) => {\n preventDefault(event);\n if (!globalObj._state._preferencesModalExists)\n createPreferencesModal(api, createMainContainer);\n }, true);\n\n addEvent(el, 'focus', () => {\n if (!globalObj._state._preferencesModalExists)\n createPreferencesModal(api, createMainContainer);\n }, true);\n }\n }\n\n for (let el of showConsentModalElements) {\n setAttribute(el, 'aria-haspopup', 'dialog');\n addEvent(el, CLICK_EVENT, (event) => {\n preventDefault(event);\n show(true);\n }, true);\n }\n //{{END: GUI}}\n\n for (let el of acceptAllElements) {\n addEvent(el, CLICK_EVENT, (event) => {\n acceptAction(event, 'all');\n }, true);\n }\n\n for (let el of acceptCustomElements) {\n addEvent(el, CLICK_EVENT, (event) => {\n acceptAction(event);\n }, true);\n }\n\n for (let el of acceptNecessaryElements) {\n addEvent(el, CLICK_EVENT, (event) => {\n acceptAction(event, []);\n }, true);\n }\n};\n","import { globalObj } from '../core/global';\nimport { BUTTON_TAG } from './constants';\nimport {\n addEvent,\n focus,\n getActiveElement,\n preventDefault,\n querySelectorAll\n} from './dom';\n\n/**\n * Trap focus inside modal and focus the first\n * focusable element of current active modal\n * @param {HTMLDivElement} modal\n */\nexport const handleFocusTrap = (modal) => {\n const dom = globalObj._dom;\n const state = globalObj._state;\n\n /**\n * @param {HTMLDivElement} modal\n * @param {HTMLElement[]} focusableElements\n */\n const trapFocus = (modal) => {\n const isConsentModal = modal === dom._cm;\n\n const scope = state._userConfig.disablePageInteraction\n ? dom._htmlDom\n : isConsentModal\n ? dom._ccMain\n : dom._htmlDom;\n\n const getFocusableElements = () => isConsentModal\n ? state._cmFocusableElements\n : state._pmFocusableElements;\n\n const isModalVisible = () => isConsentModal\n ? state._consentModalVisible && !state._preferencesModalVisible\n : state._preferencesModalVisible;\n\n addEvent(scope, 'keydown', (e) => {\n if (e.key !== 'Tab' || !isModalVisible())\n return;\n\n const currentActiveElement = getActiveElement();\n const focusableElements = getFocusableElements();\n\n if (focusableElements.length === 0)\n return;\n\n /**\n * If reached natural end of the tab sequence => restart\n * If current focused element is not inside modal => focus modal\n */\n if (e.shiftKey) {\n // Include the initial focus target, which is outside the tab sequence.\n const initialFocusElement = isConsentModal ? dom._cmDivTabindex : dom._pmDivTabindex;\n if (currentActiveElement === focusableElements[0] || currentActiveElement === initialFocusElement || !modal.contains(currentActiveElement)) {\n preventDefault(e);\n focus(focusableElements[1]);\n }\n } else {\n if (currentActiveElement === focusableElements[1] || !modal.contains(currentActiveElement)) {\n preventDefault(e);\n focus(focusableElements[0]);\n }\n }\n }, true);\n };\n\n trapFocus(modal);\n};\n\n/**\n * Note: any of the below focusable elements, which has the attribute tabindex=\"-1\" AND is either\n * the first or last element of the modal, won't receive focus during \"open/close\" modal\n */\nconst focusableTypesSelector = ['[href]', BUTTON_TAG, 'input', 'details', '[tabindex]']\n .map(selector => selector+':not([tabindex=\"-1\"])').join(',');\n\nexport const getFocusableElements = (root) => querySelectorAll(root, focusableTypesSelector);\n\n/**\n * Save reference to first and last focusable elements inside each modal\n * to prevent losing focus while navigating with TAB\n * @param {1 | 2} [modalId]\n */\nexport const getModalFocusableData = (modalId) => {\n const { _state, _dom } = globalObj;\n\n /**\n * Saves all focusable elements inside modal, into the array\n * @param {HTMLElement} modal\n * @param {Element[]} array\n */\n const saveAllFocusableElements = (modal, array) => {\n const focusableElements = getFocusableElements(modal);\n\n /**\n * Save first and last elements (trap focus inside modal)\n */\n array[0] = focusableElements[0];\n array[1] = focusableElements[focusableElements.length - 1];\n };\n\n if (modalId === 1 && _state._consentModalExists)\n saveAllFocusableElements(_dom._cm, _state._cmFocusableElements);\n\n if (modalId === 2 && _state._preferencesModalExists)\n saveAllFocusableElements(_dom._pm, _state._pmFocusableElements);\n};\n","const iconStrokes = [\n 'M 19.5 4.5 L 4.5 19.5 M 4.5 4.501 L 19.5 19.5', // X\n 'M 3.572 13.406 L 8.281 18.115 L 20.428 5.885', // TICK\n 'M 21.999 6.94 L 11.639 17.18 L 2.001 6.82 ' // ARROW\n];\n\n/**\n * [0: x, 1: tick, 2: arrow]\n * @param {0 | 1 | 2} [iconIndex]\n * @param {number} [strokeWidth]\n */\nexport const getSvgIcon = (iconIndex = 0, strokeWidth = 1.5) => {\n return `<svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" stroke-width=\"${strokeWidth}\"><path d=\"${iconStrokes[iconIndex]}\"/></svg>`;\n};\n","import { globalObj } from '../core/global';\nimport { elContains } from './collections';\nimport { addClass, removeClass } from './dom';\n\n/**\n * @typedef {Object} Layout\n * @property {string[]} _variants\n * @property {string[]} _alignV\n * @property {string[]} _alignH\n * @property {string} _defaultAlignV\n * @property {string} _defaultAlignH\n */\n\n/**\n * @typedef {Object.<string, Layout>} Layouts\n */\n\nconst CLASS_CONSTANTS = {\n _top: 'top',\n _middle: 'middle',\n _bottom: 'bottom',\n _left: 'left',\n _center: 'center',\n _right: 'right',\n _inline: 'inline',\n _wide: 'wide',\n _pmPrefix: 'pm--',\n _cmPrefix: 'cm--',\n _box: 'box'\n};\n\nconst alignV = [\n CLASS_CONSTANTS._middle,\n CLASS_CONSTANTS._top,\n CLASS_CONSTANTS._bottom\n];\n\nconst alignH = [\n CLASS_CONSTANTS._left,\n CLASS_CONSTANTS._center,\n CLASS_CONSTANTS._right\n];\n\nconst ALL_CM_LAYOUTS = {\n box: {\n _variants: [CLASS_CONSTANTS._wide, CLASS_CONSTANTS._inline],\n _alignV: alignV,\n _alignH: alignH,\n _defaultAlignV: CLASS_CONSTANTS._bottom,\n _defaultAlignH: CLASS_CONSTANTS._right\n },\n cloud: {\n _variants: [CLASS_CONSTANTS._inline],\n _alignV: alignV,\n _alignH: alignH,\n _defaultAlignV: CLASS_CONSTANTS._bottom,\n _defaultAlignH: CLASS_CONSTANTS._center\n },\n bar: {\n _variants: [CLASS_CONSTANTS._inline],\n _alignV: alignV.slice(1), //remove the first \"middle\" option\n _alignH: [],\n _defaultAlignV: CLASS_CONSTANTS._bottom,\n _defaultAlignH: ''\n }\n};\n\nconst ALL_PM_LAYOUTS = {\n box: {\n _variants: [],\n _alignV: [],\n _alignH: [],\n _defaultAlignV: '',\n _defaultAlignH: ''\n },\n bar: {\n _variants: [CLASS_CONSTANTS._wide],\n _alignV: [],\n _alignH: [CLASS_CONSTANTS._left, CLASS_CONSTANTS._right],\n _defaultAlignV: '',\n _defaultAlignH: CLASS_CONSTANTS._left\n }\n};\n\n/**\n * Add appropriate classes to modals and buttons\n * @param {0 | 1} applyToModal\n */\nexport const guiManager = (applyToModal) => {\n const guiOptions = globalObj._state._userConfig.guiOptions;\n const consentModalOptions = guiOptions && guiOptions.consentModal;\n const preferencesModalOptions = guiOptions && guiOptions.preferencesModal;\n\n if (applyToModal === 0) {\n setLayout(\n globalObj._dom._cm,\n ALL_CM_LAYOUTS,\n consentModalOptions,\n CLASS_CONSTANTS._cmPrefix,\n CLASS_CONSTANTS._box,\n 'cm'\n );\n }\n\n if (applyToModal === 1) {\n setLayout(\n globalObj._dom._pm,\n ALL_PM_LAYOUTS,\n preferencesModalOptions,\n CLASS_CONSTANTS._pmPrefix,\n CLASS_CONSTANTS._box,\n 'pm'\n );\n }\n};\n\n/**\n * Helper function to set the proper layout classes\n * @param {HTMLElement} modal\n * @param {Layouts} allowedLayoutsObj\n * @param {import(\"../core/global\").GuiModalOption} userGuiOptions\n * @param {'cm--' | 'pm--'} modalClassPrefix\n * @param {string} defaultLayoutName\n * @param {'cm' | 'pm'} modalClassName\n */\nconst setLayout = (modal, allowedLayoutsObj, userGuiOptions, modalClassPrefix, defaultLayoutName, modalClassName) => {\n /**\n * Reset modal classes to default\n */\n modal.className = modalClassName;\n\n const layout = userGuiOptions && userGuiOptions.layout;\n const position = userGuiOptions && userGuiOptions.position;\n const flipButtons = userGuiOptions && userGuiOptions.flipButtons;\n const equalWeightButtons = !userGuiOptions || userGuiOptions.equalWeightButtons !== false;\n\n const layoutSplit = layout && layout.split(' ') || [];\n\n const layoutName = layoutSplit[0];\n const layoutVariant = layoutSplit[1];\n\n const currentLayoutName = layoutName in allowedLayoutsObj\n ? layoutName\n : defaultLayoutName;\n\n const currentLayout = allowedLayoutsObj[currentLayoutName];\n const currentLayoutVariant = elContains(currentLayout._variants, layoutVariant) && layoutVariant;\n\n const positionSplit = position && position.split(' ') || [];\n const positionV = positionSplit[0];\n\n const positionH = modalClassPrefix === CLASS_CONSTANTS._pmPrefix\n ? positionSplit[0]\n : positionSplit[1];\n\n const currentPositionV = elContains(currentLayout._alignV, positionV)\n ? positionV\n : currentLayout._defaultAlignV;\n\n const currentPositionH = elContains(currentLayout._alignH, positionH)\n ? positionH\n : currentLayout._defaultAlignH;\n\n const addModalClass = className => {\n className && addClass(modal, modalClassPrefix + className);\n };\n\n addModalClass(currentLayoutName);\n addModalClass(currentLayoutVariant);\n addModalClass(currentPositionV);\n addModalClass(currentPositionH);\n flipButtons && addModalClass('flip');\n\n const secondaryBtnClass = 'btn--secondary';\n const btnClassPrefix = modalClassName + '__';\n const btnClass = btnClassPrefix + secondaryBtnClass;\n\n /**\n * Add classes to buttons\n */\n if (modalClassName === 'cm') {\n const {_cmAcceptNecessaryBtn, _cmCloseIconBtn} = globalObj._dom;\n\n if (_cmAcceptNecessaryBtn) {\n equalWeightButtons\n ? removeClass(_cmAcceptNecessaryBtn, btnClass)\n : addClass(_cmAcceptNecessaryBtn, btnClass);\n }\n\n if (_cmCloseIconBtn) {\n equalWeightButtons\n ? removeClass(_cmCloseIconBtn, btnClass)\n : addClass(_cmCloseIconBtn, btnClass);\n }\n } else {\n const { _pmAcceptNecessaryBtn } = globalObj._dom;\n\n if (_pmAcceptNecessaryBtn) {\n equalWeightButtons\n ? removeClass(_pmAcceptNecessaryBtn, btnClass)\n : addClass(_pmAcceptNecessaryBtn, btnClass);\n }\n }\n};","import { globalObj } from '../global';\nimport { isToggleChecked } from '../../utils/categories';\nimport { getKeys } from '../../utils/collections';\nimport { debug } from '../../utils/debug';\nimport {\n addClass,\n addClassPm,\n addEvent,\n appendChild,\n createNode,\n hasClass,\n removeAttribute,\n removeClass,\n setAttribute\n} from '../../utils/dom';\nimport { fireEvent } from '../../utils/events';\nimport { getModalFocusableData, handleFocusTrap } from '../../utils/focus-trap';\nimport { getSvgIcon } from '../../utils/svg-icons';\nimport { isObject, isString } from '../../utils/type-guards';\n\nimport { guiManager } from '../../utils/gui-manager';\nimport {\n PREFERENCES_MODAL_NAME,\n SCRIPT_TAG_SELECTOR,\n DIV_TAG,\n ARIA_HIDDEN,\n BUTTON_TAG,\n BTN_GROUP_CLASS,\n CLICK_EVENT,\n DATA_ROLE\n} from '../../utils/constants';\n\n/**\n * @callback CreateMainContainer\n */\n\n/**\n * Generates preferences modal and appends it to \"cc-main\" el.\n * @param {import(\"../global\").Api} api\n * @param {CreateMainContainer} createMainContainer\n */\nexport const createPreferencesModal = (api, createMainContainer) => {\n const state = globalObj._state;\n const dom = globalObj._dom;\n const {hide, hidePreferences, acceptCategory} = api;\n\n /**\n * @param {string|string[]} [categories]\n */\n const acceptHelper = (categories) => {\n acceptCategory(categories);\n hidePreferences();\n hide();\n };\n\n /**\n * @type {import(\"../global\").PreferencesModalOptions}\n */\n const modalData = state._currentTranslation && state._currentTranslation.preferencesModal;\n\n if (!modalData)\n return;\n\n const\n titleData = modalData.title,\n closeIconLabelData = modalData.closeIconLabel,\n acceptAllBtnData = modalData.acceptAllBtn,\n acceptNecessaryBtnData = modalData.acceptNecessaryBtn,\n savePreferencesBtnData = modalData.savePreferencesBtn,\n sectionsData = modalData.sections || [],\n createFooter = acceptAllBtnData\n || acceptNecessaryBtnData\n || savePreferencesBtnData;\n\n if (!dom._pmContainer) {\n dom._pmContainer = createNode(DIV_TAG, 'pm-wrapper');\n\n const pmOverlay = createNode('div', 'pm-overlay');\n appendChild(dom._pmContainer, pmOverlay);\n\n /**\n * Hide modal when overlay is clicked\n */\n addEvent(pmOverlay, CLICK_EVENT, hidePreferences);\n\n // Preferences modal\n dom._pm = createNode(DIV_TAG, 'pm');\n setAttribute(dom._pm, 'role', 'dialog');\n setAttribute(dom._pm, ARIA_HIDDEN, true);\n setAttribute(dom._pm, 'aria-modal', true);\n setAttribute(dom._pm, 'aria-labelledby', 'pm__title');\n\n // Hide preferences on 'esc' key press\n addEvent(dom._htmlDom, 'keydown', (event) => {\n if (event.key === 'Escape')\n hidePreferences();\n }, true);\n\n dom._pmHeader = createNode(DIV_TAG, 'pm__header');\n\n dom._pmTitle = createNode('h2', 'pm__title');\n dom._pmTitle.id = 'pm__title';\n\n dom._pmCloseBtn = createNode(BUTTON_TAG, 'pm__close-btn');\n setAttribute(dom._pmCloseBtn, 'aria-label', modalData.closeIconLabel || '');\n addEvent(dom._pmCloseBtn, CLICK_EVENT, hidePreferences);\n\n dom._pmFocusSpan = createNode('span');\n dom._pmFocusSpan.innerHTML = getSvgIcon();\n appendChild(dom._pmCloseBtn, dom._pmFocusSpan);\n\n dom._pmBody = createNode(DIV_TAG, 'pm__body');\n\n dom._pmFooter = createNode(DIV_TAG, 'pm__footer');\n\n dom._pmBtnGroup1 = createNode(DIV_TAG);\n dom._pmBtnGroup2 = createNode(DIV_TAG);\n addClassPm(dom._pmBtnGroup1, BTN_GROUP_CLASS);\n addClassPm(dom._pmBtnGroup2, BTN_GROUP_CLASS);\n\n appendChild(dom._pmFooter, dom._pmBtnGroup1);\n appendChild(dom._pmFooter, dom._pmBtnGroup2);\n\n appendChild(dom._pmHeader, dom._pmTitle);\n appendChild(dom._pmHeader, dom._pmCloseBtn);\n\n dom._pmDivTabindex = dom._pmTitle;\n setAttribute(dom._pmDivTabindex, 'tabIndex', -1);\n\n appendChild(dom._pm, dom._pmHeader);\n appendChild(dom._pm, dom._pmBody);\n appendChild(dom._pmContainer, dom._pm);\n } else {\n dom._pmNewBody = createNode(DIV_TAG, 'pm__body');\n }\n\n if (titleData) {\n dom._pmTitle.innerHTML = titleData;\n closeIconLabelData && setAttribute(dom._pmCloseBtn, 'aria-label', closeIconLabelData);\n }\n\n let sectionToggleContainer;\n\n sectionsData.forEach((section, sectionIndex) => {\n const\n sTitleData = section.title,\n sDescriptionData = section.description,\n sLinkedCategory = section.linkedCategory,\n sCurrentCategoryObject = sLinkedCategory && state._allDefinedCategories[sLinkedCategory],\n sCookieTableData = section.cookieTable,\n sCookieTableBody = sCookieTableData && sCookieTableData.body,\n sCreateCookieTable = sCookieTableBody && sCookieTableBody.length > 0,\n hasToggle = !!sCurrentCategoryObject,\n\n /**\n * @type {Object.<string, import('../global').Service>}\n */\n sServices = hasToggle && state._allDefinedServices[sLinkedCategory],\n sServiceNames = isObject(sServices) && getKeys(sServices) || [],\n sIsExpandableToggle = hasToggle && !!sTitleData && (!!sDescriptionData || !!sCreateCookieTable || getKeys(sServices).length>0),\n nServices = sServiceNames.length,\n expandableDivId = sLinkedCategory + '-desc';\n\n // section\n const s = createNode(DIV_TAG, 'pm__section');\n\n let sDescContainer, sTitle;\n\n if (sIsExpandableToggle || sDescriptionData) {\n sDescContainer = createNode(DIV_TAG, 'pm__section-desc-wrapper');\n }\n\n if (sIsExpandableToggle && nServices > 0)\n appendChild(sDescContainer, createServices(sServices, sServiceNames, sCurrentCategoryObject, sLinkedCategory));\n\n if (sTitleData) {\n const sTitleContainer = createNode(DIV_TAG);\n sTitle = createNode(hasToggle ? BUTTON_TAG : DIV_TAG);\n\n addClassPm(sTitleContainer, 'section-title-wrapper');\n addClassPm(sTitle, 'section-title');\n\n sTitle.innerHTML = sTitleData;\n appendChild(sTitleContainer, sTitle);\n\n if (hasToggle) {\n\n s.className += '--toggle';\n\n const toggleLabel = createToggleLabel(sTitleData, sLinkedCategory, sCurrentCategoryObject);\n const serviceCounterLabel = modalData.serviceCounterLabel;\n\n if (nServices > 0 && isString(serviceCounterLabel))\n appendChild(sTitle, createServiceCounter(nServices, serviceCounterLabel));\n\n if (sIsExpandableToggle) {\n /**\n * Arrow icon span\n */\n const sTitleIcon = createNode('span');\n sTitleIcon.innerHTML = getSvgIcon(2, 3.5);\n addClassPm(sTitleIcon, 'section-arrow');\n appendChild(sTitleContainer, sTitleIcon);\n\n addClassPm(s, 'section--expandable');\n setAttribute(sTitle, 'aria-expanded', false);\n setAttribute(sTitle, 'aria-controls', expandableDivId);\n }\n\n appendChild(sTitleContainer, toggleLabel);\n\n } else {\n setAttribute(sTitle, 'role', 'heading');\n setAttribute(sTitle, 'aria-level', '3');\n }\n\n appendChild(s, sTitleContainer);\n }\n\n if (sDescriptionData) {\n const sDesc = createNode('p', 'pm__section-desc');\n sDesc.innerHTML = sDescriptionData;\n appendChild(sDescContainer, sDesc);\n }\n\n if (sIsExpandableToggle) {\n setAttribute(sDescContainer, ARIA_HIDDEN, 'true');\n sDescContainer.id = expandableDivId;\n\n addExpandListener(sTitle, s, sDescContainer);\n\n if (sCreateCookieTable)\n appendChild(sDescContainer, createCookieTable(sCookieTableData, sectionIndex));\n }\n\n if (sIsExpandableToggle || sDescriptionData)\n appendChild(s, sDescContainer);\n\n const currentBody = dom._pmNewBody || dom._pmBody;\n\n if (hasToggle) {\n if (!sectionToggleContainer) {\n sectionToggleContainer = createNode(DIV_TAG, 'pm__section-toggles');\n }\n sectionToggleContainer.appendChild(s);\n } else {\n sectionToggleContainer = null;\n }\n\n appendChild(currentBody, sectionToggleContainer || s);\n\n });\n\n if (acceptAllBtnData) {\n if (!dom._pmAcceptAllBtn) {\n dom._pmAcceptAllBtn = createNode(BUTTON_TAG, 'pm__btn');\n setAttribute(dom._pmAcceptAllBtn, DATA_ROLE, 'all');\n appendChild(dom._pmBtnGroup1, dom._pmAcceptAllBtn);\n addEvent(dom._pmAcceptAllBtn, CLICK_EVENT, () =>\n acceptHelper('all')\n );\n }\n\n dom._pmAcceptAllBtn.innerHTML = acceptAllBtnData;\n }\n\n if (acceptNecessaryBtnData) {\n if (!dom._pmAcceptNecessaryBtn) {\n dom._pmAcceptNecessaryBtn = createNode(BUTTON_TAG, 'pm__btn');\n setAttribute(dom._pmAcceptNecessaryBtn, DATA_ROLE, 'necessary');\n appendChild(dom._pmBtnGroup1, dom._pmAcceptNecessaryBtn);\n addEvent(dom._pmAcceptNecessaryBtn, CLICK_EVENT, () =>\n acceptHelper([])\n );\n }\n\n dom._pmAcceptNecessaryBtn.innerHTML = acceptNecessaryBtnData;\n }\n\n if (savePreferencesBtnData) {\n if (!dom._pmSavePreferencesBtn) {\n dom._pmSavePreferencesBtn = createNode(BUTTON_TAG, 'pm__btn');\n addClassPm(dom._pmSavePreferencesBtn, 'btn--secondary');\n setAttribute(dom._pmSavePreferencesBtn, DATA_ROLE, 'save');\n appendChild(dom._pmBtnGroup2, dom._pmSavePreferencesBtn);\n\n addEvent(dom._pmSavePreferencesBtn, CLICK_EVENT, () =>\n acceptHelper()\n );\n }\n\n dom._pmSavePreferencesBtn.innerHTML = savePreferencesBtnData;\n }\n\n if (dom._pmNewBody) {\n dom._pm.replaceChild(dom._pmNewBody, dom._pmBody);\n dom._pmBody = dom._pmNewBody;\n }\n\n createFooter && appendChild(dom._pm, dom._pmFooter);\n\n guiManager(1);\n\n if (!state._preferencesModalExists) {\n state._preferencesModalExists = true;\n\n debug('CookieConsent [HTML] created', PREFERENCES_MODAL_NAME);\n\n fireEvent(globalObj._customEvents._onModalReady, PREFERENCES_MODAL_NAME, dom._pm);\n createMainContainer();\n appendChild(dom._ccMain, dom._pmContainer);\n handleFocusTrap(dom._pm);\n\n /**\n * Enable transition\n */\n setTimeout(() => addClass(dom._pmContainer, 'cc--anim'), 100);\n }\n\n getModalFocusableData(2);\n};\n\n/**\n * Generate the list of services (each with its own toggle) of a category\n * @param {Object.<string, import('../global').Service>} services\n * @param {string[]} serviceNames\n * @param {import('../global').Category} categoryObject\n * @param {string} categoryName\n */\nconst createServices = (services, serviceNames, categoryObject, categoryName) => {\n const servicesContainer = createNode(DIV_TAG, 'pm__section-services');\n\n for (const serviceName of serviceNames) {\n const service = services[serviceName];\n const serviceLabel = service && service.label || serviceName;\n const serviceDiv = createNode(DIV_TAG);\n const serviceHeader = createNode(DIV_TAG);\n const serviceIconContainer = createNode(DIV_TAG);\n const serviceTitle = createNode(DIV_TAG);\n\n addClassPm(serviceDiv, 'service');\n addClassPm(serviceTitle, 'service-title');\n addClassPm(serviceHeader, 'service-header');\n addClassPm(serviceIconContainer, 'service-icon');\n\n const toggleLabel = createToggleLabel(serviceLabel, serviceName, categoryObject, true, categoryName);\n\n serviceTitle.innerHTML = serviceLabel;\n\n appendChild(serviceHeader, serviceIconContainer);\n appendChild(serviceHeader, serviceTitle);\n appendChild(serviceDiv, serviceHeader);\n appendChild(serviceDiv, toggleLabel);\n appendChild(servicesContainer, serviceDiv);\n }\n\n return servicesContainer;\n};\n\n/**\n * Generate the \"N services\" badge\n * @param {number} nServices\n * @param {string} counterLabel singular and plural form, separated by \"|\"\n */\nconst createServiceCounter = (nServices, counterLabel) => {\n const serviceCounter = createNode('span', 'pm__badge');\n addClassPm(serviceCounter, 'service-counter');\n setAttribute(serviceCounter, ARIA_HIDDEN, true);\n setAttribute(serviceCounter, 'data-servicecounter', nServices);\n\n if (counterLabel) {\n const labels = counterLabel.split('|');\n\n counterLabel = labels.length > 1 && nServices > 1\n ? labels[1]\n : labels[0];\n\n setAttribute(serviceCounter, 'data-counterlabel', counterLabel);\n }\n\n serviceCounter.innerHTML = nServices + (counterLabel\n ? ' ' + counterLabel\n : '');\n\n return serviceCounter;\n};\n\n/**\n * Expand/collapse the section when its title is clicked\n * @param {HTMLElement} btn\n * @param {HTMLElement} section\n * @param {HTMLElement} accordion\n */\nconst addExpandListener = (btn, section, accordion) => {\n addEvent(btn, CLICK_EVENT, () => {\n if (!hasClass(section, 'is-expanded')) {\n addClass(section, 'is-expanded');\n setAttribute(btn, 'aria-expanded', 'true');\n removeAttribute(accordion, ARIA_HIDDEN);\n } else {\n removeClass(section, 'is-expanded');\n setAttribute(btn, 'aria-expanded', 'false');\n setAttribute(accordion, ARIA_HIDDEN, 'true');\n }\n });\n};\n\n/**\n * Generate the section's cookie table\n * @param {import('../global').CookieTable} cookieTableData\n * @param {number} sectionIndex\n */\nconst createCookieTable = (cookieTableData, sectionIndex) => {\n const table = createNode('table');\n const thead = createNode('thead');\n const tbody = createNode('tbody');\n const caption = cookieTableData.caption;\n\n if (caption) {\n const captionEl = createNode('caption', 'pm__table-caption');\n captionEl.innerHTML = caption;\n table.appendChild(captionEl);\n }\n\n addClassPm(table, 'section-table');\n addClassPm(thead, 'table-head');\n addClassPm(tbody, 'table-body');\n\n const headerData = cookieTableData.headers;\n const tableHeadersKeys = getKeys(headerData);\n\n /**\n * Create table headers\n */\n const trHeadFragment = globalObj._dom._document.createDocumentFragment();\n const trHead = createNode('tr');\n\n for (const headerKey of tableHeadersKeys) {\n const headerValue = headerData[headerKey];\n const th = createNode('th');\n\n th.id = 'cc__row-' + headerKey + sectionIndex;\n setAttribute(th, 'scope', 'col');\n addClassPm(th, 'table-th');\n\n th.innerHTML = headerValue;\n appendChild(trHeadFragment, th);\n }\n\n appendChild(trHead, trHeadFragment);\n appendChild(thead, trHead);\n\n /**\n * Create table body\n */\n const bodyFragment = globalObj._dom._document.createDocumentFragment();\n\n for (const bodyItem of cookieTableData.body) {\n const tr = createNode('tr', 'pm__table-tr');\n\n for (const tdKey of tableHeadersKeys) {\n const tdHeader = headerData[tdKey];\n const tdValue = bodyItem[tdKey];\n\n const td = createNode('td');\n const tdInner = createNode(DIV_TAG);\n\n addClassPm(td, 'table-td');\n setAttribute(td, 'data-column', tdHeader);\n setAttribute(td, 'headers', 'cc__row-' + tdKey + sectionIndex);\n\n tdInner.insertAdjacentHTML('beforeend', tdValue);\n\n appendChild(td, tdInner);\n appendChild(tr, td);\n }\n\n appendChild(bodyFragment, tr);\n }\n\n appendChild(tbody, bodyFragment);\n appendChild(table, thead);\n appendChild(table, tbody);\n\n return table;\n};\n\n/**\n * Strip html elements (and their content) and return the remaining text\n * @param {string} html\n * @returns {string}\n */\nconst getTextWithoutElements = (html) => {\n const template = createNode('template');\n template.innerHTML = html;\n\n let text = '';\n\n for (const node of template.content.childNodes)\n node.nodeType === Node.TEXT_NODE && (text += node.textContent);\n\n return text;\n};\n\n/**\n * Generate toggle\n * @param {string} label block title\n * @param {string} value category/service\n * @param {import('../global').Category} sCurrentCategoryObject\n * @param {boolean} [isService]\n * @param {string} categoryName\n */\nfunction createToggleLabel(label, value, sCurrentCategoryObject, isService, categoryName) {\n const state = globalObj._state;\n const dom = globalObj._dom;\n\n /** @type {HTMLLabelElement} */ const toggleLabel = createNode('label');\n /** @type {HTMLInputElement} */ const toggle = createNode('input');\n /** @type {HTMLSpanElement} */ const toggleIcon = createNode('span');\n /** @type {HTMLSpanElement} */ const toggleIconCircle = createNode('span');\n /** @type {HTMLSpanElement} */ const toggleLabelSpan = createNode('span');\n\n // each will contain 2 pseudo-elements to generate 'tick' and 'x' icons\n /** @type {HTMLSpanElement} */ const toggleOnIcon = createNode('span');\n /** @type {HTMLSpanElement} */ const toggleOffIcon = createNode('span');\n\n toggleOnIcon.innerHTML = getSvgIcon(1, 3);\n toggleOffIcon.innerHTML = getSvgIcon(0, 3);\n\n toggle.type = 'checkbox';\n\n addClass(toggleLabel, 'section__toggle-wrapper');\n addClass(toggle, 'section__toggle');\n addClass(toggleOnIcon, 'toggle__icon-on');\n addClass(toggleOffIcon, 'toggle__icon-off');\n addClass(toggleIcon, 'toggle__icon');\n addClass(toggleIconCircle, 'toggle__icon-circle');\n addClass(toggleLabelSpan, 'toggle__label');\n\n setAttribute(toggleIcon, ARIA_HIDDEN, 'true');\n\n if (isService) {\n addClass(toggleLabel, 'toggle-service');\n setAttribute(toggle, SCRIPT_TAG_SELECTOR, categoryName);\n toggle.name = 'cc-' + categoryName + '-' + value;\n\n // Save reference to toggles to avoid using document.querySelector later on\n dom._serviceCheckboxInputs[categoryName][value] = toggle;\n } else {\n toggle.name = 'cc-' + value;\n dom._categoryCheckboxInputs[value] = toggle;\n }\n\n if (!isService) {\n ((value)=> {\n addEvent(toggle, CLICK_EVENT, () => {\n const categoryServicesToggles = dom._serviceCheckboxInputs[value];\n const checked = toggle.checked;\n state._enabledServices[value] = [];\n\n /**\n * Enable/disable all services\n */\n for (let serviceName in categoryServicesToggles) {\n categoryServicesToggles[serviceName].checked = checked;\n checked && state._enabledServices[value].push(serviceName);\n }\n });\n })(value);\n } else {\n ((categoryName) => {\n addEvent(toggle, 'change', () => {\n const categoryServicesToggles = dom._serviceCheckboxInputs[categoryName];\n const categoryToggle = dom._categoryCheckboxInputs[categoryName];\n\n state._enabledServices[categoryName] = [];\n\n for (let serviceName in categoryServicesToggles) {\n const serviceInput = categoryServicesToggles[serviceName];\n\n if (serviceInput.checked) {\n state._enabledServices[categoryName].push(serviceInput.value);\n }\n }\n\n categoryToggle.checked = state._enabledServices[categoryName].length > 0;\n });\n })(categoryName);\n\n }\n\n toggle.value = value;\n toggleLabelSpan.textContent = getTextWithoutElements(label);\n\n appendChild(toggleIconCircle, toggleOffIcon);\n appendChild(toggleIconCircle, toggleOnIcon);\n appendChild(toggleIcon, toggleIconCircle);\n\n toggle.checked = isService\n ? isToggleChecked(categoryName, value, !state._invalidConsent)\n : isToggleChecked(value, '', !state._invalidConsent);\n\n /**\n * Set toggle as readonly if true (disable checkbox)\n */\n if (sCurrentCategoryObject.readOnly) {\n toggle.disabled = true;\n }\n\n appendChild(toggleLabel, toggle);\n appendChild(toggleLabel, toggleIcon);\n appendChild(toggleLabel, toggleLabelSpan);\n\n return toggleLabel;\n}","import { globalObj } from '../global';\n\nimport { addDataButtonListeners } from '../../utils/data-buttons';\nimport { debug } from '../../utils/debug';\nimport {\n addClass,\n addClassCm,\n addEvent,\n appendChild,\n createNode,\n removeClass,\n setAttribute\n} from '../../utils/dom';\nimport { fireEvent } from '../../utils/events';\nimport { getModalFocusableData, handleFocusTrap } from '../../utils/focus-trap';\nimport { getSvgIcon } from '../../utils/svg-icons';\n\nimport {\n CONSENT_MODAL_NAME,\n ARIA_HIDDEN,\n DIV_TAG,\n BUTTON_TAG,\n BTN_GROUP_CLASS,\n CLICK_EVENT,\n DATA_ROLE\n} from '../../utils/constants';\n\nimport { guiManager } from '../../utils/gui-manager';\nimport { createPreferencesModal } from './preferencesModal';\n\n/**\n * @callback CreateMainContainer\n */\n\n/**\n * @returns {HTMLSpanElement}\n */\nconst createFocusSpan = () => {\n const span = createNode('span');\n\n if (!globalObj._dom._focusSpan)\n globalObj._dom._focusSpan = span;\n\n return span;\n};\n\n/**\n * Create consent modal and append it to \"cc-main\" el.\n * @param {import(\"../global\").Api} api\n * @param {CreateMainContainer} createMainContainer\n */\nexport const createConsentModal = (api, createMainContainer) => {\n const state = globalObj._state;\n const dom = globalObj._dom;\n const {hide, showPreferences, acceptCategory} = api;\n\n /**\n * @type {import(\"../global\").ConsentModalOptions}\n */\n const consentModalData = state._currentTranslation && state._currentTranslation.consentModal;\n\n if (!consentModalData)\n return;\n\n const acceptAllBtnData = consentModalData.acceptAllBtn,\n acceptNecessaryBtnData = consentModalData.acceptNecessaryBtn,\n showPreferencesBtnData = consentModalData.showPreferencesBtn,\n closeIconLabelData = consentModalData.closeIconLabel,\n footerData = consentModalData.footer,\n consentModalLabelValue = consentModalData.label,\n consentModalTitleValue = consentModalData.title;\n\n /**\n * @param {string|string[]} [categories]\n */\n const acceptAndHide = (categories) => {\n hide();\n acceptCategory(categories);\n };\n\n // Create modal if it doesn't exist\n if (!dom._cmContainer) {\n dom._cmContainer = createNode(DIV_TAG);\n dom._cm = createNode(DIV_TAG);\n dom._cmBody = createNode(DIV_TAG);\n dom._cmTexts = createNode(DIV_TAG);\n dom._cmBtns = createNode(DIV_TAG);\n\n addClass(dom._cmContainer, 'cm-wrapper');\n addClass(dom._cm, 'cm');\n addClassCm(dom._cmBody, 'body');\n addClassCm(dom._cmTexts, 'texts');\n addClassCm(dom._cmBtns, 'btns');\n\n setAttribute(dom._cm, ARIA_HIDDEN, 'true');\n\n if (state._disablePageInteraction) {\n setAttribute(dom._cm, 'role', 'dialog');\n setAttribute(dom._cm, 'aria-modal', 'true');\n } else {\n setAttribute(dom._cm, 'role', 'region');\n }\n\n if (!consentModalLabelValue && consentModalTitleValue) {\n setAttribute(dom._cm, 'aria-labelledby', 'cm__title');\n setAttribute(dom._cm, 'aria-describedby', 'cm__desc');\n }\n const\n boxLayout = 'box',\n guiOptions = state._userConfig.guiOptions,\n consentModalOptions = guiOptions && guiOptions.consentModal,\n consentModalLayout = consentModalOptions && consentModalOptions.layout || boxLayout,\n isBoxLayout = consentModalLayout.split(' ')[0] === boxLayout;\n\n /**\n * Close icon-button (visible only in the 'box' layout)\n */\n if (consentModalTitleValue && closeIconLabelData && isBoxLayout) {\n if (!dom._cmCloseIconBtn) {\n dom._cmCloseIconBtn = createNode(BUTTON_TAG);\n dom._cmCloseIconBtn.innerHTML = getSvgIcon();\n addClassCm(dom._cmCloseIconBtn, 'btn');\n addClassCm(dom._cmCloseIconBtn, 'btn--close');\n addEvent(dom._cmCloseIconBtn, CLICK_EVENT, () => {\n debug('CookieConsent [ACCEPT]: necessary');\n acceptAndHide([]);\n });\n appendChild(dom._cmBody, dom._cmCloseIconBtn);\n }\n }\n\n appendChild(dom._cmBody, dom._cmTexts);\n\n appendChild(dom._cm, dom._cmBody);\n appendChild(dom._cmContainer, dom._cm);\n\n dom._cmDivTabindex = dom._cm;\n setAttribute(dom._cmDivTabindex, 'tabIndex', -1);\n }\n\n consentModalLabelValue && setAttribute(dom._cm, 'aria-label', consentModalLabelValue);\n\n if (dom._cmCloseIconBtn && closeIconLabelData)\n setAttribute(dom._cmCloseIconBtn, 'aria-label', closeIconLabelData);\n\n if (consentModalTitleValue) {\n if (!dom._cmTitle) {\n dom._cmTitle = createNode('h2');\n dom._cmTitle.className = dom._cmTitle.id = 'cm__title';\n appendChild(dom._cmTexts, dom._cmTitle);\n }\n\n dom._cmTitle.innerHTML = consentModalTitleValue;\n }\n\n let description = consentModalData.description;\n\n if (description) {\n if (state._revisionEnabled) {\n description = description.replace(\n '{{revisionMessage}}',\n state._validRevision\n ? ''\n : consentModalData.revisionMessage || ''\n );\n }\n\n if (!dom._cmDescription) {\n dom._cmDescription = createNode('p');\n dom._cmDescription.className = dom._cmDescription.id = 'cm__desc';\n appendChild(dom._cmTexts, dom._cmDescription);\n }\n\n dom._cmDescription.innerHTML = description;\n }\n\n if (acceptAllBtnData) {\n if (!dom._cmAcceptAllBtn) {\n dom._cmAcceptAllBtn = createNode(BUTTON_TAG);\n appendChild(dom._cmAcceptAllBtn, createFocusSpan());\n addClassCm(dom._cmAcceptAllBtn, 'btn');\n setAttribute(dom._cmAcceptAllBtn, DATA_ROLE, 'all');\n\n addEvent(dom._cmAcceptAllBtn, CLICK_EVENT, () => {\n debug('CookieConsent [ACCEPT]: all');\n acceptAndHide('all');\n });\n }\n\n dom._cmAcceptAllBtn.firstElementChild.innerHTML = acceptAllBtnData;\n }\n\n if (acceptNecessaryBtnData) {\n if (!dom._cmAcceptNecessaryBtn) {\n dom._cmAcceptNecessaryBtn = createNode(BUTTON_TAG);\n appendChild(dom._cmAcceptNecessaryBtn, createFocusSpan());\n addClassCm(dom._cmAcceptNecessaryBtn, 'btn');\n setAttribute(dom._cmAcceptNecessaryBtn, DATA_ROLE, 'necessary');\n\n addEvent(dom._cmAcceptNecessaryBtn, CLICK_EVENT, () => {\n debug('CookieConsent [ACCEPT]: necessary');\n acceptAndHide([]);\n });\n }\n\n dom._cmAcceptNecessaryBtn.firstElementChild.innerHTML = acceptNecessaryBtnData;\n }\n\n if (showPreferencesBtnData) {\n if (!dom._cmShowPreferencesBtn) {\n dom._cmShowPreferencesBtn = createNode(BUTTON_TAG);\n appendChild(dom._cmShowPreferencesBtn, createFocusSpan());\n addClassCm(dom._cmShowPreferencesBtn, 'btn');\n addClassCm(dom._cmShowPreferencesBtn, 'btn--secondary');\n setAttribute(dom._cmShowPreferencesBtn, DATA_ROLE, 'show');\n setAttribute(dom._cmShowPreferencesBtn, 'aria-haspopup', 'dialog');\n\n addEvent(dom._cmShowPreferencesBtn, 'mouseenter', () => {\n if (!state._preferencesModalExists)\n createPreferencesModal(api, createMainContainer);\n });\n addEvent(dom._cmShowPreferencesBtn, CLICK_EVENT, showPreferences);\n }\n\n dom._cmShowPreferencesBtn.firstElementChild.innerHTML = showPreferencesBtnData;\n }\n\n if (!dom._cmBtnGroup) {\n dom._cmBtnGroup = createNode(DIV_TAG, 'cm__' + BTN_GROUP_CLASS);\n appendChild(dom._cmBtns, dom._cmBtnGroup);\n }\n\n dom._cmAcceptAllBtn && appendChild(dom._cmBtnGroup, dom._cmAcceptAllBtn);\n dom._cmAcceptNecessaryBtn && appendChild(dom._cmBtnGroup, dom._cmAcceptNecessaryBtn);\n\n if (dom._cmShowPreferencesBtn) {\n if (!dom._cmAcceptNecessaryBtn || !dom._cmAcceptAllBtn) {\n appendChild(dom._cmBtnGroup, dom._cmShowPreferencesBtn);\n addClassCm(dom._cmBtnGroup, BTN_GROUP_CLASS + '--uneven');\n } else {\n if (!dom._cmBtnGroup2) {\n dom._cmBtnGroup2 = createNode(DIV_TAG, 'cm__' + BTN_GROUP_CLASS);\n appendChild(dom._cmBtns, dom._cmBtnGroup2);\n }\n\n removeClass(dom._cmBtnGroup, 'cm__' + BTN_GROUP_CLASS + '--uneven');\n appendChild(dom._cmBtnGroup2, dom._cmShowPreferencesBtn);\n }\n }\n\n if (dom._cmAcceptAllBtn || dom._cmAcceptNecessaryBtn || dom._cmShowPreferencesBtn)\n appendChild(dom._cmBody, dom._cmBtns);\n\n if (footerData) {\n if (!dom._cmFooterLinksGroup) {\n let _consentModalFooter = createNode(DIV_TAG);\n let _consentModalFooterLinks = createNode(DIV_TAG);\n dom._cmFooterLinksGroup = createNode(DIV_TAG);\n\n addClassCm(_consentModalFooter, 'footer');\n addClassCm(_consentModalFooterLinks, 'links');\n addClassCm(dom._cmFooterLinksGroup, 'link-group');\n\n appendChild(_consentModalFooterLinks, dom._cmFooterLinksGroup);\n appendChild(_consentModalFooter, _consentModalFooterLinks);\n appendChild(dom._cm, _consentModalFooter);\n }\n\n dom._cmFooterLinksGroup.innerHTML = footerData;\n }\n\n guiManager(0);\n\n if (!state._consentModalExists) {\n state._consentModalExists = true;\n\n debug('CookieConsent [HTML] created', CONSENT_MODAL_NAME);\n\n fireEvent(globalObj._customEvents._onModalReady, CONSENT_MODAL_NAME, dom._cm);\n createMainContainer();\n appendChild(dom._ccMain, dom._cmContainer);\n handleFocusTrap(dom._cm);\n }\n\n getModalFocusableData(1);\n\n addDataButtonListeners(dom._cmBody, api, createPreferencesModal, createMainContainer);\n};\n","import { globalObj } from '../core/global';\nimport { elContains } from './collections';\nimport { debug } from './debug';\nimport { addClass, removeClass } from './dom';\nimport { isArray, isFunction, isString } from './type-guards';\n\n/**\n * Detect the available language. The language autodetection process prioritizes finding translations\n * for the complete language code. If translations for the complete code are unavailable, the detection\n * mechanism then resorts to searching for the language-only version.\n * Works with 'en', 'en_US' and 'en-US'.\n *\n * @param {string} languageCode - The language code to be detected.\n * @returns {?string} The detected language code, or null if not detected.\n */\nexport const getAvailableLanguage = (languageCode) => {\n if (!isString(languageCode))\n return null;\n\n const translations = globalObj._state._allTranslations;\n const hasTranslation = (code) => Object.prototype.hasOwnProperty.call(translations, code);\n\n if (hasTranslation(languageCode))\n return languageCode;\n\n /**\n * @type {string}\n */\n let language = languageCode.slice(0, 2);\n\n if (hasTranslation(language))\n return language;\n\n return null;\n};\n\n/**\n * Returns the current language code\n * @returns {string}\n */\nexport const getCurrentLanguageCode = () => {\n return globalObj._state._currentLanguageCode || globalObj._state._userConfig.language.default;\n};\n\n/**\n * Set language code\n * @param {string} newLanguageCode\n */\nexport const setCurrentLanguageCode = (newLanguageCode) => {\n newLanguageCode && (globalObj._state._currentLanguageCode = newLanguageCode);\n};\n\n/**\n * Get current client's browser language\n * returns only the first 2 chars: en-US => en\n * @returns {string} language\n */\nexport const getBrowserLanguageCode = () => navigator.language;\n\n/**\n * Get the user's preferred languages, in order of preference\n * @returns {readonly string[]}\n */\nexport const getBrowserLanguageCodes = () => navigator.languages && navigator.languages.length\n ? navigator.languages\n : [getBrowserLanguageCode()];\n\n/**\n * Get the lang attribute\n * @returns lang attribute\n */\nexport const getDocumentLanguageCode = () => document.documentElement.lang;\n\n/**\n * Resolve the language to use.\n * @returns {string} language code\n */\nexport const resolveCurrentLanguageCode = () => {\n const autoDetect = globalObj._state._userConfig.language.autoDetect;\n\n if (autoDetect) {\n debug('CookieConsent [LANG]: autoDetect strategy: \"' + autoDetect + '\"');\n\n const detectionStrategies = {\n browser: getBrowserLanguageCodes(),\n document: [getDocumentLanguageCode()]\n };\n\n const languageCodes = detectionStrategies[autoDetect];\n\n if (isArray(languageCodes)) {\n for (const languageCode of languageCodes) {\n const newLanguageCode = getAvailableLanguage(languageCode);\n\n if (newLanguageCode)\n return newLanguageCode;\n }\n }\n }\n\n /**\n * Use current language\n */\n return getCurrentLanguageCode();\n};\n\n/**\n * Load translation\n * @param {string | null} [desiredLanguageCode]\n */\nexport const loadTranslationData = async (desiredLanguageCode) => {\n const state = globalObj._state;\n\n /**\n * @type {string}\n */\n let currentLanguageCode = getAvailableLanguage(desiredLanguageCode) ?? getCurrentLanguageCode();\n\n let translationData = state._allTranslations[currentLanguageCode];\n\n /**\n * Fetch translation if a string or function is provided\n */\n if (isString(translationData)) {\n translationData = await fetchJson(translationData);\n } else if (isFunction(translationData)) {\n translationData = await translationData();\n }\n\n if (!translationData) {\n throw `Could not load translation for the '${currentLanguageCode}' language`;\n }\n\n state._currentTranslation = translationData;\n setCurrentLanguageCode(currentLanguageCode);\n\n debug('CookieConsent [LANG]: set language: \"' + currentLanguageCode + '\"');\n\n return true;\n};\n\n/**\n * Toggle RTL class on/off based on current language\n */\nexport const handleRtlLanguage = () => {\n let rtlLanguages = globalObj._state._userConfig.language.rtl;\n let ccMain = globalObj._dom._ccMain;\n\n if (rtlLanguages && ccMain) {\n if (!isArray(rtlLanguages))\n rtlLanguages = [rtlLanguages];\n\n elContains(rtlLanguages, globalObj._state._currentLanguageCode)\n ? addClass(ccMain, 'cc--rtl')\n : removeClass(ccMain, 'cc--rtl');\n }\n};\n\n/**\n * Used to fetch external language files (.json)\n * @param {string} url\n * @returns {Promise<import('../core/global').Translation | boolean>}\n */\nexport const fetchJson = async (url) => {\n try {\n const response = await fetch(url);\n return response.ok && await response.json();\n } catch (e) {\n console.error(e);\n return false;\n }\n};\n","import { globalObj } from '../global';\nimport { addDataButtonListeners } from '../../utils/data-buttons';\nimport { createNode } from '../../utils/dom';\nimport { createConsentModal } from './consentModal';\nimport { createPreferencesModal } from './preferencesModal';\nimport { DIV_TAG } from '../../utils/constants';\nimport { handleRtlLanguage } from '../../utils/language';\n\nexport const createMainContainer = () => {\n const dom = globalObj._dom;\n\n if (dom._ccMain) return;\n\n dom._ccMain = createNode(DIV_TAG);\n dom._ccMain.id = 'cc-main';\n dom._ccMain.setAttribute('data-nosnippet', '');\n\n handleRtlLanguage();\n\n // Append main container to dom\n (dom._rootEl || dom._document.body || dom._htmlDom).appendChild(dom._ccMain);\n};\n\n/**\n * @param {import('../global').Api} api\n */\nexport const generateHtml = (api) => {\n addDataButtonListeners(null, api, createPreferencesModal, createMainContainer);\n\n if (globalObj._state._invalidConsent && !globalObj._config.lazyHtmlGeneration)\n createConsentModal(api, createMainContainer);\n\n if (!globalObj._config.lazyHtmlGeneration)\n createPreferencesModal(api, createMainContainer);\n};\n\nexport * from './consentModal';\nexport * from './preferencesModal';\n","/**\n * @param {CallableFunction} fn\n */\nexport const safeRun = (fn, hideError) => {\n try {\n return fn();\n } catch (e) {\n !hideError && console.warn('CookieConsent:', e);\n return false;\n }\n};\n","import { safeRun } from './safe-run';\n\nexport const localStorageManager = {\n /**\n * @param {string} key\n * @param {string} value\n */\n _setItem: (key, value) => {\n safeRun(() => localStorage.setItem(key, value));\n },\n\n /**\n * @param {string} key\n */\n _getItem: (key) => safeRun(() => localStorage.getItem(key)) || '',\n\n /**\n * @param {string} key\n */\n _removeItem: (key) => safeRun(() => localStorage.removeItem(key))\n};","import { globalObj } from '../core/global';\nimport { OPT_OUT_MODE, OPT_IN_MODE } from './constants';\nimport { manageExistingScripts } from './scripts';\n\nimport { syncModalToggles } from './categories';\nimport {\n arrayDiff,\n deepCopy,\n elContains,\n indexOf\n} from './collections';\nimport { debug } from './debug';\nimport { fireEvent } from './events';\nimport { safeRun } from './safe-run';\nimport { isFunction, isObject } from './type-guards';\nimport { localStorageManager } from './localstorage';\nimport { afterPaint } from './dom';\n\n/**\n * @param {boolean} [isFirstConsent]\n */\nconst getCategoriesWithCookies = (isFirstConsent) => {\n const state = globalObj._state;\n\n const categoriesToFilter = isFirstConsent\n ? state._allCategoryNames\n : state._lastChangedCategoryNames;\n\n /**\n * Filter out categories with readOnly=true or don't have an autoClear object\n */\n return categoriesToFilter.filter(categoryName => {\n const currentCategoryObject = state._allDefinedCategories[categoryName];\n\n return !!currentCategoryObject\n && !currentCategoryObject.readOnly\n && !!currentCategoryObject.autoClear;\n });\n};\n\n/**\n * @param {string[]} allCookies\n * @param {string} cookieName\n */\nconst findMatchingCookies = (allCookies, cookieName) => {\n if (cookieName instanceof RegExp) {\n return allCookies.filter(cookie => cookieName.test(cookie));\n } else {\n const cookieIndex = indexOf(allCookies, cookieName);\n return cookieIndex > -1\n ? [allCookies[cookieIndex]]\n : [];\n }\n};\n\n/**\n * Delete all unused cookies\n * @param {boolean} [isFirstConsent]\n */\nexport const autoclearCookiesHelper = (isFirstConsent) => {\n const state = globalObj._state;\n const allCookiesArray = getAllCookies();\n const categoriesToClear = getCategoriesWithCookies(isFirstConsent);\n\n /**\n * Clear cookies for each disabled service\n */\n for (const categoryName in state._lastChangedServices) {\n for (const serviceName of state._lastChangedServices[categoryName]) {\n const service = state._allDefinedServices[categoryName][serviceName];\n const serviceCookies = service && service.cookies;\n const serviceIsDisabled = !elContains(state._acceptedServices[categoryName], serviceName);\n\n if (!serviceIsDisabled || !serviceCookies)\n continue;\n\n for (const cookieItem of serviceCookies) {\n const foundCookies = findMatchingCookies(allCookiesArray, cookieItem.name);\n eraseCookiesHelper(foundCookies, cookieItem.path, cookieItem.domain);\n }\n }\n }\n\n for (const currentCategoryName of categoriesToClear) {\n const category = state._allDefinedCategories[currentCategoryName];\n const autoClear = category.autoClear;\n const autoClearCookies = autoClear && autoClear.cookies || [];\n\n const categoryWasJustChanged = elContains(state._lastChangedCategoryNames, currentCategoryName);\n const categoryIsDisabled = !elContains(state._acceptedCategories, currentCategoryName);\n const categoryWasJustDisabled = categoryWasJustChanged && categoryIsDisabled;\n\n const shouldClearCookies = isFirstConsent\n ? categoryIsDisabled\n : categoryWasJustDisabled;\n\n if (!shouldClearCookies)\n continue;\n\n if (autoClear.reloadPage && categoryWasJustDisabled)\n state._reloadPage = true;\n\n for (const cookieItem of autoClearCookies) {\n const foundCookies = findMatchingCookies(allCookiesArray, cookieItem.name);\n eraseCookiesHelper(foundCookies, cookieItem.path, cookieItem.domain);\n }\n }\n};\n\n/**\n * @param {boolean} [afterNextPaint] run scripts and callbacks after the next paint\n */\nexport const saveCookiePreferences = (afterNextPaint) => {\n const state = globalObj._state;\n\n /**\n * Determine if categories were changed from last state (saved in the cookie)\n */\n state._lastChangedCategoryNames = globalObj._config.mode === OPT_OUT_MODE && state._invalidConsent\n ? arrayDiff(state._defaultEnabledCategories, state._acceptedCategories)\n : arrayDiff(state._acceptedCategories, state._savedCookieContent.categories);\n\n let categoriesWereChanged = state._lastChangedCategoryNames.length > 0;\n let servicesWereChanged = false;\n\n /**\n * Determine if services were changed from last state\n */\n for (const categoryName of state._allCategoryNames) {\n state._lastChangedServices[categoryName] = arrayDiff(\n state._acceptedServices[categoryName],\n state._lastEnabledServices[categoryName]\n );\n\n if (state._lastChangedServices[categoryName].length > 0)\n servicesWereChanged = true;\n }\n\n //{{START: GUI}}\n syncModalToggles(true);\n //{{END: GUI}}\n\n if (!state._consentTimestamp)\n state._consentTimestamp = new Date();\n\n if (!state._consentId)\n state._consentId = uuidv4();\n\n state._savedCookieContent = {\n categories: deepCopy(state._acceptedCategories),\n revision: globalObj._config.revision,\n data: state._cookieData,\n consentTimestamp: state._consentTimestamp.toISOString(),\n consentId: state._consentId,\n services: deepCopy(state._acceptedServices),\n languageCode: globalObj._state._currentLanguageCode\n };\n\n if (state._lastConsentTimestamp) {\n state._savedCookieContent.lastConsentTimestamp = state._lastConsentTimestamp.toISOString();\n }\n\n let isFirstConsent = false;\n const stateChanged = categoriesWereChanged || servicesWereChanged;\n\n if (state._invalidConsent || stateChanged) {\n /**\n * Set consent as valid\n */\n if (state._invalidConsent) {\n state._invalidConsent = false;\n isFirstConsent = true;\n }\n\n state._lastConsentTimestamp = !state._lastConsentTimestamp\n ? state._consentTimestamp\n : new Date();\n\n state._savedCookieContent.lastConsentTimestamp = state._lastConsentTimestamp.toISOString();\n\n setCookie();\n\n const isAutoClearEnabled = globalObj._config.autoClearCookies;\n const shouldClearCookies = isFirstConsent || stateChanged;\n\n if (isAutoClearEnabled && shouldClearCookies)\n autoclearCookiesHelper(isFirstConsent);\n }\n\n afterNextPaint\n ? afterPaint(() => state === globalObj._state && runConsentEffects(isFirstConsent, stateChanged))\n : runConsentEffects(isFirstConsent, stateChanged);\n};\n\n/**\n * Enable/disable scripts, fire the consent callbacks and reload the page if needed\n * @param {boolean} isFirstConsent\n * @param {boolean} stateChanged\n */\nconst runConsentEffects = (isFirstConsent, stateChanged) => {\n const state = globalObj._state;\n\n if (isFirstConsent || stateChanged)\n manageExistingScripts();\n\n if (isFirstConsent) {\n fireEvent(globalObj._customEvents._onFirstConsent);\n fireEvent(globalObj._customEvents._onConsent);\n\n // Nothing ran before the first consent, so there is nothing to reload\n if (globalObj._config.mode === OPT_IN_MODE) {\n state._reloadPage = false;\n return;\n }\n }\n\n if (stateChanged)\n fireEvent(globalObj._customEvents._onChange);\n\n /**\n * Reload page if needed\n */\n if (state._reloadPage) {\n state._reloadPage = false;\n location.reload();\n }\n};\n\n/**\n * Set plugin's cookie\n * @param {boolean} [useRemainingExpirationTime]\n */\nexport const setCookie = (useRemainingExpirationTime) => {\n const { hostname, protocol } = location;\n const { name, path, domain, sameSite, useLocalStorage, secure } = globalObj._config.cookie;\n\n const expiresAfterMs = useRemainingExpirationTime\n ? getRemainingExpirationTimeMS()\n : getExpiresAfterDaysValue()*86400000;\n\n /**\n * Expiration date\n */\n const date = new Date();\n date.setTime(date.getTime() + expiresAfterMs);\n\n /**\n * Store the expiration date in the cookie (in case localstorage is used)\n */\n\n globalObj._state._savedCookieContent.expirationTime = date.getTime();\n\n const value = JSON.stringify(globalObj._state._savedCookieContent);\n\n /**\n * Encode value (RFC compliant)\n */\n const cookieValue = encodeURIComponent(value);\n\n let cookieStr = name + '='\n + cookieValue\n + (expiresAfterMs !== 0 ? '; expires=' + date.toUTCString() : '')\n + '; Path=' + path\n + '; SameSite=' + sameSite;\n\n /**\n * Set \"domain\" only if hostname contains a dot (e.g domain.com)\n * to ensure that cookie works with 'localhost'.\n * A falsy domain leaves it out (cookie not shared with subdomains)\n */\n if (domain && elContains(hostname, '.'))\n cookieStr += '; Domain=' + domain;\n\n if (secure && protocol === 'https:')\n cookieStr += '; Secure';\n\n useLocalStorage\n ? localStorageManager._setItem(name, value)\n : document.cookie = cookieStr;\n\n debug('CookieConsent [SET_COOKIE]: ' + name + ':', globalObj._state._savedCookieContent);\n};\n\n/**\n * Parse cookie value using JSON.parse\n * @param {string} value\n */\nexport const parseCookie = (value, skipDecode) => {\n /**\n * @type {import('../../types').CookieValue}\n */\n let parsedValue;\n\n parsedValue = safeRun(() => JSON.parse(skipDecode\n ? value\n : decodeURIComponent(value)\n ), true);\n\n return isObject(parsedValue) ? parsedValue : {};\n};\n\n/**\n * Delete cookie by name & path\n * @param {string[]} cookies Array of cookie names\n * @param {string} [customPath]\n * @param {string} [customDomain]\n */\nexport const eraseCookiesHelper = (cookies, customPath, customDomain) => {\n if (cookies.length === 0)\n return;\n\n const domain = customDomain || globalObj._config.cookie.domain || location.hostname;\n const path = customPath || globalObj._config.cookie.path;\n const isWwwSubdomain = domain.slice(0, 4) === 'www.';\n const mainDomain = isWwwSubdomain && domain.substring(4);\n\n /**\n * Helper function to erase cookie\n * @param {string} cookie\n * @param {string} [domain]\n */\n const erase = (cookie, domain) => {\n if (domain && domain.slice(0, 1) !== '.')\n domain = '.' + domain;\n document.cookie = cookie + '='\n + '; path=' + path\n + (domain ? '; domain=' + domain : '')\n + '; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\n };\n\n for (const cookieName of cookies) {\n erase(cookieName, customDomain);\n\n /**\n * If custom domain not specified,\n * also erase config domain\n */\n if (!customDomain) {\n erase(cookieName, domain);\n }\n\n /**\n * If domain starts with 'www.',\n * also erase the cookie for the\n * main domain (without www)\n */\n if (isWwwSubdomain)\n erase(cookieName, mainDomain);\n\n debug('CookieConsent [AUTOCLEAR]: deleting cookie: \"' + cookieName + '\" path: \"' + path + '\" domain:', domain);\n }\n};\n\n/**\n * Get plugin cookie\n * @param {string} [customName]\n */\nexport const getPluginCookie = (customName) => {\n const name = customName || globalObj._config.cookie.name;\n const useLocalStorage = globalObj._config.cookie.useLocalStorage;\n const valueStr = useLocalStorage\n ? localStorageManager._getItem(name)\n : getSingleCookie(name, true);\n return parseCookie(valueStr, useLocalStorage);\n};\n\n/**\n * Returns the cookie name/value, if it exists\n * @param {string} name\n * @param {boolean} getValue\n * @returns {string}\n */\nexport const getSingleCookie = (name, getValue) => {\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const found = document.cookie.match('(^|;)\\\\s*' + escapedName + '\\\\s*=\\\\s*([^;]+)');\n\n return found\n ? (getValue ? found.pop() : name)\n : '';\n};\n\n/**\n * Returns array with all the cookie names\n * @param {RegExp} regex\n * @returns {string[]}\n */\nexport const getAllCookies = (regex) => {\n const allCookies = document.cookie.split(/;\\s*/);\n\n /**\n * @type {string[]}\n */\n const cookieNames = [];\n\n /**\n * Save only the cookie names\n */\n for (const cookie of allCookies) {\n let name = cookie.split('=')[0];\n\n if (regex) {\n safeRun(() => {\n regex.test(name) && cookieNames.push(name);\n });\n } else {\n cookieNames.push(name);\n }\n }\n\n return cookieNames;\n};\n\n/**\n * Generate RFC4122-compliant UUIDs.\n * https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid?page=1&tab=votes#tab-top\n * @returns {string} unique uuid string\n */\nexport const uuidv4 = () => {\n return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, (c) => {\n return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16);\n });\n};\n\n/**\n * Calculate the existing cookie's remaining time until expiration (in milliseconds)\n */\nexport const getRemainingExpirationTimeMS = () => {\n const lastTimestamp = globalObj._state._lastConsentTimestamp;\n\n const elapsedTimeMilliseconds = lastTimestamp\n ? new Date() - lastTimestamp\n : 0;\n\n return getExpiresAfterDaysValue()*86400000 - elapsedTimeMilliseconds;\n};\n\n/**\n * Helper function to retrieve cookie duration\n * @returns {number}\n */\nexport const getExpiresAfterDaysValue = () => {\n const expiresAfterDays = globalObj._config.cookie.expiresAfterDays;\n\n return isFunction(expiresAfterDays)\n ? expiresAfterDays(globalObj._state._acceptType)\n : expiresAfterDays;\n};\n","import { globalObj } from './global';\nimport { fetchCategoriesAndServices } from '../utils/categories';\nimport { getKeys } from '../utils/collections';\nimport { debug } from '../utils/debug';\nimport { retrieveScriptElements } from '../utils/scripts';\nimport { isObject, isString } from '../utils/type-guards';\nimport { OPT_OUT_MODE } from '../utils/constants';\nimport { resolveCurrentLanguageCode, setCurrentLanguageCode } from '../utils/language';\n\n/**\n * Configure CookieConsent\n * @param {import(\"./global\").UserConfig} userConfig\n */\nexport const setConfig = (userConfig) => {\n const { _dom, _config, _state } = globalObj;\n\n const\n config = _config,\n state = _state,\n { cookie } = config,\n callbacks = globalObj._callbacks,\n userCookieConfig = userConfig.cookie,\n userCategories = userConfig.categories || {},\n allCategoryNames = getKeys(userCategories),\n nav = navigator,\n doc = document;\n\n /**\n * Access the 'window' and 'document' objects\n * during execution, rather than on import\n * (avoid window/document is not defined error)\n */\n _dom._document = doc;\n //{{START: GUI}}\n _dom._htmlDom = doc.documentElement;\n const _root = userConfig.root;\n _dom._rootEl = (_root && isString(_root) ? doc.querySelector(_root) : _root);\n //{{END: GUI}}\n cookie.domain = location.hostname;\n\n /**\n * Make user configuration globally available\n */\n state._userConfig = userConfig;\n state._allDefinedCategories = userCategories;\n state._allCategoryNames = allCategoryNames;\n\n //{{START: GUI}}\n state._allTranslations = userConfig.language.translations;\n state._disablePageInteraction = !!userConfig.disablePageInteraction;\n //{{END: GUI}}\n\n /**\n * Save references to callback functions\n */\n callbacks._onFirstConsent = userConfig.onFirstConsent;\n callbacks._onConsent = userConfig.onConsent;\n callbacks._onChange = userConfig.onChange;\n\n //{{START: GUI}}\n callbacks._onModalHide = userConfig.onModalHide;\n callbacks._onModalShow = userConfig.onModalShow;\n callbacks._onModalReady = userConfig.onModalReady;\n //{{END: GUI}}\n\n const {\n mode,\n //{{START: GUI}}\n autoShow,\n lazyHtmlGeneration,\n //{{END: GUI}}\n autoClearCookies,\n revision,\n manageScriptTags,\n hideFromBots,\n respectGpc\n } = userConfig;\n\n if (mode === OPT_OUT_MODE)\n config.mode = mode;\n\n if (typeof autoClearCookies === 'boolean')\n config.autoClearCookies = autoClearCookies;\n\n if (typeof manageScriptTags === 'boolean')\n config.manageScriptTags = manageScriptTags;\n\n if (typeof revision === 'number' && revision >= 0) {\n config.revision = revision;\n state._revisionEnabled = true;\n }\n\n //{{START: GUI}}\n\n if (typeof autoShow === 'boolean')\n config.autoShow = autoShow;\n\n if (typeof lazyHtmlGeneration === 'boolean')\n config.lazyHtmlGeneration = lazyHtmlGeneration;\n\n //{{END: GUI}}\n\n if (hideFromBots === false)\n config.hideFromBots = false;\n\n if (config.hideFromBots === true && nav)\n state._botAgentDetected = (nav.userAgent && /bot|crawl|spider|slurp|teoma/i.test(nav.userAgent)) || nav.webdriver;\n\n if (typeof respectGpc === 'boolean')\n config.respectGpc = respectGpc;\n\n if (isObject(userCookieConfig))\n config.cookie = {...cookie, ...userCookieConfig};\n\n debug('CookieConsent [CONFIG]: configuration:', userConfig);\n debug('CookieConsent [CONFIG]: autoClearCookies:', config.autoClearCookies);\n debug('CookieConsent [CONFIG]: revision enabled:', state._revisionEnabled);\n debug('CookieConsent [CONFIG]: manageScriptTags:', config.manageScriptTags);\n\n fetchCategoriesAndServices(allCategoryNames);\n retrieveScriptElements();\n\n //{{START: GUI}}\n setCurrentLanguageCode(resolveCurrentLanguageCode());\n //{{END: GUI}}\n};","import {\n getCurrentCategoriesState,\n isGpcOptOutActive,\n resolveEnabledCategories,\n resolveEnabledServices,\n getCurrentServicesState,\n setAcceptedCategories,\n syncModalToggles,\n updateModalToggles\n} from '../utils/categories';\nimport { deepCopy, elContains, getKeys } from '../utils/collections';\nimport { debug } from '../utils/debug';\nimport {\n addClass,\n appendChild,\n createNode,\n focus,\n getActiveElement,\n getAttribute,\n getStateClassElements,\n removeAttribute,\n removeClass,\n setAttribute,\n toggleDisableInteraction,\n toggleStateClass\n} from '../utils/dom';\nimport { fireEvent } from '../utils/events';\nimport { isArray, isObject, isString } from '../utils/type-guards';\n\nimport { manageExistingScripts, retrieveEnabledCategoriesAndServices } from '../utils/scripts';\n\nimport {\n globalObj,\n GlobalState\n} from './global';\n\n//{{START: GUI}}\n\nimport {\n createConsentModal,\n createPreferencesModal,\n generateHtml,\n createMainContainer\n} from './modals/index';\n\nimport {\n getCurrentLanguageCode,\n handleRtlLanguage,\n loadTranslationData,\n getAvailableLanguage\n} from '../utils/language';\n\n//{{END: GUI}}\n\nimport {\n setCookie,\n eraseCookiesHelper,\n saveCookiePreferences,\n getSingleCookie,\n getPluginCookie,\n getAllCookies\n} from '../utils/cookies';\n\nimport { setConfig } from './config-init';\n\nimport {\n TOGGLE_CONSENT_MODAL_CLASS,\n TOGGLE_DISABLE_INTERACTION_CLASS,\n TOGGLE_PREFERENCES_MODAL_CLASS,\n OPT_OUT_MODE,\n CONSENT_MODAL_NAME,\n ARIA_HIDDEN,\n PREFERENCES_MODAL_NAME\n} from '../utils/constants';\nimport { localStorageManager } from '../utils/localstorage';\n\n/**\n * @param {string[]|string} categories\n * @param {string[]} excludedCategories\n * @param {boolean} [afterNextPaint] run scripts and callbacks after the next paint\n */\nconst acceptAndSave = (categories, excludedCategories, afterNextPaint) => {\n resolveEnabledCategories(categories, excludedCategories);\n resolveEnabledServices();\n saveCookiePreferences(afterNextPaint);\n};\n\n/**\n * Accept API\n * @param {string[]|string} categories - Categories to accept\n * @param {string[]} [excludedCategories]\n */\nexport const acceptCategory = (categories, excludedCategories = []) => acceptAndSave(categories, excludedCategories);\n\n/**\n * True if the accepted categories/services apply:\n * the consent is valid, or the defaults are enabled (opt-out)\n */\nconst acceptedStateApplies = () => !globalObj._state._invalidConsent || globalObj._config.mode === OPT_OUT_MODE;\n\n/**\n * Returns true if cookie category is accepted\n * @param {string} category\n */\nexport const acceptedCategory = (category) => {\n\n const acceptedCategories = acceptedStateApplies()\n ? globalObj._state._acceptedCategories\n : [];\n\n return elContains(acceptedCategories, category);\n};\n\n/**\n * Accept one or multiple services under a specific category\n * @param {string|string[]} service\n * @param {string} category\n */\nexport const acceptService = (service, category) => {\n const { _allCategoryNames, _allDefinedServices, } = globalObj._state;\n\n if (\n !service\n || !category\n || !isString(category)\n || !elContains(_allCategoryNames, category)\n || getKeys(_allDefinedServices[category]).length === 0\n ) {\n return false;\n }\n\n updateModalToggles(service, category);\n acceptCategory();\n};\n\n/**\n * Returns true if the service in the specified\n * category is accepted/enabled\n * @param {string} service\n * @param {string} category\n */\nexport const acceptedService = (service, category) => {\n const acceptedServices = acceptedStateApplies()\n ? (globalObj._state._acceptedServices[category] || [])\n : [];\n\n return elContains(acceptedServices, service);\n};\n\n/**\n * Returns true if cookie was found and has valid value (not an empty string)\n * @param {string} cookieName\n */\nexport const validCookie = (cookieName) => getSingleCookie(cookieName, true) !== '';\n\n/**\n * Erase cookies API\n * @param {(string|RegExp|(string|RegExp)[])} cookies\n * @param {string} [path]\n * @param {string} [domain]\n */\nexport const eraseCookies = (cookies, path, domain) => {\n let allCookies = [];\n\n /**\n * Add cookie to allCookies array if it exists\n * @param {string | RegExp} cookieName\n */\n const addCookieIfExists = (cookieName) => {\n if (isString(cookieName)) {\n let name = getSingleCookie(cookieName);\n name !== '' && allCookies.push(name);\n } else {\n allCookies.push(...getAllCookies(cookieName));\n }\n };\n\n if (isArray(cookies)) {\n for (let cookie of cookies) {\n addCookieIfExists(cookie);\n }\n } else {\n addCookieIfExists(cookies);\n }\n\n eraseCookiesHelper(allCookies, path, domain);\n};\n\n//{{START: GUI}}\n\n/**\n * Show cookie consent modal\n * @param {boolean} [createModal] create modal if it doesn't exist\n */\nexport const show = (createModal) => {\n const { _dom, _state } = globalObj;\n\n if (_state._consentModalVisible)\n return;\n\n if (!_state._consentModalExists && (createModal || _state._invalidConsent))\n createConsentModal(miniAPI, createMainContainer);\n\n if (!_state._consentModalExists)\n return;\n\n _state._consentModalVisible = true;\n _state._lastFocusedElemBeforeModal = getActiveElement();\n\n if (_state._disablePageInteraction)\n toggleDisableInteraction(true);\n\n toggleStateClass(TOGGLE_CONSENT_MODAL_CLASS, true);\n removeAttribute(_dom._cm, ARIA_HIDDEN);\n /**\n * Set focus to consentModal and enable transition\n */\n setTimeout(() => {\n addClass(_dom._cmContainer, 'cc--anim');\n }, 100);\n setTimeout(() => {\n focus(_dom._cmDivTabindex, false, true);\n }, 200);\n\n debug('CookieConsent [TOGGLE]: show consentModal');\n\n fireEvent(globalObj._customEvents._onModalShow, CONSENT_MODAL_NAME);\n};\n\n/**\n * Hide consent modal\n */\nexport const hide = () => {\n const { _dom, _state, _customEvents } = globalObj;\n\n if (!_state._consentModalVisible)\n return;\n\n _state._consentModalVisible = false;\n\n if (_state._disablePageInteraction)\n toggleDisableInteraction();\n\n /**\n * Fix focus restoration to body with Chrome\n */\n focus(_dom._focusSpan, true, true);\n\n toggleStateClass(TOGGLE_CONSENT_MODAL_CLASS);\n setAttribute(_dom._cm, ARIA_HIDDEN, 'true');\n\n /**\n * Restore focus to last focused element\n */\n focus(_state._lastFocusedElemBeforeModal);\n _state._lastFocusedElemBeforeModal = null;\n\n /**\n * Remove transition class after it executed\n */\n setTimeout(() => removeClass(_dom._cmContainer, 'cc--anim'), 100);\n\n debug('CookieConsent [TOGGLE]: hide consentModal');\n\n fireEvent(_customEvents._onModalHide, CONSENT_MODAL_NAME);\n};\n\n/**\n * Show preferences modal\n */\nexport const showPreferences = () => {\n const { _dom, _state: state } = globalObj;\n\n if (state._preferencesModalVisible)\n return;\n\n if (!state._preferencesModalExists)\n createPreferencesModal(miniAPI, createMainContainer);\n\n if (!state._preferencesModalExists)\n return;\n\n state._preferencesModalVisible = true;\n\n // If there is no consent-modal, keep track of the last focused elem.\n if (!state._consentModalVisible) {\n state._lastFocusedElemBeforeModal = getActiveElement();\n } else {\n state._lastFocusedModalElement = getActiveElement();\n }\n\n toggleStateClass(TOGGLE_PREFERENCES_MODAL_CLASS, true);\n removeAttribute(_dom._pm, ARIA_HIDDEN);\n\n /**\n * Set focus to preferencesModal\n */\n setTimeout(() => {\n focus(_dom._pmDivTabindex, false, true);\n }, 200);\n\n debug('CookieConsent [TOGGLE]: show preferencesModal');\n\n fireEvent(globalObj._customEvents._onModalShow, PREFERENCES_MODAL_NAME);\n};\n\n/**\n * https://github.com/orestbida/cookieconsent/issues/481\n */\nconst discardUnsavedPreferences = () => syncModalToggles(validConsent());\n\n/**\n * Hide preferences modal\n */\nexport const hidePreferences = () => {\n const state = globalObj._state;\n\n if (!state._preferencesModalVisible)\n return;\n\n state._preferencesModalVisible = false;\n\n discardUnsavedPreferences();\n\n /**\n * Fix focus restoration to body with Chrome\n */\n focus(globalObj._dom._pmFocusSpan, true, true);\n\n toggleStateClass(TOGGLE_PREFERENCES_MODAL_CLASS);\n setAttribute(globalObj._dom._pm, ARIA_HIDDEN, 'true');\n\n /**\n * If consent modal is visible, focus him (instead of page document)\n */\n if (state._consentModalVisible) {\n focus(state._lastFocusedModalElement, false, true);\n state._lastFocusedModalElement = null;\n } else {\n /**\n * Restore focus to last page element which had focus before modal opening\n */\n focus(state._lastFocusedElemBeforeModal);\n state._lastFocusedElemBeforeModal = null;\n }\n\n debug('CookieConsent [TOGGLE]: hide preferencesModal');\n\n fireEvent(globalObj._customEvents._onModalHide, PREFERENCES_MODAL_NAME);\n};\n\nconst miniAPI = {\n show,\n hide,\n showPreferences,\n hidePreferences,\n /**\n * Used by the modal buttons, so that scripts and\n * callbacks don't delay the click's response (INP)\n * @param {string[]|string} [categories]\n */\n acceptCategory: (categories) => acceptAndSave(categories, [], true)\n};\n\n/**\n * Update/change modal's language\n * @param {string} lang new language\n * @param {boolean} [forceUpdate] update language fields forcefully\n * @returns {Promise<boolean>}\n */\nexport const setLanguage = async (newLanguageCode, forceUpdate) => {\n if (!getAvailableLanguage(newLanguageCode))\n return false;\n\n const state = globalObj._state;\n\n /**\n * Set language only if it differs from current\n */\n if (newLanguageCode !== getCurrentLanguageCode() || forceUpdate === true) {\n\n const loaded = await loadTranslationData(newLanguageCode);\n\n if (!loaded)\n return false;\n\n if (state._consentModalExists)\n createConsentModal(miniAPI, createMainContainer);\n\n if (state._preferencesModalExists) {\n // The new toggles show the saved state\n discardUnsavedPreferences();\n createPreferencesModal(miniAPI, createMainContainer);\n }\n\n handleRtlLanguage();\n\n return true;\n }\n\n return false;\n};\n\n//{{END: GUI}}\n\n/**\n * Retrieve current user preferences (summary)\n * @returns {import(\"./global\").UserPreferences}\n */\nexport const getUserPreferences = () => {\n const { accepted, rejected } = getCurrentCategoriesState();\n const services = getCurrentServicesState();\n\n return deepCopy({\n acceptType: globalObj._state._acceptType,\n acceptedCategories: accepted,\n rejectedCategories: rejected,\n acceptedServices: services.accepted,\n rejectedServices: services.rejected\n });\n};\n\n/**\n * Dynamically load script (append to head)\n * @param {string} src\n * @param {{[key: string]: string}} [attrs] Custom attributes\n * @returns {Promise<boolean>} promise\n */\nexport const loadScript = (src, attrs) => {\n /**\n * @type {HTMLScriptElement}\n */\n let script = [...document.scripts].find(el => getAttribute(el, 'src') === src);\n\n return new Promise((resolve) => {\n if (script)\n return resolve(true);\n\n script = createNode('script');\n\n /**\n * Add custom attributes\n */\n if (isObject(attrs)) {\n for (const key in attrs) {\n setAttribute(script, key, attrs[key]);\n }\n }\n\n script.onload = () => resolve(true);\n script.onerror = () => {\n /**\n * Remove script from dom if error is thrown\n */\n script.remove();\n resolve(false);\n };\n\n script.src = src;\n\n appendChild(document.head, script);\n });\n};\n\n/**\n * Save custom data inside cookie\n * @param {{\n * value: any,\n * mode: string\n * }} props\n * @returns {boolean}\n */\nexport const setCookieData = (props) => {\n let newData = props.value,\n mode = props.mode,\n set = false,\n cookieData;\n\n const state = globalObj._state;\n\n /**\n * If mode is 'update':\n * add/update only the specified props.\n */\n if (mode === 'update') {\n state._cookieData = cookieData = getCookie('data');\n const sameType = typeof cookieData === typeof newData;\n\n if (sameType && typeof cookieData === 'object') {\n !cookieData && (cookieData = {});\n\n for (let prop in newData) {\n if (cookieData[prop] !== newData[prop]) {\n cookieData[prop] = newData[prop];\n set = true;\n }\n }\n } else if ((sameType || !cookieData) && cookieData !== newData) {\n cookieData = newData;\n set = true;\n }\n } else {\n cookieData = newData;\n set = true;\n }\n\n if (set) {\n state._cookieData = cookieData;\n state._savedCookieContent.data = cookieData;\n setCookie(true);\n }\n\n return set;\n};\n\n/**\n * Retrieve data from existing cookie\n * @param {string} field\n * @param {string} [cookieName]\n * @returns {any}\n */\nexport const getCookie = (field, cookieName) => {\n const cookie = getPluginCookie(cookieName);\n\n return field\n ? cookie[field]\n : cookie;\n};\n\n/**\n * Return configuration object or just one of its fields.\n * @param {string} field\n * @returns {any}\n */\nexport const getConfig = (field) => {\n const config = globalObj._config;\n const userConfig = globalObj._state._userConfig;\n\n return field\n ? config[field] || userConfig[field]\n : {...config, ...userConfig, cookie:{...config.cookie}};\n};\n\n/**\n * Returns true if consent is valid\n * @returns {boolean}\n */\nexport const validConsent = () => !globalObj._state._invalidConsent;\n\n/**\n * Date from a value saved in the cookie, undefined if missing or invalid\n * @param {string} [value]\n * @returns {Date|undefined}\n */\nconst parseDate = (value) => {\n const date = value && new Date(value);\n return date && !isNaN(date) ? date : undefined;\n};\n\nconst retrieveState = () => {\n const state = globalObj._state;\n const config = globalObj._config;\n\n let cookieValue = getPluginCookie();\n\n /**\n * An expired localStorage item counts as no consent, like an expired cookie\n */\n if (config.cookie.useLocalStorage && new Date().getTime() > (cookieValue.expirationTime || 0)) {\n localStorageManager._removeItem(config.cookie.name);\n cookieValue = {};\n }\n\n const {\n categories,\n services,\n consentId,\n consentTimestamp,\n lastConsentTimestamp,\n data,\n revision\n } = cookieValue;\n\n const validCategories = isArray(categories);\n\n state._savedCookieContent = cookieValue;\n state._consentId = consentId;\n\n // If \"_consentId\" is present => assume that consent was previously given\n const validConsentId = !!consentId && isString(consentId);\n\n state._consentTimestamp = parseDate(consentTimestamp);\n state._lastConsentTimestamp = parseDate(lastConsentTimestamp);\n\n // Retrieve \"data\"\n state._cookieData = typeof data !== 'undefined'\n ? data\n : null;\n\n // If revision is enabled and current value !== saved value inside the cookie => revision is not valid\n if (state._revisionEnabled && validConsentId && revision !== config.revision)\n state._validRevision = false;\n\n state._invalidConsent = !validConsentId\n || !state._validRevision\n || !state._consentTimestamp\n || !state._lastConsentTimestamp\n || !validCategories;\n\n debug('CookieConsent [STATUS] valid consent:', !state._invalidConsent);\n retrieveEnabledCategoriesAndServices();\n\n /**\n * Retrieve last accepted categories from cookie\n * and calculate acceptType\n */\n if (!state._invalidConsent) {\n /**\n * Ignore categories and services that are no longer in the config;\n * readOnly categories always have all their services accepted\n */\n for (const categoryName of state._allCategoryNames) {\n const savedServices = services && services[categoryName];\n const definedServices = getKeys(state._allDefinedServices[categoryName]);\n\n if (elContains(state._readOnlyCategories, categoryName))\n state._acceptedServices[categoryName] = definedServices;\n else if (isArray(savedServices))\n state._acceptedServices[categoryName] = savedServices.filter(service => elContains(definedServices, service));\n else if (!elContains(categories, categoryName))\n state._acceptedServices[categoryName] = [];\n }\n\n state._enabledServices = {...state._acceptedServices};\n\n setAcceptedCategories([\n ...state._readOnlyCategories,\n ...categories.filter(category => elContains(state._allCategoryNames, category))\n ]);\n } else {\n if (config.mode === OPT_OUT_MODE) {\n state._acceptedCategories = [\n ...state._defaultEnabledCategories\n ];\n }\n }\n};\n\n/**\n * Will run once and only if modals do not exist.\n * @param {import(\"./global\").UserConfig} userConfig\n */\nexport const run = async (userConfig) => {\n const {\n _state,\n _config,\n _customEvents\n } = globalObj;\n\n const win = window;\n\n if (!win._ccRun) {\n win._ccRun = true;\n\n setConfig(userConfig);\n\n if (_state._botAgentDetected)\n return;\n\n retrieveState();\n\n const consentIsValid = validConsent();\n\n //{{START: GUI}}\n let translationError;\n\n // The scripts must run even if the translation can't be loaded\n const translationLoaded = await loadTranslationData().catch((error) => {\n translationError = error;\n });\n\n if (translationLoaded) {\n generateHtml(miniAPI);\n\n // The consent may have been given while the translation was loading\n if (_config.autoShow && !validConsent() && !isGpcOptOutActive())\n show(true);\n }\n //{{END: GUI}}\n\n if (consentIsValid) {\n manageExistingScripts();\n fireEvent(_customEvents._onConsent);\n } else if (_config.mode === OPT_OUT_MODE) {\n manageExistingScripts();\n }\n\n //{{START: GUI}}\n if (translationError)\n throw translationError;\n //{{END: GUI}}\n }\n};\n\n/**\n * Reset cookieconsent.\n * @param {boolean} [deleteCookie] Delete plugin's cookie\n */\nexport const reset = (deleteCookie) => {\n //{{START: GUI}}\n const { _ccMain } = globalObj._dom;\n //{{END: GUI}}\n\n const { name, path, domain, useLocalStorage } = globalObj._config.cookie;\n\n if (deleteCookie) {\n useLocalStorage\n ? localStorageManager._removeItem(name)\n : eraseCookies(name, path, domain);\n }\n\n /**\n * Remove data-cc event listeners\n */\n for (const {_element, _event, _listener} of globalObj._state._dataEventListeners) {\n _element.removeEventListener(_event, _listener);\n }\n\n //{{START: GUI}}\n /**\n * Remove main container from DOM\n */\n _ccMain && _ccMain.remove();\n\n /**\n * Remove any remaining classes\n */\n for (const el of getStateClassElements()) {\n el.classList.remove(\n TOGGLE_DISABLE_INTERACTION_CLASS,\n TOGGLE_PREFERENCES_MODAL_CLASS,\n TOGGLE_CONSENT_MODAL_CLASS\n );\n }\n //{{END: GUI}}\n\n const newGlobal = new GlobalState();\n\n /**\n * Reset all global state props.\n */\n for (const key in globalObj) {\n globalObj[key] = newGlobal[key];\n }\n\n window._ccRun = false;\n};\n","import type { CategoryDeclaration, GcmSignal, Texts } from './types';\n\nexport const DEFAULT_COOKIE_NAME = 'ec_consent';\nexport const DEFAULT_EXPIRY_DAYS = 182;\nexport const DEFAULT_GCM_EVENT = 'easy_cookie_update';\nexport const DEFAULT_WAIT_FOR_UPDATE = 500;\n\n/**\n * Well-known category ids. They match Iubenda's five purposes (1–5) so sites can\n * migrate without renaming, but any id is allowed.\n */\nexport const KNOWN_CATEGORIES: Record<\n string,\n { gcm: GcmSignal[]; color: string; title: Record<'it' | 'en', string>; description: Record<'it' | 'en', string> }\n> = {\n necessary: {\n gcm: ['security_storage'],\n color: 'var(--ec-c-necessary)',\n title: { it: 'Necessari', en: 'Necessary' },\n description: {\n it: 'Servono al funzionamento del sito, ad esempio per la sessione e per ricordare questa scelta. Non si possono disattivare.',\n en: 'Required for the site to work, for example the session and remembering this choice. They cannot be turned off.',\n },\n },\n functionality: {\n gcm: ['functionality_storage'],\n color: 'var(--ec-c-functionality)',\n title: { it: 'Funzionalità', en: 'Functionality' },\n description: {\n it: 'Abilitano funzioni aggiuntive come chat, mappe o preferenze salvate.',\n en: 'Enable extra features such as chat, maps or saved preferences.',\n },\n },\n experience: {\n gcm: ['personalization_storage'],\n color: 'var(--ec-c-experience)',\n title: { it: 'Esperienza', en: 'Experience' },\n description: {\n it: 'Contenuti incorporati di terze parti, come video e post social.',\n en: 'Embedded third-party content such as videos and social posts.',\n },\n },\n measurement: {\n gcm: ['analytics_storage'],\n color: 'var(--ec-c-measurement)',\n title: { it: 'Misurazione', en: 'Measurement' },\n description: {\n it: 'Ci aiutano a capire come viene usato il sito, con statistiche sulle visite.',\n en: 'Help us understand how the site is used, through visit statistics.',\n },\n },\n marketing: {\n gcm: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n color: 'var(--ec-c-marketing)',\n title: { it: 'Marketing', en: 'Marketing' },\n description: {\n it: 'Servono a misurare le campagne e a mostrarti pubblicità più pertinente, anche su altri siti.',\n en: 'Measure campaigns and show you more relevant ads, including on other sites.',\n },\n },\n};\n\n/** Fallback module colours for unknown category ids, in order. */\nexport const EXTRA_CATEGORY_COLORS = ['var(--ec-c-extra-1)', 'var(--ec-c-extra-2)', 'var(--ec-c-extra-3)'];\n\nexport function categoryDefaults(id: string): Partial<CategoryDeclaration> & { color: string } {\n const known = KNOWN_CATEGORIES[id];\n if (known) return { gcm: known.gcm, color: known.color, title: known.title, description: known.description };\n return { color: EXTRA_CATEGORY_COLORS[0] };\n}\n\nexport const DEFAULT_TEXTS: Record<'it' | 'en', Texts> = {\n it: {\n banner: {\n title: 'Usiamo i cookie solo se sei d’accordo',\n description:\n 'I cookie necessari fanno funzionare il sito. Con il tuo consenso usiamo anche le altre categorie qui sotto. Puoi cambiare idea quando vuoi da «Preferenze cookie».',\n acceptAll: 'Accetta tutti',\n rejectAll: 'Rifiuta tutti',\n customize: 'Personalizza',\n close: 'Chiudi e rifiuta i cookie non necessari',\n policyLink: 'Cookie policy',\n legendOn: 'attivi',\n legendOff: 'spenti',\n legendAlways: 'sempre attivi',\n },\n preferences: {\n title: 'Preferenze cookie',\n intro:\n 'Scegli quali categorie attivare. Quelle spente restano bloccate finché non le accendi. Puoi tornare qui in qualsiasi momento.',\n acceptAll: 'Accetta tutti',\n rejectAll: 'Rifiuta tutti',\n save: 'Salva le scelte',\n close: 'Chiudi',\n alwaysOn: 'Sempre attivi',\n services: 'Servizi',\n serviceCounter: 'servizio|servizi',\n cookieName: 'Cookie',\n cookieDuration: 'Durata',\n cookieDescription: 'A cosa serve',\n provider: 'Fornitore',\n privacyPolicy: 'Privacy policy',\n noCookies: 'Nessun cookie dichiarato.',\n },\n reopen: { label: 'Preferenze cookie' },\n embed: {\n blocked: 'Questo contenuto di {service} è bloccato finché non accetti i cookie «{category}».',\n enable: 'Mostra il contenuto',\n enableAlways: 'Attiva sempre «{category}»',\n },\n errors: { logFailed: 'Non siamo riusciti a registrare la scelta. Riprova.' },\n },\n en: {\n banner: {\n title: 'We use cookies only if you agree',\n description:\n 'Necessary cookies make the site work. With your consent we also use the other categories below. You can change your mind at any time from “Cookie preferences”.',\n acceptAll: 'Accept all',\n rejectAll: 'Reject all',\n customize: 'Customize',\n close: 'Close and reject non-necessary cookies',\n policyLink: 'Cookie policy',\n legendOn: 'on',\n legendOff: 'off',\n legendAlways: 'always on',\n },\n preferences: {\n title: 'Cookie preferences',\n intro: 'Choose which categories to turn on. Categories left off stay blocked until you enable them. You can come back here at any time.',\n acceptAll: 'Accept all',\n rejectAll: 'Reject all',\n save: 'Save choices',\n close: 'Close',\n alwaysOn: 'Always on',\n services: 'Services',\n serviceCounter: 'service|services',\n cookieName: 'Cookie',\n cookieDuration: 'Duration',\n cookieDescription: 'Purpose',\n provider: 'Provider',\n privacyPolicy: 'Privacy policy',\n noCookies: 'No cookies declared.',\n },\n reopen: { label: 'Cookie preferences' },\n embed: {\n blocked: 'This {service} content is blocked until you accept “{category}” cookies.',\n enable: 'Show content',\n enableAlways: 'Always enable “{category}”',\n },\n errors: { logFailed: 'We could not record your choice. Please try again.' },\n },\n};\n","import {\n DEFAULT_COOKIE_NAME,\n DEFAULT_EXPIRY_DAYS,\n DEFAULT_GCM_EVENT,\n DEFAULT_TEXTS,\n DEFAULT_WAIT_FOR_UPDATE,\n EXTRA_CATEGORY_COLORS,\n KNOWN_CATEGORIES,\n} from './defaults';\nimport type { EasyCookieConfig, GcmSignal, Localized, Texts } from './types';\n\nconst GCM_SIGNALS: GcmSignal[] = [\n 'ad_storage',\n 'ad_user_data',\n 'ad_personalization',\n 'analytics_storage',\n 'functionality_storage',\n 'personalization_storage',\n 'security_storage',\n];\n\n/** Identity helper that gives editors type checking for a config object. */\nexport function defineConfig(config: EasyCookieConfig): EasyCookieConfig {\n return config;\n}\n\nexport interface ConfigIssue {\n path: string;\n message: string;\n}\n\n/**\n * Validate a config. Returns every problem found (empty array = valid).\n * Hand-written to keep the browser bundle free of schema libraries; the\n * consent server runs the same function before publishing a revision.\n */\nexport function validateConfig(input: unknown): ConfigIssue[] {\n const issues: ConfigIssue[] = [];\n const add = (path: string, message: string) => issues.push({ path, message });\n const isObj = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n const isLocalized = (v: unknown) =>\n typeof v === 'string' || (isObj(v) && Object.values(v).every((x) => typeof x === 'string'));\n\n if (!isObj(input)) return [{ path: '', message: 'Config must be an object' }];\n const c = input as Partial<EasyCookieConfig>;\n\n if (typeof c.revision !== 'string' || !c.revision.trim()) add('revision', 'Required non-empty string');\n if (c.expiryDays !== undefined && (typeof c.expiryDays !== 'number' || c.expiryDays < 1 || c.expiryDays > 395))\n add('expiryDays', 'Must be a number between 1 and 395 (13 months)');\n\n if (!isObj(c.categories) || Object.keys(c.categories).length === 0) {\n add('categories', 'At least one category is required');\n } else {\n const readOnly = Object.entries(c.categories).filter(([, v]) => isObj(v) && v.readOnly);\n if (readOnly.length === 0) add('categories', 'Declare a readOnly category for strictly necessary cookies');\n for (const [id, cat] of Object.entries(c.categories)) {\n const p = `categories.${id}`;\n if (!/^[a-z][a-z0-9_-]*$/i.test(id)) add(p, 'Category id must be alphanumeric (a-z, 0-9, _ and -)');\n if (!isObj(cat)) {\n add(p, 'Must be an object');\n continue;\n }\n if (cat.title !== undefined && !isLocalized(cat.title)) add(`${p}.title`, 'Must be a string or a language map');\n if (cat.description !== undefined && !isLocalized(cat.description))\n add(`${p}.description`, 'Must be a string or a language map');\n if (cat.gcm !== undefined) {\n if (!Array.isArray(cat.gcm)) add(`${p}.gcm`, 'Must be an array');\n else cat.gcm.forEach((s, i) => GCM_SIGNALS.includes(s) || add(`${p}.gcm.${i}`, `Unknown Consent Mode signal \"${s}\"`));\n }\n }\n }\n\n if (c.services !== undefined) {\n if (!isObj(c.services)) add('services', 'Must be an object');\n else\n for (const [id, svc] of Object.entries(c.services)) {\n const p = `services.${id}`;\n if (!isObj(svc)) {\n add(p, 'Must be an object');\n continue;\n }\n if (typeof svc.category !== 'string' || !isObj(c.categories) || !(svc.category in c.categories))\n add(`${p}.category`, 'Must reference a declared category');\n if (svc.cookies !== undefined) {\n if (!Array.isArray(svc.cookies)) add(`${p}.cookies`, 'Must be an array');\n else\n svc.cookies.forEach((ck, i) => {\n if (!isObj(ck) || typeof ck.name !== 'string' || !ck.name) add(`${p}.cookies.${i}.name`, 'Required');\n else if (ck.pattern) {\n try {\n new RegExp(ck.name);\n } catch {\n add(`${p}.cookies.${i}.name`, 'Invalid regular expression');\n }\n }\n });\n }\n if (svc.privacyUrl !== undefined && typeof svc.privacyUrl !== 'string') add(`${p}.privacyUrl`, 'Must be a URL string');\n if (svc.from !== undefined && typeof svc.from !== 'string') add(`${p}.from`, 'Must be a catalog entry id string');\n }\n }\n\n if (c.log !== undefined) {\n if (!isObj(c.log) || typeof c.log.endpoint !== 'string' || typeof c.log.siteKey !== 'string')\n add('log', 'Requires endpoint and siteKey strings');\n }\n if (c.cookie?.sameSite === 'None' && c.cookie.secure === false) add('cookie.secure', 'SameSite=None requires secure');\n if (c.language && typeof c.language.default !== 'string') add('language.default', 'Required string');\n return issues;\n}\n\n/** Pick the string for `lang` from a Localized value, falling back to `fallback`, then to any value. */\nexport function localize(value: Localized | undefined, lang: string, fallback = 'en'): string {\n if (value === undefined) return '';\n if (typeof value === 'string') return value;\n return value[lang] ?? value[fallback] ?? Object.values(value)[0] ?? '';\n}\n\nexport interface ResolvedCategory {\n id: string;\n readOnly: boolean;\n title: Localized;\n description: Localized;\n gcm: GcmSignal[];\n color: string;\n services: string[];\n}\n\nexport interface ResolvedConfig extends EasyCookieConfig {\n expiryDays: number;\n cookie: Required<Pick<NonNullable<EasyCookieConfig['cookie']>, 'name' | 'path' | 'sameSite' | 'secure'>> & { domain?: string };\n language: { default: string; available: string[]; autoDetect: 'document' | 'browser' | false };\n resolvedCategories: ResolvedCategory[];\n gcm: Required<Omit<NonNullable<EasyCookieConfig['googleConsentMode']>, 'region'>> & { region?: string[] };\n}\n\n/** Fill defaults. Pure and DOM-free: safe on the server and in the head snippet builder. */\nexport function resolveConfig(config: EasyCookieConfig): ResolvedConfig {\n let extra = 0;\n const services = config.services ?? {};\n const allCategories: ResolvedCategory[] = Object.entries(config.categories).map(([id, cat]) => {\n const known = KNOWN_CATEGORIES[id];\n return {\n id,\n readOnly: !!cat.readOnly,\n title: cat.title ?? known?.title ?? id,\n description: cat.description ?? known?.description ?? '',\n gcm: cat.gcm ?? known?.gcm ?? [],\n color: cat.color ?? known?.color ?? EXTRA_CATEGORY_COLORS[extra++ % EXTRA_CATEGORY_COLORS.length],\n services: Object.entries(services)\n .filter(([, s]) => s.category === id)\n .map(([sid]) => sid),\n };\n });\n // Like Iubenda, the banner asks only about what the site uses: once services are\n // declared, an optional category without services is left out of the banner,\n // the preferences, the policy and Consent Mode (its signals stay denied).\n // Configs without any service keep every category (script-tag-only setups).\n const resolvedCategories = Object.keys(services).length\n ? allCategories.filter((c) => c.readOnly || c.services.length > 0)\n : allCategories;\n const lang = config.language?.default ?? 'it';\n const gcm = config.googleConsentMode;\n return {\n ...config,\n expiryDays: config.expiryDays ?? DEFAULT_EXPIRY_DAYS,\n cookie: {\n name: config.cookie?.name ?? DEFAULT_COOKIE_NAME,\n path: config.cookie?.path ?? '/',\n sameSite: config.cookie?.sameSite ?? 'Lax',\n secure: config.cookie?.secure ?? true,\n domain: config.cookie?.domain,\n },\n language: {\n default: lang,\n available: config.language?.available ?? [lang],\n autoDetect: config.language?.autoDetect ?? 'document',\n },\n resolvedCategories,\n gcm: {\n enabled: gcm?.enabled ?? false,\n waitForUpdate: gcm?.waitForUpdate ?? DEFAULT_WAIT_FOR_UPDATE,\n adsDataRedaction: gcm?.adsDataRedaction ?? true,\n urlPassthrough: gcm?.urlPassthrough ?? false,\n region: gcm?.region,\n dataLayerName: gcm?.dataLayerName ?? 'dataLayer',\n eventName: gcm?.eventName ?? DEFAULT_GCM_EVENT,\n },\n };\n}\n\n/** Merge default texts for `lang` with the config overrides. */\nexport function resolveTexts(config: EasyCookieConfig, lang: string): Texts {\n const base = (DEFAULT_TEXTS as Record<string, Texts>)[lang] ?? DEFAULT_TEXTS.en;\n const over = config.texts?.[lang] ?? {};\n const out = JSON.parse(JSON.stringify(base)) as Texts;\n for (const [section, values] of Object.entries(over)) {\n if (values && typeof values === 'object') Object.assign((out as any)[section], values);\n }\n return out;\n}\n\n/**\n * Consent Mode state for a set of granted categories.\n * A signal is granted when any accepted category maps to it; `security_storage` is always granted.\n */\nexport function gcmStateFor(config: ResolvedConfig, granted: string[]): Partial<Record<GcmSignal, 'granted' | 'denied'>> {\n const out: Partial<Record<GcmSignal, 'granted' | 'denied'>> = {};\n for (const cat of config.resolvedCategories) for (const s of cat.gcm) out[s] = out[s] === 'granted' ? 'granted' : 'denied';\n for (const cat of config.resolvedCategories)\n if (cat.readOnly || granted.includes(cat.id)) for (const s of cat.gcm) out[s] = 'granted';\n // The four v2 core signals are always declared, so tags never see \"undefined\".\n for (const s of ['ad_storage', 'ad_user_data', 'ad_personalization', 'analytics_storage'] as GcmSignal[])\n if (!out[s]) out[s] = 'denied';\n out.security_storage = 'granted';\n return out;\n}\n","import { DEFAULT_COOKIE_NAME, DEFAULT_EXPIRY_DAYS } from './defaults';\nimport type { ConsentMethod, ConsentState } from './types';\n\n/**\n * Raw content of the consent cookie as written by the engine\n * (vanilla-cookieconsent format) plus easy-cookie's own fields in `data`.\n */\nexport interface RawConsentCookie {\n categories: string[];\n revision: number;\n data: { ec?: { rev: string; method: ConsentMethod } } | null;\n consentTimestamp: string;\n lastConsentTimestamp?: string;\n consentId: string;\n services: Record<string, string[]>;\n languageCode?: string;\n expirationTime?: number;\n}\n\n/** Read one cookie value from a `Cookie` header or `document.cookie` string. */\nexport function readCookie(cookieHeader: string | null | undefined, name = DEFAULT_COOKIE_NAME): string | null {\n if (!cookieHeader) return null;\n for (const part of cookieHeader.split(/;\\s*/)) {\n const eq = part.indexOf('=');\n if (eq > 0 && part.slice(0, eq).trim() === name) return part.slice(eq + 1);\n }\n return null;\n}\n\nexport function decodeRawCookie(value: string | null | undefined): RawConsentCookie | null {\n if (!value) return null;\n try {\n let text = value;\n // The engine URI-encodes the JSON; frameworks sometimes hand us the decoded value.\n if (!text.startsWith('{')) text = decodeURIComponent(text);\n const raw = JSON.parse(text);\n if (!raw || !Array.isArray(raw.categories) || typeof raw.consentId !== 'string') return null;\n return raw as RawConsentCookie;\n } catch {\n return null;\n }\n}\n\nexport interface ParseOptions {\n /** Current config revision: a stored choice for another revision is not valid. */\n revision?: string;\n expiryDays?: number;\n now?: number;\n}\n\n/**\n * Turn the cookie value into a ConsentState, or null when there is no valid choice\n * (missing, malformed, other revision, expired). DOM-free: use it in middleware,\n * route handlers and React Server Components.\n */\nexport function parseConsent(value: string | null | undefined, opts: ParseOptions = {}): ConsentState | null {\n const raw = decodeRawCookie(value);\n if (!raw) return null;\n const ec = raw.data?.ec;\n if (!ec) return null;\n if (opts.revision !== undefined && ec.rev !== opts.revision) return null;\n const updatedAt = raw.lastConsentTimestamp ?? raw.consentTimestamp;\n const now = opts.now ?? Date.now();\n const maxAge = (opts.expiryDays ?? DEFAULT_EXPIRY_DAYS) * 86_400_000;\n const updatedMs = Date.parse(updatedAt);\n if (!Number.isFinite(updatedMs) || now - updatedMs > maxAge) return null;\n if (raw.expirationTime && raw.expirationTime < now) return null;\n return {\n id: raw.consentId,\n revision: ec.rev,\n categories: raw.categories,\n services: raw.services ?? {},\n method: ec.method,\n firstAt: raw.consentTimestamp,\n updatedAt,\n language: raw.languageCode,\n };\n}\n\n/** Convenience: parse straight from a Cookie header / document.cookie string. */\nexport function consentFromCookieHeader(\n cookieHeader: string | null | undefined,\n opts: ParseOptions & { cookieName?: string } = {},\n): ConsentState | null {\n return parseConsent(readCookie(cookieHeader, opts.cookieName ?? DEFAULT_COOKIE_NAME), opts);\n}\n","import { localize, type ResolvedConfig } from '../shared/config';\nimport type { EasyCookieApi, Texts } from '../shared/types';\n\nconst SELECTOR = 'iframe[data-category][data-src]';\n\nconst fill = (tpl: string, vars: Record<string, string>) => tpl.replace(/\\{(\\w+)\\}/g, (_, k) => vars[k] ?? '');\n\n/**\n * Blocked embeds: `<iframe data-category=\"experience\" data-service=\"youtube\" data-src=\"…\">`.\n * While the category is off, the iframe stays empty and a placeholder sits in\n * its place with two choices: show this one content now (no consent stored),\n * or turn the whole category on.\n */\nexport function mountEmbeds(\n c: ResolvedConfig,\n texts: () => Texts,\n lang: () => string,\n api: EasyCookieApi,\n): { refresh(): void } {\n const loaded = new WeakSet<HTMLIFrameElement>();\n\n const load = (frame: HTMLIFrameElement) => {\n loaded.add(frame);\n frame.src = frame.dataset.src!;\n frame.hidden = false;\n const ph = frame.previousElementSibling;\n if (ph?.classList.contains('ec-embed')) ph.remove();\n };\n\n const placeholder = (frame: HTMLIFrameElement) => {\n if (frame.previousElementSibling?.classList.contains('ec-embed')) return;\n const t = texts();\n const catId = frame.dataset.category!;\n const cat = c.resolvedCategories.find((x) => x.id === catId);\n const catName = cat ? localize(cat.title, lang(), c.language.default) : catId;\n const svcId = frame.dataset.service;\n const svc = svcId ? c.services?.[svcId] : undefined;\n const svcName = (svc && localize(svc.label, lang(), c.language.default)) || svcId || frame.title || catName;\n\n const box = document.createElement('div');\n // The placeholder takes the iframe's own box (class, inline style, ratio) so\n // nothing shifts when the real embed loads.\n box.className = ['ec-embed', frame.className].filter(Boolean).join(' ');\n if (frame.style.cssText) box.style.cssText = frame.style.cssText;\n if (cat) box.style.setProperty('--ec-cat', cat.color);\n const rect = frame.getBoundingClientRect();\n const w = Number(frame.getAttribute('width')) || rect.width;\n const hgt = Number(frame.getAttribute('height')) || rect.height;\n if (w > 0 && hgt > 0) box.style.aspectRatio = `${w} / ${hgt}`;\n\n const sw = document.createElement('span');\n sw.className = 'ec-module';\n sw.setAttribute('aria-hidden', 'true');\n const msg = document.createElement('p');\n msg.className = 'ec-embed__text';\n msg.textContent = fill(t.embed.blocked, { service: svcName, category: catName });\n const actions = document.createElement('div');\n actions.className = 'ec-embed__actions';\n const once = document.createElement('button');\n once.type = 'button';\n once.className = 'ec-btn';\n once.textContent = t.embed.enable;\n once.addEventListener('click', () => load(frame));\n const always = document.createElement('button');\n always.type = 'button';\n always.className = 'ec-btn ec-btn--secondary';\n always.textContent = fill(t.embed.enableAlways, { category: catName });\n always.addEventListener('click', () => api.accept([catId]));\n actions.append(once, always);\n box.append(sw, msg, actions);\n frame.hidden = true;\n frame.parentNode?.insertBefore(box, frame);\n };\n\n const refresh = () => {\n document.querySelectorAll<HTMLIFrameElement>(SELECTOR).forEach((frame) => {\n if (loaded.has(frame)) return;\n const svc = frame.dataset.service;\n const granted = svc ? api.isServiceGranted(svc) || api.isGranted(frame.dataset.category!) : api.isGranted(frame.dataset.category!);\n if (granted) load(frame);\n else placeholder(frame);\n });\n };\n\n // Embeds added later (SPA navigation, CMS widgets).\n const mo = new MutationObserver((muts) => {\n if (muts.some((m) => Array.from(m.addedNodes).some((n) => n instanceof Element && (n.matches(SELECTOR) || n.querySelector(SELECTOR)))))\n refresh();\n });\n mo.observe(document.body, { childList: true, subtree: true });\n return { refresh };\n}\n","import type { ConsentLogOptions, ConsentRecordInput } from '../shared/types';\n\nconst QUEUE_KEY = 'ec_log_queue';\nconst MAX_QUEUE = 20;\n\nconst url = (log: ConsentLogOptions, path: string) =>\n `${log.endpoint.replace(/\\/$/, '')}${path}?key=${encodeURIComponent(log.siteKey)}`;\n\n/**\n * POST as a CORS \"simple request\" (text/plain, key in the query string) so no\n * preflight is needed and `keepalive` survives the page unloading.\n */\nasync function post(target: string, body: unknown): Promise<boolean> {\n try {\n const res = await fetch(target, {\n method: 'POST',\n mode: 'cors',\n credentials: 'omit',\n keepalive: true,\n headers: { 'Content-Type': 'text/plain;charset=UTF-8' },\n body: JSON.stringify(body),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nfunction readQueue(): ConsentRecordInput[] {\n try {\n return JSON.parse(localStorage.getItem(QUEUE_KEY) || '[]');\n } catch {\n return [];\n }\n}\n\nfunction writeQueue(q: ConsentRecordInput[]) {\n try {\n if (q.length) localStorage.setItem(QUEUE_KEY, JSON.stringify(q.slice(-MAX_QUEUE)));\n else localStorage.removeItem(QUEUE_KEY);\n } catch {\n /* storage blocked: nothing to do, the record is lost (documented) */\n }\n}\n\n/** Send a consent record; on failure keep it for a retry on the next page load. */\nexport async function sendRecord(log: ConsentLogOptions, record: ConsentRecordInput): Promise<boolean> {\n const ok = await post(url(log, '/v1/consents'), record);\n if (!ok) writeQueue([...readQueue(), record]);\n return ok;\n}\n\nexport async function flushQueue(log: ConsentLogOptions): Promise<void> {\n const q = readQueue();\n if (!q.length) return;\n const left: ConsentRecordInput[] = [];\n for (const r of q) if (!(await post(url(log, '/v1/consents'), r))) left.push(r);\n writeQueue(left);\n}\n\nexport function sendSubject(log: ConsentLogOptions, consentId: string, subjectId: string): Promise<boolean> {\n return post(url(log, `/v1/consents/${encodeURIComponent(consentId)}/subject`), { subjectId });\n}\n","import { localize, type ResolvedConfig } from '../shared/config';\nimport type { ConsentState, ReopenButtonOptions, Texts } from '../shared/types';\n\nconst h = <K extends keyof HTMLElementTagNameMap>(tag: K, cls?: string, text?: string) => {\n const el = document.createElement(tag);\n if (cls) el.className = cls;\n if (text !== undefined) el.textContent = text;\n return el;\n};\n\nconst isOn = (cat: ResolvedConfig['resolvedCategories'][number], state: ConsentState | null) =>\n cat.readOnly || !!state?.categories.includes(cat.id);\n\n/** Build one module per category, once. `--i` drives the staggered fill. */\nfunction buildModules(row: HTMLElement, c: ResolvedConfig, extra = '') {\n c.resolvedCategories.forEach((cat, i) => {\n const m = h('span', `ec-module${extra}`);\n m.dataset.cat = cat.id;\n m.style.setProperty('--ec-cat', cat.color);\n m.style.setProperty('--i', String(i));\n row.appendChild(m);\n });\n}\n\nfunction syncModules(row: Element, c: ResolvedConfig, state: ConsentState | null) {\n row.querySelectorAll<HTMLElement>('.ec-module').forEach((m) => {\n const cat = c.resolvedCategories.find((x) => x.id === m.dataset.cat);\n if (cat) m.classList.toggle('ec-module--on', isOn(cat, state));\n });\n}\n\n/**\n * The consent mosaic: one colour module per category, filled when granted,\n * outlined when off. Necessary categories are always filled. State is never\n * colour alone: every module has a text label and state in the legend.\n * Modules are created once and toggled in place so the fill can animate.\n */\nexport function renderMosaic(\n modal: Element | null,\n c: ResolvedConfig,\n texts: Texts,\n lang: string,\n state: ConsentState | null,\n) {\n if (!modal) return;\n const body = modal.querySelector('.cm__texts') ?? modal;\n let mosaic = modal.querySelector<HTMLElement>('.ec-mosaic');\n if (!mosaic || mosaic.dataset.lang !== lang) {\n mosaic?.remove();\n mosaic = h('div', 'ec-mosaic');\n mosaic.dataset.lang = lang;\n const row = h('div', 'ec-mosaic__row');\n row.setAttribute('aria-hidden', 'true');\n buildModules(row, c);\n const legend = h('ul', 'ec-mosaic__legend');\n for (const cat of c.resolvedCategories) {\n const li = h('li', 'ec-mosaic__item');\n li.dataset.cat = cat.id;\n const sw = h('span', 'ec-swatch');\n sw.style.setProperty('--ec-cat', cat.color);\n sw.setAttribute('aria-hidden', 'true');\n li.append(sw, document.createTextNode(localize(cat.title, lang, c.language.default)), h('span', 'ec-mosaic__state'));\n legend.appendChild(li);\n }\n mosaic.append(row, legend);\n body.insertBefore(mosaic, body.firstChild);\n }\n syncModules(mosaic.querySelector('.ec-mosaic__row')!, c, state);\n mosaic.querySelectorAll<HTMLElement>('.ec-mosaic__item').forEach((li) => {\n const cat = c.resolvedCategories.find((x) => x.id === li.dataset.cat)!;\n const on = isOn(cat, state);\n li.classList.toggle('is-on', on);\n li.querySelector('.ec-swatch')!.classList.toggle('ec-swatch--on', on);\n li.querySelector('.ec-mosaic__state')!.textContent = cat.readOnly\n ? texts.banner.legendAlways\n : on\n ? texts.banner.legendOn\n : texts.banner.legendOff;\n });\n}\n\nexport interface ReopenHandle {\n update(state: ConsentState | null): void;\n destroy(): void;\n}\n\n/** Floating \"cookie preferences\" button carrying a miniature of the visitor's mosaic. */\nexport function mountReopenButton(\n c: ResolvedConfig,\n texts: Texts,\n _lang: string,\n opts: ReopenButtonOptions,\n open: () => void,\n): ReopenHandle {\n const btn = h('button', `ec-reopen ec-reopen--${opts.position ?? (c.ui?.position === 'bottom-right' ? 'bottom-right' : 'bottom-left')}`);\n btn.type = 'button';\n btn.setAttribute('aria-label', texts.reopen.label);\n btn.title = texts.reopen.label;\n btn.hidden = true;\n const grid = h('span', 'ec-reopen__grid');\n grid.setAttribute('aria-hidden', 'true');\n buildModules(grid, c, ' ec-module--mini');\n btn.appendChild(grid);\n btn.addEventListener('click', open);\n document.body.appendChild(btn);\n\n let current: ConsentState | null = null;\n let revealed = false;\n const hiddenHere = () => (opts.hideOn ?? []).some((p) => location.pathname.startsWith(p));\n const sync = () => {\n btn.hidden = !current || hiddenHere();\n };\n const onNav = () => sync();\n // SPA routers change the path without reloading: watch history too.\n const wrap = (k: 'pushState' | 'replaceState') => {\n const orig = history[k];\n history[k] = function (this: History, ...args: Parameters<History['pushState']>) {\n const r = orig.apply(this, args);\n queueMicrotask(onNav);\n return r;\n } as History['pushState'];\n return () => (history[k] = orig);\n };\n const unwrap = [wrap('pushState'), wrap('replaceState')];\n addEventListener('popstate', onNav);\n\n return {\n update(state) {\n current = state;\n sync();\n if (!revealed && state && !btn.hidden) {\n // First appearance: start empty, then let the modules fill one step at a time.\n revealed = true;\n syncModules(grid, c, null);\n grid.querySelectorAll('.ec-module').forEach((m) => m.classList.remove('ec-module--on'));\n // Wait until the banner has gone (the button is display:none while it shows),\n // otherwise the fill would happen unseen.\n const start = performance.now();\n const fillWhenVisible = () => {\n const bannerUp = document.documentElement.classList.contains('show--consent');\n if ((bannerUp || getComputedStyle(btn).display === 'none') && performance.now() - start < 1500) {\n requestAnimationFrame(fillWhenVisible);\n return;\n }\n requestAnimationFrame(() => syncModules(grid, c, current));\n };\n requestAnimationFrame(fillWhenVisible);\n return;\n }\n syncModules(grid, c, state);\n },\n destroy() {\n unwrap.forEach((u) => u());\n removeEventListener('popstate', onNav);\n btn.remove();\n },\n };\n}\n","import { localize, resolveTexts, type ResolvedConfig } from '../shared/config';\nimport type { Texts } from '../shared/types';\n\nconst esc = (s: string) =>\n s.replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!);\n\n/** Build the engine (vanilla-cookieconsent) translation object for one language. */\nexport function engineTranslation(c: ResolvedConfig, lang: string, texts: Texts = resolveTexts(c, lang)) {\n const policyUrl = localize(c.policyUrl, lang, c.language.default);\n const policyLink = policyUrl\n ? ` <a class=\"ec-link\" href=\"${esc(policyUrl)}\">${esc(texts.banner.policyLink)}</a>`\n : '';\n const services = c.services ?? {};\n\n const sections = c.resolvedCategories.map((cat) => {\n const rows = cat.services.flatMap((sid) => {\n const svc = services[sid]!;\n const label = localize(svc.label, lang, c.language.default) || sid;\n return (svc.cookies ?? []).map((ck) => ({\n name: `<code>${esc(ck.pattern ? ck.name.replace(/^\\^|\\$$/g, '') + '…' : ck.name)}</code>`,\n service: esc(label),\n duration: esc(localize(ck.duration, lang, c.language.default)),\n desc: esc(localize(ck.description, lang, c.language.default) || localize(svc.purpose, lang, c.language.default)),\n }));\n });\n const serviceFurniture = cat.services\n .map((sid) => {\n const svc = services[sid]!;\n const label = localize(svc.label, lang, c.language.default) || sid;\n const purpose = localize(svc.purpose, lang, c.language.default);\n const durations = Array.from(\n new Set((svc.cookies ?? []).map((ck) => localize(ck.duration, lang, c.language.default)).filter(Boolean)),\n );\n const bits = [\n svc.provider ? `<span class=\"ec-svc__provider\">${esc(texts.preferences.provider)}: ${esc(svc.provider)}</span>` : '',\n durations.length\n ? `<span class=\"ec-svc__duration\">${esc(texts.preferences.cookieDuration)}: ${esc(durations.join(', '))}</span>`\n : '',\n svc.privacyUrl\n ? `<a class=\"ec-link\" href=\"${esc(svc.privacyUrl)}\" target=\"_blank\" rel=\"noopener\">${esc(texts.preferences.privacyPolicy)}</a>`\n : '',\n ].filter(Boolean);\n return `<li class=\"ec-svc\"><strong class=\"ec-svc__name\">${esc(label)}</strong>${\n purpose ? `<span class=\"ec-svc__purpose\">${esc(purpose)}</span>` : ''\n }${bits.length ? `<span class=\"ec-svc__meta\">${bits.join(' · ')}</span>` : ''}</li>`;\n })\n .join('');\n\n return {\n title: `<span class=\"ec-swatch\" style=\"--ec-cat:${esc(cat.color)}\" aria-hidden=\"true\"></span>${esc(\n localize(cat.title, lang, c.language.default),\n )}${cat.readOnly ? ` <span class=\"ec-always\">${esc(texts.preferences.alwaysOn)}</span>` : ''}`,\n description:\n esc(localize(cat.description, lang, c.language.default)) +\n (serviceFurniture ? `<ul class=\"ec-svcs\" aria-label=\"${esc(texts.preferences.services)}\">${serviceFurniture}</ul>` : ''),\n linkedCategory: cat.id,\n ...(rows.length\n ? {\n cookieTable: {\n caption: esc(texts.preferences.cookieName),\n headers: {\n name: esc(texts.preferences.cookieName),\n service: esc(texts.preferences.services),\n duration: esc(texts.preferences.cookieDuration),\n desc: esc(texts.preferences.cookieDescription),\n },\n body: rows,\n },\n }\n : {}),\n };\n });\n\n return {\n consentModal: {\n title: esc(texts.banner.title),\n description: esc(texts.banner.description) + policyLink,\n acceptAllBtn: esc(texts.banner.acceptAll),\n acceptNecessaryBtn: esc(texts.banner.rejectAll),\n showPreferencesBtn: esc(texts.banner.customize),\n // The X closes the banner and counts as a rejection (Garante 2021).\n closeIconLabel: esc(texts.banner.close),\n },\n preferencesModal: {\n title: esc(texts.preferences.title),\n acceptAllBtn: esc(texts.preferences.acceptAll),\n acceptNecessaryBtn: esc(texts.preferences.rejectAll),\n savePreferencesBtn: esc(texts.preferences.save),\n closeIconLabel: esc(texts.preferences.close),\n serviceCounterLabel: esc(texts.preferences.serviceCounter),\n sections: [{ description: esc(texts.preferences.intro) + policyLink }, ...sections],\n },\n };\n}\n\n/** Engine `categories` block: enabled false by default, readOnly, services and autoClear rules. */\nexport function engineCategories(c: ResolvedConfig, lang: string, serviceToggles: boolean) {\n const services = c.services ?? {};\n const out: Record<string, unknown> = {};\n for (const cat of c.resolvedCategories) {\n const cookies = cat.services.flatMap((sid) =>\n (services[sid]!.cookies ?? []).map((ck) => ({ name: ck.pattern ? new RegExp(ck.name) : ck.name })),\n );\n const svc: Record<string, { label: string }> = {};\n if (serviceToggles && !cat.readOnly)\n for (const sid of cat.services) svc[sid] = { label: localize(services[sid]!.label, lang, c.language.default) || sid };\n out[cat.id] = {\n enabled: false,\n readOnly: cat.readOnly,\n ...(Object.keys(svc).length ? { services: svc } : {}),\n ...(cookies.length && !cat.readOnly ? { autoClear: { cookies, reloadPage: false } } : {}),\n };\n }\n return out;\n}\n","import * as engine from '../engine/index.esm.js';\nimport { gcmStateFor, localize, resolveConfig, resolveTexts, validateConfig, type ResolvedConfig } from '../shared/config';\nimport { decodeRawCookie, parseConsent, readCookie } from '../shared/cookie';\nimport type {\n ConsentEventDetail,\n ConsentMethod,\n ConsentRecordInput,\n ConsentState,\n EasyCookieApi,\n EasyCookieConfig,\n EasyCookieEvent,\n Texts,\n} from '../shared/types';\nimport { mountEmbeds } from './embeds';\nimport { flushQueue, sendRecord, sendSubject } from './log';\nimport { renderMosaic, mountReopenButton, type ReopenHandle } from './ui';\nimport { engineCategories, engineTranslation } from './translate';\n\ntype Listener = (detail: ConsentEventDetail | null) => void;\ntype RunInput = EasyCookieConfig | { remote: { endpoint: string; siteKey: string } };\n\nconst w = typeof window !== 'undefined' ? (window as any) : undefined;\n\nfunction detectLanguage(c: ResolvedConfig): string {\n const avail = c.language.available;\n let cand: string | undefined;\n if (c.language.autoDetect === 'document' && typeof document !== 'undefined') cand = document.documentElement.lang;\n else if (c.language.autoDetect === 'browser' && typeof navigator !== 'undefined') cand = navigator.language;\n const short = cand?.slice(0, 2).toLowerCase();\n return short && avail.includes(short) ? short : c.language.default;\n}\n\nfunction eraseCookie(c: ResolvedConfig) {\n const base = `${c.cookie.name}=; Max-Age=0; Path=${c.cookie.path}`;\n document.cookie = base;\n if (c.cookie.domain) document.cookie = `${base}; Domain=${c.cookie.domain}`;\n}\n\n/** Create an independent easy-cookie instance. The default export is a singleton. */\nexport function createEasyCookie(): EasyCookieApi {\n let config: ResolvedConfig | null = null;\n let lang = 'it';\n let texts: Texts | null = null;\n const listeners = new Map<EasyCookieEvent, Set<Listener>>();\n let pendingMethod: ConsentMethod | null = null;\n let firstFlag = false;\n let previous: string[] = [];\n let reopen: ReopenHandle | null = null;\n let embeds: { refresh(): void } | null = null;\n let ran = false;\n\n const emit = (event: EasyCookieEvent, detail: ConsentEventDetail | null) => {\n listeners.get(event)?.forEach((cb) => {\n try {\n cb(detail);\n } catch (e) {\n console.error('[easy-cookie] listener error', e);\n }\n });\n w?.dispatchEvent(new CustomEvent(`easycookie:${event}`, { detail }));\n };\n\n const get = (): ConsentState | null => {\n if (!config || typeof document === 'undefined') return null;\n return parseConsent(readCookie(document.cookie, config.cookie.name), {\n revision: config.revision,\n expiryDays: config.expiryDays,\n });\n };\n\n const gtag = (...args: unknown[]) => {\n if (!w || !config) return;\n const dl = config.gcm.dataLayerName;\n w[dl] = w[dl] || [];\n if (typeof w.gtag === 'function') w.gtag(...args);\n else\n w[dl].push(\n (function (this: unknown) {\n return arguments;\n } as any)(...args),\n );\n };\n\n const pushConsentMode = (state: ConsentState, first: boolean, notify: boolean) => {\n if (!config?.gcm.enabled) return;\n gtag('consent', 'update', gcmStateFor(config, state.categories));\n if (!notify) return;\n const flags: Record<string, boolean> = {};\n for (const cat of config.resolvedCategories) flags[cat.id] = state.categories.includes(cat.id);\n // A tag blocked on gtm.init is not re-fired by a later consent update:\n // GTM needs this custom event as an extra trigger (documented in the README).\n w[config.gcm.dataLayerName].push({\n event: config.gcm.eventName,\n easyCookie: { categories: flags, method: state.method, first, revision: state.revision },\n });\n };\n\n const inferMethod = (accepted: string[]): ConsentMethod => {\n if (!config) return 'custom';\n const optional = config.resolvedCategories.filter((c) => !c.readOnly).map((c) => c.id);\n if (optional.every((id) => accepted.includes(id))) return 'accept_all';\n if (optional.every((id) => !accepted.includes(id))) return 'reject_all';\n return 'custom';\n };\n\n const record = (state: ConsentState): ConsentRecordInput => {\n const cats: Record<string, boolean> = {};\n for (const c of config!.resolvedCategories) cats[c.id] = state.categories.includes(c.id);\n return {\n consentId: state.id,\n revision: state.revision,\n categories: cats,\n services: state.services,\n method: state.method,\n language: lang,\n pageUrl: location.origin + location.pathname,\n clientTimestamp: state.updatedAt,\n };\n };\n\n const handleChoice = (first: boolean, changed: string[]) => {\n if (!config) return;\n const raw = engine.getUserPreferences() as { acceptedCategories: string[] };\n const method = pendingMethod ?? inferMethod(raw.acceptedCategories);\n pendingMethod = null;\n engine.setCookieData({ value: { ec: { rev: config.revision, method } }, mode: 'overwrite' });\n const state = get();\n if (!state) return;\n pushConsentMode(state, first, true);\n const withdrawn = previous.filter((c) => !state.categories.includes(c));\n previous = state.categories;\n afterState(state);\n emit(first ? 'consent' : 'change', { consent: state, changed, first });\n const sent = config.log ? sendRecord(config.log, record(state)) : Promise.resolve(true);\n if (config.log?.requireLog)\n sent.then((ok) => {\n if (!ok) {\n eraseCookie(config!);\n engine.show(true);\n const err = document.querySelector('#cc-main .ec-error');\n if (err) err.textContent = texts!.errors.logFailed;\n }\n });\n if (withdrawn.length && !first && config.ui?.reloadOnWithdraw !== false) {\n // Scripts already running cannot be unloaded: reload once the record is out.\n sent.finally(() => location.reload());\n }\n };\n\n const afterState = (state: ConsentState | null) => {\n renderMosaic(document.querySelector('#cc-main .cm'), config!, texts!, lang, state);\n reopen?.update(state);\n embeds?.refresh();\n };\n\n const api: EasyCookieApi = {\n async run(input: RunInput) {\n if (!w) return;\n if (ran) {\n console.warn('[easy-cookie] run() called twice; ignoring.');\n return;\n }\n ran = true;\n let cfg: EasyCookieConfig;\n if ('remote' in input) {\n const res = await fetch(\n `${input.remote.endpoint.replace(/\\/$/, '')}/v1/sites/${encodeURIComponent(input.remote.siteKey)}/config.json`,\n { credentials: 'omit' },\n );\n if (!res.ok) throw new Error(`[easy-cookie] could not load config (${res.status})`);\n cfg = await res.json();\n } else cfg = input;\n\n const issues = validateConfig(cfg);\n if (issues.length) console.warn('[easy-cookie] config issues:', issues);\n config = resolveConfig(cfg);\n lang = detectLanguage(config);\n texts = resolveTexts(config, lang);\n\n // A stored choice for another revision, expired, or without easy-cookie data is not\n // valid: drop it so the engine shows the banner again (re-prompt).\n const rawValue = readCookie(document.cookie, config.cookie.name);\n if (rawValue && !parseConsent(rawValue, { revision: config.revision, expiryDays: config.expiryDays })) {\n if (decodeRawCookie(rawValue)) eraseCookie(config);\n else eraseCookie(config);\n }\n previous = get()?.categories ?? [];\n\n if (config.log) flushQueue(config.log);\n\n const translations: Record<string, unknown> = {};\n for (const l of config.language.available) translations[l] = engineTranslation(config, l, resolveTexts(config, l));\n\n const pos = config.ui?.position ?? 'bottom-left';\n const enginePos = pos === 'bottom' ? 'bottom center' : pos === 'center' ? 'middle center' : pos.replace('-', ' ');\n document.documentElement.classList.add('ec');\n // `bottom` is a full-width bar on wide screens, not a centred box.\n document.documentElement.classList.toggle('ec--bar', pos === 'bottom');\n const scheme = config.ui?.colorScheme ?? 'light';\n if (scheme === 'dark') document.documentElement.classList.add('ec--dark');\n if (scheme === 'auto' && w.matchMedia?.('(prefers-color-scheme: dark)').matches)\n document.documentElement.classList.add('ec--dark');\n\n // Record which control the visitor used (the engine's callbacks don't say).\n document.addEventListener(\n 'click',\n (e) => {\n const el = (e.target as Element | null)?.closest?.('#cc-main button');\n if (!el) return;\n const role = el.getAttribute('data-role');\n if (el.classList.contains('cm__btn--close')) pendingMethod = 'close';\n else if (role === 'all') pendingMethod = 'accept_all';\n else if (role === 'necessary') pendingMethod = 'reject_all';\n else if (role === 'save') pendingMethod = null; // inferred from the toggles\n },\n true,\n );\n\n // Any `[data-ec-open-preferences]` element opens the preferences, including\n // elements added later (e.g. the `{{preferences-link}}` of a legal document).\n document.addEventListener('click', (e) => {\n const el = (e.target as Element | null)?.closest?.('[data-ec-open-preferences]');\n if (!el) return;\n e.preventDefault();\n api.openPreferences();\n });\n\n await engine.run({\n root: document.body,\n mode: 'opt-in',\n autoShow: true,\n revision: 0,\n hideFromBots: cfg.hideFromBots ?? true,\n manageScriptTags: true,\n autoClearCookies: true,\n disablePageInteraction: false,\n respectGpc: cfg.respectGpc ?? true,\n cookie: {\n name: config.cookie.name,\n path: config.cookie.path,\n sameSite: config.cookie.sameSite,\n ...(config.cookie.domain ? { domain: config.cookie.domain } : {}),\n expiresAfterDays: config.expiryDays,\n secure: config.cookie.secure && location.protocol === 'https:',\n },\n guiOptions: {\n consentModal: { layout: 'box', position: enginePos, equalWeightButtons: true, flipButtons: false },\n preferencesModal: { layout: 'box', equalWeightButtons: true, flipButtons: false },\n },\n categories: engineCategories(config, lang, config.ui?.serviceToggles !== false),\n language: { default: lang, translations },\n onFirstConsent: () => {\n firstFlag = true;\n },\n onConsent: () => {\n if (firstFlag) {\n firstFlag = false;\n handleChoice(true, []);\n } else {\n const state = get();\n if (state) {\n pushConsentMode(state, false, false);\n afterState(state);\n emit('replay', { consent: state, changed: [], first: false });\n }\n }\n },\n onChange: ({ changedCategories }: { changedCategories: string[] }) => handleChoice(false, changedCategories),\n onModalReady: ({ modalName, modal }: { modalName: string; modal: HTMLElement }) => {\n if (modalName === 'consentModal') {\n renderMosaic(modal, config!, texts!, lang, get());\n if (!modal.querySelector('.ec-error')) {\n const err = document.createElement('p');\n err.className = 'ec-error';\n err.setAttribute('role', 'alert');\n modal.querySelector('.cm__texts')?.appendChild(err);\n }\n }\n },\n } as any);\n\n const reopenOpt = config.ui?.reopenButton ?? true;\n if (reopenOpt)\n reopen = mountReopenButton(config, texts, lang, typeof reopenOpt === 'object' ? reopenOpt : {}, () =>\n api.openPreferences(),\n );\n embeds = mountEmbeds(config, () => texts!, () => lang, api);\n afterState(get());\n emit('ready', null);\n },\n\n get,\n isGranted: (category) => !!get()?.categories.includes(category),\n isServiceGranted: (service) => {\n const s = get();\n if (!s || !config) return false;\n const cat = config.services?.[service]?.category;\n return !!cat && (s.services[cat]?.includes(service) ?? false);\n },\n on(event, cb) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(cb);\n return () => listeners.get(event)?.delete(cb);\n },\n onGranted(category, cb) {\n let fired = false;\n const check = () => {\n if (!fired && api.isGranted(category)) {\n fired = true;\n cb();\n }\n };\n check();\n const offs = (['ready', 'consent', 'change', 'replay'] as EasyCookieEvent[]).map((e) => api.on(e, check));\n return () => offs.forEach((off) => off());\n },\n showBanner: () => engine.show(true),\n openPreferences: () => engine.showPreferences(),\n acceptAll() {\n pendingMethod = 'accept_all';\n engine.acceptCategory('all');\n engine.hide();\n engine.hidePreferences();\n },\n rejectAll() {\n pendingMethod = 'reject_all';\n engine.acceptCategory([]);\n engine.hide();\n engine.hidePreferences();\n },\n accept(categories, services) {\n pendingMethod = null;\n const current = get()?.categories ?? [];\n engine.acceptCategory(Array.from(new Set([...current, ...categories])));\n if (services)\n for (const [cat, svcs] of Object.entries(services)) engine.acceptService(svcs, cat);\n engine.hide();\n },\n async identify(subjectId) {\n const s = get();\n if (!s || !config?.log) return;\n await sendSubject(config.log, s.id, subjectId);\n },\n reset() {\n if (!config) return;\n const s = get();\n if (s && config.log) sendRecord(config.log, { ...record(s), method: 'withdraw', categories: Object.fromEntries(config.resolvedCategories.map((c) => [c.id, c.readOnly])) });\n eraseCookie(config);\n previous = [];\n engine.reset(true);\n ran = false;\n reopen?.destroy();\n reopen = null;\n },\n getConfig: () => config,\n getLanguage: () => lang,\n async setLanguage(l) {\n if (!config || !config.language.available.includes(l)) return;\n lang = l;\n texts = resolveTexts(config, l);\n await engine.setLanguage(l, true);\n afterState(get());\n },\n };\n return api;\n}\n\nexport { localize };\n","import { resolveConfig, type ResolvedConfig } from './config';\nimport type { EasyCookieConfig, GcmSignal } from './types';\n\n/**\n * Build the inline `<head>` script that must run before GTM / gtag.\n *\n * It reads the consent cookie synchronously and calls\n * `gtag('consent','default', …)` with the visitor's real stored state\n * (everything denied when there is no valid choice for this revision), so tags\n * fired on `gtm.init` already see the right consent from the second page on.\n *\n * The output is dependency-free ES5, generated from the same config the\n * runtime uses: no hand-copied cookie parsing in host apps.\n */\nexport function renderHeadScript(config: EasyCookieConfig | ResolvedConfig): string {\n const c = 'resolvedCategories' in config ? (config as ResolvedConfig) : resolveConfig(config);\n const map: Record<string, GcmSignal[]> = {};\n const always: string[] = [];\n const signals = new Set<GcmSignal>(['ad_storage', 'ad_user_data', 'ad_personalization', 'analytics_storage']);\n for (const cat of c.resolvedCategories) {\n map[cat.id] = cat.gcm;\n cat.gcm.forEach((s) => signals.add(s));\n if (cat.readOnly) always.push(cat.id);\n }\n signals.delete('security_storage');\n\n const data = {\n n: c.cookie.name,\n r: c.revision,\n e: c.expiryDays * 86400000,\n m: map,\n a: always,\n s: Array.from(signals),\n w: c.gcm.waitForUpdate,\n g: c.gcm.region ?? null,\n d: c.gcm.dataLayerName,\n x: c.gcm.adsDataRedaction,\n u: c.gcm.urlPassthrough,\n on: c.gcm.enabled,\n };\n\n // Keep this ES5 and tiny: it runs render-blocking in <head>.\n return `(function(w,d,o){\nvar dl=o.d;w[dl]=w[dl]||[];\nw.gtag=w.gtag||function(){w[dl].push(arguments);};\nvar granted=o.a.slice(),state=null;\nvar i,k,s,v=null,p=d.cookie.split(/;\\\\s*/);\nfor(i=0;i<p.length;i++){var q=p[i].indexOf('=');if(q>0&&p[i].slice(0,q)===o.n){v=p[i].slice(q+1);break;}}\ntry{if(v){if(v.charAt(0)!=='{')v=decodeURIComponent(v);var c=JSON.parse(v);\nvar ec=c.data&&c.data.ec,t=Date.parse(c.lastConsentTimestamp||c.consentTimestamp);\nif(ec&&ec.rev===o.r&&t&&(new Date().getTime()-t)<=o.e){state=c;granted=c.categories||granted;}}}catch(e){}\nw.__easyCookieHead={granted:granted,valid:!!state};\nif(!o.on)return;\nvar cs={};\nfor(i=0;i<o.s.length;i++)cs[o.s[i]]='denied';\nfor(k in o.m){if(granted.indexOf(k)>-1){s=o.m[k];for(i=0;i<s.length;i++)cs[s[i]]='granted';}}\ncs.security_storage='granted';\nif(!state)cs.wait_for_update=o.w;\nif(o.g)cs.region=o.g;\nw.gtag('consent','default',cs);\nif(o.x)w.gtag('set','ads_data_redaction',true);\nif(o.u)w.gtag('set','url_passthrough',true);\n})(window,document,${JSON.stringify(data)});`;\n}\n"],"mappings":"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","names":["scripts","createPreferencesModal","createMainContainer","show","showPreferences","hide","hidePreferences","acceptCategory","modal","getFocusableElements","createMainContainer","hide","hidePreferences","acceptCategory","value","categoryName","createMainContainer","hide","showPreferences","acceptCategory","url","domain","_a","_b","_c","_d","_e","_f","_g","_h","w","_a","_a","_a","_b"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/engine/utils/constants.js","../src/engine/core/global.js","../src/engine/utils/collections.js","../src/engine/utils/dom.js","../src/engine/utils/type-guards.js","../src/engine/utils/categories.js","../src/engine/utils/debug.js","../src/engine/utils/events.js","../src/engine/utils/scripts.js","../src/engine/utils/data-buttons.js","../src/engine/utils/focus-trap.js","../src/engine/utils/svg-icons.js","../src/engine/utils/gui-manager.js","../src/engine/core/modals/preferencesModal.js","../src/engine/core/modals/consentModal.js","../src/engine/utils/language.js","../src/engine/core/modals/index.js","../src/engine/utils/safe-run.js","../src/engine/utils/localstorage.js","../src/engine/utils/cookies.js","../src/engine/core/config-init.js","../src/engine/core/api.js","../src/shared/defaults.ts","../src/shared/config.ts","../src/shared/cookie.ts","../src/runtime/embeds.ts","../src/runtime/log.ts","../src/runtime/ui.ts","../src/runtime/translate.ts","../src/runtime/index.ts","../src/shared/head.ts"],"sourcesContent":["import { createEasyCookie } from './runtime';\n\nexport * from './shared';\nexport { createEasyCookie };\n\n/** The page-wide easy-cookie instance (the engine is a singleton). */\nconst EasyCookie = createEasyCookie();\nexport default EasyCookie;\nexport { EasyCookie };\n","export const COOKIE_NAME = 'cc_cookie';\n\nexport const OPT_IN_MODE = 'opt-in';\nexport const OPT_OUT_MODE = 'opt-out';\n\nexport const TOGGLE_CONSENT_MODAL_CLASS = 'show--consent';\nexport const TOGGLE_PREFERENCES_MODAL_CLASS = 'show--preferences';\nexport const TOGGLE_DISABLE_INTERACTION_CLASS = 'disable--interaction';\n\nexport const SCRIPT_TAG_SELECTOR = 'data-category';\n\nexport const DIV_TAG = 'div';\nexport const BUTTON_TAG = 'button';\n\nexport const ARIA_HIDDEN = 'aria-hidden';\nexport const BTN_GROUP_CLASS = 'btn-group';\nexport const CLICK_EVENT = 'click';\nexport const DATA_ROLE = 'data-role';\n\nexport const CONSENT_MODAL_NAME = 'consentModal';\nexport const PREFERENCES_MODAL_NAME = 'preferencesModal';","import { COOKIE_NAME, OPT_IN_MODE } from '../utils/constants';\n\n/**\n * @typedef {import('../../types')} CookieConsent\n *\n * @typedef {CookieConsent} Api\n * @typedef {CookieConsent.CookieConsentConfig} UserConfig\n * @typedef {CookieConsent.Category} Category\n * @typedef {CookieConsent.Service} Service\n * @typedef {Object.<string, Service>} Services\n * @typedef {CookieConsent.AutoClear} AutoClear\n * @typedef {CookieConsent.GuiOptions} GuiOptions\n * @typedef {GuiOptions['consentModal']} GuiModalOption\n * @typedef {CookieConsent.CookieConsentConfig['language']} Language\n * @typedef {CookieConsent.Translation} Translation\n * @typedef {CookieConsent.ConsentModalOptions} ConsentModalOptions\n * @typedef {CookieConsent.PreferencesModalOptions} PreferencesModalOptions\n * @typedef {CookieConsent.CookieTable} CookieTable\n * @typedef {CookieConsent.Section} Section\n * @typedef {CookieConsent.CookieValue} CookieValue\n * @typedef {CookieConsent.UserPreferences} UserPreferences\n */\n\n/**\n * Internal state for each script tag\n * @typedef {Object} ScriptInfo\n * @property {HTMLScriptElement} _script\n * @property {string} _categoryName\n * @property {string} [_serviceName]\n * @property {boolean} _executed\n * @property {boolean} _runOnDisable\n */\n\n/**\n * Pointers to main dom elements\n * @typedef {Object} DomElements\n * @property {Document} _document\n * @property {HTMLElement} _htmlDom\n *\n * @property {HTMLElement} _ccMain\n * @property {HTMLElement} _cmContainer\n * @property {HTMLElement} _pmContainer\n *\n * @property {HTMLElement} _cm\n * @property {HTMLElement} _cmBody\n * @property {HTMLElement} _cmTexts\n * @property {HTMLElement} _cmTitle\n * @property {HTMLElement} _cmDescription\n * @property {HTMLElement} _cmBtns\n * @property {HTMLElement} _cmBtnGroup\n * @property {HTMLElement} _cmBtnGroup2\n * @property {HTMLElement} _cmAcceptAllBtn\n * @property {HTMLElement} _cmAcceptNecessaryBtn\n * @property {HTMLElement} _cmShowPreferencesBtn\n * @property {HTMLElement} _cmFooterLinksGroup\n * @property {HTMLElement} _cmCloseIconBtn\n *\n * @property {HTMLElement} _pm\n * @property {HTMLElement} _pmHeader\n * @property {HTMLElement} _pmTitle\n * @property {HTMLElement} _pmCloseBtn\n * @property {HTMLElement} _pmBody\n * @property {HTMLElement} _pmNewBody\n * @property {HTMLElement} _pmSections\n * @property {HTMLElement} _pmFooter\n * @property {HTMLElement} _pmBtnGroup1\n * @property {HTMLElement} _pmBtnGroup2\n * @property {HTMLElement} _pmAcceptAllBtn\n * @property {HTMLElement} _pmAcceptNecessaryBtn\n * @property {HTMLElement} _pmSavePreferencesBtn\n *\n * @property {Object.<string, HTMLInputElement>} _categoryCheckboxInputs\n * @property {Object.<string, ServiceToggle>} _serviceCheckboxInputs\n *\n * // Used to properly restore focus when modal is closed\n * @property {HTMLSpanElement} _focusSpan\n * @property {HTMLSpanElement} _pmFocusSpan\n */\n\n/**\n * @typedef {Object} CustomCallbacks\n * @property {Function} _onFirstConsent\n * @property {Function} _onConsent\n * @property {Function} _onChange\n * @property {Function} _onModalShow\n * @property {Function} _onModalHide\n * @property {Function} _onModalReady\n */\n\n/**\n * Pointers to all services toggles relative to a category\n * @typedef {Object.<string, HTMLInputElement>} ServiceToggle\n */\n\nexport class GlobalState {\n constructor() {\n\n /**\n * Default config. options\n * @type {CookieConsent.CookieConsentConfig}\n */\n this._config = {\n mode: OPT_IN_MODE,\n revision: 0,\n\n //{{START: GUI}}\n autoShow: true,\n lazyHtmlGeneration: true,\n //{{END: GUI}}\n\n autoClearCookies: true,\n manageScriptTags: true,\n hideFromBots: true,\n respectGpc: false,\n\n cookie: {\n name: COOKIE_NAME,\n expiresAfterDays: 182,\n domain: '',\n path: '/',\n secure: true,\n sameSite: 'Lax'\n }\n };\n\n this._state = {\n /**\n * @type {UserConfig}\n */\n _userConfig: {},\n\n _currentLanguageCode: '',\n\n /**\n * @type {Object.<string, Translation>}\n */\n _allTranslations: {},\n\n /**\n * @type {Translation}\n */\n _currentTranslation: {},\n\n /**\n * Internal state variables\n * @type {CookieValue}\n */\n _savedCookieContent : {},\n\n /**\n * Store all event data-cc event listeners\n * (so that they can be removed on .reset())\n *\n * @type {{\n * _element: HTMLElement,\n * _event: string,\n * _listener: Function\n * }[]}\n */\n _dataEventListeners: [],\n\n _disablePageInteraction: false,\n\n /**\n * @type {any}\n */\n _cookieData : null,\n\n /**\n * @type {Date}\n */\n _consentTimestamp: null,\n\n /**\n * @type {Date}\n */\n _lastConsentTimestamp: null,\n\n /**\n * @type {string}\n */\n _consentId: '',\n\n _invalidConsent : true,\n\n //{{START: GUI}}\n _consentModalExists : false,\n _consentModalVisible : false,\n\n _preferencesModalVisible : false,\n _preferencesModalExists: false,\n\n /**\n * @type {HTMLElement[]}\n */\n _currentModalFocusableElements: [],\n //{{END: GUI}}\n\n _revisionEnabled : false,\n _validRevision : true,\n\n /**\n * Array containing the last changed categories (enabled/disabled)\n * @type {string[]}\n */\n _lastChangedCategoryNames : [],\n\n _reloadPage : false,\n\n /**\n * @type {CookieConsent.AcceptType}\n */\n _acceptType: '',\n\n /**\n * Object containing all user's defined categories\n * @type {Object.<string, Category>}\n */\n _allDefinedCategories: false,\n\n /**\n * Stores all available categories\n * @type {string[]}\n */\n _allCategoryNames: [],\n\n /**\n * Contains all accepted categories\n * @type {string[]}\n */\n _acceptedCategories : [],\n\n /**\n * Keep track of readonly toggles\n * @type {string[]}\n */\n _readOnlyCategories : [],\n\n /**\n * Contains all categories enabled by default\n * @type {string[]}\n */\n _defaultEnabledCategories : [],\n\n /**\n * Don't run plugin if bot detected\n * (to avoid indexing its text content)\n */\n _botAgentDetected : false,\n\n /**\n * Save reference to the last focused element on the page\n * (used later to restore focus when both modals are closed)\n */\n\n //{{START: GUI}}\n\n /** @type {HTMLElement} **/_lastFocusedElemBeforeModal: false,\n /** @type {HTMLElement} **/_lastFocusedModalElement: false,\n\n /**\n * Both of the arrays below have the same structure:\n * [0]: first focusable element inside modal\n * [1]: last focusable element inside modal\n */\n\n /** @type {HTMLElement[]} **/ _cmFocusableElements : [],\n /** @type {HTMLElement[]} **/ _pmFocusableElements : [],\n\n /**\n * Keep track of enabled/disabled categories\n * @type {boolean[]}\n */\n _allToggleStates : [],\n\n //{{END: GUI}}\n\n /**\n * @type {Object.<string, Services>}\n */\n _allDefinedServices: {},\n\n /**\n * @type {Object.<string, string[]>}\n */\n _acceptedServices: {},\n\n /**\n * Keep track of the current state of the services\n * (may not be the same as enabledServices)\n *\n * @type {Object.<string, string[]>}\n */\n _enabledServices: {},\n\n /**\n * @type {Object.<string, string[]>}\n */\n _lastChangedServices: {},\n\n /**\n * @type {Object.<string, string[]>}\n */\n _lastEnabledServices: {},\n\n /**\n * @type {ScriptInfo[]}\n */\n _allScriptTags: []\n };\n\n /**\n * Pointers to main dom elements\n * @type {DomElements}\n */\n this._dom = {\n _categoryCheckboxInputs: {},\n _serviceCheckboxInputs: {}\n };\n\n /**\n * Callback functions\n * @type {CustomCallbacks}\n */\n this._callbacks = {};\n\n this._customEvents = {\n _onFirstConsent: 'cc:onFirstConsent',\n _onConsent: 'cc:onConsent',\n _onChange: 'cc:onChange',\n //{{START: GUI}}\n _onModalShow: 'cc:onModalShow',\n _onModalHide: 'cc:onModalHide',\n _onModalReady: 'cc:onModalReady'\n //{{END: GUI}}\n };\n }\n}\n\nexport const globalObj = new GlobalState();","/**\n * Helper indexOf\n * @param {any[]|string} el\n * @param {any} value\n */\nexport const indexOf = (el, value) => el.indexOf(value);\n\n/**\n * Returns true if el. (array or string) contains the specified value\n * @param {any[]|string} el\n */\nexport const elContains = (el, value) => indexOf(el, value) !== -1;\n\nexport const getKeys = obj => Object.keys(obj);\n\n/**\n * Return array without duplicates\n * @param {any[]} arr\n */\nexport const unique = (arr) => Array.from(new Set(arr));\n\nexport const deepCopy = (el) => {\n if (typeof el !== 'object' || el === null)\n return el;\n\n if (el instanceof Date)\n return new Date(el.getTime());\n\n let clone = Array.isArray(el) ? [] : {};\n\n for (let key in el) {\n let value = el[key];\n clone[key] = deepCopy(value);\n }\n\n return clone;\n};\n\n/**\n * Symmetric difference between 2 arrays\n * @param {any[]} arr1\n * @param {any[]} arr2\n */\nexport const arrayDiff = (arr1, arr2) => {\n const a = arr1 || [];\n const b = arr2 || [];\n\n return a\n .filter(x => !elContains(b, x))\n .concat(b.filter(x => !elContains(a, x)));\n};\n","import { globalObj } from '../core/global';\nimport { BUTTON_TAG, TOGGLE_DISABLE_INTERACTION_CLASS } from './constants';\n\nexport const getActiveElement = () => document.activeElement;\n\n/**\n * @param {Event} e\n */\nexport const preventDefault = (e) => e.preventDefault();\n\n/**\n * @param {Element} el\n * @param {string} selector\n */\nexport const querySelectorAll = (el, selector) => el.querySelectorAll(selector);\n\n/**\n * @param {HTMLInputElement} input\n */\nexport const dispatchInputChangeEvent = (input) => input.dispatchEvent(new Event('change'));\n\n/**\n * @param {keyof HTMLElementTagNameMap} type\n * @param {string} [className]\n */\nexport const createNode = (type, className) => {\n const el = document.createElement(type);\n\n if (type === BUTTON_TAG) {\n el.type = type;\n }\n\n className && addClass(el, className);\n\n return el;\n};\n\n/**\n * @param {HTMLElement} el\n * @param {string} attribute\n * @param {string} value\n */\nexport const setAttribute = (el, attribute, value) => el.setAttribute(attribute, value);\n\n/**\n * @param {HTMLElement} el\n * @param {string} attribute\n * @param {boolean} [prependData]\n */\nexport const removeAttribute = (el, attribute, prependData) => {\n el.removeAttribute(prependData\n ? 'data-' + attribute\n : attribute\n );\n};\n\n/**\n * @param {HTMLElement} el\n * @param {string} attribute\n * @param {boolean} [prependData]\n * @returns {string}\n */\nexport const getAttribute = (el, attribute, prependData) => {\n return el.getAttribute(prependData\n ? 'data-' + attribute\n : attribute\n );\n};\n\n/**\n * @param {Node} parent\n * @param {Node} child\n */\nexport const appendChild = (parent, child) => parent.appendChild(child);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const addClass = (elem, className) => elem.classList.add(className);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const addClassCm = (elem, className) => addClass(elem, 'cm__' + className);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const addClassPm = (elem, className) => addClass(elem, 'pm__' + className);\n\n/**\n * @param {HTMLElement} elem\n * @param {string} className\n */\nexport const removeClass = (el, className) => el.classList.remove(className);\n\n/**\n * @param {HTMLElement} el\n * @param {string} className\n */\nexport const hasClass = (el, className) => el.classList.contains(className);\n\n/**\n * Add event listener to dom object (cross browser function)\n * @param {Element} elem\n * @param {keyof WindowEventMap} event\n * @param {EventListener} fn\n * @param {boolean} [saveListener]\n */\nexport const addEvent = (elem, event, fn, saveListener) => {\n elem.addEventListener(event, fn);\n\n /**\n * Keep track of specific event listeners\n * that must be removed on `.reset()`\n */\n if (saveListener) {\n globalObj._state._dataEventListeners.push({\n _element: elem,\n _event: event,\n _listener: fn\n });\n }\n};\n\n/**\n * @param {HTMLElement} el\n * @param {boolean} [toggleTabIndex]\n * @param {boolean} [preventScroll]\n */\nexport const focus = (el, toggleTabIndex, preventScroll) => {\n if (!el) return;\n\n /**\n * Momentarily add the `tabindex` attribute to fix\n * a bug with focus restoration in chrome\n */\n toggleTabIndex && (el.tabIndex = -1);\n\n el.focus({ preventScroll });\n\n /**\n * Remove the `tabindex` attribute so\n * that the html markup is valid again\n */\n toggleTabIndex && el.removeAttribute('tabindex');\n};\n\n/**\n * Run `fn` in a new task, once the browser had the chance to paint\n * @param {Function} fn\n */\nexport const afterPaint = (fn) => requestAnimationFrame(() => setTimeout(fn));\n\n/**\n * Elements that get the modal state classes: <html> (page styles, e.g. the\n * scroll lock) and the root element (styles inside a shadow root)\n * @returns {HTMLElement[]}\n */\nexport const getStateClassElements = () => {\n const { _htmlDom, _rootEl } = globalObj._dom;\n\n return [...new Set([_htmlDom, _rootEl])].filter(el => el);\n};\n\n/**\n * @param {string} className\n * @param {boolean} [enable]\n * @param {HTMLElement[]} [elements]\n */\nexport const toggleStateClass = (className, enable, elements = getStateClassElements()) => {\n for (const el of elements)\n el.classList.toggle(className, !!enable);\n};\n\nlet disableInteractionTimeout;\n\n/**\n * @param {boolean} [enable]\n */\nexport const toggleDisableInteraction = (enable) => {\n clearTimeout(disableInteractionTimeout);\n\n const elements = getStateClassElements();\n\n if (enable) {\n toggleStateClass(TOGGLE_DISABLE_INTERACTION_CLASS, true, elements);\n }else {\n disableInteractionTimeout = setTimeout(() => {\n toggleStateClass(TOGGLE_DISABLE_INTERACTION_CLASS, false, elements);\n }, 500);\n }\n};\n","export const isArray = el => Array.isArray(el);\n\nexport const isString = el => typeof el === 'string';\n\nexport const isObject = el => !!el && typeof el === 'object' && !isArray(el);\n\nexport const isFunction = el => typeof el === 'function';\n","import { globalObj } from '../core/global';\nimport {\n arrayDiff,\n deepCopy,\n elContains,\n getKeys,\n unique\n} from './collections';\nimport { dispatchInputChangeEvent } from './dom';\nimport { isArray, isObject, isString } from './type-guards';\n\n/**\n * Store categories and services' config. details\n * @param {string[]} allCategoryNames\n */\nexport const fetchCategoriesAndServices = (allCategoryNames) => {\n const {\n _allDefinedCategories,\n _allDefinedServices,\n _acceptedServices,\n _enabledServices,\n _readOnlyCategories\n } = globalObj._state;\n\n for (let categoryName of allCategoryNames) {\n\n const currCategory = _allDefinedCategories[categoryName];\n const services = currCategory.services || {};\n const serviceNames = isObject(services) && getKeys(services) || [];\n\n _allDefinedServices[categoryName] = {};\n _acceptedServices[categoryName] = [];\n _enabledServices[categoryName] = [];\n\n /**\n * Keep track of readOnly categories\n */\n if (currCategory.readOnly) {\n _readOnlyCategories.push(categoryName);\n _acceptedServices[categoryName] = serviceNames;\n }\n\n globalObj._dom._serviceCheckboxInputs[categoryName] = {};\n\n for (let serviceName of serviceNames) {\n const service = services[serviceName];\n service._enabled = false;\n _allDefinedServices[categoryName][serviceName] = service;\n }\n }\n};\n\n/**\n * Obtain accepted and rejected services, consistent with the categories' state:\n * only the services of an accepted category are accepted, and nothing is rejected\n * until the consent is valid\n * @returns {{accepted: Object.<string, string[]>, rejected: Object.<string, string[]>}}\n */\nexport const getCurrentServicesState = () => {\n const accepted = {};\n const rejected = {};\n\n const {\n _invalidConsent,\n _allCategoryNames,\n _allDefinedServices,\n _acceptedCategories,\n _acceptedServices\n } = globalObj._state;\n\n for (const categoryName of _allCategoryNames) {\n accepted[categoryName] = elContains(_acceptedCategories, categoryName)\n ? _acceptedServices[categoryName]\n : [];\n\n rejected[categoryName] = _invalidConsent\n ? []\n : arrayDiff(accepted[categoryName], getKeys(_allDefinedServices[categoryName]));\n }\n\n return { accepted, rejected };\n};\n\nexport const retrieveCategoriesFromModal = () => {\n const toggles = globalObj._dom._categoryCheckboxInputs;\n\n if (!toggles)\n return [];\n\n let enabledCategories = [];\n\n for (let categoryName in toggles) {\n if (toggles[categoryName].checked) {\n enabledCategories.push(categoryName);\n }\n }\n\n return enabledCategories;\n};\n\n/**\n * @param {string[]|string} categories - Categories to accept\n * @param {string[]} [excludedCategories]\n */\nexport const resolveEnabledCategories = (categories, excludedCategories) => {\n const {\n _allCategoryNames,\n _acceptedCategories,\n _readOnlyCategories,\n _preferencesModalExists,\n _enabledServices,\n _defaultEnabledCategories,\n _allDefinedServices,\n _invalidConsent\n } = globalObj._state;\n\n /**\n * @type {string[]}\n */\n let enabledCategories = [];\n\n if (!categories) {\n // The default categories apply only until the user makes a choice\n enabledCategories = _invalidConsent\n ? [..._acceptedCategories, ..._defaultEnabledCategories]\n : [..._acceptedCategories];\n //{{START: GUI}}\n if (_preferencesModalExists) {\n const toggles = globalObj._dom._categoryCheckboxInputs;\n\n // Categories without a toggle keep their current state\n enabledCategories = [\n ...retrieveCategoriesFromModal(),\n ...enabledCategories.filter(categoryName => !toggles[categoryName])\n ];\n }\n //{{END: GUI}}\n } else {\n if (isArray(categories)) {\n enabledCategories.push(...categories);\n } else if (isString(categories)) {\n enabledCategories = categories === 'all'\n ? _allCategoryNames\n : [categories];\n }\n }\n\n // Remove invalid and excluded categories\n enabledCategories = enabledCategories.filter(category =>\n elContains(_allCategoryNames, category) &&\n !elContains(excludedCategories, category)\n );\n\n /**\n * If there are services, turn them all on or off\n */\n if (categories) {\n for (const categoryName of _allCategoryNames) {\n _enabledServices[categoryName] = elContains(enabledCategories, categoryName)\n ? getKeys(_allDefinedServices[categoryName])\n : [];\n }\n }\n\n // Add back all the categories set as \"readonly/required\"\n enabledCategories.push(..._readOnlyCategories);\n\n setAcceptedCategories(enabledCategories);\n};\n\n/**\n * @param {string} [relativeCategory]\n */\nexport const resolveEnabledServices = (relativeCategory) => {\n const state = globalObj._state;\n\n const {\n _enabledServices,\n _readOnlyCategories,\n _acceptedServices,\n _allDefinedServices,\n _allCategoryNames\n } = state;\n\n const categoriesToConsider = relativeCategory\n ? [relativeCategory]\n : _allCategoryNames;\n\n /**\n * Save previously enabled services to calculate later on which of them was changed\n */\n state._lastEnabledServices = deepCopy(_acceptedServices);\n\n for (const categoryName of categoriesToConsider) {\n const services = _allDefinedServices[categoryName];\n const serviceNames = getKeys(services);\n\n /**\n * Stop here if there are no services\n */\n if (serviceNames.length === 0)\n continue;\n\n // If category is marked as readOnly enable all its services\n _acceptedServices[categoryName] = unique(elContains(_readOnlyCategories, categoryName)\n ? serviceNames\n : _enabledServices[categoryName] || []\n );\n }\n};\n\n/**\n * True if the browser's Global Privacy Control signal must be honored:\n * `respectGpc` is enabled and there is no valid consent yet to override it\n */\nexport const isGpcOptOutActive = () => globalObj._config.respectGpc\n && globalObj._state._invalidConsent\n && navigator.globalPrivacyControl === true;\n\n/**\n * True if the toggle of the category (or of one of its services) should be checked.\n * Without `useAcceptedState`, the defaults are used.\n * @param {string} categoryName\n * @param {string} [serviceName]\n * @param {boolean} [useAcceptedState]\n */\nexport const isToggleChecked = (categoryName, serviceName, useAcceptedState) => {\n const state = globalObj._state;\n\n if (state._allDefinedCategories[categoryName].readOnly)\n return true;\n\n if (!useAcceptedState)\n return elContains(state._defaultEnabledCategories, categoryName);\n\n return serviceName\n ? elContains(state._acceptedServices[categoryName], serviceName)\n : elContains(state._acceptedCategories, categoryName);\n};\n\n/**\n * Tick/untick all the modal's toggles and reset the enabled services to match\n * @param {boolean} [useAcceptedState]\n */\nexport const syncModalToggles = (useAcceptedState) => {\n const { _categoryCheckboxInputs, _serviceCheckboxInputs } = globalObj._dom;\n\n for (const categoryName in _categoryCheckboxInputs) {\n const enabledServices = [];\n\n _categoryCheckboxInputs[categoryName].checked = isToggleChecked(categoryName, '', useAcceptedState);\n\n for (const serviceName in _serviceCheckboxInputs[categoryName]) {\n const serviceInput = _serviceCheckboxInputs[categoryName][serviceName];\n\n serviceInput.checked = isToggleChecked(categoryName, serviceName, useAcceptedState);\n serviceInput.checked && enabledServices.push(serviceName);\n }\n\n globalObj._state._enabledServices[categoryName] = enabledServices;\n }\n};\n\n/**\n * Update services state internally and tick/untick checkboxes\n * @param {string|string[]} service\n * @param {string} category\n */\nexport const updateModalToggles = (service, category) => {\n const state = globalObj._state;\n const {\n _allDefinedServices,\n _enabledServices,\n _preferencesModalExists\n } = state;\n\n const servicesInputs = globalObj._dom._serviceCheckboxInputs[category] || {};\n const categoryInput = globalObj._dom._categoryCheckboxInputs[category];\n const allServiceNames = getKeys(_allDefinedServices[category]);\n\n // Clear previously enabled services\n _enabledServices[category] = [];\n\n if (isString(service)) {\n if (service === 'all') {\n\n // Enable all services\n _enabledServices[category].push(...allServiceNames);\n\n if (_preferencesModalExists) {\n for (let serviceName in servicesInputs) {\n servicesInputs[serviceName].checked = true;\n dispatchInputChangeEvent(servicesInputs[serviceName]);\n }\n }\n\n } else {\n\n // Enable only one service (if valid) and disable all the others\n if (elContains(allServiceNames, service))\n _enabledServices[category].push(service);\n\n if (_preferencesModalExists) {\n for (let serviceName in servicesInputs) {\n servicesInputs[serviceName].checked = service === serviceName;\n dispatchInputChangeEvent(servicesInputs[serviceName]);\n }\n }\n }\n } else if (isArray(service)) {\n for (let serviceName of allServiceNames) {\n const validService = elContains(service, serviceName);\n const serviceInput = servicesInputs[serviceName];\n validService && _enabledServices[category].push(serviceName);\n\n if (serviceInput) {\n serviceInput.checked = validService;\n dispatchInputChangeEvent(serviceInput);\n }\n }\n }\n\n const uncheckCategory = _enabledServices[category].length === 0;\n\n /**\n * Remove/add the category from acceptedCategories\n */\n state._acceptedCategories = uncheckCategory\n ? state._acceptedCategories.filter(cat => cat !== category)\n : unique([...state._acceptedCategories, category]);\n\n /**\n * If there are no services enabled in the\n * current category, uncheck the category\n */\n if (categoryInput) {\n categoryInput.checked = !uncheckCategory;\n dispatchInputChangeEvent(categoryInput);\n }\n};\n\n/**\n * Calculate \"accept type\"\n * @returns {'all'|'custom'|'necessary'} accept type\n */\nexport const resolveAcceptType = () => {\n let type = 'custom';\n\n const { _acceptedCategories, _allCategoryNames, _readOnlyCategories } = globalObj._state;\n const nAcceptedCategories = _acceptedCategories.length;\n\n if (nAcceptedCategories === _allCategoryNames.length)\n type = 'all';\n else if (nAcceptedCategories === _readOnlyCategories.length)\n type = 'necessary';\n\n return type;\n};\n\n/**\n * Note: getUserPreferences() depends on \"acceptType\"\n * @param {string[]} acceptedCategories\n */\nexport const setAcceptedCategories = (acceptedCategories) => {\n globalObj._state._acceptedCategories = unique(acceptedCategories);\n globalObj._state._acceptType = resolveAcceptType();\n};\n\n/**\n * This callback type is called `requestCallback` and is displayed as a global symbol.\n *\n * @callback createModal\n * @param {import('../core/global').Api} api\n */\n\n/**\n * Obtain accepted and rejected categories\n * @returns {{accepted: string[], rejected: string[]}}\n */\nexport const getCurrentCategoriesState = () => {\n const {\n _invalidConsent,\n _acceptedCategories,\n _allCategoryNames\n } = globalObj._state;\n\n return {\n accepted: _acceptedCategories,\n rejected: _invalidConsent\n ? []\n : _allCategoryNames.filter(category =>\n !elContains(_acceptedCategories, category)\n )\n };\n};\n","/**\n * Helper console.log function\n * @param {any} [params]\n */\nexport const debug = (...params) => {\n console.log(...params);\n};\n","import { globalObj } from '../core/global';\nimport { deepCopy } from './collections';\nimport { isFunction } from './type-guards';\n\n/**\n * @param {string} eventName\n */\nconst dispatchPluginEvent = (eventName, data) => dispatchEvent(new CustomEvent(eventName, {detail: data}));\n\n/**\n * Fire custom event\n * @param {string} eventName\n * @param {string} [modalName]\n * @param {HTMLElement} [modal]\n */\nexport const fireEvent = (eventName, modalName, modal) => {\n const {\n _onChange,\n _onConsent,\n _onFirstConsent,\n _onModalHide,\n _onModalReady,\n _onModalShow\n } = globalObj._callbacks;\n\n const events = globalObj._customEvents;\n\n //{{START: GUI}}\n if (modalName) {\n const modalParams = { modalName };\n\n if (eventName === events._onModalShow) {\n isFunction(_onModalShow) && _onModalShow(modalParams);\n } else if (eventName === events._onModalHide) {\n isFunction(_onModalHide) && _onModalHide(modalParams);\n } else {\n modalParams.modal = modal;\n isFunction(_onModalReady) && _onModalReady(modalParams);\n }\n\n return dispatchPluginEvent(eventName, modalParams);\n }\n //{{END: GUI}}\n\n const params = {\n cookie: globalObj._state._savedCookieContent\n };\n\n if (eventName === events._onFirstConsent) {\n isFunction(_onFirstConsent) && _onFirstConsent(deepCopy(params));\n } else if (eventName === events._onConsent) {\n isFunction(_onConsent) && _onConsent(deepCopy(params));\n } else {\n params.changedCategories = globalObj._state._lastChangedCategoryNames;\n params.changedServices = globalObj._state._lastChangedServices;\n isFunction(_onChange) && _onChange(deepCopy(params));\n }\n\n dispatchPluginEvent(eventName, deepCopy(params));\n};\n","import { globalObj } from '../core/global';\nimport { isGpcOptOutActive } from './categories';\nimport { elContains } from './collections';\nimport {\n createNode,\n getAttribute,\n querySelectorAll,\n removeAttribute,\n setAttribute\n} from './dom';\nimport { isFunction } from './type-guards';\nimport { SCRIPT_TAG_SELECTOR, OPT_OUT_MODE } from './constants';\n\n/**\n * @param {string} type\n */\nconst validMimeType = type => ['text/javascript', 'module'].includes(type);\n\n/**\n * This function handles the loading/activation logic of the already\n * existing scripts based on the current accepted cookie categories\n */\nexport const manageExistingScripts = () => {\n const {\n _acceptedCategories,\n _acceptedServices,\n _lastChangedServices,\n _allCategoryNames,\n _allDefinedServices,\n _allScriptTags,\n _lastChangedCategoryNames,\n } = globalObj._state;\n\n /**\n * Automatically Enable/Disable internal services\n */\n for (const categoryName of _allCategoryNames) {\n const changedServices = _lastChangedServices[categoryName];\n\n // Nothing changed (e.g. readOnly services on the first consent):\n // check the accepted services that are not enabled yet\n const lastChangedServices = changedServices && changedServices.length > 0\n ? changedServices\n : _acceptedServices[categoryName] || [];\n\n for (const serviceName of lastChangedServices) {\n const service = _allDefinedServices[categoryName][serviceName];\n\n if (!service)\n continue;\n\n const { onAccept, onReject } = service;\n\n if (\n !service._enabled\n && elContains(_acceptedServices[categoryName], serviceName)\n ) {\n service._enabled = true;\n isFunction(onAccept) && onAccept();\n }\n\n else if (\n service._enabled\n && !elContains(_acceptedServices[categoryName], serviceName)\n ) {\n service._enabled = false;\n isFunction(onReject) && onReject();\n }\n }\n }\n\n if (!globalObj._config.manageScriptTags)\n return;\n\n const scripts = _allScriptTags;\n\n /**\n * Load scripts (sequentially), using a recursive function\n * which loops through the scripts array\n * @param {import('../core/global').ScriptInfo[]} scripts scripts to load\n * @param {number} index current script to load\n */\n const loadScriptsHelper = (scripts, index) => {\n if (index >= scripts.length)\n return;\n\n const currScriptInfo = _allScriptTags[index];\n\n /**\n * Skip script if it was already executed\n */\n if (currScriptInfo._executed)\n return loadScriptsHelper(scripts, index+1);\n\n const currScript = currScriptInfo._script;\n const currScriptCategory = currScriptInfo._categoryName;\n const currScriptService = currScriptInfo._serviceName;\n const categoryAccepted = elContains(_acceptedCategories, currScriptCategory);\n const serviceAccepted = currScriptService\n ? elContains(_acceptedServices[currScriptCategory], currScriptService)\n : false;\n\n const categoryWasJustEnabled = () => !currScriptService\n && !currScriptInfo._runOnDisable\n && categoryAccepted;\n\n const serviceWasJustEnabled = () => currScriptService\n && !currScriptInfo._runOnDisable\n && serviceAccepted;\n\n const categoryWasJustDisabled = () => !currScriptService\n && currScriptInfo._runOnDisable\n && !categoryAccepted\n && elContains(_lastChangedCategoryNames, currScriptCategory);\n\n const serviceWasJustDisabled = () => currScriptService\n && currScriptInfo._runOnDisable\n && !serviceAccepted\n && elContains(_lastChangedServices[currScriptCategory] || [], currScriptService);\n\n const shouldRunScript =\n categoryWasJustEnabled()\n || categoryWasJustDisabled()\n || serviceWasJustEnabled()\n || serviceWasJustDisabled();\n\n if (shouldRunScript) {\n currScriptInfo._executed = true;\n const dataType = getAttribute(currScript, 'type', true);\n\n removeAttribute(currScript, 'type', !!dataType);\n removeAttribute(currScript, SCRIPT_TAG_SELECTOR);\n\n // Get current script data-src (if there is one)\n let src = getAttribute(currScript, 'src', true);\n\n // Some scripts (like ga) might throw warning if data-src is present\n src && removeAttribute(currScript, 'src', true);\n\n /**\n * Fresh script\n * @type {HTMLScriptElement}\n */\n const freshScript = createNode('script');\n\n freshScript.textContent = currScript.innerHTML;\n\n // Copy attributes over to the new \"revived\" script; properties are\n // preferred since some values (e.g. `nonce`) are hidden from attributes\n for (const {nodeName} of currScript.attributes) {\n setAttribute(\n freshScript,\n nodeName,\n currScript[nodeName] || getAttribute(currScript, nodeName)\n );\n }\n\n /**\n * Set custom type\n */\n dataType && (freshScript.type = dataType);\n\n // Set src (if data-src found)\n src\n ? (freshScript.src = src)\n : (src = currScript.src);\n\n const externalScript = !!src && (dataType ? validMimeType(dataType) : true);\n\n // If script has valid \"src\" attribute\n // try loading it sequentially\n if (externalScript) {\n // load script sequentially => the next script will not be loaded\n // until the current's script onload event triggers\n freshScript.onload = freshScript.onerror = () => {\n loadScriptsHelper(scripts, ++index);\n };\n }\n\n // Replace current \"sleeping\" script with the new \"revived\" one\n currScript.replaceWith(freshScript);\n\n /**\n * If we managed to get here and src is still set, it means that\n * the script is loading/loaded sequentially so don't go any further\n */\n if (externalScript)\n return;\n }\n\n\n // Go to next script right away\n loadScriptsHelper(scripts, ++index);\n };\n\n loadScriptsHelper(scripts, 0);\n};\n\n/**\n * Keep track of categories enabled by default (useful when mode==OPT_OUT_MODE)\n */\nexport const retrieveEnabledCategoriesAndServices = () => {\n const state = globalObj._state;\n\n for (const categoryName of state._allCategoryNames) {\n const category = state._allDefinedCategories[categoryName];\n\n if (category.readOnly || (category.enabled && !isGpcOptOutActive())) {\n state._defaultEnabledCategories.push(categoryName);\n const services = state._allDefinedServices[categoryName] || {};\n\n for (let serviceName in services) {\n state._enabledServices[categoryName].push(serviceName);\n if (\n state._userConfig.mode === OPT_OUT_MODE\n && !elContains(state._acceptedServices[categoryName], serviceName)\n ) {\n state._acceptedServices[categoryName].push(serviceName);\n }\n }\n }\n }\n};\n\n/**\n * Retrieves all script elements with 'data-category' attribute\n * and save the following attributes: category-name and service\n */\nexport const retrieveScriptElements = () => {\n if (!globalObj._config.manageScriptTags)\n return;\n\n const state = globalObj._state;\n\n /**\n * @type {NodeListOf<HTMLScriptElement>}\n */\n const scripts = querySelectorAll(document, 'script[' + SCRIPT_TAG_SELECTOR +']');\n\n for (const scriptTag of scripts) {\n let scriptCategoryName = getAttribute(scriptTag, SCRIPT_TAG_SELECTOR);\n let scriptServiceName = scriptTag.dataset.service || '';\n let runOnDisable = false;\n\n /**\n * Remove the '!' char if it is present\n */\n if (scriptCategoryName && scriptCategoryName.charAt(0) === '!') {\n scriptCategoryName = scriptCategoryName.slice(1);\n runOnDisable = true;\n }\n\n if (scriptServiceName.charAt(0) === '!') {\n scriptServiceName = scriptServiceName.slice(1);\n runOnDisable = true;\n }\n\n if (elContains(state._allCategoryNames, scriptCategoryName)) {\n state._allScriptTags.push({\n _script: scriptTag,\n _executed: false,\n _runOnDisable: runOnDisable,\n _categoryName: scriptCategoryName,\n _serviceName: scriptServiceName\n });\n\n if (scriptServiceName) {\n const categoryServices = state._allDefinedServices[scriptCategoryName];\n if (!categoryServices[scriptServiceName]) {\n categoryServices[scriptServiceName] = {\n _enabled: false\n };\n }\n }\n }\n }\n};\n","import { globalObj } from '../core/global';\nimport { CLICK_EVENT } from './constants';\nimport {\n addEvent,\n preventDefault,\n querySelectorAll,\n setAttribute\n} from './dom';\n\n/**\n * Add an onClick listeners to all html elements with data-cc attribute\n * @param {HTMLElement} [elem]\n * @param {import('../core/global').Api} api\n * @param {createModal} [createPreferencesModal]\n */\nexport const addDataButtonListeners = (elem, api, createPreferencesModal, createMainContainer) => {\n const ACCEPT_PREFIX = 'accept-';\n\n const {\n show,\n showPreferences,\n hide,\n hidePreferences,\n acceptCategory\n } = api;\n\n const rootEl = elem || document;\n const getElements = dataRole => querySelectorAll(rootEl, `[data-cc=\"${dataRole}\"]`);\n\n /**\n * Helper function: accept and then hide modals\n * @param {Event} event source event\n * @param {string|string[]} [acceptType]\n */\n const acceptAction = (event, acceptType) => {\n preventDefault(event);\n acceptCategory(acceptType);\n hidePreferences();\n hide();\n };\n\n const\n showPreferencesModalElements = getElements('show-preferencesModal'),\n showConsentModalElements = getElements('show-consentModal'),\n acceptAllElements = getElements(ACCEPT_PREFIX + 'all'),\n acceptNecessaryElements = getElements(ACCEPT_PREFIX + 'necessary'),\n acceptCustomElements = getElements(ACCEPT_PREFIX + 'custom'),\n createPreferencesModalOnHover = globalObj._config.lazyHtmlGeneration;\n\n //{{START: GUI}}\n for (const el of showPreferencesModalElements) {\n setAttribute(el, 'aria-haspopup', 'dialog');\n addEvent(el, CLICK_EVENT, (event) => {\n preventDefault(event);\n showPreferences();\n }, true);\n\n if (createPreferencesModalOnHover) {\n addEvent(el, 'mouseenter', (event) => {\n preventDefault(event);\n if (!globalObj._state._preferencesModalExists)\n createPreferencesModal(api, createMainContainer);\n }, true);\n\n addEvent(el, 'focus', () => {\n if (!globalObj._state._preferencesModalExists)\n createPreferencesModal(api, createMainContainer);\n }, true);\n }\n }\n\n for (let el of showConsentModalElements) {\n setAttribute(el, 'aria-haspopup', 'dialog');\n addEvent(el, CLICK_EVENT, (event) => {\n preventDefault(event);\n show(true);\n }, true);\n }\n //{{END: GUI}}\n\n for (let el of acceptAllElements) {\n addEvent(el, CLICK_EVENT, (event) => {\n acceptAction(event, 'all');\n }, true);\n }\n\n for (let el of acceptCustomElements) {\n addEvent(el, CLICK_EVENT, (event) => {\n acceptAction(event);\n }, true);\n }\n\n for (let el of acceptNecessaryElements) {\n addEvent(el, CLICK_EVENT, (event) => {\n acceptAction(event, []);\n }, true);\n }\n};\n","import { globalObj } from '../core/global';\nimport { BUTTON_TAG } from './constants';\nimport {\n addEvent,\n focus,\n getActiveElement,\n preventDefault,\n querySelectorAll\n} from './dom';\n\n/**\n * Trap focus inside modal and focus the first\n * focusable element of current active modal\n * @param {HTMLDivElement} modal\n */\nexport const handleFocusTrap = (modal) => {\n const dom = globalObj._dom;\n const state = globalObj._state;\n\n /**\n * @param {HTMLDivElement} modal\n * @param {HTMLElement[]} focusableElements\n */\n const trapFocus = (modal) => {\n const isConsentModal = modal === dom._cm;\n\n const scope = state._userConfig.disablePageInteraction\n ? dom._htmlDom\n : isConsentModal\n ? dom._ccMain\n : dom._htmlDom;\n\n const getFocusableElements = () => isConsentModal\n ? state._cmFocusableElements\n : state._pmFocusableElements;\n\n const isModalVisible = () => isConsentModal\n ? state._consentModalVisible && !state._preferencesModalVisible\n : state._preferencesModalVisible;\n\n addEvent(scope, 'keydown', (e) => {\n if (e.key !== 'Tab' || !isModalVisible())\n return;\n\n const currentActiveElement = getActiveElement();\n const focusableElements = getFocusableElements();\n\n if (focusableElements.length === 0)\n return;\n\n /**\n * If reached natural end of the tab sequence => restart\n * If current focused element is not inside modal => focus modal\n */\n if (e.shiftKey) {\n // Include the initial focus target, which is outside the tab sequence.\n const initialFocusElement = isConsentModal ? dom._cmDivTabindex : dom._pmDivTabindex;\n if (currentActiveElement === focusableElements[0] || currentActiveElement === initialFocusElement || !modal.contains(currentActiveElement)) {\n preventDefault(e);\n focus(focusableElements[1]);\n }\n } else {\n if (currentActiveElement === focusableElements[1] || !modal.contains(currentActiveElement)) {\n preventDefault(e);\n focus(focusableElements[0]);\n }\n }\n }, true);\n };\n\n trapFocus(modal);\n};\n\n/**\n * Note: any of the below focusable elements, which has the attribute tabindex=\"-1\" AND is either\n * the first or last element of the modal, won't receive focus during \"open/close\" modal\n */\nconst focusableTypesSelector = ['[href]', BUTTON_TAG, 'input', 'details', '[tabindex]']\n .map(selector => selector+':not([tabindex=\"-1\"])').join(',');\n\nexport const getFocusableElements = (root) => querySelectorAll(root, focusableTypesSelector);\n\n/**\n * Save reference to first and last focusable elements inside each modal\n * to prevent losing focus while navigating with TAB\n * @param {1 | 2} [modalId]\n */\nexport const getModalFocusableData = (modalId) => {\n const { _state, _dom } = globalObj;\n\n /**\n * Saves all focusable elements inside modal, into the array\n * @param {HTMLElement} modal\n * @param {Element[]} array\n */\n const saveAllFocusableElements = (modal, array) => {\n const focusableElements = getFocusableElements(modal);\n\n /**\n * Save first and last elements (trap focus inside modal)\n */\n array[0] = focusableElements[0];\n array[1] = focusableElements[focusableElements.length - 1];\n };\n\n if (modalId === 1 && _state._consentModalExists)\n saveAllFocusableElements(_dom._cm, _state._cmFocusableElements);\n\n if (modalId === 2 && _state._preferencesModalExists)\n saveAllFocusableElements(_dom._pm, _state._pmFocusableElements);\n};\n","const iconStrokes = [\n 'M 19.5 4.5 L 4.5 19.5 M 4.5 4.501 L 19.5 19.5', // X\n 'M 3.572 13.406 L 8.281 18.115 L 20.428 5.885', // TICK\n 'M 21.999 6.94 L 11.639 17.18 L 2.001 6.82 ' // ARROW\n];\n\n/**\n * [0: x, 1: tick, 2: arrow]\n * @param {0 | 1 | 2} [iconIndex]\n * @param {number} [strokeWidth]\n */\nexport const getSvgIcon = (iconIndex = 0, strokeWidth = 1.5) => {\n return `<svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" stroke-width=\"${strokeWidth}\"><path d=\"${iconStrokes[iconIndex]}\"/></svg>`;\n};\n","import { globalObj } from '../core/global';\nimport { elContains } from './collections';\nimport { addClass, removeClass } from './dom';\n\n/**\n * @typedef {Object} Layout\n * @property {string[]} _variants\n * @property {string[]} _alignV\n * @property {string[]} _alignH\n * @property {string} _defaultAlignV\n * @property {string} _defaultAlignH\n */\n\n/**\n * @typedef {Object.<string, Layout>} Layouts\n */\n\nconst CLASS_CONSTANTS = {\n _top: 'top',\n _middle: 'middle',\n _bottom: 'bottom',\n _left: 'left',\n _center: 'center',\n _right: 'right',\n _inline: 'inline',\n _wide: 'wide',\n _pmPrefix: 'pm--',\n _cmPrefix: 'cm--',\n _box: 'box'\n};\n\nconst alignV = [\n CLASS_CONSTANTS._middle,\n CLASS_CONSTANTS._top,\n CLASS_CONSTANTS._bottom\n];\n\nconst alignH = [\n CLASS_CONSTANTS._left,\n CLASS_CONSTANTS._center,\n CLASS_CONSTANTS._right\n];\n\nconst ALL_CM_LAYOUTS = {\n box: {\n _variants: [CLASS_CONSTANTS._wide, CLASS_CONSTANTS._inline],\n _alignV: alignV,\n _alignH: alignH,\n _defaultAlignV: CLASS_CONSTANTS._bottom,\n _defaultAlignH: CLASS_CONSTANTS._right\n },\n cloud: {\n _variants: [CLASS_CONSTANTS._inline],\n _alignV: alignV,\n _alignH: alignH,\n _defaultAlignV: CLASS_CONSTANTS._bottom,\n _defaultAlignH: CLASS_CONSTANTS._center\n },\n bar: {\n _variants: [CLASS_CONSTANTS._inline],\n _alignV: alignV.slice(1), //remove the first \"middle\" option\n _alignH: [],\n _defaultAlignV: CLASS_CONSTANTS._bottom,\n _defaultAlignH: ''\n }\n};\n\nconst ALL_PM_LAYOUTS = {\n box: {\n _variants: [],\n _alignV: [],\n _alignH: [],\n _defaultAlignV: '',\n _defaultAlignH: ''\n },\n bar: {\n _variants: [CLASS_CONSTANTS._wide],\n _alignV: [],\n _alignH: [CLASS_CONSTANTS._left, CLASS_CONSTANTS._right],\n _defaultAlignV: '',\n _defaultAlignH: CLASS_CONSTANTS._left\n }\n};\n\n/**\n * Add appropriate classes to modals and buttons\n * @param {0 | 1} applyToModal\n */\nexport const guiManager = (applyToModal) => {\n const guiOptions = globalObj._state._userConfig.guiOptions;\n const consentModalOptions = guiOptions && guiOptions.consentModal;\n const preferencesModalOptions = guiOptions && guiOptions.preferencesModal;\n\n if (applyToModal === 0) {\n setLayout(\n globalObj._dom._cm,\n ALL_CM_LAYOUTS,\n consentModalOptions,\n CLASS_CONSTANTS._cmPrefix,\n CLASS_CONSTANTS._box,\n 'cm'\n );\n }\n\n if (applyToModal === 1) {\n setLayout(\n globalObj._dom._pm,\n ALL_PM_LAYOUTS,\n preferencesModalOptions,\n CLASS_CONSTANTS._pmPrefix,\n CLASS_CONSTANTS._box,\n 'pm'\n );\n }\n};\n\n/**\n * Helper function to set the proper layout classes\n * @param {HTMLElement} modal\n * @param {Layouts} allowedLayoutsObj\n * @param {import(\"../core/global\").GuiModalOption} userGuiOptions\n * @param {'cm--' | 'pm--'} modalClassPrefix\n * @param {string} defaultLayoutName\n * @param {'cm' | 'pm'} modalClassName\n */\nconst setLayout = (modal, allowedLayoutsObj, userGuiOptions, modalClassPrefix, defaultLayoutName, modalClassName) => {\n /**\n * Reset modal classes to default\n */\n modal.className = modalClassName;\n\n const layout = userGuiOptions && userGuiOptions.layout;\n const position = userGuiOptions && userGuiOptions.position;\n const flipButtons = userGuiOptions && userGuiOptions.flipButtons;\n const equalWeightButtons = !userGuiOptions || userGuiOptions.equalWeightButtons !== false;\n\n const layoutSplit = layout && layout.split(' ') || [];\n\n const layoutName = layoutSplit[0];\n const layoutVariant = layoutSplit[1];\n\n const currentLayoutName = layoutName in allowedLayoutsObj\n ? layoutName\n : defaultLayoutName;\n\n const currentLayout = allowedLayoutsObj[currentLayoutName];\n const currentLayoutVariant = elContains(currentLayout._variants, layoutVariant) && layoutVariant;\n\n const positionSplit = position && position.split(' ') || [];\n const positionV = positionSplit[0];\n\n const positionH = modalClassPrefix === CLASS_CONSTANTS._pmPrefix\n ? positionSplit[0]\n : positionSplit[1];\n\n const currentPositionV = elContains(currentLayout._alignV, positionV)\n ? positionV\n : currentLayout._defaultAlignV;\n\n const currentPositionH = elContains(currentLayout._alignH, positionH)\n ? positionH\n : currentLayout._defaultAlignH;\n\n const addModalClass = className => {\n className && addClass(modal, modalClassPrefix + className);\n };\n\n addModalClass(currentLayoutName);\n addModalClass(currentLayoutVariant);\n addModalClass(currentPositionV);\n addModalClass(currentPositionH);\n flipButtons && addModalClass('flip');\n\n const secondaryBtnClass = 'btn--secondary';\n const btnClassPrefix = modalClassName + '__';\n const btnClass = btnClassPrefix + secondaryBtnClass;\n\n /**\n * Add classes to buttons\n */\n if (modalClassName === 'cm') {\n const {_cmAcceptNecessaryBtn, _cmCloseIconBtn} = globalObj._dom;\n\n if (_cmAcceptNecessaryBtn) {\n equalWeightButtons\n ? removeClass(_cmAcceptNecessaryBtn, btnClass)\n : addClass(_cmAcceptNecessaryBtn, btnClass);\n }\n\n if (_cmCloseIconBtn) {\n equalWeightButtons\n ? removeClass(_cmCloseIconBtn, btnClass)\n : addClass(_cmCloseIconBtn, btnClass);\n }\n } else {\n const { _pmAcceptNecessaryBtn } = globalObj._dom;\n\n if (_pmAcceptNecessaryBtn) {\n equalWeightButtons\n ? removeClass(_pmAcceptNecessaryBtn, btnClass)\n : addClass(_pmAcceptNecessaryBtn, btnClass);\n }\n }\n};","import { globalObj } from '../global';\nimport { isToggleChecked } from '../../utils/categories';\nimport { getKeys } from '../../utils/collections';\nimport { debug } from '../../utils/debug';\nimport {\n addClass,\n addClassPm,\n addEvent,\n appendChild,\n createNode,\n hasClass,\n removeAttribute,\n removeClass,\n setAttribute\n} from '../../utils/dom';\nimport { fireEvent } from '../../utils/events';\nimport { getModalFocusableData, handleFocusTrap } from '../../utils/focus-trap';\nimport { getSvgIcon } from '../../utils/svg-icons';\nimport { isObject, isString } from '../../utils/type-guards';\n\nimport { guiManager } from '../../utils/gui-manager';\nimport {\n PREFERENCES_MODAL_NAME,\n SCRIPT_TAG_SELECTOR,\n DIV_TAG,\n ARIA_HIDDEN,\n BUTTON_TAG,\n BTN_GROUP_CLASS,\n CLICK_EVENT,\n DATA_ROLE\n} from '../../utils/constants';\n\n/**\n * @callback CreateMainContainer\n */\n\n/**\n * Generates preferences modal and appends it to \"cc-main\" el.\n * @param {import(\"../global\").Api} api\n * @param {CreateMainContainer} createMainContainer\n */\nexport const createPreferencesModal = (api, createMainContainer) => {\n const state = globalObj._state;\n const dom = globalObj._dom;\n const {hide, hidePreferences, acceptCategory} = api;\n\n /**\n * @param {string|string[]} [categories]\n */\n const acceptHelper = (categories) => {\n acceptCategory(categories);\n hidePreferences();\n hide();\n };\n\n /**\n * @type {import(\"../global\").PreferencesModalOptions}\n */\n const modalData = state._currentTranslation && state._currentTranslation.preferencesModal;\n\n if (!modalData)\n return;\n\n const\n titleData = modalData.title,\n closeIconLabelData = modalData.closeIconLabel,\n acceptAllBtnData = modalData.acceptAllBtn,\n acceptNecessaryBtnData = modalData.acceptNecessaryBtn,\n savePreferencesBtnData = modalData.savePreferencesBtn,\n sectionsData = modalData.sections || [],\n createFooter = acceptAllBtnData\n || acceptNecessaryBtnData\n || savePreferencesBtnData;\n\n if (!dom._pmContainer) {\n dom._pmContainer = createNode(DIV_TAG, 'pm-wrapper');\n\n const pmOverlay = createNode('div', 'pm-overlay');\n appendChild(dom._pmContainer, pmOverlay);\n\n /**\n * Hide modal when overlay is clicked\n */\n addEvent(pmOverlay, CLICK_EVENT, hidePreferences);\n\n // Preferences modal\n dom._pm = createNode(DIV_TAG, 'pm');\n setAttribute(dom._pm, 'role', 'dialog');\n setAttribute(dom._pm, ARIA_HIDDEN, true);\n setAttribute(dom._pm, 'aria-modal', true);\n setAttribute(dom._pm, 'aria-labelledby', 'pm__title');\n\n // Hide preferences on 'esc' key press\n addEvent(dom._htmlDom, 'keydown', (event) => {\n if (event.key === 'Escape')\n hidePreferences();\n }, true);\n\n dom._pmHeader = createNode(DIV_TAG, 'pm__header');\n\n dom._pmTitle = createNode('h2', 'pm__title');\n dom._pmTitle.id = 'pm__title';\n\n dom._pmCloseBtn = createNode(BUTTON_TAG, 'pm__close-btn');\n setAttribute(dom._pmCloseBtn, 'aria-label', modalData.closeIconLabel || '');\n addEvent(dom._pmCloseBtn, CLICK_EVENT, hidePreferences);\n\n dom._pmFocusSpan = createNode('span');\n dom._pmFocusSpan.innerHTML = getSvgIcon();\n appendChild(dom._pmCloseBtn, dom._pmFocusSpan);\n\n dom._pmBody = createNode(DIV_TAG, 'pm__body');\n\n dom._pmFooter = createNode(DIV_TAG, 'pm__footer');\n\n dom._pmBtnGroup1 = createNode(DIV_TAG);\n dom._pmBtnGroup2 = createNode(DIV_TAG);\n addClassPm(dom._pmBtnGroup1, BTN_GROUP_CLASS);\n addClassPm(dom._pmBtnGroup2, BTN_GROUP_CLASS);\n\n appendChild(dom._pmFooter, dom._pmBtnGroup1);\n appendChild(dom._pmFooter, dom._pmBtnGroup2);\n\n appendChild(dom._pmHeader, dom._pmTitle);\n appendChild(dom._pmHeader, dom._pmCloseBtn);\n\n dom._pmDivTabindex = dom._pmTitle;\n setAttribute(dom._pmDivTabindex, 'tabIndex', -1);\n\n appendChild(dom._pm, dom._pmHeader);\n appendChild(dom._pm, dom._pmBody);\n appendChild(dom._pmContainer, dom._pm);\n } else {\n dom._pmNewBody = createNode(DIV_TAG, 'pm__body');\n }\n\n if (titleData) {\n dom._pmTitle.innerHTML = titleData;\n closeIconLabelData && setAttribute(dom._pmCloseBtn, 'aria-label', closeIconLabelData);\n }\n\n let sectionToggleContainer;\n\n sectionsData.forEach((section, sectionIndex) => {\n const\n sTitleData = section.title,\n sDescriptionData = section.description,\n sLinkedCategory = section.linkedCategory,\n sCurrentCategoryObject = sLinkedCategory && state._allDefinedCategories[sLinkedCategory],\n sCookieTableData = section.cookieTable,\n sCookieTableBody = sCookieTableData && sCookieTableData.body,\n sCreateCookieTable = sCookieTableBody && sCookieTableBody.length > 0,\n hasToggle = !!sCurrentCategoryObject,\n\n /**\n * @type {Object.<string, import('../global').Service>}\n */\n sServices = hasToggle && state._allDefinedServices[sLinkedCategory],\n sServiceNames = isObject(sServices) && getKeys(sServices) || [],\n sIsExpandableToggle = hasToggle && !!sTitleData && (!!sDescriptionData || !!sCreateCookieTable || getKeys(sServices).length>0),\n nServices = sServiceNames.length,\n expandableDivId = sLinkedCategory + '-desc';\n\n // section\n const s = createNode(DIV_TAG, 'pm__section');\n\n let sDescContainer, sTitle;\n\n if (sIsExpandableToggle || sDescriptionData) {\n sDescContainer = createNode(DIV_TAG, 'pm__section-desc-wrapper');\n }\n\n if (sIsExpandableToggle && nServices > 0)\n appendChild(sDescContainer, createServices(sServices, sServiceNames, sCurrentCategoryObject, sLinkedCategory));\n\n if (sTitleData) {\n const sTitleContainer = createNode(DIV_TAG);\n sTitle = createNode(hasToggle ? BUTTON_TAG : DIV_TAG);\n\n addClassPm(sTitleContainer, 'section-title-wrapper');\n addClassPm(sTitle, 'section-title');\n\n sTitle.innerHTML = sTitleData;\n appendChild(sTitleContainer, sTitle);\n\n if (hasToggle) {\n\n s.className += '--toggle';\n\n const toggleLabel = createToggleLabel(sTitleData, sLinkedCategory, sCurrentCategoryObject);\n const serviceCounterLabel = modalData.serviceCounterLabel;\n\n if (nServices > 0 && isString(serviceCounterLabel))\n appendChild(sTitle, createServiceCounter(nServices, serviceCounterLabel));\n\n if (sIsExpandableToggle) {\n /**\n * Arrow icon span\n */\n const sTitleIcon = createNode('span');\n sTitleIcon.innerHTML = getSvgIcon(2, 3.5);\n addClassPm(sTitleIcon, 'section-arrow');\n appendChild(sTitleContainer, sTitleIcon);\n\n addClassPm(s, 'section--expandable');\n setAttribute(sTitle, 'aria-expanded', false);\n setAttribute(sTitle, 'aria-controls', expandableDivId);\n }\n\n appendChild(sTitleContainer, toggleLabel);\n\n } else {\n setAttribute(sTitle, 'role', 'heading');\n setAttribute(sTitle, 'aria-level', '3');\n }\n\n appendChild(s, sTitleContainer);\n }\n\n if (sDescriptionData) {\n const sDesc = createNode('p', 'pm__section-desc');\n sDesc.innerHTML = sDescriptionData;\n appendChild(sDescContainer, sDesc);\n }\n\n if (sIsExpandableToggle) {\n setAttribute(sDescContainer, ARIA_HIDDEN, 'true');\n sDescContainer.id = expandableDivId;\n\n addExpandListener(sTitle, s, sDescContainer);\n\n if (sCreateCookieTable)\n appendChild(sDescContainer, createCookieTable(sCookieTableData, sectionIndex));\n }\n\n if (sIsExpandableToggle || sDescriptionData)\n appendChild(s, sDescContainer);\n\n const currentBody = dom._pmNewBody || dom._pmBody;\n\n if (hasToggle) {\n if (!sectionToggleContainer) {\n sectionToggleContainer = createNode(DIV_TAG, 'pm__section-toggles');\n }\n sectionToggleContainer.appendChild(s);\n } else {\n sectionToggleContainer = null;\n }\n\n appendChild(currentBody, sectionToggleContainer || s);\n\n });\n\n if (acceptAllBtnData) {\n if (!dom._pmAcceptAllBtn) {\n dom._pmAcceptAllBtn = createNode(BUTTON_TAG, 'pm__btn');\n setAttribute(dom._pmAcceptAllBtn, DATA_ROLE, 'all');\n appendChild(dom._pmBtnGroup1, dom._pmAcceptAllBtn);\n addEvent(dom._pmAcceptAllBtn, CLICK_EVENT, () =>\n acceptHelper('all')\n );\n }\n\n dom._pmAcceptAllBtn.innerHTML = acceptAllBtnData;\n }\n\n if (acceptNecessaryBtnData) {\n if (!dom._pmAcceptNecessaryBtn) {\n dom._pmAcceptNecessaryBtn = createNode(BUTTON_TAG, 'pm__btn');\n setAttribute(dom._pmAcceptNecessaryBtn, DATA_ROLE, 'necessary');\n appendChild(dom._pmBtnGroup1, dom._pmAcceptNecessaryBtn);\n addEvent(dom._pmAcceptNecessaryBtn, CLICK_EVENT, () =>\n acceptHelper([])\n );\n }\n\n dom._pmAcceptNecessaryBtn.innerHTML = acceptNecessaryBtnData;\n }\n\n if (savePreferencesBtnData) {\n if (!dom._pmSavePreferencesBtn) {\n dom._pmSavePreferencesBtn = createNode(BUTTON_TAG, 'pm__btn');\n addClassPm(dom._pmSavePreferencesBtn, 'btn--secondary');\n setAttribute(dom._pmSavePreferencesBtn, DATA_ROLE, 'save');\n appendChild(dom._pmBtnGroup2, dom._pmSavePreferencesBtn);\n\n addEvent(dom._pmSavePreferencesBtn, CLICK_EVENT, () =>\n acceptHelper()\n );\n }\n\n dom._pmSavePreferencesBtn.innerHTML = savePreferencesBtnData;\n }\n\n if (dom._pmNewBody) {\n dom._pm.replaceChild(dom._pmNewBody, dom._pmBody);\n dom._pmBody = dom._pmNewBody;\n }\n\n createFooter && appendChild(dom._pm, dom._pmFooter);\n\n guiManager(1);\n\n if (!state._preferencesModalExists) {\n state._preferencesModalExists = true;\n\n debug('CookieConsent [HTML] created', PREFERENCES_MODAL_NAME);\n\n fireEvent(globalObj._customEvents._onModalReady, PREFERENCES_MODAL_NAME, dom._pm);\n createMainContainer();\n appendChild(dom._ccMain, dom._pmContainer);\n handleFocusTrap(dom._pm);\n\n /**\n * Enable transition\n */\n setTimeout(() => addClass(dom._pmContainer, 'cc--anim'), 100);\n }\n\n getModalFocusableData(2);\n};\n\n/**\n * Generate the list of services (each with its own toggle) of a category\n * @param {Object.<string, import('../global').Service>} services\n * @param {string[]} serviceNames\n * @param {import('../global').Category} categoryObject\n * @param {string} categoryName\n */\nconst createServices = (services, serviceNames, categoryObject, categoryName) => {\n const servicesContainer = createNode(DIV_TAG, 'pm__section-services');\n\n for (const serviceName of serviceNames) {\n const service = services[serviceName];\n const serviceLabel = service && service.label || serviceName;\n const serviceDiv = createNode(DIV_TAG);\n const serviceHeader = createNode(DIV_TAG);\n const serviceIconContainer = createNode(DIV_TAG);\n const serviceTitle = createNode(DIV_TAG);\n\n addClassPm(serviceDiv, 'service');\n addClassPm(serviceTitle, 'service-title');\n addClassPm(serviceHeader, 'service-header');\n addClassPm(serviceIconContainer, 'service-icon');\n\n const toggleLabel = createToggleLabel(serviceLabel, serviceName, categoryObject, true, categoryName);\n\n serviceTitle.innerHTML = serviceLabel;\n\n appendChild(serviceHeader, serviceIconContainer);\n appendChild(serviceHeader, serviceTitle);\n appendChild(serviceDiv, serviceHeader);\n appendChild(serviceDiv, toggleLabel);\n appendChild(servicesContainer, serviceDiv);\n }\n\n return servicesContainer;\n};\n\n/**\n * Generate the \"N services\" badge\n * @param {number} nServices\n * @param {string} counterLabel singular and plural form, separated by \"|\"\n */\nconst createServiceCounter = (nServices, counterLabel) => {\n const serviceCounter = createNode('span', 'pm__badge');\n addClassPm(serviceCounter, 'service-counter');\n setAttribute(serviceCounter, ARIA_HIDDEN, true);\n setAttribute(serviceCounter, 'data-servicecounter', nServices);\n\n if (counterLabel) {\n const labels = counterLabel.split('|');\n\n counterLabel = labels.length > 1 && nServices > 1\n ? labels[1]\n : labels[0];\n\n setAttribute(serviceCounter, 'data-counterlabel', counterLabel);\n }\n\n serviceCounter.innerHTML = nServices + (counterLabel\n ? ' ' + counterLabel\n : '');\n\n return serviceCounter;\n};\n\n/**\n * Expand/collapse the section when its title is clicked\n * @param {HTMLElement} btn\n * @param {HTMLElement} section\n * @param {HTMLElement} accordion\n */\nconst addExpandListener = (btn, section, accordion) => {\n addEvent(btn, CLICK_EVENT, () => {\n if (!hasClass(section, 'is-expanded')) {\n addClass(section, 'is-expanded');\n setAttribute(btn, 'aria-expanded', 'true');\n removeAttribute(accordion, ARIA_HIDDEN);\n } else {\n removeClass(section, 'is-expanded');\n setAttribute(btn, 'aria-expanded', 'false');\n setAttribute(accordion, ARIA_HIDDEN, 'true');\n }\n });\n};\n\n/**\n * Generate the section's cookie table\n * @param {import('../global').CookieTable} cookieTableData\n * @param {number} sectionIndex\n */\nconst createCookieTable = (cookieTableData, sectionIndex) => {\n const table = createNode('table');\n const thead = createNode('thead');\n const tbody = createNode('tbody');\n const caption = cookieTableData.caption;\n\n if (caption) {\n const captionEl = createNode('caption', 'pm__table-caption');\n captionEl.innerHTML = caption;\n table.appendChild(captionEl);\n }\n\n addClassPm(table, 'section-table');\n addClassPm(thead, 'table-head');\n addClassPm(tbody, 'table-body');\n\n const headerData = cookieTableData.headers;\n const tableHeadersKeys = getKeys(headerData);\n\n /**\n * Create table headers\n */\n const trHeadFragment = globalObj._dom._document.createDocumentFragment();\n const trHead = createNode('tr');\n\n for (const headerKey of tableHeadersKeys) {\n const headerValue = headerData[headerKey];\n const th = createNode('th');\n\n th.id = 'cc__row-' + headerKey + sectionIndex;\n setAttribute(th, 'scope', 'col');\n addClassPm(th, 'table-th');\n\n th.innerHTML = headerValue;\n appendChild(trHeadFragment, th);\n }\n\n appendChild(trHead, trHeadFragment);\n appendChild(thead, trHead);\n\n /**\n * Create table body\n */\n const bodyFragment = globalObj._dom._document.createDocumentFragment();\n\n for (const bodyItem of cookieTableData.body) {\n const tr = createNode('tr', 'pm__table-tr');\n\n for (const tdKey of tableHeadersKeys) {\n const tdHeader = headerData[tdKey];\n const tdValue = bodyItem[tdKey];\n\n const td = createNode('td');\n const tdInner = createNode(DIV_TAG);\n\n addClassPm(td, 'table-td');\n setAttribute(td, 'data-column', tdHeader);\n setAttribute(td, 'headers', 'cc__row-' + tdKey + sectionIndex);\n\n tdInner.insertAdjacentHTML('beforeend', tdValue);\n\n appendChild(td, tdInner);\n appendChild(tr, td);\n }\n\n appendChild(bodyFragment, tr);\n }\n\n appendChild(tbody, bodyFragment);\n appendChild(table, thead);\n appendChild(table, tbody);\n\n return table;\n};\n\n/**\n * Strip html elements (and their content) and return the remaining text\n * @param {string} html\n * @returns {string}\n */\nconst getTextWithoutElements = (html) => {\n const template = createNode('template');\n template.innerHTML = html;\n\n let text = '';\n\n for (const node of template.content.childNodes)\n node.nodeType === Node.TEXT_NODE && (text += node.textContent);\n\n return text;\n};\n\n/**\n * Generate toggle\n * @param {string} label block title\n * @param {string} value category/service\n * @param {import('../global').Category} sCurrentCategoryObject\n * @param {boolean} [isService]\n * @param {string} categoryName\n */\nfunction createToggleLabel(label, value, sCurrentCategoryObject, isService, categoryName) {\n const state = globalObj._state;\n const dom = globalObj._dom;\n\n /** @type {HTMLLabelElement} */ const toggleLabel = createNode('label');\n /** @type {HTMLInputElement} */ const toggle = createNode('input');\n /** @type {HTMLSpanElement} */ const toggleIcon = createNode('span');\n /** @type {HTMLSpanElement} */ const toggleIconCircle = createNode('span');\n /** @type {HTMLSpanElement} */ const toggleLabelSpan = createNode('span');\n\n // each will contain 2 pseudo-elements to generate 'tick' and 'x' icons\n /** @type {HTMLSpanElement} */ const toggleOnIcon = createNode('span');\n /** @type {HTMLSpanElement} */ const toggleOffIcon = createNode('span');\n\n toggleOnIcon.innerHTML = getSvgIcon(1, 3);\n toggleOffIcon.innerHTML = getSvgIcon(0, 3);\n\n toggle.type = 'checkbox';\n\n addClass(toggleLabel, 'section__toggle-wrapper');\n addClass(toggle, 'section__toggle');\n addClass(toggleOnIcon, 'toggle__icon-on');\n addClass(toggleOffIcon, 'toggle__icon-off');\n addClass(toggleIcon, 'toggle__icon');\n addClass(toggleIconCircle, 'toggle__icon-circle');\n addClass(toggleLabelSpan, 'toggle__label');\n\n setAttribute(toggleIcon, ARIA_HIDDEN, 'true');\n\n if (isService) {\n addClass(toggleLabel, 'toggle-service');\n setAttribute(toggle, SCRIPT_TAG_SELECTOR, categoryName);\n toggle.name = 'cc-' + categoryName + '-' + value;\n\n // Save reference to toggles to avoid using document.querySelector later on\n dom._serviceCheckboxInputs[categoryName][value] = toggle;\n } else {\n toggle.name = 'cc-' + value;\n dom._categoryCheckboxInputs[value] = toggle;\n }\n\n if (!isService) {\n ((value)=> {\n addEvent(toggle, CLICK_EVENT, () => {\n const categoryServicesToggles = dom._serviceCheckboxInputs[value];\n const checked = toggle.checked;\n state._enabledServices[value] = [];\n\n /**\n * Enable/disable all services\n */\n for (let serviceName in categoryServicesToggles) {\n categoryServicesToggles[serviceName].checked = checked;\n checked && state._enabledServices[value].push(serviceName);\n }\n });\n })(value);\n } else {\n ((categoryName) => {\n addEvent(toggle, 'change', () => {\n const categoryServicesToggles = dom._serviceCheckboxInputs[categoryName];\n const categoryToggle = dom._categoryCheckboxInputs[categoryName];\n\n state._enabledServices[categoryName] = [];\n\n for (let serviceName in categoryServicesToggles) {\n const serviceInput = categoryServicesToggles[serviceName];\n\n if (serviceInput.checked) {\n state._enabledServices[categoryName].push(serviceInput.value);\n }\n }\n\n categoryToggle.checked = state._enabledServices[categoryName].length > 0;\n });\n })(categoryName);\n\n }\n\n toggle.value = value;\n toggleLabelSpan.textContent = getTextWithoutElements(label);\n\n appendChild(toggleIconCircle, toggleOffIcon);\n appendChild(toggleIconCircle, toggleOnIcon);\n appendChild(toggleIcon, toggleIconCircle);\n\n toggle.checked = isService\n ? isToggleChecked(categoryName, value, !state._invalidConsent)\n : isToggleChecked(value, '', !state._invalidConsent);\n\n /**\n * Set toggle as readonly if true (disable checkbox)\n */\n if (sCurrentCategoryObject.readOnly) {\n toggle.disabled = true;\n }\n\n appendChild(toggleLabel, toggle);\n appendChild(toggleLabel, toggleIcon);\n appendChild(toggleLabel, toggleLabelSpan);\n\n return toggleLabel;\n}","import { globalObj } from '../global';\n\nimport { addDataButtonListeners } from '../../utils/data-buttons';\nimport { debug } from '../../utils/debug';\nimport {\n addClass,\n addClassCm,\n addEvent,\n appendChild,\n createNode,\n removeClass,\n setAttribute\n} from '../../utils/dom';\nimport { fireEvent } from '../../utils/events';\nimport { getModalFocusableData, handleFocusTrap } from '../../utils/focus-trap';\nimport { getSvgIcon } from '../../utils/svg-icons';\n\nimport {\n CONSENT_MODAL_NAME,\n ARIA_HIDDEN,\n DIV_TAG,\n BUTTON_TAG,\n BTN_GROUP_CLASS,\n CLICK_EVENT,\n DATA_ROLE\n} from '../../utils/constants';\n\nimport { guiManager } from '../../utils/gui-manager';\nimport { createPreferencesModal } from './preferencesModal';\n\n/**\n * @callback CreateMainContainer\n */\n\n/**\n * @returns {HTMLSpanElement}\n */\nconst createFocusSpan = () => {\n const span = createNode('span');\n\n if (!globalObj._dom._focusSpan)\n globalObj._dom._focusSpan = span;\n\n return span;\n};\n\n/**\n * Create consent modal and append it to \"cc-main\" el.\n * @param {import(\"../global\").Api} api\n * @param {CreateMainContainer} createMainContainer\n */\nexport const createConsentModal = (api, createMainContainer) => {\n const state = globalObj._state;\n const dom = globalObj._dom;\n const {hide, showPreferences, acceptCategory} = api;\n\n /**\n * @type {import(\"../global\").ConsentModalOptions}\n */\n const consentModalData = state._currentTranslation && state._currentTranslation.consentModal;\n\n if (!consentModalData)\n return;\n\n const acceptAllBtnData = consentModalData.acceptAllBtn,\n acceptNecessaryBtnData = consentModalData.acceptNecessaryBtn,\n showPreferencesBtnData = consentModalData.showPreferencesBtn,\n closeIconLabelData = consentModalData.closeIconLabel,\n footerData = consentModalData.footer,\n consentModalLabelValue = consentModalData.label,\n consentModalTitleValue = consentModalData.title;\n\n /**\n * @param {string|string[]} [categories]\n */\n const acceptAndHide = (categories) => {\n hide();\n acceptCategory(categories);\n };\n\n // Create modal if it doesn't exist\n if (!dom._cmContainer) {\n dom._cmContainer = createNode(DIV_TAG);\n dom._cm = createNode(DIV_TAG);\n dom._cmBody = createNode(DIV_TAG);\n dom._cmTexts = createNode(DIV_TAG);\n dom._cmBtns = createNode(DIV_TAG);\n\n addClass(dom._cmContainer, 'cm-wrapper');\n addClass(dom._cm, 'cm');\n addClassCm(dom._cmBody, 'body');\n addClassCm(dom._cmTexts, 'texts');\n addClassCm(dom._cmBtns, 'btns');\n\n setAttribute(dom._cm, ARIA_HIDDEN, 'true');\n\n if (state._disablePageInteraction) {\n setAttribute(dom._cm, 'role', 'dialog');\n setAttribute(dom._cm, 'aria-modal', 'true');\n } else {\n setAttribute(dom._cm, 'role', 'region');\n }\n\n if (!consentModalLabelValue && consentModalTitleValue) {\n setAttribute(dom._cm, 'aria-labelledby', 'cm__title');\n setAttribute(dom._cm, 'aria-describedby', 'cm__desc');\n }\n const\n boxLayout = 'box',\n guiOptions = state._userConfig.guiOptions,\n consentModalOptions = guiOptions && guiOptions.consentModal,\n consentModalLayout = consentModalOptions && consentModalOptions.layout || boxLayout,\n isBoxLayout = consentModalLayout.split(' ')[0] === boxLayout;\n\n /**\n * Close icon-button (visible only in the 'box' layout)\n */\n if (consentModalTitleValue && closeIconLabelData && isBoxLayout) {\n if (!dom._cmCloseIconBtn) {\n dom._cmCloseIconBtn = createNode(BUTTON_TAG);\n dom._cmCloseIconBtn.innerHTML = getSvgIcon();\n addClassCm(dom._cmCloseIconBtn, 'btn');\n addClassCm(dom._cmCloseIconBtn, 'btn--close');\n addEvent(dom._cmCloseIconBtn, CLICK_EVENT, () => {\n debug('CookieConsent [ACCEPT]: necessary');\n acceptAndHide([]);\n });\n appendChild(dom._cmBody, dom._cmCloseIconBtn);\n }\n }\n\n appendChild(dom._cmBody, dom._cmTexts);\n\n appendChild(dom._cm, dom._cmBody);\n appendChild(dom._cmContainer, dom._cm);\n\n dom._cmDivTabindex = dom._cm;\n setAttribute(dom._cmDivTabindex, 'tabIndex', -1);\n }\n\n consentModalLabelValue && setAttribute(dom._cm, 'aria-label', consentModalLabelValue);\n\n if (dom._cmCloseIconBtn && closeIconLabelData)\n setAttribute(dom._cmCloseIconBtn, 'aria-label', closeIconLabelData);\n\n if (consentModalTitleValue) {\n if (!dom._cmTitle) {\n dom._cmTitle = createNode('h2');\n dom._cmTitle.className = dom._cmTitle.id = 'cm__title';\n appendChild(dom._cmTexts, dom._cmTitle);\n }\n\n dom._cmTitle.innerHTML = consentModalTitleValue;\n }\n\n let description = consentModalData.description;\n\n if (description) {\n if (state._revisionEnabled) {\n description = description.replace(\n '{{revisionMessage}}',\n state._validRevision\n ? ''\n : consentModalData.revisionMessage || ''\n );\n }\n\n if (!dom._cmDescription) {\n dom._cmDescription = createNode('p');\n dom._cmDescription.className = dom._cmDescription.id = 'cm__desc';\n appendChild(dom._cmTexts, dom._cmDescription);\n }\n\n dom._cmDescription.innerHTML = description;\n }\n\n if (acceptAllBtnData) {\n if (!dom._cmAcceptAllBtn) {\n dom._cmAcceptAllBtn = createNode(BUTTON_TAG);\n appendChild(dom._cmAcceptAllBtn, createFocusSpan());\n addClassCm(dom._cmAcceptAllBtn, 'btn');\n setAttribute(dom._cmAcceptAllBtn, DATA_ROLE, 'all');\n\n addEvent(dom._cmAcceptAllBtn, CLICK_EVENT, () => {\n debug('CookieConsent [ACCEPT]: all');\n acceptAndHide('all');\n });\n }\n\n dom._cmAcceptAllBtn.firstElementChild.innerHTML = acceptAllBtnData;\n }\n\n if (acceptNecessaryBtnData) {\n if (!dom._cmAcceptNecessaryBtn) {\n dom._cmAcceptNecessaryBtn = createNode(BUTTON_TAG);\n appendChild(dom._cmAcceptNecessaryBtn, createFocusSpan());\n addClassCm(dom._cmAcceptNecessaryBtn, 'btn');\n setAttribute(dom._cmAcceptNecessaryBtn, DATA_ROLE, 'necessary');\n\n addEvent(dom._cmAcceptNecessaryBtn, CLICK_EVENT, () => {\n debug('CookieConsent [ACCEPT]: necessary');\n acceptAndHide([]);\n });\n }\n\n dom._cmAcceptNecessaryBtn.firstElementChild.innerHTML = acceptNecessaryBtnData;\n }\n\n if (showPreferencesBtnData) {\n if (!dom._cmShowPreferencesBtn) {\n dom._cmShowPreferencesBtn = createNode(BUTTON_TAG);\n appendChild(dom._cmShowPreferencesBtn, createFocusSpan());\n addClassCm(dom._cmShowPreferencesBtn, 'btn');\n addClassCm(dom._cmShowPreferencesBtn, 'btn--secondary');\n setAttribute(dom._cmShowPreferencesBtn, DATA_ROLE, 'show');\n setAttribute(dom._cmShowPreferencesBtn, 'aria-haspopup', 'dialog');\n\n addEvent(dom._cmShowPreferencesBtn, 'mouseenter', () => {\n if (!state._preferencesModalExists)\n createPreferencesModal(api, createMainContainer);\n });\n addEvent(dom._cmShowPreferencesBtn, CLICK_EVENT, showPreferences);\n }\n\n dom._cmShowPreferencesBtn.firstElementChild.innerHTML = showPreferencesBtnData;\n }\n\n if (!dom._cmBtnGroup) {\n dom._cmBtnGroup = createNode(DIV_TAG, 'cm__' + BTN_GROUP_CLASS);\n appendChild(dom._cmBtns, dom._cmBtnGroup);\n }\n\n dom._cmAcceptAllBtn && appendChild(dom._cmBtnGroup, dom._cmAcceptAllBtn);\n dom._cmAcceptNecessaryBtn && appendChild(dom._cmBtnGroup, dom._cmAcceptNecessaryBtn);\n\n if (dom._cmShowPreferencesBtn) {\n if (!dom._cmAcceptNecessaryBtn || !dom._cmAcceptAllBtn) {\n appendChild(dom._cmBtnGroup, dom._cmShowPreferencesBtn);\n addClassCm(dom._cmBtnGroup, BTN_GROUP_CLASS + '--uneven');\n } else {\n if (!dom._cmBtnGroup2) {\n dom._cmBtnGroup2 = createNode(DIV_TAG, 'cm__' + BTN_GROUP_CLASS);\n appendChild(dom._cmBtns, dom._cmBtnGroup2);\n }\n\n removeClass(dom._cmBtnGroup, 'cm__' + BTN_GROUP_CLASS + '--uneven');\n appendChild(dom._cmBtnGroup2, dom._cmShowPreferencesBtn);\n }\n }\n\n if (dom._cmAcceptAllBtn || dom._cmAcceptNecessaryBtn || dom._cmShowPreferencesBtn)\n appendChild(dom._cmBody, dom._cmBtns);\n\n if (footerData) {\n if (!dom._cmFooterLinksGroup) {\n let _consentModalFooter = createNode(DIV_TAG);\n let _consentModalFooterLinks = createNode(DIV_TAG);\n dom._cmFooterLinksGroup = createNode(DIV_TAG);\n\n addClassCm(_consentModalFooter, 'footer');\n addClassCm(_consentModalFooterLinks, 'links');\n addClassCm(dom._cmFooterLinksGroup, 'link-group');\n\n appendChild(_consentModalFooterLinks, dom._cmFooterLinksGroup);\n appendChild(_consentModalFooter, _consentModalFooterLinks);\n appendChild(dom._cm, _consentModalFooter);\n }\n\n dom._cmFooterLinksGroup.innerHTML = footerData;\n }\n\n guiManager(0);\n\n if (!state._consentModalExists) {\n state._consentModalExists = true;\n\n debug('CookieConsent [HTML] created', CONSENT_MODAL_NAME);\n\n fireEvent(globalObj._customEvents._onModalReady, CONSENT_MODAL_NAME, dom._cm);\n createMainContainer();\n appendChild(dom._ccMain, dom._cmContainer);\n handleFocusTrap(dom._cm);\n }\n\n getModalFocusableData(1);\n\n addDataButtonListeners(dom._cmBody, api, createPreferencesModal, createMainContainer);\n};\n","import { globalObj } from '../core/global';\nimport { elContains } from './collections';\nimport { debug } from './debug';\nimport { addClass, removeClass } from './dom';\nimport { isArray, isFunction, isString } from './type-guards';\n\n/**\n * Detect the available language. The language autodetection process prioritizes finding translations\n * for the complete language code. If translations for the complete code are unavailable, the detection\n * mechanism then resorts to searching for the language-only version.\n * Works with 'en', 'en_US' and 'en-US'.\n *\n * @param {string} languageCode - The language code to be detected.\n * @returns {?string} The detected language code, or null if not detected.\n */\nexport const getAvailableLanguage = (languageCode) => {\n if (!isString(languageCode))\n return null;\n\n const translations = globalObj._state._allTranslations;\n const hasTranslation = (code) => Object.prototype.hasOwnProperty.call(translations, code);\n\n if (hasTranslation(languageCode))\n return languageCode;\n\n /**\n * @type {string}\n */\n let language = languageCode.slice(0, 2);\n\n if (hasTranslation(language))\n return language;\n\n return null;\n};\n\n/**\n * Returns the current language code\n * @returns {string}\n */\nexport const getCurrentLanguageCode = () => {\n return globalObj._state._currentLanguageCode || globalObj._state._userConfig.language.default;\n};\n\n/**\n * Set language code\n * @param {string} newLanguageCode\n */\nexport const setCurrentLanguageCode = (newLanguageCode) => {\n newLanguageCode && (globalObj._state._currentLanguageCode = newLanguageCode);\n};\n\n/**\n * Get current client's browser language\n * returns only the first 2 chars: en-US => en\n * @returns {string} language\n */\nexport const getBrowserLanguageCode = () => navigator.language;\n\n/**\n * Get the user's preferred languages, in order of preference\n * @returns {readonly string[]}\n */\nexport const getBrowserLanguageCodes = () => navigator.languages && navigator.languages.length\n ? navigator.languages\n : [getBrowserLanguageCode()];\n\n/**\n * Get the lang attribute\n * @returns lang attribute\n */\nexport const getDocumentLanguageCode = () => document.documentElement.lang;\n\n/**\n * Resolve the language to use.\n * @returns {string} language code\n */\nexport const resolveCurrentLanguageCode = () => {\n const autoDetect = globalObj._state._userConfig.language.autoDetect;\n\n if (autoDetect) {\n debug('CookieConsent [LANG]: autoDetect strategy: \"' + autoDetect + '\"');\n\n const detectionStrategies = {\n browser: getBrowserLanguageCodes(),\n document: [getDocumentLanguageCode()]\n };\n\n const languageCodes = detectionStrategies[autoDetect];\n\n if (isArray(languageCodes)) {\n for (const languageCode of languageCodes) {\n const newLanguageCode = getAvailableLanguage(languageCode);\n\n if (newLanguageCode)\n return newLanguageCode;\n }\n }\n }\n\n /**\n * Use current language\n */\n return getCurrentLanguageCode();\n};\n\n/**\n * Load translation\n * @param {string | null} [desiredLanguageCode]\n */\nexport const loadTranslationData = async (desiredLanguageCode) => {\n const state = globalObj._state;\n\n /**\n * @type {string}\n */\n let currentLanguageCode = getAvailableLanguage(desiredLanguageCode) ?? getCurrentLanguageCode();\n\n let translationData = state._allTranslations[currentLanguageCode];\n\n /**\n * Fetch translation if a string or function is provided\n */\n if (isString(translationData)) {\n translationData = await fetchJson(translationData);\n } else if (isFunction(translationData)) {\n translationData = await translationData();\n }\n\n if (!translationData) {\n throw `Could not load translation for the '${currentLanguageCode}' language`;\n }\n\n state._currentTranslation = translationData;\n setCurrentLanguageCode(currentLanguageCode);\n\n debug('CookieConsent [LANG]: set language: \"' + currentLanguageCode + '\"');\n\n return true;\n};\n\n/**\n * Toggle RTL class on/off based on current language\n */\nexport const handleRtlLanguage = () => {\n let rtlLanguages = globalObj._state._userConfig.language.rtl;\n let ccMain = globalObj._dom._ccMain;\n\n if (rtlLanguages && ccMain) {\n if (!isArray(rtlLanguages))\n rtlLanguages = [rtlLanguages];\n\n elContains(rtlLanguages, globalObj._state._currentLanguageCode)\n ? addClass(ccMain, 'cc--rtl')\n : removeClass(ccMain, 'cc--rtl');\n }\n};\n\n/**\n * Used to fetch external language files (.json)\n * @param {string} url\n * @returns {Promise<import('../core/global').Translation | boolean>}\n */\nexport const fetchJson = async (url) => {\n try {\n const response = await fetch(url);\n return response.ok && await response.json();\n } catch (e) {\n console.error(e);\n return false;\n }\n};\n","import { globalObj } from '../global';\nimport { addDataButtonListeners } from '../../utils/data-buttons';\nimport { createNode } from '../../utils/dom';\nimport { createConsentModal } from './consentModal';\nimport { createPreferencesModal } from './preferencesModal';\nimport { DIV_TAG } from '../../utils/constants';\nimport { handleRtlLanguage } from '../../utils/language';\n\nexport const createMainContainer = () => {\n const dom = globalObj._dom;\n\n if (dom._ccMain) return;\n\n dom._ccMain = createNode(DIV_TAG);\n dom._ccMain.id = 'cc-main';\n dom._ccMain.setAttribute('data-nosnippet', '');\n\n handleRtlLanguage();\n\n // Append main container to dom\n (dom._rootEl || dom._document.body || dom._htmlDom).appendChild(dom._ccMain);\n};\n\n/**\n * @param {import('../global').Api} api\n */\nexport const generateHtml = (api) => {\n addDataButtonListeners(null, api, createPreferencesModal, createMainContainer);\n\n if (globalObj._state._invalidConsent && !globalObj._config.lazyHtmlGeneration)\n createConsentModal(api, createMainContainer);\n\n if (!globalObj._config.lazyHtmlGeneration)\n createPreferencesModal(api, createMainContainer);\n};\n\nexport * from './consentModal';\nexport * from './preferencesModal';\n","/**\n * @param {CallableFunction} fn\n */\nexport const safeRun = (fn, hideError) => {\n try {\n return fn();\n } catch (e) {\n !hideError && console.warn('CookieConsent:', e);\n return false;\n }\n};\n","import { safeRun } from './safe-run';\n\nexport const localStorageManager = {\n /**\n * @param {string} key\n * @param {string} value\n */\n _setItem: (key, value) => {\n safeRun(() => localStorage.setItem(key, value));\n },\n\n /**\n * @param {string} key\n */\n _getItem: (key) => safeRun(() => localStorage.getItem(key)) || '',\n\n /**\n * @param {string} key\n */\n _removeItem: (key) => safeRun(() => localStorage.removeItem(key))\n};","import { globalObj } from '../core/global';\nimport { OPT_OUT_MODE, OPT_IN_MODE } from './constants';\nimport { manageExistingScripts } from './scripts';\n\nimport { syncModalToggles } from './categories';\nimport {\n arrayDiff,\n deepCopy,\n elContains,\n indexOf\n} from './collections';\nimport { debug } from './debug';\nimport { fireEvent } from './events';\nimport { safeRun } from './safe-run';\nimport { isFunction, isObject } from './type-guards';\nimport { localStorageManager } from './localstorage';\nimport { afterPaint } from './dom';\n\n/**\n * @param {boolean} [isFirstConsent]\n */\nconst getCategoriesWithCookies = (isFirstConsent) => {\n const state = globalObj._state;\n\n const categoriesToFilter = isFirstConsent\n ? state._allCategoryNames\n : state._lastChangedCategoryNames;\n\n /**\n * Filter out categories with readOnly=true or don't have an autoClear object\n */\n return categoriesToFilter.filter(categoryName => {\n const currentCategoryObject = state._allDefinedCategories[categoryName];\n\n return !!currentCategoryObject\n && !currentCategoryObject.readOnly\n && !!currentCategoryObject.autoClear;\n });\n};\n\n/**\n * @param {string[]} allCookies\n * @param {string} cookieName\n */\nconst findMatchingCookies = (allCookies, cookieName) => {\n if (cookieName instanceof RegExp) {\n return allCookies.filter(cookie => cookieName.test(cookie));\n } else {\n const cookieIndex = indexOf(allCookies, cookieName);\n return cookieIndex > -1\n ? [allCookies[cookieIndex]]\n : [];\n }\n};\n\n/**\n * Delete all unused cookies\n * @param {boolean} [isFirstConsent]\n */\nexport const autoclearCookiesHelper = (isFirstConsent) => {\n const state = globalObj._state;\n const allCookiesArray = getAllCookies();\n const categoriesToClear = getCategoriesWithCookies(isFirstConsent);\n\n /**\n * Clear cookies for each disabled service\n */\n for (const categoryName in state._lastChangedServices) {\n for (const serviceName of state._lastChangedServices[categoryName]) {\n const service = state._allDefinedServices[categoryName][serviceName];\n const serviceCookies = service && service.cookies;\n const serviceIsDisabled = !elContains(state._acceptedServices[categoryName], serviceName);\n\n if (!serviceIsDisabled || !serviceCookies)\n continue;\n\n for (const cookieItem of serviceCookies) {\n const foundCookies = findMatchingCookies(allCookiesArray, cookieItem.name);\n eraseCookiesHelper(foundCookies, cookieItem.path, cookieItem.domain);\n }\n }\n }\n\n for (const currentCategoryName of categoriesToClear) {\n const category = state._allDefinedCategories[currentCategoryName];\n const autoClear = category.autoClear;\n const autoClearCookies = autoClear && autoClear.cookies || [];\n\n const categoryWasJustChanged = elContains(state._lastChangedCategoryNames, currentCategoryName);\n const categoryIsDisabled = !elContains(state._acceptedCategories, currentCategoryName);\n const categoryWasJustDisabled = categoryWasJustChanged && categoryIsDisabled;\n\n const shouldClearCookies = isFirstConsent\n ? categoryIsDisabled\n : categoryWasJustDisabled;\n\n if (!shouldClearCookies)\n continue;\n\n if (autoClear.reloadPage && categoryWasJustDisabled)\n state._reloadPage = true;\n\n for (const cookieItem of autoClearCookies) {\n const foundCookies = findMatchingCookies(allCookiesArray, cookieItem.name);\n eraseCookiesHelper(foundCookies, cookieItem.path, cookieItem.domain);\n }\n }\n};\n\n/**\n * @param {boolean} [afterNextPaint] run scripts and callbacks after the next paint\n */\nexport const saveCookiePreferences = (afterNextPaint) => {\n const state = globalObj._state;\n\n /**\n * Determine if categories were changed from last state (saved in the cookie)\n */\n state._lastChangedCategoryNames = globalObj._config.mode === OPT_OUT_MODE && state._invalidConsent\n ? arrayDiff(state._defaultEnabledCategories, state._acceptedCategories)\n : arrayDiff(state._acceptedCategories, state._savedCookieContent.categories);\n\n let categoriesWereChanged = state._lastChangedCategoryNames.length > 0;\n let servicesWereChanged = false;\n\n /**\n * Determine if services were changed from last state\n */\n for (const categoryName of state._allCategoryNames) {\n state._lastChangedServices[categoryName] = arrayDiff(\n state._acceptedServices[categoryName],\n state._lastEnabledServices[categoryName]\n );\n\n if (state._lastChangedServices[categoryName].length > 0)\n servicesWereChanged = true;\n }\n\n //{{START: GUI}}\n syncModalToggles(true);\n //{{END: GUI}}\n\n if (!state._consentTimestamp)\n state._consentTimestamp = new Date();\n\n if (!state._consentId)\n state._consentId = uuidv4();\n\n state._savedCookieContent = {\n categories: deepCopy(state._acceptedCategories),\n revision: globalObj._config.revision,\n data: state._cookieData,\n consentTimestamp: state._consentTimestamp.toISOString(),\n consentId: state._consentId,\n services: deepCopy(state._acceptedServices),\n languageCode: globalObj._state._currentLanguageCode\n };\n\n if (state._lastConsentTimestamp) {\n state._savedCookieContent.lastConsentTimestamp = state._lastConsentTimestamp.toISOString();\n }\n\n let isFirstConsent = false;\n const stateChanged = categoriesWereChanged || servicesWereChanged;\n\n if (state._invalidConsent || stateChanged) {\n /**\n * Set consent as valid\n */\n if (state._invalidConsent) {\n state._invalidConsent = false;\n isFirstConsent = true;\n }\n\n state._lastConsentTimestamp = !state._lastConsentTimestamp\n ? state._consentTimestamp\n : new Date();\n\n state._savedCookieContent.lastConsentTimestamp = state._lastConsentTimestamp.toISOString();\n\n setCookie();\n\n const isAutoClearEnabled = globalObj._config.autoClearCookies;\n const shouldClearCookies = isFirstConsent || stateChanged;\n\n if (isAutoClearEnabled && shouldClearCookies)\n autoclearCookiesHelper(isFirstConsent);\n }\n\n afterNextPaint\n ? afterPaint(() => state === globalObj._state && runConsentEffects(isFirstConsent, stateChanged))\n : runConsentEffects(isFirstConsent, stateChanged);\n};\n\n/**\n * Enable/disable scripts, fire the consent callbacks and reload the page if needed\n * @param {boolean} isFirstConsent\n * @param {boolean} stateChanged\n */\nconst runConsentEffects = (isFirstConsent, stateChanged) => {\n const state = globalObj._state;\n\n if (isFirstConsent || stateChanged)\n manageExistingScripts();\n\n if (isFirstConsent) {\n fireEvent(globalObj._customEvents._onFirstConsent);\n fireEvent(globalObj._customEvents._onConsent);\n\n // Nothing ran before the first consent, so there is nothing to reload\n if (globalObj._config.mode === OPT_IN_MODE) {\n state._reloadPage = false;\n return;\n }\n }\n\n if (stateChanged)\n fireEvent(globalObj._customEvents._onChange);\n\n /**\n * Reload page if needed\n */\n if (state._reloadPage) {\n state._reloadPage = false;\n location.reload();\n }\n};\n\n/**\n * Set plugin's cookie\n * @param {boolean} [useRemainingExpirationTime]\n */\nexport const setCookie = (useRemainingExpirationTime) => {\n const { hostname, protocol } = location;\n const { name, path, domain, sameSite, useLocalStorage, secure } = globalObj._config.cookie;\n\n const expiresAfterMs = useRemainingExpirationTime\n ? getRemainingExpirationTimeMS()\n : getExpiresAfterDaysValue()*86400000;\n\n /**\n * Expiration date\n */\n const date = new Date();\n date.setTime(date.getTime() + expiresAfterMs);\n\n /**\n * Store the expiration date in the cookie (in case localstorage is used)\n */\n\n globalObj._state._savedCookieContent.expirationTime = date.getTime();\n\n const value = JSON.stringify(globalObj._state._savedCookieContent);\n\n /**\n * Encode value (RFC compliant)\n */\n const cookieValue = encodeURIComponent(value);\n\n let cookieStr = name + '='\n + cookieValue\n + (expiresAfterMs !== 0 ? '; expires=' + date.toUTCString() : '')\n + '; Path=' + path\n + '; SameSite=' + sameSite;\n\n /**\n * Set \"domain\" only if hostname contains a dot (e.g domain.com)\n * to ensure that cookie works with 'localhost'.\n * A falsy domain leaves it out (cookie not shared with subdomains)\n */\n if (domain && elContains(hostname, '.'))\n cookieStr += '; Domain=' + domain;\n\n if (secure && protocol === 'https:')\n cookieStr += '; Secure';\n\n useLocalStorage\n ? localStorageManager._setItem(name, value)\n : document.cookie = cookieStr;\n\n debug('CookieConsent [SET_COOKIE]: ' + name + ':', globalObj._state._savedCookieContent);\n};\n\n/**\n * Parse cookie value using JSON.parse\n * @param {string} value\n */\nexport const parseCookie = (value, skipDecode) => {\n /**\n * @type {import('../../types').CookieValue}\n */\n let parsedValue;\n\n parsedValue = safeRun(() => JSON.parse(skipDecode\n ? value\n : decodeURIComponent(value)\n ), true);\n\n return isObject(parsedValue) ? parsedValue : {};\n};\n\n/**\n * Delete cookie by name & path\n * @param {string[]} cookies Array of cookie names\n * @param {string} [customPath]\n * @param {string} [customDomain]\n */\nexport const eraseCookiesHelper = (cookies, customPath, customDomain) => {\n if (cookies.length === 0)\n return;\n\n const domain = customDomain || globalObj._config.cookie.domain || location.hostname;\n const path = customPath || globalObj._config.cookie.path;\n const isWwwSubdomain = domain.slice(0, 4) === 'www.';\n const mainDomain = isWwwSubdomain && domain.substring(4);\n\n /**\n * Helper function to erase cookie\n * @param {string} cookie\n * @param {string} [domain]\n */\n const erase = (cookie, domain) => {\n if (domain && domain.slice(0, 1) !== '.')\n domain = '.' + domain;\n document.cookie = cookie + '='\n + '; path=' + path\n + (domain ? '; domain=' + domain : '')\n + '; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\n };\n\n for (const cookieName of cookies) {\n erase(cookieName, customDomain);\n\n /**\n * If custom domain not specified,\n * also erase config domain\n */\n if (!customDomain) {\n erase(cookieName, domain);\n }\n\n /**\n * If domain starts with 'www.',\n * also erase the cookie for the\n * main domain (without www)\n */\n if (isWwwSubdomain)\n erase(cookieName, mainDomain);\n\n debug('CookieConsent [AUTOCLEAR]: deleting cookie: \"' + cookieName + '\" path: \"' + path + '\" domain:', domain);\n }\n};\n\n/**\n * Get plugin cookie\n * @param {string} [customName]\n */\nexport const getPluginCookie = (customName) => {\n const name = customName || globalObj._config.cookie.name;\n const useLocalStorage = globalObj._config.cookie.useLocalStorage;\n const valueStr = useLocalStorage\n ? localStorageManager._getItem(name)\n : getSingleCookie(name, true);\n return parseCookie(valueStr, useLocalStorage);\n};\n\n/**\n * Returns the cookie name/value, if it exists\n * @param {string} name\n * @param {boolean} getValue\n * @returns {string}\n */\nexport const getSingleCookie = (name, getValue) => {\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const found = document.cookie.match('(^|;)\\\\s*' + escapedName + '\\\\s*=\\\\s*([^;]+)');\n\n return found\n ? (getValue ? found.pop() : name)\n : '';\n};\n\n/**\n * Returns array with all the cookie names\n * @param {RegExp} regex\n * @returns {string[]}\n */\nexport const getAllCookies = (regex) => {\n const allCookies = document.cookie.split(/;\\s*/);\n\n /**\n * @type {string[]}\n */\n const cookieNames = [];\n\n /**\n * Save only the cookie names\n */\n for (const cookie of allCookies) {\n let name = cookie.split('=')[0];\n\n if (regex) {\n safeRun(() => {\n regex.test(name) && cookieNames.push(name);\n });\n } else {\n cookieNames.push(name);\n }\n }\n\n return cookieNames;\n};\n\n/**\n * Generate RFC4122-compliant UUIDs.\n * https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid?page=1&tab=votes#tab-top\n * @returns {string} unique uuid string\n */\nexport const uuidv4 = () => {\n return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, (c) => {\n return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16);\n });\n};\n\n/**\n * Calculate the existing cookie's remaining time until expiration (in milliseconds)\n */\nexport const getRemainingExpirationTimeMS = () => {\n const lastTimestamp = globalObj._state._lastConsentTimestamp;\n\n const elapsedTimeMilliseconds = lastTimestamp\n ? new Date() - lastTimestamp\n : 0;\n\n return getExpiresAfterDaysValue()*86400000 - elapsedTimeMilliseconds;\n};\n\n/**\n * Helper function to retrieve cookie duration\n * @returns {number}\n */\nexport const getExpiresAfterDaysValue = () => {\n const expiresAfterDays = globalObj._config.cookie.expiresAfterDays;\n\n return isFunction(expiresAfterDays)\n ? expiresAfterDays(globalObj._state._acceptType)\n : expiresAfterDays;\n};\n","import { globalObj } from './global';\nimport { fetchCategoriesAndServices } from '../utils/categories';\nimport { getKeys } from '../utils/collections';\nimport { debug } from '../utils/debug';\nimport { retrieveScriptElements } from '../utils/scripts';\nimport { isObject, isString } from '../utils/type-guards';\nimport { OPT_OUT_MODE } from '../utils/constants';\nimport { resolveCurrentLanguageCode, setCurrentLanguageCode } from '../utils/language';\n\n/**\n * Configure CookieConsent\n * @param {import(\"./global\").UserConfig} userConfig\n */\nexport const setConfig = (userConfig) => {\n const { _dom, _config, _state } = globalObj;\n\n const\n config = _config,\n state = _state,\n { cookie } = config,\n callbacks = globalObj._callbacks,\n userCookieConfig = userConfig.cookie,\n userCategories = userConfig.categories || {},\n allCategoryNames = getKeys(userCategories),\n nav = navigator,\n doc = document;\n\n /**\n * Access the 'window' and 'document' objects\n * during execution, rather than on import\n * (avoid window/document is not defined error)\n */\n _dom._document = doc;\n //{{START: GUI}}\n _dom._htmlDom = doc.documentElement;\n const _root = userConfig.root;\n _dom._rootEl = (_root && isString(_root) ? doc.querySelector(_root) : _root);\n //{{END: GUI}}\n cookie.domain = location.hostname;\n\n /**\n * Make user configuration globally available\n */\n state._userConfig = userConfig;\n state._allDefinedCategories = userCategories;\n state._allCategoryNames = allCategoryNames;\n\n //{{START: GUI}}\n state._allTranslations = userConfig.language.translations;\n state._disablePageInteraction = !!userConfig.disablePageInteraction;\n //{{END: GUI}}\n\n /**\n * Save references to callback functions\n */\n callbacks._onFirstConsent = userConfig.onFirstConsent;\n callbacks._onConsent = userConfig.onConsent;\n callbacks._onChange = userConfig.onChange;\n\n //{{START: GUI}}\n callbacks._onModalHide = userConfig.onModalHide;\n callbacks._onModalShow = userConfig.onModalShow;\n callbacks._onModalReady = userConfig.onModalReady;\n //{{END: GUI}}\n\n const {\n mode,\n //{{START: GUI}}\n autoShow,\n lazyHtmlGeneration,\n //{{END: GUI}}\n autoClearCookies,\n revision,\n manageScriptTags,\n hideFromBots,\n respectGpc\n } = userConfig;\n\n if (mode === OPT_OUT_MODE)\n config.mode = mode;\n\n if (typeof autoClearCookies === 'boolean')\n config.autoClearCookies = autoClearCookies;\n\n if (typeof manageScriptTags === 'boolean')\n config.manageScriptTags = manageScriptTags;\n\n if (typeof revision === 'number' && revision >= 0) {\n config.revision = revision;\n state._revisionEnabled = true;\n }\n\n //{{START: GUI}}\n\n if (typeof autoShow === 'boolean')\n config.autoShow = autoShow;\n\n if (typeof lazyHtmlGeneration === 'boolean')\n config.lazyHtmlGeneration = lazyHtmlGeneration;\n\n //{{END: GUI}}\n\n if (hideFromBots === false)\n config.hideFromBots = false;\n\n if (config.hideFromBots === true && nav)\n state._botAgentDetected = (nav.userAgent && /bot|crawl|spider|slurp|teoma/i.test(nav.userAgent)) || nav.webdriver;\n\n if (typeof respectGpc === 'boolean')\n config.respectGpc = respectGpc;\n\n if (isObject(userCookieConfig))\n config.cookie = {...cookie, ...userCookieConfig};\n\n debug('CookieConsent [CONFIG]: configuration:', userConfig);\n debug('CookieConsent [CONFIG]: autoClearCookies:', config.autoClearCookies);\n debug('CookieConsent [CONFIG]: revision enabled:', state._revisionEnabled);\n debug('CookieConsent [CONFIG]: manageScriptTags:', config.manageScriptTags);\n\n fetchCategoriesAndServices(allCategoryNames);\n retrieveScriptElements();\n\n //{{START: GUI}}\n setCurrentLanguageCode(resolveCurrentLanguageCode());\n //{{END: GUI}}\n};","import {\n getCurrentCategoriesState,\n isGpcOptOutActive,\n resolveEnabledCategories,\n resolveEnabledServices,\n getCurrentServicesState,\n setAcceptedCategories,\n syncModalToggles,\n updateModalToggles\n} from '../utils/categories';\nimport { deepCopy, elContains, getKeys } from '../utils/collections';\nimport { debug } from '../utils/debug';\nimport {\n addClass,\n appendChild,\n createNode,\n focus,\n getActiveElement,\n getAttribute,\n getStateClassElements,\n removeAttribute,\n removeClass,\n setAttribute,\n toggleDisableInteraction,\n toggleStateClass\n} from '../utils/dom';\nimport { fireEvent } from '../utils/events';\nimport { isArray, isObject, isString } from '../utils/type-guards';\n\nimport { manageExistingScripts, retrieveEnabledCategoriesAndServices } from '../utils/scripts';\n\nimport {\n globalObj,\n GlobalState\n} from './global';\n\n//{{START: GUI}}\n\nimport {\n createConsentModal,\n createPreferencesModal,\n generateHtml,\n createMainContainer\n} from './modals/index';\n\nimport {\n getCurrentLanguageCode,\n handleRtlLanguage,\n loadTranslationData,\n getAvailableLanguage\n} from '../utils/language';\n\n//{{END: GUI}}\n\nimport {\n setCookie,\n eraseCookiesHelper,\n saveCookiePreferences,\n getSingleCookie,\n getPluginCookie,\n getAllCookies\n} from '../utils/cookies';\n\nimport { setConfig } from './config-init';\n\nimport {\n TOGGLE_CONSENT_MODAL_CLASS,\n TOGGLE_DISABLE_INTERACTION_CLASS,\n TOGGLE_PREFERENCES_MODAL_CLASS,\n OPT_OUT_MODE,\n CONSENT_MODAL_NAME,\n ARIA_HIDDEN,\n PREFERENCES_MODAL_NAME\n} from '../utils/constants';\nimport { localStorageManager } from '../utils/localstorage';\n\n/**\n * @param {string[]|string} categories\n * @param {string[]} excludedCategories\n * @param {boolean} [afterNextPaint] run scripts and callbacks after the next paint\n */\nconst acceptAndSave = (categories, excludedCategories, afterNextPaint) => {\n resolveEnabledCategories(categories, excludedCategories);\n resolveEnabledServices();\n saveCookiePreferences(afterNextPaint);\n};\n\n/**\n * Accept API\n * @param {string[]|string} categories - Categories to accept\n * @param {string[]} [excludedCategories]\n */\nexport const acceptCategory = (categories, excludedCategories = []) => acceptAndSave(categories, excludedCategories);\n\n/**\n * True if the accepted categories/services apply:\n * the consent is valid, or the defaults are enabled (opt-out)\n */\nconst acceptedStateApplies = () => !globalObj._state._invalidConsent || globalObj._config.mode === OPT_OUT_MODE;\n\n/**\n * Returns true if cookie category is accepted\n * @param {string} category\n */\nexport const acceptedCategory = (category) => {\n\n const acceptedCategories = acceptedStateApplies()\n ? globalObj._state._acceptedCategories\n : [];\n\n return elContains(acceptedCategories, category);\n};\n\n/**\n * Accept one or multiple services under a specific category\n * @param {string|string[]} service\n * @param {string} category\n */\nexport const acceptService = (service, category) => {\n const { _allCategoryNames, _allDefinedServices, } = globalObj._state;\n\n if (\n !service\n || !category\n || !isString(category)\n || !elContains(_allCategoryNames, category)\n || getKeys(_allDefinedServices[category]).length === 0\n ) {\n return false;\n }\n\n updateModalToggles(service, category);\n acceptCategory();\n};\n\n/**\n * Returns true if the service in the specified\n * category is accepted/enabled\n * @param {string} service\n * @param {string} category\n */\nexport const acceptedService = (service, category) => {\n const acceptedServices = acceptedStateApplies()\n ? (globalObj._state._acceptedServices[category] || [])\n : [];\n\n return elContains(acceptedServices, service);\n};\n\n/**\n * Returns true if cookie was found and has valid value (not an empty string)\n * @param {string} cookieName\n */\nexport const validCookie = (cookieName) => getSingleCookie(cookieName, true) !== '';\n\n/**\n * Erase cookies API\n * @param {(string|RegExp|(string|RegExp)[])} cookies\n * @param {string} [path]\n * @param {string} [domain]\n */\nexport const eraseCookies = (cookies, path, domain) => {\n let allCookies = [];\n\n /**\n * Add cookie to allCookies array if it exists\n * @param {string | RegExp} cookieName\n */\n const addCookieIfExists = (cookieName) => {\n if (isString(cookieName)) {\n let name = getSingleCookie(cookieName);\n name !== '' && allCookies.push(name);\n } else {\n allCookies.push(...getAllCookies(cookieName));\n }\n };\n\n if (isArray(cookies)) {\n for (let cookie of cookies) {\n addCookieIfExists(cookie);\n }\n } else {\n addCookieIfExists(cookies);\n }\n\n eraseCookiesHelper(allCookies, path, domain);\n};\n\n//{{START: GUI}}\n\n/**\n * Show cookie consent modal\n * @param {boolean} [createModal] create modal if it doesn't exist\n */\nexport const show = (createModal) => {\n const { _dom, _state } = globalObj;\n\n if (_state._consentModalVisible)\n return;\n\n if (!_state._consentModalExists && (createModal || _state._invalidConsent))\n createConsentModal(miniAPI, createMainContainer);\n\n if (!_state._consentModalExists)\n return;\n\n _state._consentModalVisible = true;\n _state._lastFocusedElemBeforeModal = getActiveElement();\n\n if (_state._disablePageInteraction)\n toggleDisableInteraction(true);\n\n toggleStateClass(TOGGLE_CONSENT_MODAL_CLASS, true);\n removeAttribute(_dom._cm, ARIA_HIDDEN);\n /**\n * Set focus to consentModal and enable transition\n */\n setTimeout(() => {\n addClass(_dom._cmContainer, 'cc--anim');\n }, 100);\n setTimeout(() => {\n focus(_dom._cmDivTabindex, false, true);\n }, 200);\n\n debug('CookieConsent [TOGGLE]: show consentModal');\n\n fireEvent(globalObj._customEvents._onModalShow, CONSENT_MODAL_NAME);\n};\n\n/**\n * Hide consent modal\n */\nexport const hide = () => {\n const { _dom, _state, _customEvents } = globalObj;\n\n if (!_state._consentModalVisible)\n return;\n\n _state._consentModalVisible = false;\n\n if (_state._disablePageInteraction)\n toggleDisableInteraction();\n\n /**\n * Fix focus restoration to body with Chrome\n */\n focus(_dom._focusSpan, true, true);\n\n toggleStateClass(TOGGLE_CONSENT_MODAL_CLASS);\n setAttribute(_dom._cm, ARIA_HIDDEN, 'true');\n\n /**\n * Restore focus to last focused element\n */\n focus(_state._lastFocusedElemBeforeModal);\n _state._lastFocusedElemBeforeModal = null;\n\n /**\n * Remove transition class after it executed\n */\n setTimeout(() => removeClass(_dom._cmContainer, 'cc--anim'), 100);\n\n debug('CookieConsent [TOGGLE]: hide consentModal');\n\n fireEvent(_customEvents._onModalHide, CONSENT_MODAL_NAME);\n};\n\n/**\n * Show preferences modal\n */\nexport const showPreferences = () => {\n const { _dom, _state: state } = globalObj;\n\n if (state._preferencesModalVisible)\n return;\n\n if (!state._preferencesModalExists)\n createPreferencesModal(miniAPI, createMainContainer);\n\n if (!state._preferencesModalExists)\n return;\n\n state._preferencesModalVisible = true;\n\n // If there is no consent-modal, keep track of the last focused elem.\n if (!state._consentModalVisible) {\n state._lastFocusedElemBeforeModal = getActiveElement();\n } else {\n state._lastFocusedModalElement = getActiveElement();\n }\n\n toggleStateClass(TOGGLE_PREFERENCES_MODAL_CLASS, true);\n removeAttribute(_dom._pm, ARIA_HIDDEN);\n\n /**\n * Set focus to preferencesModal\n */\n setTimeout(() => {\n focus(_dom._pmDivTabindex, false, true);\n }, 200);\n\n debug('CookieConsent [TOGGLE]: show preferencesModal');\n\n fireEvent(globalObj._customEvents._onModalShow, PREFERENCES_MODAL_NAME);\n};\n\n/**\n * https://github.com/orestbida/cookieconsent/issues/481\n */\nconst discardUnsavedPreferences = () => syncModalToggles(validConsent());\n\n/**\n * Hide preferences modal\n */\nexport const hidePreferences = () => {\n const state = globalObj._state;\n\n if (!state._preferencesModalVisible)\n return;\n\n state._preferencesModalVisible = false;\n\n discardUnsavedPreferences();\n\n /**\n * Fix focus restoration to body with Chrome\n */\n focus(globalObj._dom._pmFocusSpan, true, true);\n\n toggleStateClass(TOGGLE_PREFERENCES_MODAL_CLASS);\n setAttribute(globalObj._dom._pm, ARIA_HIDDEN, 'true');\n\n /**\n * If consent modal is visible, focus him (instead of page document)\n */\n if (state._consentModalVisible) {\n focus(state._lastFocusedModalElement, false, true);\n state._lastFocusedModalElement = null;\n } else {\n /**\n * Restore focus to last page element which had focus before modal opening\n */\n focus(state._lastFocusedElemBeforeModal);\n state._lastFocusedElemBeforeModal = null;\n }\n\n debug('CookieConsent [TOGGLE]: hide preferencesModal');\n\n fireEvent(globalObj._customEvents._onModalHide, PREFERENCES_MODAL_NAME);\n};\n\nconst miniAPI = {\n show,\n hide,\n showPreferences,\n hidePreferences,\n /**\n * Used by the modal buttons, so that scripts and\n * callbacks don't delay the click's response (INP)\n * @param {string[]|string} [categories]\n */\n acceptCategory: (categories) => acceptAndSave(categories, [], true)\n};\n\n/**\n * Update/change modal's language\n * @param {string} lang new language\n * @param {boolean} [forceUpdate] update language fields forcefully\n * @returns {Promise<boolean>}\n */\nexport const setLanguage = async (newLanguageCode, forceUpdate) => {\n if (!getAvailableLanguage(newLanguageCode))\n return false;\n\n const state = globalObj._state;\n\n /**\n * Set language only if it differs from current\n */\n if (newLanguageCode !== getCurrentLanguageCode() || forceUpdate === true) {\n\n const loaded = await loadTranslationData(newLanguageCode);\n\n if (!loaded)\n return false;\n\n if (state._consentModalExists)\n createConsentModal(miniAPI, createMainContainer);\n\n if (state._preferencesModalExists) {\n // The new toggles show the saved state\n discardUnsavedPreferences();\n createPreferencesModal(miniAPI, createMainContainer);\n }\n\n handleRtlLanguage();\n\n return true;\n }\n\n return false;\n};\n\n//{{END: GUI}}\n\n/**\n * Retrieve current user preferences (summary)\n * @returns {import(\"./global\").UserPreferences}\n */\nexport const getUserPreferences = () => {\n const { accepted, rejected } = getCurrentCategoriesState();\n const services = getCurrentServicesState();\n\n return deepCopy({\n acceptType: globalObj._state._acceptType,\n acceptedCategories: accepted,\n rejectedCategories: rejected,\n acceptedServices: services.accepted,\n rejectedServices: services.rejected\n });\n};\n\n/**\n * Dynamically load script (append to head)\n * @param {string} src\n * @param {{[key: string]: string}} [attrs] Custom attributes\n * @returns {Promise<boolean>} promise\n */\nexport const loadScript = (src, attrs) => {\n /**\n * @type {HTMLScriptElement}\n */\n let script = [...document.scripts].find(el => getAttribute(el, 'src') === src);\n\n return new Promise((resolve) => {\n if (script)\n return resolve(true);\n\n script = createNode('script');\n\n /**\n * Add custom attributes\n */\n if (isObject(attrs)) {\n for (const key in attrs) {\n setAttribute(script, key, attrs[key]);\n }\n }\n\n script.onload = () => resolve(true);\n script.onerror = () => {\n /**\n * Remove script from dom if error is thrown\n */\n script.remove();\n resolve(false);\n };\n\n script.src = src;\n\n appendChild(document.head, script);\n });\n};\n\n/**\n * Save custom data inside cookie\n * @param {{\n * value: any,\n * mode: string\n * }} props\n * @returns {boolean}\n */\nexport const setCookieData = (props) => {\n let newData = props.value,\n mode = props.mode,\n set = false,\n cookieData;\n\n const state = globalObj._state;\n\n /**\n * If mode is 'update':\n * add/update only the specified props.\n */\n if (mode === 'update') {\n state._cookieData = cookieData = getCookie('data');\n const sameType = typeof cookieData === typeof newData;\n\n if (sameType && typeof cookieData === 'object') {\n !cookieData && (cookieData = {});\n\n for (let prop in newData) {\n if (cookieData[prop] !== newData[prop]) {\n cookieData[prop] = newData[prop];\n set = true;\n }\n }\n } else if ((sameType || !cookieData) && cookieData !== newData) {\n cookieData = newData;\n set = true;\n }\n } else {\n cookieData = newData;\n set = true;\n }\n\n if (set) {\n state._cookieData = cookieData;\n state._savedCookieContent.data = cookieData;\n setCookie(true);\n }\n\n return set;\n};\n\n/**\n * Retrieve data from existing cookie\n * @param {string} field\n * @param {string} [cookieName]\n * @returns {any}\n */\nexport const getCookie = (field, cookieName) => {\n const cookie = getPluginCookie(cookieName);\n\n return field\n ? cookie[field]\n : cookie;\n};\n\n/**\n * Return configuration object or just one of its fields.\n * @param {string} field\n * @returns {any}\n */\nexport const getConfig = (field) => {\n const config = globalObj._config;\n const userConfig = globalObj._state._userConfig;\n\n return field\n ? config[field] || userConfig[field]\n : {...config, ...userConfig, cookie:{...config.cookie}};\n};\n\n/**\n * Returns true if consent is valid\n * @returns {boolean}\n */\nexport const validConsent = () => !globalObj._state._invalidConsent;\n\n/**\n * Date from a value saved in the cookie, undefined if missing or invalid\n * @param {string} [value]\n * @returns {Date|undefined}\n */\nconst parseDate = (value) => {\n const date = value && new Date(value);\n return date && !isNaN(date) ? date : undefined;\n};\n\nconst retrieveState = () => {\n const state = globalObj._state;\n const config = globalObj._config;\n\n let cookieValue = getPluginCookie();\n\n /**\n * An expired localStorage item counts as no consent, like an expired cookie\n */\n if (config.cookie.useLocalStorage && new Date().getTime() > (cookieValue.expirationTime || 0)) {\n localStorageManager._removeItem(config.cookie.name);\n cookieValue = {};\n }\n\n const {\n categories,\n services,\n consentId,\n consentTimestamp,\n lastConsentTimestamp,\n data,\n revision\n } = cookieValue;\n\n const validCategories = isArray(categories);\n\n state._savedCookieContent = cookieValue;\n state._consentId = consentId;\n\n // If \"_consentId\" is present => assume that consent was previously given\n const validConsentId = !!consentId && isString(consentId);\n\n state._consentTimestamp = parseDate(consentTimestamp);\n state._lastConsentTimestamp = parseDate(lastConsentTimestamp);\n\n // Retrieve \"data\"\n state._cookieData = typeof data !== 'undefined'\n ? data\n : null;\n\n // If revision is enabled and current value !== saved value inside the cookie => revision is not valid\n if (state._revisionEnabled && validConsentId && revision !== config.revision)\n state._validRevision = false;\n\n state._invalidConsent = !validConsentId\n || !state._validRevision\n || !state._consentTimestamp\n || !state._lastConsentTimestamp\n || !validCategories;\n\n debug('CookieConsent [STATUS] valid consent:', !state._invalidConsent);\n retrieveEnabledCategoriesAndServices();\n\n /**\n * Retrieve last accepted categories from cookie\n * and calculate acceptType\n */\n if (!state._invalidConsent) {\n /**\n * Ignore categories and services that are no longer in the config;\n * readOnly categories always have all their services accepted\n */\n for (const categoryName of state._allCategoryNames) {\n const savedServices = services && services[categoryName];\n const definedServices = getKeys(state._allDefinedServices[categoryName]);\n\n if (elContains(state._readOnlyCategories, categoryName))\n state._acceptedServices[categoryName] = definedServices;\n else if (isArray(savedServices))\n state._acceptedServices[categoryName] = savedServices.filter(service => elContains(definedServices, service));\n else if (!elContains(categories, categoryName))\n state._acceptedServices[categoryName] = [];\n }\n\n state._enabledServices = {...state._acceptedServices};\n\n setAcceptedCategories([\n ...state._readOnlyCategories,\n ...categories.filter(category => elContains(state._allCategoryNames, category))\n ]);\n } else {\n if (config.mode === OPT_OUT_MODE) {\n state._acceptedCategories = [\n ...state._defaultEnabledCategories\n ];\n }\n }\n};\n\n/**\n * Will run once and only if modals do not exist.\n * @param {import(\"./global\").UserConfig} userConfig\n */\nexport const run = async (userConfig) => {\n const {\n _state,\n _config,\n _customEvents\n } = globalObj;\n\n const win = window;\n\n if (!win._ccRun) {\n win._ccRun = true;\n\n setConfig(userConfig);\n\n if (_state._botAgentDetected)\n return;\n\n retrieveState();\n\n const consentIsValid = validConsent();\n\n //{{START: GUI}}\n let translationError;\n\n // The scripts must run even if the translation can't be loaded\n const translationLoaded = await loadTranslationData().catch((error) => {\n translationError = error;\n });\n\n if (translationLoaded) {\n generateHtml(miniAPI);\n\n // The consent may have been given while the translation was loading\n if (_config.autoShow && !validConsent() && !isGpcOptOutActive())\n show(true);\n }\n //{{END: GUI}}\n\n if (consentIsValid) {\n manageExistingScripts();\n fireEvent(_customEvents._onConsent);\n } else if (_config.mode === OPT_OUT_MODE) {\n manageExistingScripts();\n }\n\n //{{START: GUI}}\n if (translationError)\n throw translationError;\n //{{END: GUI}}\n }\n};\n\n/**\n * Reset cookieconsent.\n * @param {boolean} [deleteCookie] Delete plugin's cookie\n */\nexport const reset = (deleteCookie) => {\n //{{START: GUI}}\n const { _ccMain } = globalObj._dom;\n //{{END: GUI}}\n\n const { name, path, domain, useLocalStorage } = globalObj._config.cookie;\n\n if (deleteCookie) {\n useLocalStorage\n ? localStorageManager._removeItem(name)\n : eraseCookies(name, path, domain);\n }\n\n /**\n * Remove data-cc event listeners\n */\n for (const {_element, _event, _listener} of globalObj._state._dataEventListeners) {\n _element.removeEventListener(_event, _listener);\n }\n\n //{{START: GUI}}\n /**\n * Remove main container from DOM\n */\n _ccMain && _ccMain.remove();\n\n /**\n * Remove any remaining classes\n */\n for (const el of getStateClassElements()) {\n el.classList.remove(\n TOGGLE_DISABLE_INTERACTION_CLASS,\n TOGGLE_PREFERENCES_MODAL_CLASS,\n TOGGLE_CONSENT_MODAL_CLASS\n );\n }\n //{{END: GUI}}\n\n const newGlobal = new GlobalState();\n\n /**\n * Reset all global state props.\n */\n for (const key in globalObj) {\n globalObj[key] = newGlobal[key];\n }\n\n window._ccRun = false;\n};\n","import type { CategoryDeclaration, GcmSignal, Texts } from './types';\n\nexport const DEFAULT_COOKIE_NAME = 'ec_consent';\nexport const DEFAULT_EXPIRY_DAYS = 182;\nexport const DEFAULT_GCM_EVENT = 'easy_cookie_update';\nexport const DEFAULT_WAIT_FOR_UPDATE = 500;\n\n/**\n * Well-known category ids. They match Iubenda's five purposes (1–5) so sites can\n * migrate without renaming, but any id is allowed.\n */\nexport const KNOWN_CATEGORIES: Record<\n string,\n { gcm: GcmSignal[]; color: string; title: Record<'it' | 'en', string>; description: Record<'it' | 'en', string> }\n> = {\n necessary: {\n gcm: ['security_storage'],\n color: 'var(--ec-c-necessary)',\n title: { it: 'Necessari', en: 'Necessary' },\n description: {\n it: 'Servono al funzionamento del sito, ad esempio per la sessione e per ricordare questa scelta. Non si possono disattivare.',\n en: 'Required for the site to work, for example the session and remembering this choice. They cannot be turned off.',\n },\n },\n functionality: {\n gcm: ['functionality_storage'],\n color: 'var(--ec-c-functionality)',\n title: { it: 'Funzionalità', en: 'Functionality' },\n description: {\n it: 'Abilitano funzioni aggiuntive come chat, mappe o preferenze salvate.',\n en: 'Enable extra features such as chat, maps or saved preferences.',\n },\n },\n experience: {\n gcm: ['personalization_storage'],\n color: 'var(--ec-c-experience)',\n title: { it: 'Esperienza', en: 'Experience' },\n description: {\n it: 'Contenuti incorporati di terze parti, come video e post social.',\n en: 'Embedded third-party content such as videos and social posts.',\n },\n },\n measurement: {\n gcm: ['analytics_storage'],\n color: 'var(--ec-c-measurement)',\n title: { it: 'Misurazione', en: 'Measurement' },\n description: {\n it: 'Ci aiutano a capire come viene usato il sito, con statistiche sulle visite.',\n en: 'Help us understand how the site is used, through visit statistics.',\n },\n },\n marketing: {\n gcm: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n color: 'var(--ec-c-marketing)',\n title: { it: 'Marketing', en: 'Marketing' },\n description: {\n it: 'Servono a misurare le campagne e a mostrarti pubblicità più pertinente, anche su altri siti.',\n en: 'Measure campaigns and show you more relevant ads, including on other sites.',\n },\n },\n};\n\n/** Fallback module colours for unknown category ids, in order. */\nexport const EXTRA_CATEGORY_COLORS = ['var(--ec-c-extra-1)', 'var(--ec-c-extra-2)', 'var(--ec-c-extra-3)'];\n\nexport function categoryDefaults(id: string): Partial<CategoryDeclaration> & { color: string } {\n const known = KNOWN_CATEGORIES[id];\n if (known) return { gcm: known.gcm, color: known.color, title: known.title, description: known.description };\n return { color: EXTRA_CATEGORY_COLORS[0] };\n}\n\nexport const DEFAULT_TEXTS: Record<'it' | 'en', Texts> = {\n it: {\n banner: {\n title: 'Usiamo i cookie solo se sei d’accordo',\n description:\n 'I cookie necessari fanno funzionare il sito. Con il tuo consenso usiamo anche le altre categorie qui sotto. Puoi cambiare idea quando vuoi da «Preferenze cookie».',\n acceptAll: 'Accetta tutti',\n rejectAll: 'Rifiuta tutti',\n customize: 'Personalizza',\n close: 'Chiudi e rifiuta i cookie non necessari',\n policyLink: 'Cookie policy',\n legendOn: 'attivi',\n legendOff: 'spenti',\n legendAlways: 'sempre attivi',\n },\n preferences: {\n title: 'Preferenze cookie',\n intro:\n 'Scegli quali categorie attivare. Quelle spente restano bloccate finché non le accendi. Puoi tornare qui in qualsiasi momento.',\n acceptAll: 'Accetta tutti',\n rejectAll: 'Rifiuta tutti',\n save: 'Salva le scelte',\n close: 'Chiudi',\n alwaysOn: 'Sempre attivi',\n services: 'Servizi',\n serviceCounter: 'servizio|servizi',\n cookieName: 'Cookie',\n cookieDuration: 'Durata',\n cookieDescription: 'A cosa serve',\n provider: 'Fornitore',\n privacyPolicy: 'Privacy policy',\n noCookies: 'Nessun cookie dichiarato.',\n },\n reopen: { label: 'Preferenze cookie' },\n embed: {\n blocked: 'Questo contenuto di {service} è bloccato finché non accetti i cookie «{category}».',\n enable: 'Mostra il contenuto',\n enableAlways: 'Attiva sempre «{category}»',\n },\n errors: { logFailed: 'Non siamo riusciti a registrare la scelta. Riprova.' },\n },\n en: {\n banner: {\n title: 'We use cookies only if you agree',\n description:\n 'Necessary cookies make the site work. With your consent we also use the other categories below. You can change your mind at any time from “Cookie preferences”.',\n acceptAll: 'Accept all',\n rejectAll: 'Reject all',\n customize: 'Customize',\n close: 'Close and reject non-necessary cookies',\n policyLink: 'Cookie policy',\n legendOn: 'on',\n legendOff: 'off',\n legendAlways: 'always on',\n },\n preferences: {\n title: 'Cookie preferences',\n intro: 'Choose which categories to turn on. Categories left off stay blocked until you enable them. You can come back here at any time.',\n acceptAll: 'Accept all',\n rejectAll: 'Reject all',\n save: 'Save choices',\n close: 'Close',\n alwaysOn: 'Always on',\n services: 'Services',\n serviceCounter: 'service|services',\n cookieName: 'Cookie',\n cookieDuration: 'Duration',\n cookieDescription: 'Purpose',\n provider: 'Provider',\n privacyPolicy: 'Privacy policy',\n noCookies: 'No cookies declared.',\n },\n reopen: { label: 'Cookie preferences' },\n embed: {\n blocked: 'This {service} content is blocked until you accept “{category}” cookies.',\n enable: 'Show content',\n enableAlways: 'Always enable “{category}”',\n },\n errors: { logFailed: 'We could not record your choice. Please try again.' },\n },\n};\n","import {\n DEFAULT_COOKIE_NAME,\n DEFAULT_EXPIRY_DAYS,\n DEFAULT_GCM_EVENT,\n DEFAULT_TEXTS,\n DEFAULT_WAIT_FOR_UPDATE,\n EXTRA_CATEGORY_COLORS,\n KNOWN_CATEGORIES,\n} from './defaults';\nimport type { EasyCookieConfig, GcmSignal, Localized, Texts } from './types';\n\nconst GCM_SIGNALS: GcmSignal[] = [\n 'ad_storage',\n 'ad_user_data',\n 'ad_personalization',\n 'analytics_storage',\n 'functionality_storage',\n 'personalization_storage',\n 'security_storage',\n];\n\n/** Identity helper that gives editors type checking for a config object. */\nexport function defineConfig(config: EasyCookieConfig): EasyCookieConfig {\n return config;\n}\n\nexport interface ConfigIssue {\n path: string;\n message: string;\n}\n\n/**\n * Validate a config. Returns every problem found (empty array = valid).\n * Hand-written to keep the browser bundle free of schema libraries; the\n * consent server runs the same function before publishing a revision.\n */\nexport function validateConfig(input: unknown): ConfigIssue[] {\n const issues: ConfigIssue[] = [];\n const add = (path: string, message: string) => issues.push({ path, message });\n const isObj = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n const isLocalized = (v: unknown) =>\n typeof v === 'string' || (isObj(v) && Object.values(v).every((x) => typeof x === 'string'));\n\n if (!isObj(input)) return [{ path: '', message: 'Config must be an object' }];\n const c = input as Partial<EasyCookieConfig>;\n\n if (typeof c.revision !== 'string' || !c.revision.trim()) add('revision', 'Required non-empty string');\n if (c.expiryDays !== undefined && (typeof c.expiryDays !== 'number' || c.expiryDays < 1 || c.expiryDays > 395))\n add('expiryDays', 'Must be a number between 1 and 395 (13 months)');\n\n if (!isObj(c.categories) || Object.keys(c.categories).length === 0) {\n add('categories', 'At least one category is required');\n } else {\n const readOnly = Object.entries(c.categories).filter(([, v]) => isObj(v) && v.readOnly);\n if (readOnly.length === 0) add('categories', 'Declare a readOnly category for strictly necessary cookies');\n for (const [id, cat] of Object.entries(c.categories)) {\n const p = `categories.${id}`;\n if (!/^[a-z][a-z0-9_-]*$/i.test(id)) add(p, 'Category id must be alphanumeric (a-z, 0-9, _ and -)');\n if (!isObj(cat)) {\n add(p, 'Must be an object');\n continue;\n }\n if (cat.title !== undefined && !isLocalized(cat.title)) add(`${p}.title`, 'Must be a string or a language map');\n if (cat.description !== undefined && !isLocalized(cat.description))\n add(`${p}.description`, 'Must be a string or a language map');\n if (cat.gcm !== undefined) {\n if (!Array.isArray(cat.gcm)) add(`${p}.gcm`, 'Must be an array');\n else cat.gcm.forEach((s, i) => GCM_SIGNALS.includes(s) || add(`${p}.gcm.${i}`, `Unknown Consent Mode signal \"${s}\"`));\n }\n }\n }\n\n if (c.services !== undefined) {\n if (!isObj(c.services)) add('services', 'Must be an object');\n else\n for (const [id, svc] of Object.entries(c.services)) {\n const p = `services.${id}`;\n if (!isObj(svc)) {\n add(p, 'Must be an object');\n continue;\n }\n if (typeof svc.category !== 'string' || !isObj(c.categories) || !(svc.category in c.categories))\n add(`${p}.category`, 'Must reference a declared category');\n if (svc.cookies !== undefined) {\n if (!Array.isArray(svc.cookies)) add(`${p}.cookies`, 'Must be an array');\n else\n svc.cookies.forEach((ck, i) => {\n if (!isObj(ck) || typeof ck.name !== 'string' || !ck.name) add(`${p}.cookies.${i}.name`, 'Required');\n else if (ck.pattern) {\n try {\n new RegExp(ck.name);\n } catch {\n add(`${p}.cookies.${i}.name`, 'Invalid regular expression');\n }\n }\n });\n }\n if (svc.privacyUrl !== undefined && typeof svc.privacyUrl !== 'string') add(`${p}.privacyUrl`, 'Must be a URL string');\n if (svc.from !== undefined && typeof svc.from !== 'string') add(`${p}.from`, 'Must be a catalog entry id string');\n }\n }\n\n if (c.log !== undefined) {\n if (!isObj(c.log) || typeof c.log.endpoint !== 'string' || typeof c.log.siteKey !== 'string')\n add('log', 'Requires endpoint and siteKey strings');\n }\n if (c.cookie?.sameSite === 'None' && c.cookie.secure === false) add('cookie.secure', 'SameSite=None requires secure');\n if (c.language && typeof c.language.default !== 'string') add('language.default', 'Required string');\n return issues;\n}\n\n/** Pick the string for `lang` from a Localized value, falling back to `fallback`, then to any value. */\nexport function localize(value: Localized | undefined, lang: string, fallback = 'en'): string {\n if (value === undefined) return '';\n if (typeof value === 'string') return value;\n return value[lang] ?? value[fallback] ?? Object.values(value)[0] ?? '';\n}\n\nexport interface ResolvedCategory {\n id: string;\n readOnly: boolean;\n title: Localized;\n description: Localized;\n gcm: GcmSignal[];\n color: string;\n services: string[];\n}\n\nexport interface ResolvedConfig extends EasyCookieConfig {\n expiryDays: number;\n cookie: Required<Pick<NonNullable<EasyCookieConfig['cookie']>, 'name' | 'path' | 'sameSite' | 'secure'>> & { domain?: string };\n language: { default: string; available: string[]; autoDetect: 'document' | 'browser' | false };\n resolvedCategories: ResolvedCategory[];\n gcm: Required<Omit<NonNullable<EasyCookieConfig['googleConsentMode']>, 'region'>> & { region?: string[] };\n}\n\n/** Fill defaults. Pure and DOM-free: safe on the server and in the head snippet builder. */\nexport function resolveConfig(config: EasyCookieConfig): ResolvedConfig {\n let extra = 0;\n const services = config.services ?? {};\n const allCategories: ResolvedCategory[] = Object.entries(config.categories).map(([id, cat]) => {\n const known = KNOWN_CATEGORIES[id];\n return {\n id,\n readOnly: !!cat.readOnly,\n title: cat.title ?? known?.title ?? id,\n description: cat.description ?? known?.description ?? '',\n gcm: cat.gcm ?? known?.gcm ?? [],\n color: cat.color ?? known?.color ?? EXTRA_CATEGORY_COLORS[extra++ % EXTRA_CATEGORY_COLORS.length],\n services: Object.entries(services)\n .filter(([, s]) => s.category === id)\n .map(([sid]) => sid),\n };\n });\n // Like Iubenda, the banner asks only about what the site uses: once services are\n // declared, an optional category without services is left out of the banner,\n // the preferences, the policy and Consent Mode (its signals stay denied).\n // Configs without any service keep every category (script-tag-only setups).\n const resolvedCategories = Object.keys(services).length\n ? allCategories.filter((c) => c.readOnly || c.services.length > 0)\n : allCategories;\n const lang = config.language?.default ?? 'it';\n const gcm = config.googleConsentMode;\n return {\n ...config,\n expiryDays: config.expiryDays ?? DEFAULT_EXPIRY_DAYS,\n cookie: {\n name: config.cookie?.name ?? DEFAULT_COOKIE_NAME,\n path: config.cookie?.path ?? '/',\n sameSite: config.cookie?.sameSite ?? 'Lax',\n secure: config.cookie?.secure ?? true,\n domain: config.cookie?.domain,\n },\n language: {\n default: lang,\n available: config.language?.available ?? [lang],\n autoDetect: config.language?.autoDetect ?? 'document',\n },\n resolvedCategories,\n gcm: {\n enabled: gcm?.enabled ?? false,\n waitForUpdate: gcm?.waitForUpdate ?? DEFAULT_WAIT_FOR_UPDATE,\n adsDataRedaction: gcm?.adsDataRedaction ?? true,\n urlPassthrough: gcm?.urlPassthrough ?? false,\n region: gcm?.region,\n dataLayerName: gcm?.dataLayerName ?? 'dataLayer',\n eventName: gcm?.eventName ?? DEFAULT_GCM_EVENT,\n },\n };\n}\n\n/** Merge default texts for `lang` with the config overrides. */\nexport function resolveTexts(config: EasyCookieConfig, lang: string): Texts {\n const base = (DEFAULT_TEXTS as Record<string, Texts>)[lang] ?? DEFAULT_TEXTS.en;\n const over = config.texts?.[lang] ?? {};\n const out = JSON.parse(JSON.stringify(base)) as Texts;\n for (const [section, values] of Object.entries(over)) {\n if (values && typeof values === 'object') Object.assign((out as any)[section], values);\n }\n return out;\n}\n\n/**\n * Consent Mode state for a set of granted categories.\n * A signal is granted when any accepted category maps to it; `security_storage` is always granted.\n */\nexport function gcmStateFor(config: ResolvedConfig, granted: string[]): Partial<Record<GcmSignal, 'granted' | 'denied'>> {\n const out: Partial<Record<GcmSignal, 'granted' | 'denied'>> = {};\n for (const cat of config.resolvedCategories) for (const s of cat.gcm) out[s] = out[s] === 'granted' ? 'granted' : 'denied';\n for (const cat of config.resolvedCategories)\n if (cat.readOnly || granted.includes(cat.id)) for (const s of cat.gcm) out[s] = 'granted';\n // The four v2 core signals are always declared, so tags never see \"undefined\".\n for (const s of ['ad_storage', 'ad_user_data', 'ad_personalization', 'analytics_storage'] as GcmSignal[])\n if (!out[s]) out[s] = 'denied';\n out.security_storage = 'granted';\n return out;\n}\n","import { DEFAULT_COOKIE_NAME, DEFAULT_EXPIRY_DAYS } from './defaults';\nimport type { ConsentMethod, ConsentState } from './types';\n\n/**\n * Raw content of the consent cookie as written by the engine\n * (vanilla-cookieconsent format) plus easy-cookie's own fields in `data`.\n */\nexport interface RawConsentCookie {\n categories: string[];\n revision: number;\n data: { ec?: { rev: string; method: ConsentMethod } } | null;\n consentTimestamp: string;\n lastConsentTimestamp?: string;\n consentId: string;\n services: Record<string, string[]>;\n languageCode?: string;\n expirationTime?: number;\n}\n\n/** Read one cookie value from a `Cookie` header or `document.cookie` string. */\nexport function readCookie(cookieHeader: string | null | undefined, name = DEFAULT_COOKIE_NAME): string | null {\n if (!cookieHeader) return null;\n for (const part of cookieHeader.split(/;\\s*/)) {\n const eq = part.indexOf('=');\n if (eq > 0 && part.slice(0, eq).trim() === name) return part.slice(eq + 1);\n }\n return null;\n}\n\nexport function decodeRawCookie(value: string | null | undefined): RawConsentCookie | null {\n if (!value) return null;\n try {\n let text = value;\n // The engine URI-encodes the JSON; frameworks sometimes hand us the decoded value.\n if (!text.startsWith('{')) text = decodeURIComponent(text);\n const raw = JSON.parse(text);\n if (!raw || !Array.isArray(raw.categories) || typeof raw.consentId !== 'string') return null;\n return raw as RawConsentCookie;\n } catch {\n return null;\n }\n}\n\nexport interface ParseOptions {\n /** Current config revision: a stored choice for another revision is not valid. */\n revision?: string;\n expiryDays?: number;\n now?: number;\n}\n\n/**\n * Turn the cookie value into a ConsentState, or null when there is no valid choice\n * (missing, malformed, other revision, expired). DOM-free: use it in middleware,\n * route handlers and React Server Components.\n */\nexport function parseConsent(value: string | null | undefined, opts: ParseOptions = {}): ConsentState | null {\n const raw = decodeRawCookie(value);\n if (!raw) return null;\n const ec = raw.data?.ec;\n if (!ec) return null;\n if (opts.revision !== undefined && ec.rev !== opts.revision) return null;\n const updatedAt = raw.lastConsentTimestamp ?? raw.consentTimestamp;\n const now = opts.now ?? Date.now();\n const maxAge = (opts.expiryDays ?? DEFAULT_EXPIRY_DAYS) * 86_400_000;\n const updatedMs = Date.parse(updatedAt);\n if (!Number.isFinite(updatedMs) || now - updatedMs > maxAge) return null;\n if (raw.expirationTime && raw.expirationTime < now) return null;\n return {\n id: raw.consentId,\n revision: ec.rev,\n categories: raw.categories,\n services: raw.services ?? {},\n method: ec.method,\n firstAt: raw.consentTimestamp,\n updatedAt,\n language: raw.languageCode,\n };\n}\n\n/** Convenience: parse straight from a Cookie header / document.cookie string. */\nexport function consentFromCookieHeader(\n cookieHeader: string | null | undefined,\n opts: ParseOptions & { cookieName?: string } = {},\n): ConsentState | null {\n return parseConsent(readCookie(cookieHeader, opts.cookieName ?? DEFAULT_COOKIE_NAME), opts);\n}\n","import { localize, type ResolvedConfig } from '../shared/config';\nimport type { EasyCookieApi, Texts } from '../shared/types';\n\nconst SELECTOR = 'iframe[data-category][data-src]';\n\nconst fill = (tpl: string, vars: Record<string, string>) => tpl.replace(/\\{(\\w+)\\}/g, (_, k) => vars[k] ?? '');\n\n/**\n * Blocked embeds: `<iframe data-category=\"experience\" data-service=\"youtube\" data-src=\"…\">`.\n * While the category is off, the iframe stays empty and a placeholder sits in\n * its place with two choices: show this one content now (no consent stored),\n * or turn the whole category on.\n */\nexport function mountEmbeds(\n c: ResolvedConfig,\n texts: () => Texts,\n lang: () => string,\n api: EasyCookieApi,\n): { refresh(): void } {\n const loaded = new WeakSet<HTMLIFrameElement>();\n\n const load = (frame: HTMLIFrameElement) => {\n loaded.add(frame);\n frame.src = frame.dataset.src!;\n frame.hidden = false;\n const ph = frame.previousElementSibling;\n if (ph?.classList.contains('ec-embed')) ph.remove();\n };\n\n const placeholder = (frame: HTMLIFrameElement) => {\n if (frame.previousElementSibling?.classList.contains('ec-embed')) return;\n const t = texts();\n const catId = frame.dataset.category!;\n const cat = c.resolvedCategories.find((x) => x.id === catId);\n const catName = cat ? localize(cat.title, lang(), c.language.default) : catId;\n const svcId = frame.dataset.service;\n const svc = svcId ? c.services?.[svcId] : undefined;\n const svcName = (svc && localize(svc.label, lang(), c.language.default)) || svcId || frame.title || catName;\n\n const box = document.createElement('div');\n // The placeholder takes the iframe's own box (class, inline style, ratio) so\n // nothing shifts when the real embed loads.\n box.className = ['ec-embed', frame.className].filter(Boolean).join(' ');\n if (frame.style.cssText) box.style.cssText = frame.style.cssText;\n if (cat) box.style.setProperty('--ec-cat', cat.color);\n const rect = frame.getBoundingClientRect();\n const w = Number(frame.getAttribute('width')) || rect.width;\n const hgt = Number(frame.getAttribute('height')) || rect.height;\n if (w > 0 && hgt > 0) box.style.aspectRatio = `${w} / ${hgt}`;\n\n const sw = document.createElement('span');\n sw.className = 'ec-module';\n sw.setAttribute('aria-hidden', 'true');\n const msg = document.createElement('p');\n msg.className = 'ec-embed__text';\n msg.textContent = fill(t.embed.blocked, { service: svcName, category: catName });\n const actions = document.createElement('div');\n actions.className = 'ec-embed__actions';\n const once = document.createElement('button');\n once.type = 'button';\n once.className = 'ec-btn';\n once.textContent = t.embed.enable;\n once.addEventListener('click', () => load(frame));\n const always = document.createElement('button');\n always.type = 'button';\n always.className = 'ec-btn ec-btn--secondary';\n always.textContent = fill(t.embed.enableAlways, { category: catName });\n always.addEventListener('click', () => api.accept([catId]));\n actions.append(once, always);\n box.append(sw, msg, actions);\n frame.hidden = true;\n frame.parentNode?.insertBefore(box, frame);\n };\n\n const refresh = () => {\n document.querySelectorAll<HTMLIFrameElement>(SELECTOR).forEach((frame) => {\n if (loaded.has(frame)) return;\n const svc = frame.dataset.service;\n const granted = svc ? api.isServiceGranted(svc) || api.isGranted(frame.dataset.category!) : api.isGranted(frame.dataset.category!);\n if (granted) load(frame);\n else placeholder(frame);\n });\n };\n\n // Embeds added later (SPA navigation, CMS widgets).\n const mo = new MutationObserver((muts) => {\n if (muts.some((m) => Array.from(m.addedNodes).some((n) => n instanceof Element && (n.matches(SELECTOR) || n.querySelector(SELECTOR)))))\n refresh();\n });\n mo.observe(document.body, { childList: true, subtree: true });\n return { refresh };\n}\n","import type { ConsentLogOptions, ConsentRecordInput } from '../shared/types';\n\nconst QUEUE_KEY = 'ec_log_queue';\nconst MAX_QUEUE = 20;\n\nconst url = (log: ConsentLogOptions, path: string) =>\n `${log.endpoint.replace(/\\/$/, '')}${path}?key=${encodeURIComponent(log.siteKey)}`;\n\n/**\n * POST as a CORS \"simple request\" (text/plain, key in the query string) so no\n * preflight is needed and `keepalive` survives the page unloading.\n */\nasync function post(target: string, body: unknown): Promise<boolean> {\n try {\n const res = await fetch(target, {\n method: 'POST',\n mode: 'cors',\n credentials: 'omit',\n keepalive: true,\n headers: { 'Content-Type': 'text/plain;charset=UTF-8' },\n body: JSON.stringify(body),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nfunction readQueue(): ConsentRecordInput[] {\n try {\n return JSON.parse(localStorage.getItem(QUEUE_KEY) || '[]');\n } catch {\n return [];\n }\n}\n\nfunction writeQueue(q: ConsentRecordInput[]) {\n try {\n if (q.length) localStorage.setItem(QUEUE_KEY, JSON.stringify(q.slice(-MAX_QUEUE)));\n else localStorage.removeItem(QUEUE_KEY);\n } catch {\n /* storage blocked: nothing to do, the record is lost (documented) */\n }\n}\n\n/** Send a consent record; on failure keep it for a retry on the next page load. */\nexport async function sendRecord(log: ConsentLogOptions, record: ConsentRecordInput): Promise<boolean> {\n const ok = await post(url(log, '/v1/consents'), record);\n if (!ok) writeQueue([...readQueue(), record]);\n return ok;\n}\n\nexport async function flushQueue(log: ConsentLogOptions): Promise<void> {\n const q = readQueue();\n if (!q.length) return;\n const left: ConsentRecordInput[] = [];\n for (const r of q) if (!(await post(url(log, '/v1/consents'), r))) left.push(r);\n writeQueue(left);\n}\n\nexport function sendSubject(log: ConsentLogOptions, consentId: string, subjectId: string): Promise<boolean> {\n return post(url(log, `/v1/consents/${encodeURIComponent(consentId)}/subject`), { subjectId });\n}\n","import { localize, type ResolvedConfig } from '../shared/config';\nimport type { ConsentState, ReopenButtonOptions, Texts } from '../shared/types';\n\nconst h = <K extends keyof HTMLElementTagNameMap>(tag: K, cls?: string, text?: string) => {\n const el = document.createElement(tag);\n if (cls) el.className = cls;\n if (text !== undefined) el.textContent = text;\n return el;\n};\n\nconst isOn = (cat: ResolvedConfig['resolvedCategories'][number], state: ConsentState | null) =>\n cat.readOnly || !!state?.categories.includes(cat.id);\n\n/** Build one module per category, once. `--i` drives the staggered fill. */\nfunction buildModules(row: HTMLElement, c: ResolvedConfig, extra = '') {\n c.resolvedCategories.forEach((cat, i) => {\n const m = h('span', `ec-module${extra}`);\n m.dataset.cat = cat.id;\n m.style.setProperty('--ec-cat', cat.color);\n m.style.setProperty('--i', String(i));\n row.appendChild(m);\n });\n}\n\nfunction syncModules(row: Element, c: ResolvedConfig, state: ConsentState | null) {\n row.querySelectorAll<HTMLElement>('.ec-module').forEach((m) => {\n const cat = c.resolvedCategories.find((x) => x.id === m.dataset.cat);\n if (cat) m.classList.toggle('ec-module--on', isOn(cat, state));\n });\n}\n\n/**\n * The consent mosaic: one colour module per category, filled when granted,\n * outlined when off. Necessary categories are always filled. State is never\n * colour alone: every module has a text label and state in the legend.\n * Modules are created once and toggled in place so the fill can animate.\n */\nexport function renderMosaic(\n modal: Element | null,\n c: ResolvedConfig,\n texts: Texts,\n lang: string,\n state: ConsentState | null,\n) {\n if (!modal) return;\n const body = modal.querySelector('.cm__texts') ?? modal;\n let mosaic = modal.querySelector<HTMLElement>('.ec-mosaic');\n if (!mosaic || mosaic.dataset.lang !== lang) {\n mosaic?.remove();\n mosaic = h('div', 'ec-mosaic');\n mosaic.dataset.lang = lang;\n const row = h('div', 'ec-mosaic__row');\n row.setAttribute('aria-hidden', 'true');\n buildModules(row, c);\n const legend = h('ul', 'ec-mosaic__legend');\n for (const cat of c.resolvedCategories) {\n const li = h('li', 'ec-mosaic__item');\n li.dataset.cat = cat.id;\n const sw = h('span', 'ec-swatch');\n sw.style.setProperty('--ec-cat', cat.color);\n sw.setAttribute('aria-hidden', 'true');\n li.append(sw, document.createTextNode(localize(cat.title, lang, c.language.default)), h('span', 'ec-mosaic__state'));\n legend.appendChild(li);\n }\n mosaic.append(row, legend);\n body.insertBefore(mosaic, body.firstChild);\n }\n syncModules(mosaic.querySelector('.ec-mosaic__row')!, c, state);\n mosaic.querySelectorAll<HTMLElement>('.ec-mosaic__item').forEach((li) => {\n const cat = c.resolvedCategories.find((x) => x.id === li.dataset.cat)!;\n const on = isOn(cat, state);\n li.classList.toggle('is-on', on);\n li.querySelector('.ec-swatch')!.classList.toggle('ec-swatch--on', on);\n li.querySelector('.ec-mosaic__state')!.textContent = cat.readOnly\n ? texts.banner.legendAlways\n : on\n ? texts.banner.legendOn\n : texts.banner.legendOff;\n });\n}\n\nexport interface ReopenHandle {\n update(state: ConsentState | null): void;\n destroy(): void;\n}\n\n/** Floating \"cookie preferences\" button carrying a miniature of the visitor's mosaic. */\nexport function mountReopenButton(\n c: ResolvedConfig,\n texts: Texts,\n _lang: string,\n opts: ReopenButtonOptions,\n open: () => void,\n): ReopenHandle {\n const btn = h('button', `ec-reopen ec-reopen--${opts.position ?? (c.ui?.position === 'bottom-right' ? 'bottom-right' : 'bottom-left')}`);\n btn.type = 'button';\n btn.setAttribute('aria-label', texts.reopen.label);\n btn.title = texts.reopen.label;\n btn.hidden = true;\n const grid = h('span', 'ec-reopen__grid');\n grid.setAttribute('aria-hidden', 'true');\n buildModules(grid, c, ' ec-module--mini');\n btn.appendChild(grid);\n btn.addEventListener('click', open);\n document.body.appendChild(btn);\n\n let current: ConsentState | null = null;\n let revealed = false;\n const hiddenHere = () => (opts.hideOn ?? []).some((p) => location.pathname.startsWith(p));\n const sync = () => {\n btn.hidden = !current || hiddenHere();\n };\n const onNav = () => sync();\n // SPA routers change the path without reloading: watch history too.\n const wrap = (k: 'pushState' | 'replaceState') => {\n const orig = history[k];\n history[k] = function (this: History, ...args: Parameters<History['pushState']>) {\n const r = orig.apply(this, args);\n queueMicrotask(onNav);\n return r;\n } as History['pushState'];\n return () => (history[k] = orig);\n };\n const unwrap = [wrap('pushState'), wrap('replaceState')];\n addEventListener('popstate', onNav);\n\n return {\n update(state) {\n current = state;\n sync();\n if (!revealed && state && !btn.hidden) {\n // First appearance: start empty, then let the modules fill one step at a time.\n revealed = true;\n syncModules(grid, c, null);\n grid.querySelectorAll('.ec-module').forEach((m) => m.classList.remove('ec-module--on'));\n // Wait until the banner has gone (the button is display:none while it shows),\n // otherwise the fill would happen unseen.\n const start = performance.now();\n const fillWhenVisible = () => {\n const bannerUp = document.documentElement.classList.contains('show--consent');\n if ((bannerUp || getComputedStyle(btn).display === 'none') && performance.now() - start < 1500) {\n requestAnimationFrame(fillWhenVisible);\n return;\n }\n requestAnimationFrame(() => syncModules(grid, c, current));\n };\n requestAnimationFrame(fillWhenVisible);\n return;\n }\n syncModules(grid, c, state);\n },\n destroy() {\n unwrap.forEach((u) => u());\n removeEventListener('popstate', onNav);\n btn.remove();\n },\n };\n}\n","import { localize, resolveTexts, type ResolvedConfig } from '../shared/config';\nimport type { Texts } from '../shared/types';\n\nconst esc = (s: string) =>\n s.replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!);\n\n/** Build the engine (vanilla-cookieconsent) translation object for one language. */\nexport function engineTranslation(c: ResolvedConfig, lang: string, texts: Texts = resolveTexts(c, lang)) {\n const policyUrl = localize(c.policyUrl, lang, c.language.default);\n const policyLink = policyUrl\n ? ` <a class=\"ec-link\" href=\"${esc(policyUrl)}\">${esc(texts.banner.policyLink)}</a>`\n : '';\n const services = c.services ?? {};\n\n const sections = c.resolvedCategories.map((cat) => {\n const rows = cat.services.flatMap((sid) => {\n const svc = services[sid]!;\n const label = localize(svc.label, lang, c.language.default) || sid;\n return (svc.cookies ?? []).map((ck) => ({\n name: `<code>${esc(ck.pattern ? ck.name.replace(/^\\^|\\$$/g, '') + '…' : ck.name)}</code>`,\n service: esc(label),\n duration: esc(localize(ck.duration, lang, c.language.default)),\n desc: esc(localize(ck.description, lang, c.language.default) || localize(svc.purpose, lang, c.language.default)),\n }));\n });\n const serviceFurniture = cat.services\n .map((sid) => {\n const svc = services[sid]!;\n const label = localize(svc.label, lang, c.language.default) || sid;\n const purpose = localize(svc.purpose, lang, c.language.default);\n const durations = Array.from(\n new Set((svc.cookies ?? []).map((ck) => localize(ck.duration, lang, c.language.default)).filter(Boolean)),\n );\n const bits = [\n svc.provider ? `<span class=\"ec-svc__provider\">${esc(texts.preferences.provider)}: ${esc(svc.provider)}</span>` : '',\n durations.length\n ? `<span class=\"ec-svc__duration\">${esc(texts.preferences.cookieDuration)}: ${esc(durations.join(', '))}</span>`\n : '',\n svc.privacyUrl\n ? `<a class=\"ec-link\" href=\"${esc(svc.privacyUrl)}\" target=\"_blank\" rel=\"noopener\">${esc(texts.preferences.privacyPolicy)}</a>`\n : '',\n ].filter(Boolean);\n return `<li class=\"ec-svc\"><strong class=\"ec-svc__name\">${esc(label)}</strong>${\n purpose ? `<span class=\"ec-svc__purpose\">${esc(purpose)}</span>` : ''\n }${bits.length ? `<span class=\"ec-svc__meta\">${bits.join(' · ')}</span>` : ''}</li>`;\n })\n .join('');\n\n return {\n title: `<span class=\"ec-swatch\" style=\"--ec-cat:${esc(cat.color)}\" aria-hidden=\"true\"></span>${esc(\n localize(cat.title, lang, c.language.default),\n )}${cat.readOnly ? ` <span class=\"ec-always\">${esc(texts.preferences.alwaysOn)}</span>` : ''}`,\n description:\n esc(localize(cat.description, lang, c.language.default)) +\n (serviceFurniture ? `<ul class=\"ec-svcs\" aria-label=\"${esc(texts.preferences.services)}\">${serviceFurniture}</ul>` : ''),\n linkedCategory: cat.id,\n ...(rows.length\n ? {\n cookieTable: {\n caption: esc(texts.preferences.cookieName),\n headers: {\n name: esc(texts.preferences.cookieName),\n service: esc(texts.preferences.services),\n duration: esc(texts.preferences.cookieDuration),\n desc: esc(texts.preferences.cookieDescription),\n },\n body: rows,\n },\n }\n : {}),\n };\n });\n\n return {\n consentModal: {\n title: esc(texts.banner.title),\n description: esc(texts.banner.description) + policyLink,\n acceptAllBtn: esc(texts.banner.acceptAll),\n acceptNecessaryBtn: esc(texts.banner.rejectAll),\n showPreferencesBtn: esc(texts.banner.customize),\n // The X closes the banner and counts as a rejection (Garante 2021).\n closeIconLabel: esc(texts.banner.close),\n },\n preferencesModal: {\n title: esc(texts.preferences.title),\n acceptAllBtn: esc(texts.preferences.acceptAll),\n acceptNecessaryBtn: esc(texts.preferences.rejectAll),\n savePreferencesBtn: esc(texts.preferences.save),\n closeIconLabel: esc(texts.preferences.close),\n serviceCounterLabel: esc(texts.preferences.serviceCounter),\n sections: [{ description: esc(texts.preferences.intro) + policyLink }, ...sections],\n },\n };\n}\n\n/** Engine `categories` block: enabled false by default, readOnly, services and autoClear rules. */\nexport function engineCategories(c: ResolvedConfig, lang: string, serviceToggles: boolean) {\n const services = c.services ?? {};\n const out: Record<string, unknown> = {};\n for (const cat of c.resolvedCategories) {\n const cookies = cat.services.flatMap((sid) =>\n (services[sid]!.cookies ?? []).map((ck) => ({ name: ck.pattern ? new RegExp(ck.name) : ck.name })),\n );\n const svc: Record<string, { label: string }> = {};\n if (serviceToggles && !cat.readOnly)\n for (const sid of cat.services) svc[sid] = { label: localize(services[sid]!.label, lang, c.language.default) || sid };\n out[cat.id] = {\n enabled: false,\n readOnly: cat.readOnly,\n ...(Object.keys(svc).length ? { services: svc } : {}),\n ...(cookies.length && !cat.readOnly ? { autoClear: { cookies, reloadPage: false } } : {}),\n };\n }\n return out;\n}\n","import * as engine from '../engine/index.esm.js';\nimport { gcmStateFor, localize, resolveConfig, resolveTexts, validateConfig, type ResolvedConfig } from '../shared/config';\nimport { decodeRawCookie, parseConsent, readCookie } from '../shared/cookie';\nimport type {\n ConsentEventDetail,\n ConsentMethod,\n ConsentRecordInput,\n ConsentState,\n EasyCookieApi,\n EasyCookieConfig,\n EasyCookieEvent,\n Texts,\n} from '../shared/types';\nimport { mountEmbeds } from './embeds';\nimport { flushQueue, sendRecord, sendSubject } from './log';\nimport { renderMosaic, mountReopenButton, type ReopenHandle } from './ui';\nimport { engineCategories, engineTranslation } from './translate';\n\ntype Listener = (detail: ConsentEventDetail | null) => void;\ntype RunInput = EasyCookieConfig | { remote: { endpoint: string; siteKey: string } };\n\nconst w = typeof window !== 'undefined' ? (window as any) : undefined;\n\nfunction detectLanguage(c: ResolvedConfig): string {\n const avail = c.language.available;\n let cand: string | undefined;\n if (c.language.autoDetect === 'document' && typeof document !== 'undefined') cand = document.documentElement.lang;\n else if (c.language.autoDetect === 'browser' && typeof navigator !== 'undefined') cand = navigator.language;\n const short = cand?.slice(0, 2).toLowerCase();\n return short && avail.includes(short) ? short : c.language.default;\n}\n\nfunction eraseCookie(c: ResolvedConfig) {\n const base = `${c.cookie.name}=; Max-Age=0; Path=${c.cookie.path}`;\n document.cookie = base;\n if (c.cookie.domain) document.cookie = `${base}; Domain=${c.cookie.domain}`;\n}\n\n/** Create an independent easy-cookie instance. The default export is a singleton. */\nexport function createEasyCookie(): EasyCookieApi {\n let config: ResolvedConfig | null = null;\n let lang = 'it';\n let texts: Texts | null = null;\n const listeners = new Map<EasyCookieEvent, Set<Listener>>();\n let pendingMethod: ConsentMethod | null = null;\n let pendingSubject: string | null = null;\n let lastSend: Promise<boolean> = Promise.resolve(true);\n let firstFlag = false;\n let previous: string[] = [];\n let reopen: ReopenHandle | null = null;\n let embeds: { refresh(): void } | null = null;\n let ran = false;\n\n const emit = (event: EasyCookieEvent, detail: ConsentEventDetail | null) => {\n listeners.get(event)?.forEach((cb) => {\n try {\n cb(detail);\n } catch (e) {\n console.error('[easy-cookie] listener error', e);\n }\n });\n w?.dispatchEvent(new CustomEvent(`easycookie:${event}`, { detail }));\n };\n\n const get = (): ConsentState | null => {\n if (!config || typeof document === 'undefined') return null;\n return parseConsent(readCookie(document.cookie, config.cookie.name), {\n revision: config.revision,\n expiryDays: config.expiryDays,\n });\n };\n\n const gtag = (...args: unknown[]) => {\n if (!w || !config) return;\n const dl = config.gcm.dataLayerName;\n w[dl] = w[dl] || [];\n if (typeof w.gtag === 'function') w.gtag(...args);\n else\n w[dl].push(\n (function (this: unknown) {\n return arguments;\n } as any)(...args),\n );\n };\n\n const pushConsentMode = (state: ConsentState, first: boolean, notify: boolean) => {\n if (!config?.gcm.enabled) return;\n gtag('consent', 'update', gcmStateFor(config, state.categories));\n if (!notify) return;\n const flags: Record<string, boolean> = {};\n for (const cat of config.resolvedCategories) flags[cat.id] = state.categories.includes(cat.id);\n // A tag blocked on gtm.init is not re-fired by a later consent update:\n // GTM needs this custom event as an extra trigger (documented in the README).\n w[config.gcm.dataLayerName].push({\n event: config.gcm.eventName,\n easyCookie: { categories: flags, method: state.method, first, revision: state.revision },\n });\n };\n\n const inferMethod = (accepted: string[]): ConsentMethod => {\n if (!config) return 'custom';\n const optional = config.resolvedCategories.filter((c) => !c.readOnly).map((c) => c.id);\n if (optional.every((id) => accepted.includes(id))) return 'accept_all';\n if (optional.every((id) => !accepted.includes(id))) return 'reject_all';\n return 'custom';\n };\n\n const record = (state: ConsentState): ConsentRecordInput => {\n const cats: Record<string, boolean> = {};\n for (const c of config!.resolvedCategories) cats[c.id] = state.categories.includes(c.id);\n return {\n consentId: state.id,\n revision: state.revision,\n categories: cats,\n services: state.services,\n method: state.method,\n language: lang,\n pageUrl: location.origin + location.pathname,\n clientTimestamp: state.updatedAt,\n };\n };\n\n const handleChoice = (first: boolean, changed: string[]) => {\n if (!config) return;\n const raw = engine.getUserPreferences() as { acceptedCategories: string[] };\n const method = pendingMethod ?? inferMethod(raw.acceptedCategories);\n pendingMethod = null;\n engine.setCookieData({ value: { ec: { rev: config.revision, method } }, mode: 'overwrite' });\n const state = get();\n if (!state) return;\n pushConsentMode(state, first, true);\n const withdrawn = previous.filter((c) => !state.categories.includes(c));\n previous = state.categories;\n afterState(state);\n emit(first ? 'consent' : 'change', { consent: state, changed, first });\n const sent = config.log ? sendRecord(config.log, record(state)) : Promise.resolve(true);\n lastSend = sent;\n // A subject passed to identify() before the first choice is linked as soon\n // as the record exists on the server.\n if (pendingSubject && config.log) {\n const subject = pendingSubject;\n pendingSubject = null;\n void sent.then((ok) => ok && sendSubject(config!.log!, state.id, subject));\n }\n if (config.log?.requireLog)\n sent.then((ok) => {\n if (!ok) {\n eraseCookie(config!);\n engine.show(true);\n const err = document.querySelector('#cc-main .ec-error');\n if (err) err.textContent = texts!.errors.logFailed;\n }\n });\n if (withdrawn.length && !first && config.ui?.reloadOnWithdraw !== false) {\n // Scripts already running cannot be unloaded: reload once the record is out.\n sent.finally(() => location.reload());\n }\n };\n\n const afterState = (state: ConsentState | null) => {\n // Keep the head script's snapshot in sync, for code that reads it before or\n // without the runtime (e.g. the PostHog before_send filter).\n if (w) w.__easyCookieHead = { granted: state ? state.categories : config!.resolvedCategories.filter((c) => c.readOnly).map((c) => c.id), valid: !!state };\n renderMosaic(document.querySelector('#cc-main .cm'), config!, texts!, lang, state);\n reopen?.update(state);\n embeds?.refresh();\n };\n\n const api: EasyCookieApi = {\n async run(input: RunInput) {\n if (!w) return;\n if (ran) {\n console.warn('[easy-cookie] run() called twice; ignoring.');\n return;\n }\n ran = true;\n let cfg: EasyCookieConfig;\n if ('remote' in input) {\n const res = await fetch(\n `${input.remote.endpoint.replace(/\\/$/, '')}/v1/sites/${encodeURIComponent(input.remote.siteKey)}/config.json`,\n { credentials: 'omit' },\n );\n if (!res.ok) throw new Error(`[easy-cookie] could not load config (${res.status})`);\n cfg = await res.json();\n } else cfg = input;\n\n const issues = validateConfig(cfg);\n if (issues.length) console.warn('[easy-cookie] config issues:', issues);\n config = resolveConfig(cfg);\n lang = detectLanguage(config);\n texts = resolveTexts(config, lang);\n\n // A stored choice for another revision, expired, or without easy-cookie data is not\n // valid: drop it so the engine shows the banner again (re-prompt).\n const rawValue = readCookie(document.cookie, config.cookie.name);\n if (rawValue && !parseConsent(rawValue, { revision: config.revision, expiryDays: config.expiryDays })) {\n if (decodeRawCookie(rawValue)) eraseCookie(config);\n else eraseCookie(config);\n }\n previous = get()?.categories ?? [];\n\n if (config.log) flushQueue(config.log);\n\n const translations: Record<string, unknown> = {};\n for (const l of config.language.available) translations[l] = engineTranslation(config, l, resolveTexts(config, l));\n\n const pos = config.ui?.position ?? 'bottom-left';\n const enginePos = pos === 'bottom' ? 'bottom center' : pos === 'center' ? 'middle center' : pos.replace('-', ' ');\n document.documentElement.classList.add('ec');\n // `bottom` is a full-width bar on wide screens, not a centred box.\n document.documentElement.classList.toggle('ec--bar', pos === 'bottom');\n const scheme = config.ui?.colorScheme ?? 'light';\n if (scheme === 'dark') document.documentElement.classList.add('ec--dark');\n if (scheme === 'auto' && w.matchMedia?.('(prefers-color-scheme: dark)').matches)\n document.documentElement.classList.add('ec--dark');\n\n // Record which control the visitor used (the engine's callbacks don't say).\n document.addEventListener(\n 'click',\n (e) => {\n const el = (e.target as Element | null)?.closest?.('#cc-main button');\n if (!el) return;\n const role = el.getAttribute('data-role');\n if (el.classList.contains('cm__btn--close')) pendingMethod = 'close';\n else if (role === 'all') pendingMethod = 'accept_all';\n else if (role === 'necessary') pendingMethod = 'reject_all';\n else if (role === 'save') pendingMethod = null; // inferred from the toggles\n },\n true,\n );\n\n // Any `[data-ec-open-preferences]` element opens the preferences, including\n // elements added later (e.g. the `{{preferences-link}}` of a legal document).\n document.addEventListener('click', (e) => {\n const el = (e.target as Element | null)?.closest?.('[data-ec-open-preferences]');\n if (!el) return;\n e.preventDefault();\n api.openPreferences();\n });\n\n await engine.run({\n root: document.body,\n mode: 'opt-in',\n autoShow: true,\n revision: 0,\n hideFromBots: cfg.hideFromBots ?? true,\n manageScriptTags: true,\n autoClearCookies: true,\n disablePageInteraction: false,\n respectGpc: cfg.respectGpc ?? true,\n cookie: {\n name: config.cookie.name,\n path: config.cookie.path,\n sameSite: config.cookie.sameSite,\n ...(config.cookie.domain ? { domain: config.cookie.domain } : {}),\n expiresAfterDays: config.expiryDays,\n secure: config.cookie.secure && location.protocol === 'https:',\n },\n guiOptions: {\n consentModal: { layout: 'box', position: enginePos, equalWeightButtons: true, flipButtons: false },\n preferencesModal: { layout: 'box', equalWeightButtons: true, flipButtons: false },\n },\n categories: engineCategories(config, lang, config.ui?.serviceToggles !== false),\n language: { default: lang, translations },\n onFirstConsent: () => {\n firstFlag = true;\n },\n onConsent: () => {\n if (firstFlag) {\n firstFlag = false;\n handleChoice(true, []);\n } else {\n const state = get();\n if (state) {\n pushConsentMode(state, false, false);\n afterState(state);\n emit('replay', { consent: state, changed: [], first: false });\n }\n }\n },\n onChange: ({ changedCategories }: { changedCategories: string[] }) => handleChoice(false, changedCategories),\n onModalReady: ({ modalName, modal }: { modalName: string; modal: HTMLElement }) => {\n if (modalName === 'consentModal') {\n renderMosaic(modal, config!, texts!, lang, get());\n if (!modal.querySelector('.ec-error')) {\n const err = document.createElement('p');\n err.className = 'ec-error';\n err.setAttribute('role', 'alert');\n modal.querySelector('.cm__texts')?.appendChild(err);\n }\n }\n },\n } as any);\n\n const reopenOpt = config.ui?.reopenButton ?? true;\n if (reopenOpt)\n reopen = mountReopenButton(config, texts, lang, typeof reopenOpt === 'object' ? reopenOpt : {}, () =>\n api.openPreferences(),\n );\n embeds = mountEmbeds(config, () => texts!, () => lang, api);\n afterState(get());\n emit('ready', null);\n },\n\n get,\n isGranted: (category) => !!get()?.categories.includes(category),\n isServiceGranted: (service) => {\n const s = get();\n if (!s || !config) return false;\n const cat = config.services?.[service]?.category;\n return !!cat && (s.services[cat]?.includes(service) ?? false);\n },\n on(event, cb) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(cb);\n return () => listeners.get(event)?.delete(cb);\n },\n onGranted(category, cb) {\n let fired = false;\n const check = () => {\n if (!fired && api.isGranted(category)) {\n fired = true;\n cb();\n }\n };\n check();\n const offs = (['ready', 'consent', 'change', 'replay'] as EasyCookieEvent[]).map((e) => api.on(e, check));\n return () => offs.forEach((off) => off());\n },\n showBanner: () => engine.show(true),\n openPreferences: () => engine.showPreferences(),\n acceptAll() {\n pendingMethod = 'accept_all';\n engine.acceptCategory('all');\n engine.hide();\n engine.hidePreferences();\n },\n rejectAll() {\n pendingMethod = 'reject_all';\n engine.acceptCategory([]);\n engine.hide();\n engine.hidePreferences();\n },\n accept(categories, services) {\n pendingMethod = null;\n const current = get()?.categories ?? [];\n engine.acceptCategory(Array.from(new Set([...current, ...categories])));\n if (services)\n for (const [cat, svcs] of Object.entries(services)) engine.acceptService(svcs, cat);\n engine.hide();\n },\n async identify(subjectId) {\n if (!config?.log) return false;\n const s = get();\n if (!s) {\n // No choice yet: link it right after the visitor chooses.\n pendingSubject = subjectId;\n return false;\n }\n // The record must exist on the server before the link (see docs/api.md).\n await lastSend;\n return sendSubject(config.log, s.id, subjectId);\n },\n reset() {\n if (!config) return;\n const s = get();\n if (s && config.log) sendRecord(config.log, { ...record(s), method: 'withdraw', categories: Object.fromEntries(config.resolvedCategories.map((c) => [c.id, c.readOnly])) });\n eraseCookie(config);\n previous = [];\n engine.reset(true);\n ran = false;\n reopen?.destroy();\n reopen = null;\n },\n getConfig: () => config,\n getLanguage: () => lang,\n async setLanguage(l) {\n if (!config || !config.language.available.includes(l)) return;\n lang = l;\n texts = resolveTexts(config, l);\n await engine.setLanguage(l, true);\n afterState(get());\n },\n };\n return api;\n}\n\nexport { localize };\n","import { resolveConfig, type ResolvedConfig } from './config';\nimport type { EasyCookieConfig, GcmSignal } from './types';\n\n/**\n * Build the inline `<head>` script that must run before GTM / gtag.\n *\n * It reads the consent cookie synchronously and calls\n * `gtag('consent','default', …)` with the visitor's real stored state\n * (everything denied when there is no valid choice for this revision), so tags\n * fired on `gtm.init` already see the right consent from the second page on.\n *\n * The output is dependency-free ES5, generated from the same config the\n * runtime uses: no hand-copied cookie parsing in host apps.\n */\nexport function renderHeadScript(config: EasyCookieConfig | ResolvedConfig): string {\n const c = 'resolvedCategories' in config ? (config as ResolvedConfig) : resolveConfig(config);\n const map: Record<string, GcmSignal[]> = {};\n const always: string[] = [];\n const signals = new Set<GcmSignal>(['ad_storage', 'ad_user_data', 'ad_personalization', 'analytics_storage']);\n for (const cat of c.resolvedCategories) {\n map[cat.id] = cat.gcm;\n cat.gcm.forEach((s) => signals.add(s));\n if (cat.readOnly) always.push(cat.id);\n }\n signals.delete('security_storage');\n\n const data = {\n n: c.cookie.name,\n r: c.revision,\n e: c.expiryDays * 86400000,\n m: map,\n a: always,\n s: Array.from(signals),\n w: c.gcm.waitForUpdate,\n g: c.gcm.region ?? null,\n d: c.gcm.dataLayerName,\n x: c.gcm.adsDataRedaction,\n u: c.gcm.urlPassthrough,\n on: c.gcm.enabled,\n };\n\n // Keep this ES5 and tiny: it runs render-blocking in <head>.\n return `(function(w,d,o){\nvar dl=o.d;w[dl]=w[dl]||[];\nw.gtag=w.gtag||function(){w[dl].push(arguments);};\nvar granted=o.a.slice(),state=null;\nvar i,k,s,v=null,p=d.cookie.split(/;\\\\s*/);\nfor(i=0;i<p.length;i++){var q=p[i].indexOf('=');if(q>0&&p[i].slice(0,q)===o.n){v=p[i].slice(q+1);break;}}\ntry{if(v){if(v.charAt(0)!=='{')v=decodeURIComponent(v);var c=JSON.parse(v);\nvar ec=c.data&&c.data.ec,t=Date.parse(c.lastConsentTimestamp||c.consentTimestamp);\nif(ec&&ec.rev===o.r&&t&&(new Date().getTime()-t)<=o.e){state=c;granted=c.categories||granted;}}}catch(e){}\nw.__easyCookieHead={granted:granted,valid:!!state};\nif(!o.on)return;\nvar cs={};\nfor(i=0;i<o.s.length;i++)cs[o.s[i]]='denied';\nfor(k in o.m){if(granted.indexOf(k)>-1){s=o.m[k];for(i=0;i<s.length;i++)cs[s[i]]='granted';}}\ncs.security_storage='granted';\nif(!state)cs.wait_for_update=o.w;\nif(o.g)cs.region=o.g;\nw.gtag('consent','default',cs);\nif(o.x)w.gtag('set','ads_data_redaction',true);\nif(o.u)w.gtag('set','url_passthrough',true);\n})(window,document,${JSON.stringify(data)});`;\n}\n"],"mappings":"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","names":["scripts","createPreferencesModal","createMainContainer","show","showPreferences","hide","hidePreferences","acceptCategory","modal","getFocusableElements","createMainContainer","hide","hidePreferences","acceptCategory","value","categoryName","createMainContainer","hide","showPreferences","acceptCategory","url","domain","_a","_b","_c","_d","_e","_f","_g","_h","w","_a","_a","_a","_b"]}