import { FirebaseOptions } from 'firebase/app';
import { CookieItem, Service, AcceptType, ConsentModalLayout, ConsentModalPosition, PreferencesModalLayout, PreferencesModalPosition, CookieValue, ModalName, UserPreferences } from 'vanilla-cookieconsent';
import { Keyframes, CSSPropertiesWithMultiValues } from '@emotion/serialize';
import { Pseudos } from 'csstype';

/**
 * Bind any button or link to the consent manager using the `data-cc` attribute.
 * This allows you to trigger the consent manager from anywhere on your website.
 * The value of the `data-cc` attribute should be one of the predefined values.
 */
declare const cookieConsentAttributes: {
    /**
     * @description
     * Use this value to accept all cookie categories.
     *
     * @example
     *
     * ```html
     * <button type="button" data-cc="accept-all">Accept all categories</button>
     * <a href="#" data-cc={cookieConsentAttributes.acceptAll}>Accept all categories</a>
     * ```
     */
    acceptAll: string;
    /**
     * @description
     * Use this value to accept the current selection inside the preferences modal.
     *
     * @example
     *
     * ```html
     * <button type="button" data-cc="accept-custom">Accept selection</button>
     * <a href="#" data-cc={cookieConsentAttributes.acceptCustom}>Accept selection</a>
     * ```
     */
    acceptCustom: string;
    /**
     * @description
     * Use this value to accept only the necessary cookie categories.
     *
     * @example
     *
     * ```html
     * <button type="button" data-cc="accept-necessary">Reject all categories</button>
     * <a href="#" data-cc={cookieConsentAttributes.acceptNecessary}>Reject all categories</a>
     * ```
     */
    acceptNecessary: string;
    /**
     * @description
     * Use this value to show the consentModal. If the consent modal does not exist, it will be generated on the fly.
     *
     * @example
     *
     * ```html
     * <button type="button" data-cc="show-consentModal">View Consent Modal</button>
     * <a href="#" data-cc={cookieConsentAttributes.showConsentModal}>View Consent Modal</a>
     * ```
     */
    showConsentModal: string;
    /**
     * @description
     * Use this value to show the preferencesModal.
     *
     * @example
     *
     * ```html
     * <button type="button" data-cc="show-preferencesModal">View Preferences Modal</button>
     * <a href="#" data-cc={cookieConsentAttributes.showPreferencesModal}>View Preferences Modal</a>
     * ```
     */
    showPreferencesModal: string;
};

declare const cookieConsentEvents: {
    /**
     * @description
     * This event is triggered when the user modifies their preferences and only if consent has already been provided.
     *
     * @example
     *
     * ```js
     * cookieConsentEvents.onChange // "cc:onChange"
     * window.addEventListener('cc:onChange', ({ detail }) => {
     *    // detail.cookie
     *    // detail.changedCategories
     *    // detail.changedServices
     * });
     * ```
     */
    onChange: string;
    /**
     * @description
     * This event is triggered the very first time the user expresses their choice of consent — just like onFirstConsent — but also on every subsequent page load.
     *
     * @example
     *
     * ```js
     * cookieConsentEvents.onConsent // "cc:onConsent"
     * window.addEventListener('cc:onConsent', ({ detail }) => {
     *    // detail.cookie
     * });
     * ```
     */
    onConsent: string;
    /**
     * @description
     * This event is triggered only the very first time that the user expresses their choice of consent (accept/reject).
     *
     * @example
     *
     * ```js
     * cookieConsentEvents.onFirstConsent // "cc:onFirstConsent"
     * window.addEventListener('cc:onFirstConsent', ({ detail }) => {
     *    // detail.cookie
     * });
     * ```
     */
    onFirstConsent: string;
    /**
     * @description
     * This event is triggered when one of the modals is hidden.
     *
     * @example
     *
     * ```js
     * cookieConsentEvents.onModalHide // "cc:onModalHide"
     * window.addEventListener('cc:onModalHide', ({ detail }) => {
     *    // detail.modalName
     * });
     * ```
     */
    onModalHide: string;
    /**
     * @description
     * This event is triggered when a modal is created and appended to the DOM.
     *
     * @example
     *
     * ```js
     * cookieConsentEvents.onModalReady // "cc:onModalReady"
     * window.addEventListener('cc:onModalReady', ({ detail }) => {
     *    // detail.modalName
     *    // detail.modal
     * });
     * ```
     */
    onModalReady: string;
    /**
     * @description
     * This event is triggered when one of the modals is visible.
     *
     * @example
     *
     * ```js
     * cookieConsentEvents.onModalShow // "cc:onModalShow"
     * window.addEventListener('cc:onModalShow', ({ detail }) => {
     *    // detail.modalName
     * });
     * ```
     */
    onModalShow: string;
};

/**
 * ### Available [Callbacks and Events](https://cookieconsent.orestbida.com/advanced/callbacks-events.html)
 *
 * There are a few callbacks/events at your disposal to handle different kinds of situations.
 * Each callback has a corresponding custom event, named after the callback function itself.
 *
 * **Valid values:**
 *
 * - `onFirstConsent`
 * - `onConsent`
 * - `onChange`
 * - `onModalShow`
 * - `onModalHide`
 * - `onModalReady`
 *
 * ---
 *
 * ### Available [data-attributes](https://cookieconsent.orestbida.com/advanced/custom-attribute.html)
 *
 * The `data-cc` attribute allows you to bind any `button` — or `link` — to a few API methods in order to run core functions, without the need to use javascript code.
 *
 * **Valid values:**
 *
 * - `show-preferencesModal`
 * - `show-consentModal`
 * - `accept-all`
 * - `accept-necessary`
 * - `accept-custom`
 */
