{"version":3,"file":"client.mjs","sources":["../app/vbptax-teaser.client.ts"],"sourcesContent":["/// <reference types=\"../.check24-home/types/client\" />\nimport {Language} from \"../.check24-home/types/check24\";\nimport {HomeClientComponentElement, HomeClientComponentProps, UserInfo} from \"../.check24-home/types/client\";\nimport WIDGET_STYLES from \"./assets/vbptax-teaser.css?inline\";\n\ninterface WidgetAttributes extends HomeClientComponentProps {\n    title: string;\n    subtitle: string;\n    subtitlemobile: string;\n    href: string;\n}\n\ninterface TeaserVariant {\n    title: string;\n    subtitleDesktop: string;\n    subtitleMobile: string;\n    titleFirstPart: string;\n    titleSecondPart: string;\n    searchformLeftText: string;\n}\n\n/** Motiv: `public/visual-steuer-v3*.png` → Build kopiert nach `dist/`. Nicht als Import (Vite Lib-Mode würde ~400KB inlinen). */\nfunction phoneImageUrlNextToClient(fileName: string): string {\n    if (import.meta.env.DEV) {\n        return new URL(`/${fileName}`, self.location?.href ?? \"http://localhost:3000/\").href;\n    }\n    const base = import.meta.url;\n    const slash = base.lastIndexOf(\"/\");\n    return `${base.slice(0, slash + 1)}${fileName}`;\n}\n\nconst PHONE_IMAGE = phoneImageUrlNextToClient(\"visual-steuer-v3.png\");\nconst PHONE_IMAGE_APP = phoneImageUrlNextToClient(\"visual-steuer-v3-app.png\");\nconst MS_PER_DAY = 86_400_000;\nconst TEXT_VARIANTS: readonly [TeaserVariant, TeaserVariant] = [\n    {\n        title: \"Gratis Steuererklärung\",\n        subtitleDesktop: \"Hol Dir im Schnitt 1.240 € zurück!\",\n        subtitleMobile: \"Hol Dir im Schnitt<br />1.240 € zurück!\",\n        titleFirstPart: \"Gratis\",\n        titleSecondPart: \"Steuererklärung\",\n        searchformLeftText: \"Steuer kostenlos erledigen\",\n    },\n    {\n        title: \"Steuererklärung mit CHECK24\",\n        subtitleDesktop: \"100% kostenlos & Testsieger\",\n        subtitleMobile: \"Testsieger & kostenlos\",\n        titleFirstPart: \"Steuererklärung\",\n        titleSecondPart: \"mit CHECK24\",\n        searchformLeftText: \"Steuer kostenlos erledigen\",\n    },\n] as const;\n\nconst DEFAULT_TITLE = TEXT_VARIANTS[1].title;\nconst DEFAULT_SUBTITLE_DESKTOP = TEXT_VARIANTS[1].subtitleDesktop;\nconst DEFAULT_SUBTITLE_MOBILE = TEXT_VARIANTS[1].subtitleMobile;\nconst DEFAULT_HREF = \"https://steuer.check24.de/?ts=check24&tc=teaser\";\nconst OBSERVED_ATTRIBUTES = [\n    \"title\",\n    \"subtitle\",\n    \"subtitle-mobile\",\n    \"subtitlemobile\",\n    \"href\",\n    \"system-time\",\n    \"device-output\",\n    \"deviceoutput\",\n    \"language\",\n    \"user\",\n    \"platform\",\n] as const;\n\nexport default class VbptaxWidgetClient extends HTMLElement implements HomeClientComponentElement {\n    constructor() {\n        super();\n        this.shadow = this.attachShadow({mode: \"closed\"});\n        const hostSizing = document.createElement(\"style\");\n        hostSizing.textContent = `\n            :host {\n                background: transparent;\n                box-sizing: border-box;\n                display: block;\n                height: 360px;\n                min-height: 360px;\n                min-width: 0;\n                width: 100%;\n            }\n            @media (max-width: 768px) {\n                :host {\n                    height: 230px;\n                    min-height: 230px;\n                }\n            }\n        `;\n        this.shadow.appendChild(hostSizing);\n    }\n\n    title: string = DEFAULT_TITLE;\n    subtitleDesktop: string = DEFAULT_SUBTITLE_DESKTOP;\n    subtitleMobile: string = DEFAULT_SUBTITLE_MOBILE;\n    href: string = DEFAULT_HREF;\n    titleFirstPart: string = TEXT_VARIANTS[1].titleFirstPart;\n    titleSecondPart: string = TEXT_VARIANTS[1].titleSecondPart;\n    searchformLeftText: string = TEXT_VARIANTS[1].searchformLeftText;\n\n    deviceOutput: \"desktop\" | \"mobile\" | \"tabletapp\" | \"app\" = \"desktop\";\n    language: Language = \"de-DE\";\n    user?: UserInfo;\n    platform: \"app\" | \"web\" = \"web\";\n\n    private shadow: ShadowRoot;\n    private lastRenderedMarkup = \"\";\n\n    static get observedAttributes(): string[] {\n        return [...OBSERVED_ATTRIBUTES];\n    }\n\n    attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n        if (oldValue === newValue) return;\n        this.syncAttributes();\n        this.render();\n    }\n\n    connectedCallback(): void {\n        this.syncAttributes();\n        this.render();\n    }\n\n    private syncAttributes(): void {\n        const systemTime = Number(this.getAttribute(\"system-time\") || 0);\n        const dayIndex = Math.floor((systemTime * 1000) / MS_PER_DAY);\n        const variant = dayIndex % 2 === 0 ? TEXT_VARIANTS[0] : TEXT_VARIANTS[1];\n        this.applyVariant(variant);\n\n        this.title = this.getAttribute(\"title\") || this.title;\n        this.subtitleDesktop = this.getAttribute(\"subtitle\") || this.subtitleDesktop;\n        this.subtitleMobile = this.getAttribute(\"subtitle-mobile\") || this.getAttribute(\"subtitlemobile\") || this.subtitleMobile;\n        this.href = this.getAttribute(\"href\") || DEFAULT_HREF;\n\n        const host = this.readHostPropsFromAttributes();\n        this.deviceOutput = host.deviceOutput;\n        this.language = host.language;\n        this.user = host.user;\n        this.platform = host.platform;\n    }\n\n    /** Host attributes; uses C24Home when present (production), else parses like the local preview mock. */\n    private readHostPropsFromAttributes(): HomeClientComponentProps {\n        const fallback = (): HomeClientComponentProps => this.parseHostAttributesFallback();\n        try {\n            if (typeof C24Home !== \"undefined\" && typeof C24Home.validateAttributes === \"function\") {\n                const validated = C24Home.validateAttributes<WidgetAttributes>(this.attributes);\n                const fb = fallback();\n                return {\n                    deviceOutput: validated.deviceOutput ?? fb.deviceOutput,\n                    language: validated.language ?? fb.language,\n                    platform: validated.platform ?? fb.platform,\n                    user: validated.user ?? fb.user,\n                };\n            }\n        } catch {\n            /* Web Component Management preview may not inject C24Home */\n        }\n        return fallback();\n    }\n\n    private parseHostAttributesFallback(): HomeClientComponentProps {\n        const attrs = this.attributes;\n        const out: Partial<HomeClientComponentProps> & {user?: UserInfo} = {};\n\n        for (let i = 0; i < attrs.length; i++) {\n            const attr = attrs[i];\n            const camelName = attr.name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n            const value = attr.value;\n\n            if (camelName === \"deviceOutput\" || camelName === \"deviceoutput\") {\n                const v = value || \"desktop\";\n                if (v === \"desktop\" || v === \"mobile\" || v === \"tabletapp\" || v === \"app\") {\n                    out.deviceOutput = v;\n                }\n            } else if (camelName === \"language\") {\n                out.language = (value || \"de-DE\") as Language;\n            } else if (camelName === \"platform\") {\n                const p = value || \"web\";\n                if (p === \"app\" || p === \"web\") {\n                    out.platform = p;\n                }\n            } else if (camelName === \"user\" && value) {\n                try {\n                    out.user = JSON.parse(value) as UserInfo;\n                } catch {\n                    out.user = undefined;\n                }\n            }\n        }\n\n        return {\n            deviceOutput: out.deviceOutput ?? \"desktop\",\n            language: (out.language ?? \"de-DE\") as Language,\n            platform: out.platform ?? \"web\",\n            user: out.user,\n        };\n    }\n\n    private applyVariant(variant: TeaserVariant): void {\n        this.title = variant.title;\n        this.subtitleDesktop = variant.subtitleDesktop;\n        this.subtitleMobile = variant.subtitleMobile;\n        this.titleFirstPart = variant.titleFirstPart;\n        this.titleSecondPart = variant.titleSecondPart;\n        this.searchformLeftText = variant.searchformLeftText;\n    }\n\n    private navigateToHref(): void {\n        window.location.href = this.href;\n    }\n\n    private buildMarkup(): string {\n        const titleFirstPart = this.titleFirstPart;\n        const titleSecondPart = this.titleSecondPart;\n        const subtitleDesktop = this.subtitleDesktop;\n        const subtitleMobile = this.subtitleMobile;\n        const searchformLeftText = this.searchformLeftText;\n        const href = this.href;\n        const ariaLabel = `${this.title} - ${this.subtitleDesktop}`;\n        const titleSecondPartMarkup = this.titleSecondPart ? `<span class=\"vbptax-Widget-titleMobileSecondLine\">${titleSecondPart}</span>` : \"\";\n\n        return `\n      <style>${WIDGET_STYLES}</style>\n      <a class=\"vbptax-TeaserLink\" href=\"${href}\" aria-label=\"${ariaLabel}\">\n        <div class=\"vbptax-Widget\">\n          <h2 class=\"vbptax-Widget-title\">\n            <span>${titleFirstPart}</span>\n            ${titleSecondPartMarkup}\n          </h2>\n          <p class=\"vbptax-Widget-subtitle\">\n            <span class=\"vbptax-Widget-subtitleDesktop\">${subtitleDesktop}</span>\n            <span class=\"vbptax-Widget-subtitleMobile\">${subtitleMobile}</span>\n          </p>\n          <div class=\"vbptax-Widget-content\">\n            <div class=\"vbptax-Widget-phoneImage\" style=\"--vbptax-phone-image: url('${PHONE_IMAGE}'); --vbptax-phone-image-app: url('${PHONE_IMAGE_APP}');\" aria-hidden=\"true\"></div>\n            <div class=\"vbptax-Widget-searchForm\">\n              <span class=\"vbptax-Widget-searchFormLeft\">${searchformLeftText}</span>\n              <button class=\"vbptax-Widget-searchFormRight\" type=\"button\">Geld zurückholen</button>\n            </div>\n          </div>\n        </div>\n      </a>\n    `;\n    }\n\n    private render(): void {\n        if (!this.shadow) {\n            return;\n        }\n\n        const markup = this.buildMarkup();\n        if (markup === this.lastRenderedMarkup) {\n            return;\n        }\n\n        this.shadow.innerHTML = markup;\n        const searchFormRightButton = this.shadow.querySelector<HTMLButtonElement>(\".vbptax-Widget-searchFormRight\");\n        searchFormRightButton?.addEventListener(\"click\", () => this.navigateToHref());\n        this.lastRenderedMarkup = markup;\n    }\n}\n\nif (!customElements.get(\"vbptax-teaser\")) {\n    customElements.define(\"vbptax-teaser\", VbptaxWidgetClient);\n}\n"],"names":["phoneImageUrlNextToClient","fileName","base","url","slash","lastIndexOf","slice","PHONE_IMAGE","PHONE_IMAGE_APP","TEXT_VARIANTS","title","subtitleDesktop","subtitleMobile","titleFirstPart","titleSecondPart","searchformLeftText","DEFAULT_TITLE","DEFAULT_SUBTITLE_DESKTOP","DEFAULT_SUBTITLE_MOBILE","DEFAULT_HREF","OBSERVED_ATTRIBUTES","VbptaxWidgetClient","HTMLElement","constructor","super","__publicField","this","shadow","attachShadow","mode","hostSizing","document","createElement","textContent","appendChild","observedAttributes","attributeChangedCallback","_name","oldValue","newValue","syncAttributes","render","connectedCallback","systemTime","Number","getAttribute","variant","Math","floor","applyVariant","href","host","readHostPropsFromAttributes","deviceOutput","language","user","platform","fallback","parseHostAttributesFallback","C24Home","validateAttributes","validated","attributes","fb","_a","_b","_c","_d","e","attrs","out","i","length","attr","camelName","name","replace","_","c","toUpperCase","value","v","p","JSON","parse","navigateToHref","window","location","buildMarkup","markup","lastRenderedMarkup","innerHTML","searchFormRightButton","querySelector","addEventListener","customElements","get","define"],"mappings":"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"}