{"version":3,"file":"client.mjs","sources":["../app/constants.ts","../app/teaser_internet.client.ts"],"sourcesContent":["export const PSS_URL_PROD = 'https://internet.check24.de/';\nconst PSS_URL_TEST = 'https://internet.check24-test.de/';\n\n/** Use this for client-side runtime detection. For SSR, use PSS_URL_PROD directly. */\nexport function getPssUrl(): string {\n    const isProd = globalThis.location?.hostname?.endsWith('check24.de') ?? false;\n    return isProd ? PSS_URL_PROD : PSS_URL_TEST;\n}\n\nexport const TID3_VALUE = 'home_teaser';\n\nexport const de = {\n    linkLabel: 'Zum Internet-Vergleich',\n    title: 'Internet für Zuhause',\n    subtitle: 'Einfach vergleichen und sparen',\n    legend: 'Art des Vertrags:',\n    new: 'neuer Vertrag',\n    change: 'Vertrag wechseln',\n    move: 'Umzug',\n    submit: 'Tarife finden',\n    cashbackLabelTop: 'Bis zu',\n    cashbackLabelBottom: 'Cashback',\n} satisfies Labels;\n\nexport const en = {\n    linkLabel: 'To Internet Comparison',\n    title: 'Internet for your home',\n    subtitle: 'Compare and save',\n    legend: 'Type of contract:',\n    new: 'new contract',\n    change: 'change contract',\n    move: 'moving',\n    submit: 'Find tariffs',\n    cashbackLabelTop: 'Up to',\n    cashbackLabelBottom: 'Cashback',\n} satisfies Labels;\n\nexport type Labels = {\n    readonly linkLabel: string;\n    readonly title: string;\n    readonly subtitle: string;\n    readonly legend: string;\n    readonly new: string;\n    readonly change: string;\n    readonly move: string;\n    readonly submit: string;\n    readonly cashbackLabelTop: string;\n    readonly cashbackLabelBottom: string;\n};\n\nexport function getLabels(isEnglish: boolean): Labels {\n    return isEnglish ? en : de;\n}\n","/// <reference types=\"../.check24-home/types/client\" />\n\nimport type { Language } from '../.check24-home/types/check24';\nimport type { HomeClientComponentElement, HomeClientComponentProps } from '../.check24-home/types/client';\nimport { getLabels, getPssUrl, TID3_VALUE } from './constants';\nimport sharedStyles from './assets/teaser_internet_shared.css?raw';\nimport clientStyles from './assets/teaser_internet_client.css?raw';\n\nconst styles = `${sharedStyles}\\n${clientStyles}`;\n\ntype CustomerType = 'new' | 'change' | 'move';\n\nexport default class InternetTeaserClient extends HTMLElement implements HomeClientComponentElement {\n    deviceOutput: 'desktop' | 'mobile' | 'tabletapp' | 'app' = 'desktop';\n    language: Language = 'de-DE';\n    platform: 'app' | 'web' = 'web';\n    systemTime = 0;\n\n    private shadow: ShadowRoot | null = null;\n\n    static get observedAttributes(): string[] {\n        return ['device-output', 'language', 'platform', 'system-time'];\n    }\n\n    attributeChangedCallback(_name: string, oldValue: string, newValue: string): void {\n        if (oldValue === newValue) return;\n        this.applyAttributes();\n\n        if (this.shadow) {\n            this.render();\n        }\n    }\n\n    private handleSubmit(event: Event): void {\n        event.preventDefault();\n        const form = event.target as HTMLFormElement & {\n            customerType?: { value: CustomerType };\n        };\n\n        const customerType = form.customerType?.value;\n        const url = this.buildUrlWithCustomerType(customerType);\n        window.location.assign(url);\n    }\n\n    private boundHandleSubmit = this.handleSubmit.bind(this);\n\n    connectedCallback(): void {\n        if (!this.shadow) {\n            this.shadow = this.attachShadow({ mode: 'closed' });\n        }\n\n        this.applyAttributes();\n        this.render();\n\n        this.shadow?.addEventListener('submit', this.boundHandleSubmit);\n    }\n\n    disconnectedCallback(): void {\n        this.shadow?.removeEventListener('submit', this.boundHandleSubmit);\n    }\n\n    private applyAttributes(): void {\n        const validator = (globalThis as Record<string, unknown>).C24Home as typeof C24Home | undefined;\n\n        if (typeof validator?.validateAttributes === 'function') {\n            const validated = validator.validateAttributes<HomeClientComponentProps>(this.attributes);\n            this.deviceOutput = validated.deviceOutput ?? this.deviceOutput;\n            this.language = validated.language ?? this.language;\n            this.platform = validated.platform ?? this.platform;\n        } else {\n            this.deviceOutput =\n                (this.getAttribute('device-output') as InternetTeaserClient['deviceOutput']) || 'desktop';\n            this.platform = (this.getAttribute('platform') as InternetTeaserClient['platform']) || 'web';\n            const lang = this.getAttribute('language');\n            this.language = lang === 'en-GB' || lang === 'en-US' ? lang : 'de-DE';\n        }\n\n        this.systemTime = Number(this.getAttribute('system-time') || 0);\n    }\n\n    private buildUrlWithCustomerType(customerType: CustomerType | undefined): string {\n        const url = new URL(getPssUrl());\n        const currentParams = new URLSearchParams(window.location.search);\n\n        // Copy existing params except customerType\n        currentParams.forEach((value, key) => {\n            if (key !== 'customerType') {\n                url.searchParams.set(key, value);\n            }\n        });\n\n        // Add new customerType if provided\n        if (customerType) {\n            url.searchParams.set('customerType', customerType);\n        }\n\n        url.searchParams.set('tid3', TID3_VALUE);\n\n        return url.toString();\n    }\n\n    private render(): void {\n        if (!this.shadow) return;\n\n        const cssStyles = this.getStyles();\n        const content = this.getContent();\n\n        this.shadow.innerHTML = `\n            <style>${cssStyles}</style>\n            ${content}\n        `;\n    }\n\n    private getContent(): string {\n        const href = this.buildUrlWithCustomerType(undefined);\n        const isEnglish = this.language === 'en-GB' || this.language === 'en-US';\n        const labels = getLabels(isEnglish);\n\n        // Single HTML structure with CSS-based responsive behavior\n        // Link wraps only non-interactive content (for small screens)\n        // Form is separate to avoid HTML content model violation\n        return `\n            <div class=\"dsl-teaser-content\">\n                <a class=\"teaser-link\" href=\"${href}\" aria-label=\"${labels.linkLabel}\">\n                    <div class=\"container\">\n                                            <div class=\"headlines\">\n                            <h2 class=\"title\">${labels.title}</h2>\n                            <p class=\"subtitle\">${labels.subtitle}</p>\n                        </div>\n                    </div>\n                </a>\n                <form>\n                    <fieldset>\n                        <legend class=\"sr-only\">${labels.legend}</legend>\n                        <div>\n                            <input type=\"radio\" name=\"customerType\" value=\"new\" id=\"new\" />\n                            <label for=\"new\">${labels.new}</label>\n                        </div>\n                        <div>\n                            <input type=\"radio\" name=\"customerType\" value=\"change\" id=\"change\" />\n                            <label for=\"change\">${labels.change}</label>\n                        </div>\n                        <div>\n                            <input type=\"radio\" name=\"customerType\" value=\"move\" id=\"move\" />\n                            <label for=\"move\">${labels.move}</label>\n                        </div>\n                    </fieldset>\n                    <button type=\"submit\">${labels.submit}</button>\n                </form>\n            </div>\n        `;\n    }\n\n    private getStyles(): string {\n        return styles;\n    }\n}\n\n// SlugTagMatchStep: tag must match manifest slug (dsl-internetdefault)\ncustomElements.define('dsl-internetdefault', InternetTeaserClient);\n"],"names":["de","linkLabel","title","subtitle","legend","new","change","move","submit","cashbackLabelTop","cashbackLabelBottom","en","InternetTeaserClient","HTMLElement","constructor","super","arguments","__publicField","this","handleSubmit","bind","observedAttributes","attributeChangedCallback","_name","oldValue","newValue","applyAttributes","shadow","render","event","_a","preventDefault","customerType","target","value","url","buildUrlWithCustomerType","window","location","assign","connectedCallback","attachShadow","mode","addEventListener","boundHandleSubmit","disconnectedCallback","removeEventListener","_b","_c","validator","globalThis","C24Home","validateAttributes","validated","attributes","deviceOutput","language","platform","getAttribute","lang","systemTime","Number","URL","hostname","endsWith","URLSearchParams","search","forEach","key","searchParams","set","toString","cssStyles","getStyles","content","getContent","innerHTML","href","labels","isEnglish","getLabels","customElements","define"],"mappings":"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"}