interface CookieConsentConfiguration {
    /**
     * Clears cookies when user rejects a specific category. It requires a valid autoClear array.
     *
     * ---
     *
     * **Default:** `true`
     *
     * ---
     *
     * **Type:** `boolean`
     *
     * ---
     *
     * **Details:**
     *
     * This function is executed on the following 2 events:
     *
     * - when consent is not valid and the onFirstConsent callback is executed
     * - when consent is valid and the state of the categories is changed
     */
    autoClearCookies?: boolean;
    /**
     * Automatically shows the consent modal if consent is not valid.
     *
     * ---
     *
     * **Default:** `true`
     *
     * ---
     *
     * **Type:** `boolean`
     *
     * ---
     *
     * **Details:**
     *
     * When set to `true`, the consent modal will automatically appear if the user's consent is not valid.
     * If set to `false`, the modal will not appear automatically and must be triggered manually.
     *
     * ---
     *
     * **Example:**
     *
     * Disable `autoShow` and display the modal after 3 seconds:
     *
     * ```typescript
     * CookieConsent.run({
     *    autoShow: false
     * });
     *
     * setTimeout(CookieConsent.show, 3000);
     * ```
     */
    autoShow?: boolean;
    /**
     * Configure cookie categories.
     */
    categories: {
        [key: string]: Category;
    };
    /**
     * Change plugin's default cookie options.
     */
    cookie?: CookieOptions;
    /**
     * Create dark overlay and disable page scroll until consent.
     *
     * @default false
     */
    disablePageInteraction?: boolean;
    /**
     * Tweak some UI options.
     */
    guiOptions?: GuiOptions;
    /**
     * Stop the plugin's execution if a bot/crawler is detected
     * to prevent the indexing of the modal's content.
     *
     * @default true
     */
    hideFromBots?: boolean;
    /**
     * Configure language and translations.
     */
    language: {
        /**
         *  Set the current language dynamically.
         *
         * ---
         *
         * **Type:** `string`
         *
         * ---
         *
         * **Details:**
         *
         * The language will be set only if a valid translation is defined, otherwise the plugin will fallback to the default language.
         *
         * ---
         *
         * **Valid values:**
         *
         * - `document`: retrieve language from the lang attribute (e.g. <html lang="en-US">)
         * - `browser`: retrieve the user's browser language via navigator.language
         */
        autoDetect?: "browser" | "document";
        /**
         * The desired default language.
         *
         * ---
         *
         * **Type:** `string`
         *
         * ---
         *
         * **Example:**
         *
         * ```typescript
         * CookieConsent.run({
         *    language: {
         *       default: "en"
         *    }
         * })
         * ```
         */
        default: string;
        /**
         * List of languages that should use the RTL layout.
         *
         * ---
         *
         * **Type:** `string | string[]`
         *
         * ---
         *
         * **Details:**
         *
         * The RTL layout will be applied to the specified languages.
         *
         * ---
         *
         * **Example:**
         *
         * ```typescript
         * CookieConsent.run({
         *    language: {
         *        default: "en",
         *        rtl: "ar" // enable RTL for Arabic
         *        autoDetect: "browser",
         *        translations: {
         *            en: "/assets/translations/en.json",
         *            ar: "/assets/translations/ar.json"
         *        }
         *    }
         * })
         */
        rtl?: string | string[];
        /**
         * Define the translation(s) content.
         *
         * **Type:**
         *
         * ```typescript
         * interface Translations {
         *   [locale: string]:
         *     Translation
         *     | string
         *     | (() => Translation)
         *     | (() => Promise<Translation>)
         * }
         * ```
         *
         * ---
         *
         * **Details:**
         *
         * You can define an inline translation object, or specify the path to an external .json translation file.
         *
         * ---
         *
         * **Examples:**
         *
         * ---
         *
         * External translation file:
         *
         * @example
         *
         * ```typescript
         * CookieConsent.run({
         *   language: {
         *     default: "en",
         *     translations: {
         *       en: "/assets/translations/en.json"
         *     }
         *   }
         * })
         * ```
         *
         * ---
         *
         * Inline translation object:
         *
         * @example
         *
         * ```typescript
         * CookieConsent.run({
         *   language: {
         *     default: "en",
         *     translations: {
         *       en: {
         *         consentModal: {
         *           // ...
         *         },
         *         preferencesModal: {
         *           // ...
         *         }
         *       }
         *     }
         *   }
         * })
         * ```
         *
         * ---
         *
         * You can also fetch a translation asynchronously:
         *
         * @example
         *
         * ```typescript
         * CookieConsent.run({
         *   language: {
         *     default: "en",
         *     translations: {
         *       en: async () => {
         *         const res = fetch("path-to-json-translation");
         *         return await res.json();
         *       }
         *     }
         *   }
         * })
         * ```
         */
        translations: {
            [locale: string]: (() => Promise<Translation>) | (() => Translation) | string | Translation;
        };
    };
    /**
     * Delays the generation of the modal's markup until they're about to become visible, to improve the TTI score.
     * You can detect when a modal is ready/created via the `onModalReady` callback.
     *
     * @default true
     */
    lazyHtmlGeneration?: boolean;
    /**
     * Intercept all `<script>` tags with a `"data-category"` attribute, and enables them based on the accepted categories.
     *
     * ---
     *
     * **Default:** true
     *
     * ---
     *
     * **Type:** `boolean`
     *
     * ---
     *
     * **Details:**
     *
     * There are two ways to manage your scripts:
     *
     * - via <script> tags
     * - via callbacks/events
     *
     * ---
     *
     * **Info:**
     *
     * A `<script>` tag can be enabled and disabled at most once, unlike the `onChange` callback — or its equivalent event listener — which can be executed multiple times.
     *
     * ---
     *
     * **Available script attributes:**
     *
     * - **`data-category`**: name of the category
     * - **`data-service` (optional)**: if specified, a toggle will be generated in the `preferencesModal`
     * - **`data-type` (optional)**: custom type (e.g. "module")
     * - **`data-src` (optional)**: can be used instead of src to avoid validation issues
     *
     * ---
     *
     * **Example:**
     *
     * You can manage any script tag by adding the following 2 attributes (both required):
     *
     * - type="text/plain"
     * - data-category="your-category-name"
     *
     * ---
     *
     * **Inline script for enabled category:**
     *
     * ```html
     * <script
     *    type="text/plain"
     *    data-category="analytics"
     *    data-service="Google Analytics"
     * >
     * // Executed when the "analytics" category is enabled
     * </script>
     * ```
     *
     * ---
     *
     * **Inline script for disabled category:**
     *
     * You can also run scripts when a category is disabled (if it was previously enabled) by prepending the "!" character to the category name:
     *
     * ```html
     * <script
     *     type="text/plain"
     *     data-category="!analytics"
     * >
     * // Executed when the "analytics" category is disabled
     * </script>
     * ```
     *
     * ---
     *
     * **External script with src attribute:**
     *
     * You can set a custom script type via the `data-type` attribute. E.g. to set the `type="module"` attribute you must specify `data-type="module"`:
     *
     * ```html
     * <script
     *     type="text/plain"
     *     data-src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXX-X"
     *     data-category="analytics"
     *     data-service="Google Analytics"
     *     data-type="module"
     * ></script>
     * ```
     */
    manageScriptTags?: boolean;
    /**
     * Changes the scripts" activation logic when consent is not valid.
     *
     * ---
     *
     * **Default:** "opt-in"
     *
     * **Type:** `string`
     *
     * ---
     *
     * **Values:** `"opt-in" | "opt-out"`
     *
     * ---
     *
     * **Details:**
     *
     * - **`opt-in`**: Scripts — configured under a specific category — will run only if the user accepts that category (GDPR compliant).
     * - **`opt-out`**: Scripts — configured under a specific category which has `enabled: true` — will run automatically (it is generally not GDPR compliant). Once the user has provided consent, this option is ignored.
     *
     * ---
     *
     * **Example:**
     *
     * Setting the mode on a per-country basis (concept):
     *
     * ```typescript
     * const euCountries = ["DE", "FR", "IT", ...];
     * const userCountry = "IT";
     *
     * const dynamicMode = euCountries.includes(userCountry) ? "opt-in" : "opt-out";
     *
     * CookieConsent.run({
     *   mode: dynamicMode
     * });
     * ```
     */
    mode?: "opt-in" | "opt-out";
    /**
     * Callback function executed when the user's preferences — such as `accepted categories` and `services` — change.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * function({
     *     cookie: CookieValue,
     *     changedCategories: string[],
     *     changedPreferences: { [category: string]: string[] }
     * }): void
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * This callback function is executed every time the user changes their preferences in the preferences modal.
     * It is useful for tracking or logging purposes, or for executing any other action that should happen every time the user interacts with the preferences modal.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *     onChange: ({ cookie, changedCategories, changedPreferences }) => {
     *         if (changedCategories.includes("analytics")) {
     *
     *             if (CookieConsent.acceptedCategory("analytics")) {
     *                 // the analytics category was just enabled
     *             } else {
     *                 // the analytics category was just disabled
     *             }
     *
     *             if (changedServices["analytics"].includes("Google Analytics")) {
     *                 if (CookieConsent.acceptedService("Google Analytics", "analytics")) {
     *                     // Google Analytics was just enabled
     *                 } else {
     *                     // Google Analytics was just disabled
     *                 }
     *             }
     *         }
     *     }
     * })
     * ```
     *
     * ---
     *
     * **Using event listener:**
     *
     * ```typescript
     * window.addEventListener("cc:onChange", ({ detail }) => {
     *    // detail.cookie
     *    // detail.changedCategories
     *    // detail.changedServices
     * });
     * ```
     */
    onChange?: (param: {
        changedCategories: string[];
        changedServices: {
            [key: string]: string[];
        };
        cookie: CookieValue;
    }) => void;
    /**
     * Callback function executed on the user's first consent action and after each page load.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * function({
     *    cookie: CookieValue
     * }): void
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * This callback function is executed every time the user accepts or rejects the cookie consent. This callback function is also executed on revision change.
     * It is useful for tracking or logging purposes, or for executing any other action that should happen every time the user interacts with the consent modal.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *    onConsent: ({ cookie }) => {
     *        if(CookieConsent.acceptedCategory("analytics")){
     *            // Analytics category enabled
     *        }
     *
     *        if(CookieConsent.acceptedService("Google Analytics", "analytics")){
     *            // Google Analytics enabled
     *        }
     *    }
     * })
     * ```
     *
     * ---
     *
     * **Using event listener:**
     *
     * ```typescript
     * window.addEventListener("cc:onConsent", ({ detail }) => {
     *    // detail.cookie
     * });
     * ```
     */
    onConsent?: (param: {
        cookie: CookieValue;
    }) => void;
    /**
     * Callback function executed once, on the user's first consent action.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * function({
     *    cookie: CookieValue
     * }): void
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * This callback function is executed only once, when the user first accepts or rejects the cookie consent. This callback function is also executed on revision change.
     * It is useful for tracking or logging purposes, or for executing any other action that should only happen once.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *    onFirstConsent: ({ cookie }) => {
     *        // do something
     *    }
     * })
     * ```
     *
     * ---
     *
     * **Using event listener:**
     *
     * ```typescript
     * window.addEventListener("cc:onFirstConsent", ({ detail }) => {
     *    // detail.cookie
     * });
     * ```
     */
    onFirstConsent?: (param: {
        cookie: CookieValue;
    }) => void;
    /**
     * Callback function executed when one of the modals is hidden.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * function({
     *    modalName: ModalName
     * }): void
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * modalName equals to one of the following values:
     *
     * - "consentModal"
     * - "preferencesModal"
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *    onModalHide: ({ modalName }) => {
     *       // do something
     *    }
     * })
     * ```
     *
     * ---
     *
     * **Using event listener:**
     *
     * ```typescript
     * window.addEventListener("cc:onModalHide", ({ detail }) => {
     *    // detail.modalName
     * });
     * ```
     */
    onModalHide?: (param: {
        modalName: ModalName;
    }) => void;
    /**
     * Callback function executed when one of the modals is created and appended to the DOM.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * function({
     *    modalName: ModalName,
     *    modal: HTMLElement
     * }): void
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * modalName equals to one of the following values:
     *
     * - "consentModal"
     * - "preferencesModal"
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *    onModalReady: ({ modalName, modal }) => {
     *       // do something
     *       // e.g. modal.classList.add("my-custom-class");
     *    }
     * })
     * ```
     *
     * ---
     *
     * **Using event listener:**
     *
     * ```typescript
     * window.addEventListener("cc:onModalReady", ({ detail }) => {
     *    // detail.modalName
     *    // detail.modal
     * });
     * ```
     */
    onModalReady?: (param: {
        modal: HTMLElement;
        modalName: ModalName;
    }) => void;
    /**
     * Callback function executed when one of the modals is visible.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * function({
     *    modalName: ModalName
     * }): void
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * modalName equals to one of the following values:
     *
     * - "consentModal"
     * - "preferencesModal"
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *    onModalShow: ({ modalName }) => {
     *        // do something
     *    }
     * })
     * ```
     *
     * ---
     *
     * **Using event listener:**
     *
     * ```typescript
     * window.addEventListener("cc:onModalShow", ({ detail }) => {
     *     // detail.modalName
     * });
     * ```
     */
    onModalShow?: (param: {
        modalName: ModalName;
    }) => void;
    /**
     * Manages consent revisions; useful if you'd like to ask your users again for consent after a change in your cookie/privacy policy.
     *
     * ---
     *
     * **Default:** `0`
     *
     * ---
     *
     * **Type:** `number`
     *
     * ---
     *
     * **Details:**
     *
     * You can enable the revision management if you need to refresh the consent due to a change your cookie/privacy policy.
     *
     * - The default value `0` means that revision management is disabled.
     * - Set any number different from `0` to enable revision management.
     *
     * ---
     *
     * **Example:**
     *
     * To enable revisions, you just need to specify a valid revision number in your configuration.
     * Once enabled, users who had already consented to revision 0, will be prompted again for consent.
     *
     * ```typescript
     * CookieConsent.run({
     *    revision: 1
     * });
     * ```
     *
     * ---
     *
     * **Revision message:**
     *
     * Optionally, you can also set a revision message to let your users know what has changed since the last time they visited.
     *
     * 1. Add a `revisionMessage` field inside `consentModal`
     * 2. Specify the `{{revisionMessage}}` placeholder inside `consentModal.description`
     *
     * ```typescript
     * CookieConsent.run({
     *     revision: 1,
     *     language: {
     *         // ...
     *         translations: {
     *             en: {
     *                 consentModal: {
     *                     description: "Modal description. <br> {{revisionMessage}}",
     *                     revisionMessage: "Hi, we've made some changes to our cookie policy",
     *                     // ...
     *                 },
     *                 // ...
     *             }
     *         }
     *     }
     * });
     * ```
     */
    revision?: number;
    /**
     * Root element where the modal will be appended.
     *
     * ---
     *
     * **Default:** `document.body`
     *
     * ---
     *
     * **Type:** `string | HTMLElement`
     *
     * ---
     *
     * **Details:**
     *
     * Root (parent) element where the modal will be appended as a last child.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * CookieConsent.run({
     *    root: "#app" // CSS selector
     * });
     * ```
     */
    root?: Element | null | string;
}
/**
 * Firebase configuration for cookie consent storage
 *
 * @extends FirebaseOptions
 * @property {string} [collectionName] - Optional name of the Firestore collection
 *
 * @exports {FirebaseConfig}
 */
