{"version":3,"mappings":"mLAAA,EAAe,yHCAf,EAAe;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECCF,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5B,OCCW,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,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","names":["#styleEl","#mount","#render"],"ignoreList":[],"sources":["../app/assets/brand-spacer.png","../app/skeleton.css?raw","../app/host-wrapper-css.ts","../app/login-skeleton.ts","../app/dimensions-css.ts","../app/shadow-css.ts","../app/strings.ts","../app/widget/harness.ts","../app/login-bridge.ts","../app/client.ts"],"sourcesContent":["export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==\"","export default \"/**\\n * Light-DOM skeleton only (SSR / before custom element). Not loaded by the client bundle.\\n * Mirrors layout of the real card for CLS; class prefix matches other reference widgets.\\n */\\n\\n.c24-lp-login-skeleton {\\n  /* shimmer-skeleton-server-client-split (aligned with overview skin tokens) */\\n  --skeleton-dark: #ebebeb;\\n  --skeleton-light: #f5f6f5;\\n  display: block;\\n  width: 100%;\\n  box-sizing: border-box;\\n}\\n\\n.c24-lp-login-skeleton .skeleton {\\n  background: var(--skeleton-dark);\\n  animation: c24-lp-login-skeleton-pulse 1100ms ease-in-out 100ms infinite;\\n}\\n\\n@keyframes c24-lp-login-skeleton-pulse {\\n  0%, 9%, 100% {\\n    background-color: var(--skeleton-dark);\\n  }\\n  50%, 59% {\\n    background-color: var(--skeleton-light);\\n  }\\n}\\n\\n.c24-lp-login-skeleton__card {\\n  box-sizing: border-box;\\n  width: 100%;\\n  max-width: 1280px;\\n  margin: 0 auto;\\n  padding: 16px;\\n  display: flex;\\n  flex-direction: column;\\n  gap: 16px;\\n  align-items: stretch;\\n  background: #ffffff;\\n  border-radius: 10px;\\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.16);\\n}\\n\\n.c24-lp-login-skeleton__card,\\n.c24-lp-login-skeleton__card * {\\n  box-sizing: border-box;\\n}\\n\\n.c24-lp-login-skeleton__ph {\\n  position: relative;\\n  overflow: hidden;\\n  /* Skill default: pill bars; .c24-lp-login-skeleton__btn overrides for real button radii */\\n  border-radius: 90px;\\n}\\n\\n.c24-lp-login-skeleton__body {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  gap: 0;\\n  width: 100%;\\n  margin: 0;\\n  font-size: 16px;\\n  line-height: 1.2;\\n}\\n\\n/**\\n * Full-bleed box matching .lw-body / .lw-actions for widget-pipeline LayoutCheck:\\n * ignore rects are derived from skeleton descendant geometry; thin line placeholders\\n * are smaller than real copy/links and leave compared pixels that mismatch the client.\\n */\\n.c24-lp-login-skeleton__measure-bounds {\\n  position: absolute;\\n  inset: 0;\\n  visibility: hidden;\\n  pointer-events: none;\\n}\\n\\n.c24-lp-login-skeleton__line--lg {\\n  display: block;\\n  height: 1.2em;\\n  width: 92%;\\n}\\n\\n.c24-lp-login-skeleton__line--md {\\n  display: block;\\n  height: 1.2em;\\n  width: 72%;\\n  margin-top: 0;\\n}\\n\\n/*\\n * de-DE .lw-body wraps to two lines only below ~469px viewport (narrow content box).\\n * Match that: two placeholder lines only when the real copy is two lines.\\n */\\n@media (max-width: 468px) {\\n  .c24-lp-login-skeleton__body {\\n    gap: 0.35em;\\n  }\\n\\n  .c24-lp-login-skeleton__line--lg,\\n  .c24-lp-login-skeleton__line--md {\\n    height: calc((2.4em - 0.35em) / 2);\\n  }\\n}\\n\\n/* One line of copy (same as min-width 768 tablet) between narrow wrap and 767px. */\\n@media (min-width: 469px) and (max-width: 767px) {\\n  .c24-lp-login-skeleton__line--md {\\n    display: none;\\n  }\\n\\n  .c24-lp-login-skeleton__line--lg {\\n    width: 96%;\\n  }\\n}\\n\\n.c24-lp-login-skeleton__actions {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  gap: 16px;\\n  align-items: stretch;\\n  width: 100%;\\n}\\n\\n.c24-lp-login-skeleton__line--sm {\\n  display: block;\\n  height: 16px;\\n  width: 56%;\\n}\\n\\n.c24-lp-login-skeleton__btn {\\n  display: block;\\n  height: 50px;\\n  width: 100%;\\n  border-radius: 25px;\\n}\\n\\n@media (min-width: 768px) {\\n  /* One line of copy (wide viewports); mirrors .lw-body for de-DE */\\n  .c24-lp-login-skeleton__line--md {\\n    display: none;\\n  }\\n\\n  .c24-lp-login-skeleton__line--lg {\\n    width: 96%;\\n  }\\n\\n  .c24-lp-login-skeleton__card {\\n    gap: 32px;\\n  }\\n\\n  .c24-lp-login-skeleton__actions {\\n    flex-direction: row;\\n    align-items: center;\\n    justify-content: flex-end;\\n    gap: 16px;\\n  }\\n\\n  .c24-lp-login-skeleton__line--sm {\\n    width: 200px;\\n    height: 14px;\\n    order: 1;\\n  }\\n\\n  .c24-lp-login-skeleton__btn {\\n    width: 200px;\\n    height: 40px;\\n    border-radius: 20px;\\n    order: 2;\\n  }\\n}\\n\\n@media (min-width: 1312px) {\\n  .c24-lp-login-skeleton__card {\\n    flex-direction: row;\\n    align-items: center;\\n    justify-content: space-between;\\n    gap: 32px;\\n  }\\n\\n  .c24-lp-login-skeleton__body {\\n    flex: 1;\\n    width: auto;\\n    max-width: 48%;\\n  }\\n\\n  .c24-lp-login-skeleton__actions {\\n    flex: 1;\\n    width: auto;\\n    justify-content: flex-end;\\n  }\\n}\\n\\n@media (max-width: 768px) {\\n  .c24-lp-login-skeleton__card {\\n    flex-direction: column;\\n    align-items: stretch;\\n    justify-content: flex-start;\\n    gap: 16px;\\n  }\\n\\n  .c24-lp-login-skeleton__actions {\\n    flex-direction: column;\\n    align-items: stretch;\\n    gap: 8px;\\n  }\\n\\n  .c24-lp-login-skeleton__btn {\\n    width: 100%;\\n    height: 50px;\\n    border-radius: 25px;\\n    order: 1;\\n  }\\n\\n  .c24-lp-login-skeleton__line--sm {\\n    width: 56%;\\n    order: 2;\\n    margin-top: 0;\\n    /* Match .lw-register row height (16px text + inline-flex); keeps SSR vs client CLS-neutral. */\\n    height: 18px;\\n  }\\n}\\n\"","/** Optional outer host wrapper until the custom element is defined (CLS). */\nexport const hostWrapperCss = `\n.lw-widget-host {\n  display: block;\n  width: 100%;\n  box-sizing: border-box;\n}\n`.trim();\n","/**\n * SSR- und Harness-Skeleton: ein Markup/ein Style-String, damit Server-Export und\n * Client-Harness (`/client`, `/skeleton`) dieselbe Quelle nutzen (shimmer-skeleton-server-client-split).\n */\nimport skeletonCss from \"./skeleton.css?raw\";\nimport { hostWrapperCss } from \"./host-wrapper-css\";\n\n/** Root trägt `data-c24-lp-login-slot` — client.mjs ersetzt durch Custom Element (app/client.ts). */\nexport const LOGIN_SKELETON_HTML = `\n<div\n  class=\"c24-lp-login-skeleton\"\n  data-c24-lp-login-slot\n  data-product-slug=\"lp\"\n  data-deviceoutput=\"desktop\"\n  data-language=\"de-DE\"\n  data-platform=\"web\"\n  data-env=\"dev\"\n  data-sso-env=\"\"\n>\n  <div class=\"c24-lp-login-skeleton__card\">\n    <div class=\"c24-lp-login-skeleton__body\">\n      <span class=\"c24-lp-login-skeleton__ph c24-lp-login-skeleton__line--lg skeleton\"></span>\n      <span class=\"c24-lp-login-skeleton__ph c24-lp-login-skeleton__line--md skeleton\"></span>\n      <div class=\"c24-lp-login-skeleton__measure-bounds\" aria-hidden=\"true\"></div>\n    </div>\n    <div class=\"c24-lp-login-skeleton__actions\">\n      <span class=\"c24-lp-login-skeleton__ph c24-lp-login-skeleton__line--sm skeleton\"></span>\n      <span class=\"c24-lp-login-skeleton__ph c24-lp-login-skeleton__btn skeleton\"></span>\n      <div class=\"c24-lp-login-skeleton__measure-bounds\" aria-hidden=\"true\"></div>\n    </div>\n  </div>\n</div>\n`.trim();\n\nexport const LOGIN_SKELETON_STYLE = `${skeletonCss.trim()}\\n\\n${hostWrapperCss}`.trim();\n\n/** Nur Shadow-Harness: ersetzt äußeres `.lw-widget-host` aus dem SSR-Light-DOM. */\nexport const LOGIN_SKELETON_HARNESS_HOST_STYLE = `\n:host {\n  display: block;\n  width: 100%;\n  box-sizing: border-box;\n}\n`.trim();\n","/**\n * Shadow-DOM layout for the custom element only (no skeleton).\n * Breakpoints: overlap at 768px (min-width:768 + max-width:768); mobile resets last.\n */\n\nconst loginWidgetHostCss = `\n:host {\n  display: block;\n  width: 100%;\n  background: transparent;\n}\n\n.lw-root {\n  display: block;\n  width: 100%;\n}\n`.trim();\n\nconst loginWidgetSurfaceCss = `\n.lw-card {\n  box-sizing: border-box;\n  width: 100%;\n  max-width: 1280px;\n  margin: 0 auto;\n  padding: 16px;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n  align-items: stretch;\n  background: #ffffff;\n  border-radius: 10px;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.16);\n}\n\n.lw-card,\n.lw-card * {\n  box-sizing: border-box;\n}\n\n.lw-actions {\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n  align-items: stretch;\n  width: 100%;\n}\n\n.lw-body {\n  margin: 0;\n  margin-block: 0;\n  padding: 0;\n  color: #181818;\n  line-height: 1.2;\n  font-weight: 400;\n  font-size: 16px;\n  width: 100%;\n  text-align: start;\n}\n\n@media (min-width: 768px) {\n  .lw-card {\n    gap: 32px;\n  }\n\n  .lw-actions {\n    flex-direction: row;\n    align-items: center;\n    width: 100%;\n    justify-content: flex-end;\n    gap: 16px;\n  }\n}\n\n@media (min-width: 1312px) {\n  .lw-card {\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    gap: 32px;\n  }\n\n  .lw-body {\n    flex: 1;\n    width: auto;\n    max-width: 48%;\n  }\n\n  .lw-actions {\n    flex: 1;\n    width: auto;\n    justify-content: flex-end;\n  }\n}\n\n@media (max-width: 768px) {\n  .lw-card {\n    flex-direction: column;\n    align-items: stretch;\n    justify-content: flex-start;\n    gap: 16px;\n  }\n\n  .lw-body {\n    width: 100%;\n  }\n\n  .lw-actions {\n    flex-direction: column;\n    align-items: stretch;\n    width: 100%;\n    gap: 8px;\n  }\n}\n`.trim();\n\n/** Full layout injected into the closed shadow root (host + card surface). */\nexport const loginWidgetShadowLayoutCss = `${loginWidgetHostCss}\\n\\n${loginWidgetSurfaceCss}`;\n","import { loginWidgetShadowLayoutCss } from './dimensions-css';\n\n\n/** Styles only for Shadow DOM content (no global/host assumptions). */\nexport function buildShadowCss(): string {\n  return `\n${loginWidgetShadowLayoutCss}\n\n.lw-brand-spacer {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.lw-brand-spacer img {\n  display: block;\n  width: 1px;\n  height: 1px;\n}\n\n.lw-login {\n  background: #0563c1;\n  color: #ffffff;\n  border: none;\n  border-radius: 25px;\n  cursor: pointer;\n  text-align: center;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  text-decoration: none;\n  width: 100%;\n  height: 50px;\n  font-family: inherit;\n  font-size: 16px;\n}\n\n.lw-register {\n  position: relative;\n  color: #0563c1;\n  text-decoration: none;\n  font-size: 16px;\n  cursor: pointer;\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding: 0;\n  border: none;\n  background: none;\n}\n\n.lw-register:hover {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .lw-login {\n    width: 200px;\n    height: 40px;\n    order: 2;\n  }\n\n  .lw-register {\n    order: 1;\n    margin-right: 16px;\n  }\n}\n\n@media (min-width: 1312px) {\n  .lw-register {\n    margin-right: 0;\n  }\n}\n\n@media (max-width: 768px) {\n  .lw-login {\n    order: 1;\n    width: 100%;\n    height: 50px;\n  }\n\n  .lw-register {\n    order: 2;\n    justify-content: flex-start;\n    margin-right: 0;\n    min-height: 18px;\n    line-height: 18px;\n  }\n}\n\n@media (hover: hover) and (pointer: fine) {\n  .lw-login:hover {\n    filter: brightness(1.03);\n  }\n\n  .lw-register:hover {\n    text-decoration: none;\n  }\n}\n`.trim();\n}\n","export type LocaleKey = 'de-DE' | 'en-GB' | 'en-US';\n\nexport interface LoginWidgetCopy {\n  body: string;\n  registerLabel: string;\n  loginLabel: string;\n  registerHref: string;\n}\n\nconst table: Record<LocaleKey, LoginWidgetCopy> = {\n  'de-DE': {\n    body: 'Für das beste Vergleichsergebnis melden Sie sich bitte an.',\n    registerLabel: 'Kundenkonto erstellen',\n    loginLabel: 'Anmelden',\n    registerHref: 'https://kundenbereich.check24.at/user/register.html',\n  },\n  'en-GB': {\n    body: 'Please sign in for the best comparison results.',\n    registerLabel: 'Create customer account',\n    loginLabel: 'Sign in',\n    registerHref: 'https://kundenbereich.check24.at/user/register.html',\n  },\n  'en-US': {\n    body: 'Please sign in for the best comparison results.',\n    registerLabel: 'Create customer account',\n    loginLabel: 'Sign in',\n    registerHref: 'https://kundenbereich.check24.at/user/register.html',\n  },\n};\n\nexport function resolveLocale(raw: string | null): LocaleKey {\n  if (raw && raw in table) return raw as LocaleKey;\n  return 'de-DE';\n}\n\nexport function getCopy(locale: LocaleKey): LoginWidgetCopy {\n  return table[locale];\n}\n","/**\n * Lokal/Dev — gleiche Idee wie reviews/comparisons: nicht nur localhost,\n * damit Docker (host.docker.internal) und LAN-IPs den Harness (/client, /skeleton) erkennen.\n */\nfunction isHarnessHost(hostname: string): boolean {\n  if (\n    hostname === \"localhost\" ||\n    hostname === \"[::1]\" ||\n    hostname === \"::1\" ||\n    hostname === \"127.0.0.1\" ||\n    hostname.startsWith(\"127.\") ||\n    hostname === \"host.docker.internal\"\n  ) {\n    return true;\n  }\n  if (/^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname)) {\n    return true;\n  }\n  if (/^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname)) {\n    return true;\n  }\n  return /^172\\.(1[6-9]|2\\d|3[01])\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname);\n}\n\n/** Widget-Pipeline: `http://127.0.0.1:<port>/client` (auch `/pkg/client` im Multi-Dev-Hub). */\nexport function isLayoutCheckHarness(): boolean {\n  if (typeof window === \"undefined\") return false;\n  const { hostname, pathname } = window.location;\n  if (!isHarnessHost(hostname)) return false;\n  const p = pathname.endsWith(\"/\") && pathname.length > 1 ? pathname.slice(0, -1) : pathname;\n  return p === \"/client\" || p.endsWith(\"/client\");\n}\n\n/** Layout-Check `/skeleton`: gleiche Shell wie `/client` (CE + Shadow), damit Root-Maße übereinstimmen. */\nexport function isSkeletonHarnessRoute(): boolean {\n  if (typeof window === \"undefined\") return false;\n  const { hostname, pathname } = window.location;\n  if (!isHarnessHost(hostname)) return false;\n  const p = pathname.endsWith(\"/\") && pathname.length > 1 ? pathname.slice(0, -1) : pathname;\n  return p === \"/skeleton\" || p.endsWith(\"/skeleton\");\n}\n","export interface LoginBridgeAttrs {\n  deviceOutput: string;\n  productSlug: string;\n}\n\n/**\n * Opens unified login — uses host globals when present (CHECK24 / C24App).\n * Lazy-loaded chunk to keep initial client bundle small.\n */\nexport function openLogin(attrs: LoginBridgeAttrs): void {\n  const w = window as Window &\n    typeof globalThis & {\n      Check24?: { login?: { open?: () => void } };\n      C24App?: {\n        triggerUnifiedLoginWithOptions?: (opts: {\n          configurationType: string;\n          email: null;\n          custom_param: null;\n          productSSO: string;\n        }) => void;\n      };\n    };\n\n  const { deviceOutput, productSlug } = attrs;\n  const isApp = deviceOutput === 'app' || deviceOutput === 'tabletapp';\n\n  if (isApp && typeof w.C24App?.triggerUnifiedLoginWithOptions === 'function') {\n    w.C24App.triggerUnifiedLoginWithOptions({\n      configurationType: 'default',\n      email: null,\n      custom_param: null,\n      productSSO: productSlug || 'core',\n    });\n    return;\n  }\n\n  w.Check24?.login?.open?.();\n}\n\nexport function openRegister(attrs: LoginBridgeAttrs): void {\n  const w = window as Window &\n    typeof globalThis & {\n      C24App?: {\n        triggerUnifiedLoginWithOptions?: (opts: {\n          configurationType: string;\n          email: null;\n          custom_param: null;\n          productSSO: string;\n        }) => void;\n      };\n    };\n\n  const { deviceOutput, productSlug } = attrs;\n  const isApp = deviceOutput === 'app' || deviceOutput === 'tabletapp';\n\n  if (isApp && typeof w.C24App?.triggerUnifiedLoginWithOptions === 'function') {\n    w.C24App.triggerUnifiedLoginWithOptions({\n      configurationType: 'default',\n      email: null,\n      custom_param: null,\n      productSSO: productSlug || 'core',\n    });\n  }\n}\n","import brandSpacer from \"./assets/brand-spacer.png\";\nimport {\n  LOGIN_SKELETON_HARNESS_HOST_STYLE,\n  LOGIN_SKELETON_HTML,\n  LOGIN_SKELETON_STYLE,\n} from \"./login-skeleton\";\nimport { buildShadowCss } from \"./shadow-css\";\nimport { getCopy, resolveLocale } from \"./strings\";\nimport { isLayoutCheckHarness, isSkeletonHarnessRoute } from \"./widget/harness\";\n\nconst SKELETON_SELECTOR = \".c24-lp-login-skeleton\";\nconst SLOT_MARKER = \"data-c24-lp-login-slot\";\nconst SHADOW_STYLES = buildShadowCss();\n\ninterface HostAttrs {\n  productSlug: string;\n  deviceOutput: string;\n  language: string;\n  platform: string;\n  env: string;\n  ssoEnv: string;\n}\n\nfunction readAttrs(el: HTMLElement): HostAttrs {\n  return {\n    productSlug: el.getAttribute(\"product-slug\") ?? \"\",\n    deviceOutput: (el.getAttribute(\"deviceoutput\") ?? \"desktop\").toLowerCase(),\n    language: el.getAttribute(\"language\") ?? \"de-DE\",\n    platform: el.getAttribute(\"platform\") ?? \"web\",\n    env: el.getAttribute(\"env\") ?? \"\",\n    ssoEnv: el.getAttribute(\"sso-env\") ?? \"\",\n  };\n}\n\nclass C24LpLoginWidget extends HTMLElement {\n  #root?: ShadowRoot;\n  #styleEl?: HTMLStyleElement;\n  #mount?: HTMLDivElement;\n  #abort?: AbortController;\n\n  static get observedAttributes(): string[] {\n    return [\"product-slug\", \"deviceoutput\", \"language\", \"platform\", \"env\", \"sso-env\"];\n  }\n\n  connectedCallback(): void {\n    this.#abort?.abort();\n    this.#abort = new AbortController();\n    const signal = this.#abort.signal;\n\n    if (!this.#root) {\n      const shadow = this.attachShadow({ mode: \"closed\" });\n      this.#root = shadow;\n    }\n\n    if (isLayoutCheckHarness() || isSkeletonHarnessRoute()) {\n      this.setAttribute(\"data-lp-login-layout-check\", \"\");\n      this.#styleEl = undefined;\n      this.#mount = undefined;\n      this.#root.innerHTML = `<style>${LOGIN_SKELETON_STYLE}\\n${LOGIN_SKELETON_HARNESS_HOST_STYLE}</style>${LOGIN_SKELETON_HTML}`;\n      return;\n    }\n\n    this.removeAttribute(\"data-lp-login-layout-check\");\n\n    if (!this.#mount || !this.#styleEl) {\n      this.#root.innerHTML = \"\";\n      this.#styleEl = document.createElement(\"style\");\n      this.#styleEl.textContent = SHADOW_STYLES;\n      this.#root.appendChild(this.#styleEl);\n      this.#mount = document.createElement(\"div\");\n      this.#mount.className = \"lw-root\";\n      this.#root.appendChild(this.#mount);\n    }\n\n    void this.#render(signal);\n  }\n\n  disconnectedCallback(): void {\n    this.#abort?.abort();\n  }\n\n  attributeChangedCallback(): void {\n    if (isLayoutCheckHarness() || isSkeletonHarnessRoute()) return;\n    if (!this.#mount || !this.isConnected) return;\n    this.#abort?.abort();\n    this.#abort = new AbortController();\n    void this.#render(this.#abort.signal);\n  }\n\n  async #render(signal: AbortSignal): Promise<void> {\n    const mount = this.#mount;\n    if (!mount) return;\n\n    const { openLogin, openRegister } = await import(\"./login-bridge\");\n\n    if (signal.aborted) return;\n\n    const attrs = readAttrs(this);\n    const locale = resolveLocale(attrs.language);\n    const copy = getCopy(locale);\n\n    const brandUrl = new URL(brandSpacer, import.meta.url).href;\n\n    const sections: { type: \"text\"; text: string }[] = [{ type: \"text\", text: copy.body }];\n\n    const actions: { tag: \"a\" | \"button\"; label: string; href?: string; action: \"register\" | \"login\" }[] =\n      [\n        { tag: \"a\", label: copy.registerLabel, href: copy.registerHref, action: \"register\" },\n        { tag: \"button\", label: copy.loginLabel, action: \"login\" },\n      ];\n\n    const bodyHtml = sections\n      .map((s) => (s.type === \"text\" ? `<p class=\"lw-body\">${escapeHtml(s.text)}</p>` : \"\"))\n      .join(\"\");\n\n    const actionsHtml = actions\n      .map((a) => {\n        if (a.tag === \"a\") {\n          return `<a class=\"lw-register\" href=\"${escapeHtml(a.href ?? \"#\")}\" data-action=\"${a.action}\">${escapeHtml(a.label)}</a>`;\n        }\n        return `<button type=\"button\" class=\"lw-login\" data-action=\"${a.action}\">${escapeHtml(a.label)}</button>`;\n      })\n      .join(\"\");\n\n    mount.innerHTML = `\n      <div class=\"lw-brand-spacer\" aria-hidden=\"true\">\n        <img src=\"${escapeHtml(brandUrl)}\" width=\"1\" height=\"1\" alt=\"\" decoding=\"async\" />\n      </div>\n      <div class=\"lw-card\" data-platform=\"${escapeHtml(attrs.platform)}\" data-env=\"${escapeHtml(attrs.env)}\" data-sso-env=\"${escapeHtml(attrs.ssoEnv)}\">\n        ${bodyHtml}\n        <div class=\"lw-actions\">\n          ${actionsHtml}\n        </div>\n      </div>\n    `;\n\n    const bridgeAttrs = { deviceOutput: attrs.deviceOutput, productSlug: attrs.productSlug };\n\n    mount.querySelector('[data-action=\"login\"]')?.addEventListener(\"click\", () => {\n      openLogin(bridgeAttrs);\n    });\n\n    const reg = mount.querySelector<HTMLAnchorElement>('[data-action=\"register\"]');\n    reg?.addEventListener(\"click\", (e) => {\n      if (bridgeAttrs.deviceOutput === \"app\" || bridgeAttrs.deviceOutput === \"tabletapp\") {\n        e.preventDefault();\n        openRegister(bridgeAttrs);\n      }\n    });\n  }\n}\n\nfunction escapeHtml(s: string): string {\n  return s\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\");\n}\n\n// String-Literal im `define` — SlugTagMatchStep (Pipeline) parst `customElements.define('…', …)`.\nif (!customElements.get(\"check24-lp-widget-login-at-v2\")) {\n  customElements.define(\"check24-lp-widget-login-at-v2\", C24LpLoginWidget);\n}\n\n/**\n * SSR skeleton lives in the light DOM; swap it for the custom element when the bundle loads\n * (same idea as dsl-teaser-vanilla `replaceSkeletonWithComponent`).\n */\nfunction replaceSkeletonWithComponent(): void {\n  document.querySelectorAll(SKELETON_SELECTOR).forEach((el) => {\n    if (el.closest(\"check24-lp-widget-login-at-v2\")) return;\n    if (!el.parentElement) return;\n    const wrapper = el.closest(`[${SLOT_MARKER}]`) ?? el;\n    const replacement = document.createElement(\"check24-lp-widget-login-at-v2\");\n    if (wrapper instanceof HTMLElement) {\n      for (const { name, value } of Array.from(wrapper.attributes)) {\n        if (name === SLOT_MARKER) continue;\n        if (name.startsWith(\"data-\")) {\n          replacement.setAttribute(name.slice(\"data-\".length), value);\n        }\n      }\n    }\n    wrapper.replaceWith(replacement);\n  });\n}\n\nif (typeof document !== \"undefined\") {\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", replaceSkeletonWithComponent);\n  } else {\n    replaceSkeletonWithComponent();\n  }\n}\n\nexport { C24LpLoginWidget };\n"],"file":"client.mjs"}