{"version":3,"file":"client.mjs","sources":["../app/components/hardware-option.ts","../app/components/hardware-overlay.ts","../app/components/short-filter.ts","../app/configs/requests.ts","../app/configs/environment.ts","../app/client.ts","../app/components/navigation.ts"],"sourcesContent":["import {HardwareFilterOption} from '../types/types.ts';\n\nexport const HardwareOption = ({\n    label,\n    value,\n    isSelected,\n    isDisabled,\n}: HardwareFilterOption & {isSelected: boolean; isDisabled: boolean}) => `\n    <label class=\"hardware-option\">\n        <input \n            name=\"${value}\"\n            type=\"checkbox\" \n            class=\"checkbox ${isSelected ? 'checked' : ''}\" \n            ${isDisabled && !isSelected ? 'disabled' : ''}\n            data-value=\"${value}\">\n        <span>${label}</span>\n    </label>\n`;\n\nexport const setupHardwareOption = ({\n    shadowRoot,\n    changeHardwareSelection,\n}: {\n    shadowRoot: ShadowRoot;\n    changeHardwareSelection: (value: string) => void;\n}) => {\n    shadowRoot.querySelectorAll('.checkbox').forEach(checkbox => {\n        checkbox.addEventListener('change', event => {\n            const value = (event.target as HTMLElement).dataset.value;\n            if (!value) return;\n            changeHardwareSelection(value);\n        });\n    });\n};\n","import {EnvironmentUrls} from '../configs/environment.ts';\nimport {HardwareFilterCategory} from '../types/types.ts';\nimport {HardwareOption, setupHardwareOption} from './hardware-option.ts';\n\nconst MAX_SELECTION_COUNT = 3;\n\ninterface OverlayHandlers {\n    documentHandler: EventListener;\n    shadowHandler: EventListener;\n    shadowRootRef: ShadowRoot;\n}\n\nconst overlayHandlers = new WeakMap<ShadowRoot, OverlayHandlers>();\n\nexport const cleanupHardwareOverlay = (shadowRoot: ShadowRoot): void => {\n    const handlers = overlayHandlers.get(shadowRoot);\n    if (handlers) {\n        document.removeEventListener('mousedown', handlers.documentHandler);\n        handlers.shadowRootRef.removeEventListener('mousedown', handlers.shadowHandler, true);\n        overlayHandlers.delete(shadowRoot);\n    }\n};\n\nconst getSelectionCount = (selectedHardware: Array<string>) => {\n    if (selectedHardware.length === 1 && selectedHardware[0] === 'all') return 0;\n    return selectedHardware.length;\n};\n\nconst getHintText = (selectedHardware: Array<string>) => {\n    const selectionCount = getSelectionCount(selectedHardware);\n\n    if (selectionCount === 0) return `Sie können bis zu ${MAX_SELECTION_COUNT} Handys wählen`;\n\n    const remainingSelectableCount = MAX_SELECTION_COUNT - selectionCount;\n\n    switch (remainingSelectableCount) {\n        case 0:\n            return `Sie haben ${selectionCount} Handys zur Auswahl hinzugefügt`;\n        case 1:\n            return 'Sie können noch ein weiteres Handy wählen';\n        default:\n            return `Sie können noch ${remainingSelectableCount} weitere Handys wählen`;\n    }\n};\n\nexport const HardwareOverlay = ({\n    hardwareOptions,\n    selectedHardware,\n    isHardwareOverlayVisible,\n    environment,\n}: {\n    hardwareOptions: Array<HardwareFilterCategory>;\n    selectedHardware: Array<string>;\n    isHardwareOverlayVisible: boolean;\n    environment: EnvironmentUrls;\n}) => `\n<div \n    class=\"hardware-overlay\"\n    id=\"hardware-overlay\"\n    tabindex=\"0\" \n    style=\"${isHardwareOverlayVisible ? '' : 'display: none'}\"\n>\n    <header class=\"header\" id=\"overlay-header\">Ihre Handyauswahl</header>\n    <div class=\"sub-header\">\n        <img\n           \n            alt=\"\"\n            src=\"${environment.assetsExternal}/${getSelectionCount(selectedHardware) >= MAX_SELECTION_COUNT ? 'holding-slider/check-blue.svg' : 'holding-slider/light-bulb.svg'}\"\n            class=\"hint-icon\"\n            width=\"18\"\n            height=\"18\"\n            loading=\"lazy\"\n        />\n        <div>\n            ${getHintText(selectedHardware)}\n        </div>        \n    </div>\n    <div class=\"hardware-options\">\n         ${HardwareOption({\n             label: 'Alle Handys',\n             value: 0,\n             isSelected: selectedHardware.length === 0,\n             isDisabled: selectedHardware.length >= MAX_SELECTION_COUNT,\n         })}\n        ${hardwareOptions\n            .map(\n                section => `\n                    <div class=\"category\">${section.label}</div>\n                    ${section.options\n                        .map(option =>\n                            HardwareOption({\n                                ...option,\n                                isSelected: selectedHardware.includes(`${option.value}`),\n                                isDisabled: selectedHardware.length >= MAX_SELECTION_COUNT,\n                            }),\n                        )\n                        .join('')}\n                `,\n            )\n            .join('')}\n    </div>\n    <button\n        id=\"hardware-button\"\n        class=\"button\"\n    >\n        Auswahl übernehmen\n    </button>\n</div>   \n`;\n\n// Attach dismiss-on-outside-click listeners. Called independently from the\n// rest of the setup so the host can toggle overlay visibility without\n// rebinding button/checkbox listeners (which would cause duplicate handlers).\nexport const attachHardwareOverlayDismissListeners = (\n    shadowRoot: ShadowRoot,\n    closeHardwareOverlay: () => void,\n): void => {\n    cleanupHardwareOverlay(shadowRoot);\n\n    // Clicks outside the closed shadow host: composedPath reveals only the\n    // host (shadow internals are hidden), so anything not including it is\n    // clearly outside and should dismiss the overlay.\n    const documentHandler: EventListener = event => {\n        if (event.composedPath().includes(shadowRoot.host)) return;\n        cleanupHardwareOverlay(shadowRoot);\n        closeHardwareOverlay();\n    };\n\n    // Clicks inside the shadow: use a capture-phase listener on the\n    // shadowRoot so we can see the real target (composedPath inside the\n    // shadow exposes internal nodes). Dismiss unless the click landed on\n    // the overlay itself or its trigger (the trigger has its own toggle).\n    const shadowHandler: EventListener = event => {\n        const path = event.composedPath();\n        const overlay = shadowRoot.getElementById('hardware-overlay');\n        const trigger = shadowRoot.getElementById('hardware-selection');\n        if (overlay && path.includes(overlay)) return;\n        if (trigger && path.includes(trigger)) return;\n        cleanupHardwareOverlay(shadowRoot);\n        closeHardwareOverlay();\n    };\n\n    overlayHandlers.set(shadowRoot, {documentHandler, shadowHandler, shadowRootRef: shadowRoot});\n    document.addEventListener('mousedown', documentHandler);\n    shadowRoot.addEventListener('mousedown', shadowHandler, true);\n};\n\nexport const setupHardwareOverlay = ({\n    shadowRoot,\n    closeHardwareOverlay,\n    changeHardwareSelection,\n    isHardwareOverlayVisible,\n}: {\n    shadowRoot: ShadowRoot;\n    closeHardwareOverlay: () => void;\n    isHardwareOverlayVisible: boolean;\n} & Parameters<typeof setupHardwareOption>[0]) => {\n    cleanupHardwareOverlay(shadowRoot);\n\n    if (isHardwareOverlayVisible) {\n        attachHardwareOverlayDismissListeners(shadowRoot, closeHardwareOverlay);\n    }\n\n    shadowRoot.getElementById('hardware-button')?.addEventListener('click', () => {\n        cleanupHardwareOverlay(shadowRoot);\n        closeHardwareOverlay();\n    });\n    shadowRoot.getElementById('overlay-header')?.addEventListener('click', () => {\n        cleanupHardwareOverlay(shadowRoot);\n        closeHardwareOverlay();\n    });\n\n    setupHardwareOption({shadowRoot, changeHardwareSelection});\n};\n","import {HardwareFilterCategory, DataIncludedFilterOption, HardwareFilterOption} from '../types/types.ts';\nimport {FilterIcon} from './filter-icon.ts';\nimport {EnvironmentUrls} from '../configs/environment.ts';\nimport {HardwareOverlay, setupHardwareOverlay} from './hardware-overlay.ts';\n\nconst getHardwarePath = (hardwareSelection: Array<string>) => {\n    if (hardwareSelection.length === 0 || hardwareSelection.includes('all')) return 'handy-uebersicht';\n    if (hardwareSelection.length === 1) return `vergleich/${hardwareSelection[0]}`;\n    return `vergleiche/${hardwareSelection.join('-mit-')}`;\n};\n\nconst getLink = (\n    selectedDataIncluded: number,\n    hardwareOptions: Array<HardwareFilterCategory>,\n    hardwareSelection: Array<string>,\n    environment: EnvironmentUrls,\n) => {\n    const allOptions = hardwareOptions.flatMap(category => category.options);\n    const hardwareKeys = hardwareSelection.map(id => {\n        const option = allOptions.find(opt => `${opt.value}` === id);\n        return option?.key ?? id;\n    });\n    \n    const queryParams = new URLSearchParams({data_included: `${selectedDataIncluded}`}).toString();\n    return `${environment.host}/${getHardwarePath(hardwareKeys)}?${queryParams}`;\n};\n\nconst getHardwareLabel = (hardwareOptions: Array<HardwareFilterCategory>, selectedHardware: Array<string>) => {\n    if (selectedHardware.length === 0 || selectedHardware.includes('all')) return 'Alle Handys';\n\n    if (selectedHardware.length === 1) {\n        return hardwareOptions.reduce((acc, section) => {\n            const options = section.options.filter(option => selectedHardware.includes(`${option.value}`));\n            return [...acc, ...options];\n        }, [] as Array<HardwareFilterOption>)[0].label;\n    }\n\n    return `${selectedHardware.length} Handys gewählt`;\n};\n\nexport const ShortFilter = ({\n    dataIncluded,\n    selectedDataIncluded,\n    hardwareOptions,\n    selectedHardware,\n    isHardwareOverlayVisible,\n    environment,\n}: {\n    dataIncluded: Array<DataIncludedFilterOption>;\n    selectedDataIncluded: number;\n    hardwareOptions: Array<HardwareFilterCategory>;\n    selectedHardware: Array<string>;\n    isHardwareOverlayVisible: boolean;\n    environment: EnvironmentUrls;\n}): string => `\n<div class=\"short-filter\">\n    <div class=\"container\">\n        <div class=\"filter remove-appearance\" id=\"hardware-selection\">\n            <div class=\"filter-text\">\n                <label for=\"hardware-selection\" class=\"filter-title\">Ihre Handyauswahl</label>\n                <div class=\"select\">${getHardwareLabel(hardwareOptions, selectedHardware)}</div>\n            </div>\n            ${FilterIcon()}\n        </div>\n        ${HardwareOverlay({\n            hardwareOptions,\n            selectedHardware,\n            isHardwareOverlayVisible,\n            environment,\n        })}\n    </div>\n    <div class=\"divider\"></div>\n    <div class=\"container\">\n        <div class=\"filter\">\n            <div class=\"filter-text\">\n                <label for=\"data-included\" class=\"filter-title\">\n                    Datenvolumen \n                </label>\n                <select id=\"data-included\" class=\"select remove-appearance\">\n                    ${dataIncluded\n                        .map(\n                            ({value, label}) =>\n                                `<option value=\"${value}\" ${value.toString(10) === selectedDataIncluded.toString(10) ? 'selected' : ''}>${label}</option>`,\n                        )\n                        .join('')}\n                   \n                </select>\n            </div>\n            ${FilterIcon()}\n        </div>\n    </div>\n    <a\n        id=\"filter-submit\"\n        class=\"button\"\n        href=\"${getLink(selectedDataIncluded, hardwareOptions, selectedHardware, environment)}\"\n    >\n        Vergleichen\n    </a>\n    <link \n        href=\"${getLink(selectedDataIncluded, hardwareOptions, selectedHardware, environment)}\" \n        rel=\"prefetch\" \n    />\n</div>    \n`;\n\nexport const setupShortFilter = ({\n    shadowRoot,\n    clickFilterCta,\n    dataIncludedChange,\n    openHardwareOverlay,\n    closeHardwareOverlay,\n    changeHardwareSelection,\n    isHardwareOverlayVisible,\n}: {\n    shadowRoot: ShadowRoot;\n    clickFilterCta: () => void;\n    dataIncludedChange: (selectedValue: number) => void;\n    openHardwareOverlay: () => void;\n} & Parameters<typeof setupHardwareOverlay>[0]): void => {\n    shadowRoot.getElementById('filter-submit')?.addEventListener('click', () => clickFilterCta());\n    shadowRoot.getElementById('data-included')?.addEventListener('change', event => {\n        const selectedValue = (event.target as HTMLSelectElement).value;\n        dataIncludedChange(parseInt(selectedValue));\n    });\n    shadowRoot.getElementById('hardware-selection')?.addEventListener('click', () => openHardwareOverlay());\n\n    setupHardwareOverlay({\n        shadowRoot,\n        closeHardwareOverlay,\n        changeHardwareSelection,\n        isHardwareOverlayVisible,\n    });\n};\n","import {EnvironmentUrls} from './environment.ts';\nimport {HardwareFilterCategory, DataIncludedFilterOption, DeviceOutput} from '../types/types.ts';\n\nconst getPubApiDefaultHeaders = (deviceOutput: DeviceOutput) =>\n    ({\n        'Accept': 'application/json',\n        'X-App-Version': '1.0.0',\n        'X-App-Platform': deviceOutput,\n        'X-Requested-With': 'XMLHttpRequest',\n        'Content-Type': 'application/json',\n    }) as const;\n\nexport const getFilter = async (\n    deviceOutput: DeviceOutput,\n    environment: EnvironmentUrls,\n    signal?: AbortSignal,\n): Promise<{\n    dataIncluded: Array<DataIncludedFilterOption>;\n    hardware: Array<HardwareFilterCategory>;\n}> => {\n    try {\n        const response = await fetch(`${environment.publicApi}/v1/filter/holding-slider`, {\n            method: 'GET',\n            headers: getPubApiDefaultHeaders(deviceOutput),\n            signal,\n        });\n\n        if (!response.ok) {\n            return {dataIncluded: [], hardware: []};\n        }\n\n        const json = await response.json();\n\n        return {\n            dataIncluded: json.data_included || [],\n            hardware: json.hw_prop_model_multiselect || [],\n        };\n    } catch {\n        return {dataIncluded: [], hardware: []};\n    }\n};\n\nexport const getPrefilling = async (\n    deviceOutput: DeviceOutput,\n    environment: EnvironmentUrls,\n    signal?: AbortSignal,\n): Promise<Partial<{data_included: number}>> => {\n    try {\n        const response = await fetch(`${environment.publicApi}/filter/prefilling`, {\n            method: 'GET',\n            headers: getPubApiDefaultHeaders(deviceOutput),\n            credentials: 'include',\n            signal,\n        });\n        if (!response.ok) {\n            return {};\n        }\n        return response.json();\n    } catch {\n        return {};\n    }\n};\n\nexport const setPrefilling = async (\n    deviceOutput: DeviceOutput,\n    environment: EnvironmentUrls,\n    selectedDataIncluded: number,\n    signal?: AbortSignal,\n): Promise<void> => {\n    try {\n        await fetch(`${environment.publicApi}/filter/prefilling`, {\n            method: 'PUT',\n            headers: getPubApiDefaultHeaders(deviceOutput),\n            body: JSON.stringify({data_included: selectedDataIncluded}),\n            credentials: 'include',\n            signal,\n        });\n    } catch {}\n};\n","export type HostEnv = 'live' | 'test' | 'int' | 'local';\n\nexport interface EnvironmentUrls {\n    publicApi: string;\n    host: string;\n    assetsExternal: string;\n}\n\nconst local = (): EnvironmentUrls => {\n    const n = import.meta.env.VITE_LOCAL_TESTING_NUMBER ?? '1';\n    const name = import.meta.env.VITE_LOCAL_NAME ?? 'local';\n    return {\n        publicApi: `https://pub-api${n}.${name}.handyvertrag.check24-test.de`,\n        host: `https://handyvertrag${n}.${name}.handyvertrag.check24-test.de`,\n        assetsExternal: `https://assets-handyvertrag${n}.${name}.handyvertrag.check24-test.de`,\n    };\n};\n\nconst test: EnvironmentUrls = {\n    publicApi: 'https://pub-api.handyvertrag.check24-test.de',\n    host: 'https://handyvertrag.check24-test.de',\n    assetsExternal: 'https://assets.handyvertrag.check24-test.de',\n};\n\nconst int: EnvironmentUrls = {\n    publicApi: 'https://pub-api.handyvertrag.check24-test.de',\n    host: 'https://handyvertrag.check24.de',\n    assetsExternal: 'https://assets.handyvertrag.check24-test.de',\n};\n\nconst live: EnvironmentUrls = {\n    publicApi: 'https://pub-api.handyvertrag.check24.de',\n    host: 'https://handyvertrag.check24.de',\n    assetsExternal: 'https://assets.handyvertrag.check24.de',\n};\n\nexport const resolveEnvironment = (env: HostEnv | null | undefined): EnvironmentUrls => {\n    switch (env) {\n        case 'local':\n            return local();\n        case 'test':\n            return test;\n        case 'int':\n            return int;\n        case 'live':\n        default:\n            return live;\n    }\n};\n\n// Prefers the explicit `env` attribute value from the host; falls back to hostname\n// detection so the component behaves correctly during local development without needing\n// the hub to inject attributes.\nexport const normalizeEnv = (raw: string | null): HostEnv => {\n    if (raw === 'test' || raw === 'int' || raw === 'live' || raw === 'local') return raw;\n    if (typeof window !== 'undefined') {\n        const host = window.location.hostname;\n        if (host.endsWith('.check24-test.de')) return 'test';\n        if (host.endsWith('.check24.de')) return 'live';\n    }\n    return 'live';\n};\n","/// <reference types=\"../.check24-home/types/client\" />\n\nimport styles from './client.scss?inline';\nimport {HomeClientComponentElement, HomeClientComponentProps, UserInfo} from '../.check24-home/types/client';\nimport {Language} from '../.check24-home/types/check24';\nimport {Navigation, setupNavigation} from './components/navigation.ts';\nimport {ShortFilter, setupShortFilter} from './components/short-filter.ts';\nimport {getPrefilling, getFilter, setPrefilling} from './configs/requests.ts';\nimport {HardwareFilterCategory, DataIncludedFilterOption, DeviceOutput} from './types/types.ts';\nimport {resolveEnvironment, normalizeEnv, EnvironmentUrls, HostEnv} from './configs/environment.ts';\nimport {cleanupHardwareOverlay, attachHardwareOverlayDismissListeners} from './components/hardware-overlay.ts';\n\ndeclare const __PHONES_DATA_URL__: string;\nconst phonesImageUrl: string = __PHONES_DATA_URL__;\n\ndeclare global {\n    interface Window {\n        dataLayer?: Array<Record<string, unknown>>;\n    }\n}\n\ntype MobilfunkBundleProps = HomeClientComponentProps;\n\nexport default class MobilfunkBundleDefaultClient extends HTMLElement implements HomeClientComponentElement {\n    deviceOutput: DeviceOutput = 'desktop';\n    language: Language = 'de-DE';\n    user?: UserInfo | undefined;\n    platform: 'app' | 'web' = 'web';\n\n    #shadow: ShadowRoot | null = null;\n    #dataIncludedFilter: Array<DataIncludedFilterOption> = [];\n    #hardwareFilter: Array<HardwareFilterCategory> = [];\n\n    #selectedDataIncluded = 0;\n    #selectedHardware: Array<string> = [];\n    #isHardwareOverlayVisible = false;\n    #isLoading = true;\n    #controller = new AbortController();\n\n    #env: HostEnv = 'live';\n    #environment: EnvironmentUrls = resolveEnvironment('live');\n\n    // Spec host attributes: product-slug, deviceoutput, language, platform, env, sso-env.\n    // Also observe device-output (hyphenated) for reference/legacy host compatibility.\n    // `user` is not a host attribute; it surfaces as a prop via C24Home.validateAttributes.\n    static get observedAttributes(): string[] {\n        return ['product-slug', 'device-output', 'deviceoutput', 'language', 'platform', 'env', 'sso-env'];\n    }\n\n    attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n        if (oldValue === newValue) return;\n\n        this.#applyAttributes();\n\n        if (this.#shadow) {\n            if (name === 'device-output' || name === 'deviceoutput' || name === 'env') {\n                void this.#loadData();\n            } else {\n                this.#render();\n            }\n        }\n    }\n\n    async connectedCallback() {\n        this.#controller = new AbortController();\n\n        if (!this.#shadow) {\n            this.#shadow = this.attachShadow({mode: 'closed'});\n        }\n\n        // Inter font must be loaded at document level — @import inside shadow DOM is not reliable\n        if (!document.getElementById('mobileservice-inter-font')) {\n            const link = document.createElement('link');\n            link.id = 'mobileservice-inter-font';\n            link.rel = 'stylesheet';\n            link.href = 'https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap';\n            document.head.appendChild(link);\n        }\n\n        this.#applyAttributes();\n        this.#render();\n        await this.#loadData();\n    }\n\n    disconnectedCallback(): void {\n        this.#controller.abort();\n        if (this.#shadow) {\n            cleanupHardwareOverlay(this.#shadow);\n        }\n    }\n\n    #applyAttributes(): void {\n        if (typeof C24Home !== 'undefined' && typeof C24Home.validateAttributes === 'function') {\n            try {\n                const validated = C24Home.validateAttributes<MobilfunkBundleProps>(this.attributes);\n                const deviceOutput = this.#asString(validated.deviceOutput);\n                if (\n                    deviceOutput === 'desktop' ||\n                    deviceOutput === 'mobile' ||\n                    deviceOutput === 'tabletapp' ||\n                    deviceOutput === 'app'\n                ) {\n                    this.deviceOutput = deviceOutput;\n                }\n                const language = this.#asString(validated.language);\n                if (language) this.language = language as Language;\n                if (validated.user && typeof validated.user === 'object' && 'id' in validated.user) {\n                    this.user = validated.user;\n                }\n                const platform = this.#asString(validated.platform);\n                if (platform === 'app' || platform === 'web') this.platform = platform;\n            } catch {\n                this.#applyRawAttributes();\n            }\n        } else {\n            this.#applyRawAttributes();\n        }\n\n        this.#env = normalizeEnv(this.getAttribute('env'));\n        this.#environment = resolveEnvironment(this.#env);\n    }\n\n    #asString(value: unknown): string | undefined {\n        if (typeof value === 'string') return value;\n        if (value && typeof value === 'object' && 'value' in value) {\n            return (value as Attr).value;\n        }\n        return undefined;\n    }\n\n    #applyRawAttributes(): void {\n        const deviceOutput = this.getAttribute('deviceoutput') ?? this.getAttribute('device-output');\n        if (\n            deviceOutput === 'desktop' ||\n            deviceOutput === 'mobile' ||\n            deviceOutput === 'tabletapp' ||\n            deviceOutput === 'app'\n        ) {\n            this.deviceOutput = deviceOutput;\n        }\n        const language = this.getAttribute('language');\n        if (language) this.language = language as Language;\n        const platform = this.getAttribute('platform');\n        if (platform === 'app' || platform === 'web') this.platform = platform;\n        const userAttr = this.getAttribute('user');\n        if (userAttr) {\n            try {\n                const parsed: unknown = JSON.parse(userAttr);\n                if (\n                    parsed !== null &&\n                    typeof parsed === 'object' &&\n                    'id' in parsed &&\n                    typeof (parsed as {id: unknown}).id === 'string'\n                ) {\n                    this.user = parsed as UserInfo;\n                }\n            } catch {\n                // ignore malformed user attribute\n            }\n        }\n    }\n\n    #render(): void {\n        if (!this.#shadow) return;\n\n        if (this.#shadow.childElementCount === 0) {\n            this.#shadow.innerHTML = `\n                <style>${styles}</style>\n                <div class=\"teaser-root\">\n                    <a href=\"${this.#environment.host}\" class=\"teaser-overlay-link\" aria-label=\"Zum Mobilfunk Bundle Vergleich\"></a>\n                    <div class=\"phones-layer\" aria-hidden=\"true\">\n                        <img class=\"phones-image\" src=\"${phonesImageUrl}\" alt=\"\" loading=\"eager\" decoding=\"async\" />\n                    </div>\n                    <div class=\"headline\">\n                        <div class=\"mainline\">Handy mit Vertrag</div>\n                        <div class=\"subline\">Top Smartphones zum Top-Preis</div>\n                    </div>\n                    <section class=\"search-bar\" id=\"search-bar\"></section>\n                </div>\n            `;\n        }\n\n        const searchBar = this.#shadow.getElementById('search-bar');\n        if (searchBar) {\n            if (this.#isLoading) {\n                searchBar.innerHTML = `\n                    ${Navigation()}\n                    <div class=\"short-filter short-filter--skeleton skeleton\" aria-hidden=\"true\"></div>\n                `;\n            } else {\n                searchBar.innerHTML = `\n                    ${Navigation()}\n                    ${ShortFilter({\n                        dataIncluded: this.#dataIncludedFilter,\n                        selectedDataIncluded: this.#selectedDataIncluded,\n                        hardwareOptions: this.#hardwareFilter,\n                        selectedHardware: this.#selectedHardware,\n                        isHardwareOverlayVisible: this.#isHardwareOverlayVisible,\n                        environment: this.#environment,\n                    })}\n                `;\n            }\n        }\n\n        if (!this.#isLoading) {\n            this.#setupEventListeners();\n        }\n    }\n\n    async #loadData() {\n        const {signal} = this.#controller;\n\n        const prefilling = await getPrefilling(this.deviceOutput, this.#environment, signal);\n        if (signal.aborted) return;\n        this.#selectedDataIncluded = prefilling?.data_included ?? 0;\n\n        const filter = await getFilter(this.deviceOutput, this.#environment, signal);\n        if (signal.aborted) return;\n        this.#dataIncludedFilter = filter.dataIncluded;\n        this.#hardwareFilter = filter.hardware;\n\n        this.#isLoading = false;\n        this.#render();\n    }\n\n    #setupEventListeners(): void {\n        if (!this.#shadow) return;\n        setupNavigation({\n            shadowRoot: this.#shadow,\n            onSimOnlyClick: () => this.#track('teaser_click'),\n        });\n        setupShortFilter({\n            shadowRoot: this.#shadow,\n            clickFilterCta: () => this.#track('teaser_click'),\n            dataIncludedChange: selectedValue => {\n                this.#selectedDataIncluded = selectedValue;\n                void setPrefilling(this.deviceOutput, this.#environment, selectedValue, this.#controller.signal);\n                this.#render();\n            },\n            changeHardwareSelection: selectedHardware => {\n                if (selectedHardware === '0') {\n                    this.#selectedHardware = [];\n                } else if (this.#selectedHardware.includes(selectedHardware)) {\n                    this.#selectedHardware = this.#selectedHardware.filter(value => value !== selectedHardware);\n                } else {\n                    this.#selectedHardware.push(selectedHardware);\n                }\n\n                this.#render();\n            },\n            openHardwareOverlay: () => {\n                this.#setHardwareOverlayVisible(true);\n            },\n            closeHardwareOverlay: () => {\n                this.#setHardwareOverlayVisible(false);\n            },\n            isHardwareOverlayVisible: this.#isHardwareOverlayVisible,\n        });\n    }\n\n    // Toggle the overlay's visibility without rebuilding the search-bar DOM.\n    // This matters because a full re-render would destroy the native <select>\n    // mid-click, breaking the \"close dropdown A, open dropdown B\" interaction.\n    #setHardwareOverlayVisible(visible: boolean): void {\n        this.#isHardwareOverlayVisible = visible;\n        if (!this.#shadow) return;\n\n        const overlay = this.#shadow.getElementById('hardware-overlay');\n        if (overlay) {\n            overlay.style.display = visible ? '' : 'none';\n        }\n\n        if (visible) {\n            overlay?.focus({preventScroll: true});\n            attachHardwareOverlayDismissListeners(this.#shadow, () => this.#setHardwareOverlayVisible(false));\n        } else {\n            cleanupHardwareOverlay(this.#shadow);\n        }\n    }\n\n    #track(event: 'teaser_click') {\n        window.dataLayer = window.dataLayer ?? [];\n        window.dataLayer.push({event, product: 'mobilfunk:bundle'});\n    }\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('mobileservice-default')) {\n    customElements.define('mobileservice-default', MobilfunkBundleDefaultClient);\n}\n","export const Navigation = (): string => `\n<nav class=\"navigation\">\n    <a\n        href=\"https://handytarife.check24.de\"\n        class=\"nav-link\"\n        id=\"simonly-link\"\n    >\n        Handytarife (SIM-Karte)\n    </a>\n    <span class=\"nav-link active\">Handy mit Vertrag</span>\n</nav>\n`;\n\nexport const setupNavigation = ({\n    shadowRoot,\n    onSimOnlyClick,\n}: {\n    shadowRoot: ShadowRoot;\n    onSimOnlyClick: () => void;\n}): void => {\n    shadowRoot.getElementById('simonly-link')?.addEventListener('click', () => onSimOnlyClick());\n};\n"],"names":["HardwareOption","label","value","isSelected","isDisabled","overlayHandlers","WeakMap","cleanupHardwareOverlay","shadowRoot","handlers","get","document","removeEventListener","documentHandler","shadowRootRef","shadowHandler","delete","getSelectionCount","selectedHardware","length","attachHardwareOverlayDismissListeners","closeHardwareOverlay","event","composedPath","includes","host","path","overlay","getElementById","trigger","set","addEventListener","getLink","selectedDataIncluded","hardwareOptions","hardwareSelection","environment","allOptions","flatMap","category","options","hardwareKeys","map","id","option","find","opt","key","queryParams","URLSearchParams","data_included","toString","join","getHardwarePath","getPubApiDefaultHeaders","deviceOutput","Accept","test","publicApi","assetsExternal","int","live","resolveEnvironment","env","name","local","MobilfunkBundleDefaultClient","HTMLElement","constructor","super","arguments","__privateAdd","this","_MobilfunkBundleDefaultClient_instances","__publicField","_shadow","_dataIncludedFilter","_hardwareFilter","_selectedDataIncluded","_selectedHardware","_isHardwareOverlayVisible","_isLoading","_controller","AbortController","_env","_environment","observedAttributes","attributeChangedCallback","oldValue","newValue","__privateMethod","applyAttributes_fn","call","__privateGet","loadData_fn","render_fn","connectedCallback","__privateSet","attachShadow","mode","link","createElement","rel","href","head","appendChild","disconnectedCallback","abort","WeakSet","C24Home","validateAttributes","validated","attributes","asString_fn","language","user","platform","applyRawAttributes_fn","raw","window","location","hostname","endsWith","normalizeEnv","getAttribute","userAttr","parsed","JSON","parse","childElementCount","innerHTML","searchBar","dataIncluded","isHardwareOverlayVisible","reduce","acc","section","filter","getHardwareLabel","selectionCount","remainingSelectableCount","getHintText","HardwareOverlay","ShortFilter","setupEventListeners_fn","async","signal","prefilling","response","fetch","method","headers","credentials","ok","json","getPrefilling","aborted","hardware","hw_prop_model_multiselect","getFilter","onSimOnlyClick","setupNavigation","track_fn","clickFilterCta","dataIncludedChange","openHardwareOverlay","changeHardwareSelection","selectedValue","target","parseInt","querySelectorAll","forEach","checkbox","dataset","setupHardwareOption","setupHardwareOverlay","setupShortFilter","body","stringify","setPrefilling","push","setHardwareOverlayVisible_fn","visible","style","display","focus","preventScroll","dataLayer","product","customElements","define"],"mappings":"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"}