interface FirebaseConfig extends FirebaseOptions {
    /**
     * The name of the Firestore collection where cookie consent data will be stored
     *
     * @description
     * Specifies the client web application name (e.g. "Africa Exchange"
     * or "BankX") where the cookie consent is being managed, to ensure
     * proper data organization and retrieval.
     */
    collectionName: string;
}
interface AutoClear {
    /**
     * Array of cookies to clear.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * cookies: [
     *     { name: /^_ga/ }, // regex: match all cookies starting with "_ga"
     *     { name: "_gid" }, // string: exact cookie name
     * ]
     * ```
     */
    cookies: CookieItem[];
    /**
     * Reload page after the autoClear function.
     *
     * @default false
     */
    reloadPage?: boolean;
}
interface Category {
    /**
     * Declare the cookies to erase when the user rejects the category.
     */
    autoClear?: AutoClear;
    /**
     * Mark category as enabled by default.
     *
     * If mode is set to `"opt-out"` and consent has not yet been expressed, the category
     * is automatically enabled (and scripts under this category will be executed).
     *
     * @default false
     */
    enabled?: boolean;
    /**
     * Treat the category as necessary. The user won't be able to disable the category.
     *
     * @default false
     */
    readOnly?: boolean;
    /**
     * Configure individually togglable services.
     */
    services?: {
        [key: string]: Service;
    };
}
interface ConsentModalOptions {
    /**
     * Text of the `Accept all` button.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   acceptAllBtn: "Accept all"
     * }
     * ```
     */
    acceptAllBtn?: string;
    /**
     * Text of the `Accept necessary` button.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   acceptNecessaryBtn: "Accept necessary"
     * }
     * ```
     */
    acceptNecessaryBtn?: string;
    /**
     * Specify to generate a big `X` (accept necessary) button. Visible in the `box` layout only.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   closeIconLabel: "Accept necessary"
     * }
     * ```
     */
    closeIconLabel?: string;
    /**
     * Description of the modal.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   description: "This website uses cookies to ensure you get the best experience."
     * }
     * ```
     */
    description?: string;
    /**
     * Custom HTML string where you can put links pointing to your privacy policy.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   footer: "<a href="/impressum">Impressum</a> <a href="/privacy-policy">Privacy Policy</a>"
     * }
     * ```
     */
    footer?: string;
    /**
     * Accessibility label. Especially useful if no title is provided.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   label: "Cookie consent"
     * }
     * ```
     */
    label?: string;
    /**
     * Set a revision message, visible when the revision number changes.
     * Check out the [docs](https://cookieconsent.orestbida.com/advanced/revision-management.html) for more.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   description: "Modal description. <br> {{revisionMessage}}"
     *   revisionMessage: "Hi, we've made some changes to our cookie policy since the last time you visited!"
     * }
     * ```
     */
    revisionMessage?: string;
    /**
     * Text of the `Show preferences` button.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   showPreferencesBtn: "Manage individual preferences"
     * }
     * ```
     */
    showPreferencesBtn?: string;
    /**
     * Title of the modal.
     *
     * @example
     *
     * ```typescript
     * consentModal: {
     *   title: "We use cookies!"
     * }
     * ```
     */
    title?: string;
}
interface CookieOptions {
    /**
     * Current domain/subdomain's name, retrieved automatically.
     *
     * @default window.location.hostname
     */
    domain?: string;
    /**
     * Number of days before the cookie expires.
     *
     * ---
     *
     * **Default:** `182`
     *
     * ---
     *
     * **Type:** `number | ((acceptType: string) => number)`
     *
     * ---
     *
     * **Details:**
     *
     * This field also accepts a function that must return a number.
     * The acceptType parameter is equal to `getUserPreferences().acceptType`.
     *
     * ---
     *
     * **Example:**
     *
     * If the user accepted all categories, set expiresAfterDays=365.25,
     * otherwise set expiresAfterDays=182.
     *
     * ```typescript
     * CookieConsent.run({
     *    cookie: {
     *       expiresAfterDays: (acceptType) => {
     *          return acceptType === "all"
     *              ? 365.25
     *              : 182;
     *       }
     *    }
     * })
     * ```
     */
    expiresAfterDays?: ((acceptType: AcceptType) => number) | number;
    /**
     * Cookie name.
     *
     * @default "__Host-CCID"
     */
    name?: string;
    /**
     * Cookie path.
     *
     * @default "/"
     */
    path?: string;
    /**
     * Cookie sameSite.
     *
     * @default "Lax"
     */
    sameSite?: "Lax" | "None" | "Strict";
    /**
     * Toggle the secure flag.
     *
     * ---
     *
     * **Default:** `true`
     *
     * ---
     *
     * **Type:** `boolean`
     *
     * ---
     *
     * **Details:**
     *
     * The secure flag won't be set if there is no https connection.
     */
    secure?: boolean;
    /**
     * Store the content of the cookie in localstorage
     *
     * ---
     *
     * **Default:** `false`
     *
     * ---
     *
     * **Type:** `boolean`
     *
     * ---
     *
     * **Details:**
     *
     * When enabled, the following fields are ignored: `domain`, `path`, `sameSite`
     */
    useLocalStorage?: boolean;
}
interface CookieTable {
    /**
     * Define the table body items (rows).
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * cookieTable: {
     *     body: [
     *         {
     *             name: "_ga",
     *             domain: "Google Analytics",
     *             description: "Cookie set by <a href=\"https://business.safety.google/adscookies/\">Google Analytics</a>",
     *             expiration: "Expires after 12 days"
     *         },
     *         {
     *             name: "_gid",
     *             domain: "Google Analytics",
     *             description: "Cookie set by <a href=\"https://business.safety.google/adscookies/\">Google Analytics</a>",
     *             expiration: "Session"
     *         }
     *     ]
     * }
     * ```
     */
    body: {
        [key: string]: string;
    }[];
    /**
     * Table caption
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * cookieTable: {
     *     caption: "List of cookies"
     * }
     * ```
     */
    caption?: string;
    /**
     * Define the table headers (columns).
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * cookieTable: {
     *     headers: {
     *         name: "Name",
     *         domain: "Service",
     *         description: "Description",
     *         expiration: "Expiration"
     *     }
     * }
     * ```
     */
    headers: {
        [key: string]: string;
    };
}
interface GuiOptions {
    consentModal?: {
        /**
         * Stylize the accept and reject buttons the same way (GDPR compliant).
         *
         * @default true
         */
        equalWeightButtons?: boolean;
        /**
         * Flip buttons.
         *
         * @default false
         */
        flipButtons?: boolean;
        /**
         * Change consentModal layout.
         *
         * @default "box"
         */
        layout?: ConsentModalLayout;
        /**
         * Change modal position.
         *
         * @default "bottom right"
         */
        position?: ConsentModalPosition;
    };
    preferencesModal?: {
        /**
         * Stylize the accept and reject buttons the same way (GDPR compliant).
         *
         * @default true
         */
        equalWeightButtons?: boolean;
        /**
         * Flip buttons.
         *
         * @default false
         */
        flipButtons?: boolean;
        /**
         * Change preferencesModal layout.
         *
         * @default "box"
         */
        layout?: PreferencesModalLayout;
        /**
         * This options is valid only if layout=bar.
         *
         * @default "right"
         */
        position?: PreferencesModalPosition;
    };
}
interface PreferencesModalOptions {
    /**
     * Text of the `Accept all` button.
     *
     * @example
     *
     * ```typescript
     * preferencesModal: {
     *    acceptAllBtn: "Accept all"
     * }
     * ```
     */
    acceptAllBtn?: string;
    /**
     * Text of the `Reject all` button.
     *
     * @example
     *
     * ```typescript
     * preferencesModal: {
     *    acceptNecessaryBtn: "Reject all"
     * }
     * ```
     */
    acceptNecessaryBtn?: string;
    /**
     * Accessibility label.
     *
     * @example
     *
     * ```typescript
     * preferencesModal: {
     *    closeIconLabel: "Close modal"
     * }
     * ```
     */
    closeIconLabel?: string;
    /**
     * Text of the `Accept current selection` button.
     *
     * @example
     *
     * ```typescript
     * preferencesModal: {
     *    savePreferencesBtn: "Accept current selection"
     * }
     * ```
     */
    savePreferencesBtn?: string;
    /**
     * Sections to display in the preferences modal.
     * Each section can have a title, description, linked category, and a cookie table.
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * interface Section {
     *   title?: string
     *   description?: string
     *   linkedCategory?: string
     *   cookieTable?: CookieTable
     * }
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * - `linkedCategory`: by specifying the name of a defined category (e.g. "analytics"), a toggle will be generated
     * - `cookieTable`: html table where you can list and clarify the cookies under this category
     *
     * ---
     *
     * **Basic usage:**
     *
     * ```ts
     * preferencesModal: {
     *    [
     *       {
     *          title: 'Somebody said ... cookies?',
     *          description: 'I want one!'
     *       },
     *       {
     *          title: 'Strictly Necessary cookies',
     *          description: 'These cookies are essential for the proper functioning of the website and cannot be disabled.',
     *
     *          // this field will generate a toggle linked to the 'necessary' category
     *          linkedCategory: 'necessary'
     *       },
     *    ]
     * }
     * ```
     *
     * ---
     *
     * **Comprehensive Example:**
     *
     * ```typescript
     * preferencesModal: {
     *    sections: [
     *       {
     *          title: "Strictly Necessary cookies",
     *          description: "These cookies are essential for the proper functioning of the website and cannot be disabled.",
     *          linkedCategory: "necessary"
     *       },
     *       {
     *          title: "Performance and Analytics",
     *          description: "These cookies collect information about how you use our website.",
     *          linkedCategory: "analytics",
     *          cookieTable: {
     *             caption: "List of cookies",
     *             headers: {
     *                name: "Name",
     *                description: "Description",
     *                duration: "Duration"
     *             },
     *             body: [
     *                {
     *                    name: "cookie_name",
     *                    description: "Cookie description",
     *                    duration: "1 year"
     *                },
     *             ]
     *          }
     *       },
     *    ]
     * }
     * ```
     */
    sections: Section[];
    /**
     * Label to append to services counter.
     *
     * if you're using services, you can specify a label such as `"Service(s)"` to clarify what the counter means.
     * The counter will not be displayed if `guiOptions.preferencesModal.layout` is set to `bar`, as well as on narrow viewports.
     *
     * @example
     *
     * ```typescript
     * preferencesModal: {
     *    serviceCounterLabel: "services"
     * }
     * ```
     */
    serviceCounterLabel?: string;
    /**
     * Title of the modal.
     *
     * @example
     *
     * ```typescript
     * preferencesModal: {
     *    title: "Manage cookie preferences"
     * }
     * ```
     */
    title?: string;
}
interface Section {
    /**
     * Create a custom html table (generally used to clarify cookies).
     *
     * ---
     *
     * **Type:**
     *
     * ```typescript
     * interface CookieTable {
     *     caption?: string
     *     headers: {[key: string]: string}
     *     body: {[key: string]: string}[]
     * }
     * ```
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * cookieTable: {
     *     caption: "List of cookies",
     *     headers: {
     *         name: "Name",
     *         description: "Description",
     *         duration: "Duration"
     *     },
     *     body: [
     *         {
     *             name: "cookie-name",
     *             description: "cookie-description",
     *             duration: "cookie-duration"
     *         },
     *         {
     *             name: "cookie-name-2",
     *             description: "cookie-description-2",
     *             duration: "cookie-duration-2"
     *         }
     *     ]
     * }
     * ```
     */
    cookieTable?: CookieTable;
    /**
     * Section description.
     */
    description?: string;
    /**
     * Name of a valid category. This will convert the current section into a "togglable" category.
     * By specifying the name of a defined category (e.g. "analytics"), a toggle will be generated.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * preferencesModal: {
     *    sections: [
     *       {
     *          title: "Performance and Analytics",
     *          description: "These cookies collect information about how you use our website.",
     *          linkedCategory: "analytics"
     *       }
     *    ]
     * }
     * ```
     */
    linkedCategory?: string;
    /**
     * Section title.
     */
    title?: string;
}
interface Translation {
    /**
     * All the options/fields also allow html markup.
     *
     * **Type:**
     *
     * ```typescript
     * interface ConsentModal {
     *   label?: string
     *   title?: string
     *   description?: string
     *   acceptAllBtn?: string
     *   acceptNecessaryBtn?: string
     *   showPreferencesBtn?: string
     *   closeIconLabel?: string
     *   revisionMessage?: string
     *   footer?: string
     * }
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * All the `options/fields` also allow html markup.
     *
     * - `closeIconLabel`: if specified, a big `X` button will be generated (visible only in the box layout). It acts the same as `acceptNecessaryBtn`.
     * - `revisionMessage`: check out the dedicated [revision](https://cookieconsent.orestbida.com/advanced/revision-management.html#revision-message) section.
     * - `footer`: a small area where you can place your links (impressum, privacy policy, ...)
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * translations: {
     *    "en": {
     *       consentModal: {
     *          label: "Cookie Preferences Center",
     *          title: "We use cookies!",
     *          description: "This website uses cookies to ensure you get the best experience on our website.",
     *          acceptAllBtn: "Accept all",
     *          acceptNecessaryBtn: "Accept necessary",
     *          showPreferencesBtn: "Manage individual preferences",
     *          footer: `
     *            <a href="#path-to-impressum.html" target="_blank">Impressum</a>
     *            <a href="#path-to-privacy-policy.html" target="_blank">Privacy Policy</a>
     *          `
     *       }
     *    }
     * }
     * ```
     */
    consentModal: ConsentModalOptions;
    /**
     * You can define any table, with the headers you deem more fit.
     *
     * ---
     *
     *  * **Type:**
     *
     * ```typescript
     * interface PreferencesModal {
     *   title?: string
     *   acceptAllBtn?: string
     *   acceptNecessaryBtn?: string
     *   savePreferencesBtn?: string
     *   closeIconLabel?: string
     *   serviceCounterLabel?: string
     *   sections: Section[]
     * }
     * ```
     *
     * ---
     *
     * **Details:**
     *
     * - `serviceCounterLabel`: if you're using services, you can specify a label such as `"Service(s)"` to clarify what the counter means.
     * The counter will not be displayed if `guiOptions.preferencesModal.layout` is set to `bar`, as well as on narrow viewports.
     *
     * ---
     *
     * **Example:**
     *
     * ```typescript
     * {
     *    title: "Manage cookie preferences",
     *    acceptAllBtn: "Accept all",
     *    acceptNecessaryBtn: "Reject all",
     *    savePreferencesBtn: "Accept current selection",
     *    closeIconLabel: "Close modal",
     *    sections: [
     *       {
     *          title: "Strictly Necessary cookies",
     *          description: "These cookies are essential for the proper functioning of the website and cannot be disabled.",
     *          linkedCategory: "necessary"
     *       },
     *    ]
     * }
     * ```
     */
    preferencesModal: PreferencesModalOptions;
}

type DeepPartial<Argument> = Argument extends Record<PropertyKey, unknown> ? {
    [Key in keyof Argument]?: DeepPartial<Argument[Key]>;
} : Partial<Argument>;

declare function createCookieConfiguration(options?: DeepPartial<CookieConsentConfiguration>): CookieConsentConfiguration;

type CookieConsentModal = {
    [K in ConsentModal]?: CSSObject;
};
type ConsentModal = ConsentModalBlock | ConsentModalBlockElements | ConsentModalBlockElementsModifiers | ConsentModalBlockModifiers;
type ConsentModalBlock = ".cm-wrapper";
type ConsentModalBlockElements = ".cm__body" | ".cm__btn" | ".cm__btn-group" | ".cm__btns" | ".cm__close" | ".cm__desc" | ".cm__footer" | ".cm__link-group" | ".cm__links" | ".cm__texts" | ".cm__title";
type ConsentModalBlockElementsModifiers = ".cm__btn--close" | ".cm__btn--secondary" | ".cm__btn-group--uneven";
type ConsentModalBlockModifiers = ".cm--bar" | ".cm--bottom" | ".cm--box" | ".cm--center" | ".cm--cloud" | ".cm--flip" | ".cm--inline" | ".cm--left" | ".cm--middle" | ".cm--right" | ".cm--top" | ".cm--wide";

type CookieModal = {
    [Key in Modal | Theme]?: CSSInterpolation;
};
type Modal = "#cc-main";
type Theme = ".cc--darkmode" | ".default-light";

type CookieVariable = BackgroundVariable | CategoryVariable | ColorVariable | FooterVariable | GeneralVariable | ModalVariable | PrimaryButtonVariable | ScrollbarVariable | SecondaryButtonVariable | ToggleVariable;
type CookieVariables = {
    [K in CookieVariable]?: number | string;
};
type BackgroundVariable = "--cc-bg" | "--cc-overlay-bg";
type CategoryVariable = "--cc-cookie-category-block-bg" | "--cc-cookie-category-block-border" | "--cc-cookie-category-block-hover-bg" | "--cc-cookie-category-block-hover-border" | "--cc-cookie-category-expanded-block-bg" | "--cc-cookie-category-expanded-block-hover-bg" | "--cc-section-category-border";
type ColorVariable = "--cc-link-color" | "--cc-primary-color" | "--cc-secondary-color" | "--cc-separator-border-color";
type FooterVariable = "--cc-footer-bg" | "--cc-footer-border-color" | "--cc-footer-color";
type GeneralVariable = "--cc-font-family" | "--cc-z-index";
type ModalVariable = "--cc-modal-border-radius" | "--cc-modal-margin" | "--cc-modal-transition-duration";
type PrimaryButtonVariable = "--cc-btn-border-radius" | "--cc-btn-primary-bg" | "--cc-btn-primary-border-color" | "--cc-btn-primary-color" | "--cc-btn-primary-hover-bg" | "--cc-btn-primary-hover-border-color" | "--cc-btn-primary-hover-color";
type ScrollbarVariable = "--cc-webkit-scrollbar-bg" | "--cc-webkit-scrollbar-hover-bg";
type SecondaryButtonVariable = "--cc-btn-secondary-bg" | "--cc-btn-secondary-border-color" | "--cc-btn-secondary-color" | "--cc-btn-secondary-hover-bg" | "--cc-btn-secondary-hover-border-color" | "--cc-btn-secondary-hover-color";
type ToggleVariable = "--cc-pm-toggle-border-radius" | "--cc-toggle-disabled-icon-color" | "--cc-toggle-enabled-icon-color" | "--cc-toggle-off-bg" | "--cc-toggle-off-knob-bg" | "--cc-toggle-on-bg" | "--cc-toggle-on-knob-bg" | "--cc-toggle-readonly-bg" | "--cc-toggle-readonly-knob-bg" | "--cc-toggle-readonly-knob-icon-color";

type CookiePreferencesModal = {
    [K in PreferencesModal]?: CSSObject;
};
type PreferencesModal = PreferencesModalBlock | PreferencesModalBlockElements | PreferencesModalBlockElementsModifiers | PreferencesModalBlockModifiers;
type PreferencesModalBlock = ".pm-overlay" | ".pm-wrapper";
type PreferencesModalBlockElements = ".pm__badge" | ".pm__body" | ".pm__btn" | ".pm__btn-group" | ".pm__close-btn" | ".pm__footer" | ".pm__header" | ".pm__section" | ".pm__section-arrow" | ".pm__section-desc" | ".pm__section-desc-wrapper" | ".pm__section-services" | ".pm__section-table" | ".pm__section-title" | ".pm__section-title-wrapper" | ".pm__section-toggles" | ".pm__service" | ".pm__service-counter" | ".pm__service-header" | ".pm__service-icon" | ".pm__service-title" | ".pm__table-caption" | ".pm__table-head" | ".pm__table-td" | ".pm__table-th" | ".pm__table-tr" | ".pm__title";
type PreferencesModalBlockElementsModifiers = ".pm__btn--secondary" | ".pm__section--expandable" | ".pm__section--toggle";
type PreferencesModalBlockModifiers = ".pm--bar" | ".pm--box" | ".pm--flip" | ".pm--left" | ".pm--right" | ".pm--wide";

interface ArrayCSSInterpolation extends ReadonlyArray<CSSInterpolation> {
}
type CookieStyles = CSSObject;
type CSSInterpolation = ArrayCSSInterpolation | InterpolationPrimitive;
interface CSSObject extends CookieConsentModal, CookieModal, CookiePreferencesModal, CookieVariables, CSSOthersObject, CSSPropertiesWithMultiValues, CSSPseudos {
}
interface CSSOthersObject {
    [propertiesName: string]: CSSInterpolation;
}
type CSSPseudos = {
    [K in Pseudos]?: CSSObject;
};
type InterpolationPrimitive = boolean | CSSObject | Keyframes | null | number | string | undefined;

declare function createCookieStyles(styles: CookieStyles): CSSObject;

/**
 * Returns a CSS variable as a string.
 *
 * @param variable - The CSS variable to return.
 * @returns The CSS variable as a string.
 *
 * @example
 *
 * ```typescript
 * import { css } from 'cookies';
 *
 * const primaryColor = css('--cc-primary-color');
 * console.log(primaryColor); // Outputs: var(--cc-primary-color)
 * ```
 *
 * @see {@link CookieVariable} for a list of available CSS variables.
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/var() var()} for more information on CSS variables.
 */
declare function css(variable: CookieVariable | (string & {})): string;

type CookieBannerAppearance = {
    /**
     * The active theme, defaults to "light"
     *
     * @default "light"
     *
     * @example
     *
     * ```ts
     * const activeTheme = "dark";
     * ```
     */
    activeTheme?: "dark" | "light";
    /**
     * The styles to be applied to the cookie banner. This is an object where the keys are the variant names and the values are the styles.
     * The styles are defined using CSS properties and can include nested selectors.
     *
     * @example
     *
     * ```ts
     * {
     *   ".cc--darkmode": {
     *     "&:hover :not(.default-light)": {
     *       "--cc-bg": "green",
     *     },
     *   },
     * }
     * ```
     */
    styles?: CookieStyles;
};

/**
 * Props for the CookieBanner component
 *
 * @property {number} [delay] - Optional delay before showing the cookie banner
 * @property {CookieConsentConfiguration} [configuration] - Optional cookie consent configuration
 *
 * @exports {CookieBannerProps}
 */
interface CookieBannerProps extends CookieBannerAppearance {
    /**
     * Optional cookie consent configuration
     * This allows you to customize the behavior and appearance of the cookie banner
     */
    configuration?: CookieConsentConfiguration;
    /**
     * Optional delay before showing the cookie banner
     * This can be used to control when the banner appears to the user
     */
    delay?: number;
    /**
     * Optional Firebase configuration for storing cookie consent data
     * This allows you to track and manage cookie consents across sessions
     *
     * @see {@link https://firebase.google.com/docs/web/setup}
     */
    firebase?: FirebaseConfig;
}
/**
 * Represents user cookie consent data stored in the system
 *
 * @interface
 * @property {string} id - Unique identifier for the cookie consent record
 * @property {CookieValue} cookie - The cookie consent value/settings
 * @property {string} language - The language preference of the user
 * @property {UserPreferences} preferences - User's cookie consent preferences
 * @property {string} userId - Unique identifier for the user
 *
 * @exports {UserCookieData}
 */
interface UserCookieData {
    /**
     * The cookie consent value/settings
     * This represents the user's choices regarding cookies
     */
    cookie: CookieValue;
    /**
     * Unique identifier for the cookie consent record
     * This is used to track and manage cookie consents
     */
    id: string;
    /**
     * The language preference of the user
     * This can be used to display the cookie consent in the user's preferred language
     */
    language: string;
    /**
     * User's cookie consent preferences
     * This includes the user's choices regarding different categories of cookies
     */
    preferences: UserPreferences;
    /**
     * Unique identifier for the user
     * This is used to associate the cookie consent with a specific user
     */
    userId: string;
}

declare function useCookieBanner({ activeTheme, configuration, delay, firebase, styles, }?: CookieBannerProps): {
    retrieveUserCookieData: (documentId: string, onError?: (e: unknown) => void) => Promise<null | UserCookieData>;
    updateUserCookieData: (data: Partial<UserCookieData>, documentId?: string | undefined, onError?: (e: unknown) => void) => Promise<null | string>;
    updateUserId: (newUserId: string, onError?: (e: unknown) => void) => Promise<void>;
    userId: string;
};

type CookieCategory = "advertisement" | "analytics" | "functionality" | "marketing" | "necessary" | "performance" | "personalization" | "security" | "session" | "social" | "statistics" | "targeting" | "technical" | "unclassified" | (string & {});

export { type CookieBannerProps, type CookieCategory, type CookieConsentConfiguration, type CookieVariable, type FirebaseConfig, cookieConsentAttributes, cookieConsentEvents, createCookieConfiguration, createCookieStyles, css, useCookieBanner };
