{"version":3,"file":"client.mjs","sources":["../app/assets/teaser_moebel_discount_chip.webp","../app/shared/constants.ts","../app/client/core/cta-url.ts","../app/client/core/host-normalization.ts","../app/shared/device-selectors.ts","../app/client/styles/core.ts","../app/client/styles/handheld-wide.ts","../app/client/styles/mobile.ts","../app/shared/chip-position.ts","../app/client/styles/tablet.ts","../app/client/moebel-teaser.shadow-styles.ts","../app/client/moebel-teaser.client.ts"],"sourcesContent":["export default \"data:image/webp;base64,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\"","import type {Language} from \"../../.check24-home/types/check24\";\n\n/**\n * Default product slug (background slide key). Used by skeleton CSS, hook selectors,\n * and Vanilla Home background slides (`data-wc-slide-id` per platform docs).\n */\nexport const DEFAULT_PRODUCT_SLUG = \"shofur\";\n\n/** Natural size of `teaser_moebel_discount_chip.webp` (pixels) for `<img width=\"…\" height=\"…\">`. */\nexport const DISCOUNT_CHIP_INTRINSIC_WIDTH = 400;\nexport const DISCOUNT_CHIP_INTRINSIC_HEIGHT = 249;\n\n/**\n * Mobile flex `column-gap` between headline and discount chip (client + skeleton).\n * Headline `max-width` reserves chip width + this gap — change only here.\n */\nexport const MOBILE_TEASER_COLUMN_GAP_PX = 40;\n\n/** Discount chip CSS width on mobile (≤ 768px). */\nexport const MOBILE_TEASER_CHIP_WIDTH_PX = 100;\n\n/** Discount chip CSS width on very narrow viewports (≤ 260px). */\nexport const MOBILE_TEASER_CHIP_WIDTH_COMPACT_PX = 82;\n\n/**\n * From this viewport width upward (within the ≤ 768px mobile band), the two headline lines render\n * centered with the discount chip stacked below them instead of beside them.\n * Below this width the headline wraps further and the chip sits beside it.\n */\nexport const MOBILE_TEASER_STACKED_MIN_WIDTH_PX = 360;\n\n/** Vertical gap between the headline and the chip once the chip is stacked below it. */\nexport const MOBILE_TEASER_STACKED_ROW_GAP_PX = 8;\n\n/**\n * Upper bound of the smaller-chip band (960–1139). Below 1140 the desktop chip, anchored at\n * {@link DESKTOP_CHIP_RIGHT}, would overlap the long headline.\n */\nexport const TABLET_BAND_MAX_WIDTH_PX = 1139;\n\n/*\n * Text and CTA metrics follow the Home teaser specification (headline top 50px from 960px,\n * subline 18px with 16px margin, CTA bottom 60px). Chip placement is measured from the Figma\n * 1920px frame (960px and up) and 769px frame (769–959). Positions are relative to the teaser top.\n */\n\n/** Discount chip CSS width on desktop (> {@link TABLET_BAND_MAX_WIDTH_PX}). */\nexport const DESKTOP_CHIP_WIDTH_PX = 220;\n\n/** Desktop chip `top`. */\nexport const DESKTOP_CHIP_TOP_PX = 17;\n\n/** Discount chip CSS width on the mid band (960–{@link TABLET_BAND_MAX_WIDTH_PX}). */\nexport const TABLET_BAND_CHIP_WIDTH_PX = 165;\n\n/** Desktop / mid chip `right` anchoring: right chip edge 602px right of the teaser center. */\nexport const DESKTOP_CHIP_RIGHT = \"max(20px, calc(50% - 602px))\";\n\n/** Desktop text block offset from the teaser top (headline or grouped text-block). */\nexport const DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX = 50;\n\n/** Desktop headline `line-height` (paired with `font-size: 30px`). */\nexport const DESKTOP_HEADLINE_LINE_HEIGHT_PX = 40;\n\n/** Gap between desktop headline and subline (`margin-top` on subline). */\nexport const DESKTOP_SUBLINE_MARGIN_TOP_PX = 16;\n\n/** Desktop subline height (`font-size` with `line-height: 1`). */\nexport const DESKTOP_SUBLINE_LINE_HEIGHT_PX = 18;\n\n/** Distance between the yellow CTA box and the teaser bottom (960px and up). */\nexport const DESKTOP_CTA_BOTTOM_PX = 60;\n\n/** Tablet text metrics (769–959); the spec fixes the headline top only from 960px. */\nexport const TABLET_TEXT_BLOCK_MARGIN_TOP_PX = 24;\nexport const TABLET_HEADLINE_LINE_HEIGHT_PX = DESKTOP_HEADLINE_LINE_HEIGHT_PX;\nexport const TABLET_SUBLINE_MARGIN_TOP_PX = DESKTOP_SUBLINE_MARGIN_TOP_PX;\nexport const TABLET_SUBLINE_LINE_HEIGHT_PX = DESKTOP_SUBLINE_LINE_HEIGHT_PX;\n\n/**\n * 769–959: the headline spans almost the full width, so the chip sits below it, to the right of\n * the centered subline instead of being centered on the text block.\n */\nexport const TABLET_NARROW_CHIP_TOP = `${TABLET_TEXT_BLOCK_MARGIN_TOP_PX + TABLET_HEADLINE_LINE_HEIGHT_PX + 6}px`;\n\n/** Left chip edge 157px right of the teaser center. */\nexport const TABLET_NARROW_CHIP_LEFT = \"calc(50% + 157px)\";\n\n/** Discount chip CSS width on 769–959. */\nexport const TABLET_NARROW_CHIP_WIDTH_PX = 154;\n\n/**\n * Optical upward nudge when centering the chip on headline+subline (960px and up).\n * Compensates for how the red badge reads vs. the full SVG box.\n */\nexport const CHIP_TEXT_OPTICAL_NUDGE_WIDE_PX = 1;\n\n/** Headline / shimmer max-width: viewport minus chip and {@link MOBILE_TEASER_COLUMN_GAP_PX}. */\nexport function mobileHeadlineMaxWidth(chipWidthPx: number = MOBILE_TEASER_CHIP_WIDTH_PX): string {\n    return `min(100%, calc(100% - ${chipWidthPx}px - ${MOBILE_TEASER_COLUMN_GAP_PX}px))`;\n}\n\n/** Placeholder in server skeleton HTML; replaced in preview and by the host if needed. */\nexport const MOEBEL_CTA_URL_PLACEHOLDER = \"__C24_MOEBEL_CTA_URL__\";\n\n/**\n * Default desktop slide crop (`background-size: cover`).\n */\nexport const DESKTOP_BACKGROUND_POSITION = \"center\";\n\n/**\n * Narrow desktop band crop when the host viewport is at most\n * {@link TABLET_BACKGROUND_POSITION_MAX_WIDTH_PX}.\n */\nexport const TABLET_BACKGROUND_POSITION = \"88% 50%\";\n\n/** From this viewport width downward (desktop slide), use {@link TABLET_BACKGROUND_POSITION}. */\nexport const TABLET_BACKGROUND_POSITION_MAX_WIDTH_PX = 1160;\n\n/**\n * Mobile slide crop for `background-size: cover` (teaser_moebel_mobile.webp is 960x1440px; the\n * plain blue wall ends at 540px of it). The slide is 480px tall and as wide as the viewport, so the\n * image scales with the viewport width (100vw / 960px) and the wall ends at 56.25vw.\n * Narrow phones show the image from the top; wider ones shift it up just enough that the wall\n * still ends 255px below the page top, so header, headline and chip stay on the blue wall and the\n * sofa starts right below the chip.\n */\nexport const MOBILE_BACKGROUND_POSITION = \"center min(0px, calc(255px - 56.25vw))\";\n\nexport interface TeaserStrings {\n    headlineDesktop: string;\n    headlineMobileLines: string[];\n    sublineDesktop: string;\n    ctaText: string;\n    ctaPill: string;\n}\n\nconst GERMAN_TEASER_STRINGS: TeaserStrings = {\n    headlineDesktop: `Internet-Bestpreis-Garantie für Möbel`,\n    headlineMobileLines: [\"Internet-Bestpreis-\", \"Garantie für Möbel\"],\n    sublineDesktop: `Nur bis 11.10. – nur in der App`,\n    ctaText: \"Über 1 Million Produkte\",\n    ctaPill: \"Angebote entdecken\",\n};\n\nconst ENGLISH_TEASER_STRINGS: TeaserStrings = {\n    headlineDesktop: `Internet Best Price Guarantee for Furniture`,\n    headlineMobileLines: [\"Internet Best Price\", \"Guarantee for Furniture\"],\n    sublineDesktop: `Only until October 11th – only in the app`,\n    ctaText: \"Over 1 million products\",\n    ctaPill: \"Discover offers\",\n};\n\nconst TEASER_DICTIONARY: Record<Language, TeaserStrings> = {\n    \"de-DE\": GERMAN_TEASER_STRINGS,\n    \"de-AT\": GERMAN_TEASER_STRINGS,\n    \"en-GB\": ENGLISH_TEASER_STRINGS,\n    \"en-US\": ENGLISH_TEASER_STRINGS,\n    \"es-ES\": ENGLISH_TEASER_STRINGS,\n};\n\nexport function getTeaserStrings(language: Language): TeaserStrings {\n    return TEASER_DICTIONARY[language];\n}\n","const PROD_DOMAIN = \"moebel.check24.de\";\nconst NON_PROD_DOMAIN = \"moebel.check24-test.de\";\nconst CTA_URL_TEMPLATE = \"https://{DOMAIN}/ul/?tid=CH24_extradiscount_Teaser_Web\";\n\nexport function isNonProdEnv(env: string): boolean {\n    return [\"dev\", \"int\", \"test\"].includes(env);\n}\n\nexport function buildMoebelCtaUrl(env: string): string {\n    const domain = isNonProdEnv(env) ? NON_PROD_DOMAIN : PROD_DOMAIN;\n    return CTA_URL_TEMPLATE.replace(\"{DOMAIN}\", domain);\n}\n","import type {Language} from \"../../../.check24-home/types/check24\";\n\nconst LANGUAGES: readonly Language[] = [\"de-DE\", \"en-GB\", \"en-US\", \"de-AT\", \"es-ES\"];\n\nexport function normalizeLanguage(value: string | undefined): Language {\n    if (value && (LANGUAGES as readonly string[]).includes(value)) {\n        return value as Language;\n    }\n\n    return \"de-DE\";\n}\n\nexport type NormalizedDeviceOutput = \"desktop\" | \"mobile\" | \"tabletapp\" | \"app\";\n\nexport function normalizeDeviceOutput(value: string | undefined): NormalizedDeviceOutput {\n    if (value === \"mobile\" || value === \"tabletapp\" || value === \"app\") {\n        return value;\n    }\n\n    return \"desktop\";\n}\n","/**\n * Handheld `deviceoutput` / `data-deviceoutput` attribute selectors.\n * Used by skeleton (light DOM) and shadow styles to keep host matching in sync.\n */\nexport const HANDHELD_DEVICE_ATTRS = [\n    '[data-deviceoutput=\"mobile\"]',\n    '[data-deviceoutput=\"tabletapp\"]',\n    '[data-deviceoutput=\"app\"]',\n    '[deviceoutput=\"mobile\"]',\n    '[deviceoutput=\"tabletapp\"]',\n    '[deviceoutput=\"app\"]',\n] as const;\n\n/** `:not([…])` chain — exclude handheld deviceoutputs (desktop product layout). */\nexport const NOT_HANDHELD = HANDHELD_DEVICE_ATTRS.map((attr) => `:not(${attr})`).join(\"\");\n\n/** Light DOM: `.root[attr], …` — handheld roots only. */\nexport function serverHandheldRoot(rootClass: string): string {\n    return HANDHELD_DEVICE_ATTRS.map((attr) => `.${rootClass}${attr}`).join(\",\\n  \");\n}\n\n/** Light DOM: `.root[attr] ${descendant}, …` */\nexport function serverHandheld(rootClass: string, descendant: string): string {\n    return HANDHELD_DEVICE_ATTRS.map((attr) => `.${rootClass}${attr} ${descendant}`).join(\",\\n  \");\n}\n\n/** Light DOM: `.root:not(…):not(…) ${descendant}` */\nexport function serverNotHandheld(rootClass: string, descendant: string): string {\n    return `.${rootClass}${NOT_HANDHELD} ${descendant}`;\n}\n\n/** Shadow: `:host([attr]), …` — handheld hosts only. */\nexport function shadowHandheldHost(): string {\n    return HANDHELD_DEVICE_ATTRS.map((attr) => `:host(${attr})`).join(\",\\n  \");\n}\n\n/** Shadow: `:host([attr]) ${descendant}, …` */\nexport function shadowHandheld(descendant: string): string {\n    return HANDHELD_DEVICE_ATTRS.map((attr) => `:host(${attr}) ${descendant}`).join(\",\\n  \");\n}\n\n/** Shadow: `:host(:not(…):not(…)) ${descendant}` */\nexport function shadowNotHandheld(descendant: string): string {\n    return `:host(${NOT_HANDHELD}) ${descendant}`;\n}\n","import {\n    DESKTOP_CHIP_RIGHT,\n    DESKTOP_CHIP_TOP_PX,\n    DESKTOP_CHIP_WIDTH_PX,\n    DESKTOP_CTA_BOTTOM_PX,\n    DESKTOP_HEADLINE_LINE_HEIGHT_PX,\n    DESKTOP_SUBLINE_LINE_HEIGHT_PX,\n    DESKTOP_SUBLINE_MARGIN_TOP_PX,\n    DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX,\n    DISCOUNT_CHIP_INTRINSIC_HEIGHT,\n    DISCOUNT_CHIP_INTRINSIC_WIDTH,\n} from \"../../shared/constants.js\";\nimport {shadowHandheld} from \"../../shared/device-selectors.js\";\n\nexport function buildShadowCoreStyles(): string {\n    const handheldYellowBox = shadowHandheld(\".c24-yellow-box\");\n\n    return `\n:host {\n  display: block;\n  box-sizing: border-box;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n  height: 360px;\n  position: relative;\n  background: transparent;\n  font-family: Inter, sans-serif;\n  visibility: visible;\n}\n\n.teaser-container {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  max-width: 960px;\n  margin: 0 auto;\n  padding: 0;\n  text-align: center;\n}\n\n.teaser-text-block {\n  display: contents;\n}\n\n.c24-teaser-headline {\n  font-size: 30px;\n  font-weight: 700;\n  color: #FFF;\n  line-height: ${DESKTOP_HEADLINE_LINE_HEIGHT_PX}px;\n  margin: ${DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX}px 30px 0;\n  hyphens: none;\n  -webkit-hyphens: none;\n}\n\n.c24-teaser-headline__mobile {\n  display: none;\n}\n\n.c24-teaser-subline {\n  font-size: ${DESKTOP_SUBLINE_LINE_HEIGHT_PX}px;\n  font-weight: normal;\n  color: #FFF;\n  line-height: 1;\n  margin: ${DESKTOP_SUBLINE_MARGIN_TOP_PX}px 30px 0;\n  letter-spacing: -0.32px;\n  hyphens: none;\n  -webkit-hyphens: none;\n}\n\n.c24-yellow-box {\n  display: inline-flex;\n  position: absolute;\n  bottom: ${DESKTOP_CTA_BOTTOM_PX}px;\n  align-items: center;\n  justify-content: space-between;\n  height: 64px;\n  width: fit-content;\n  margin: 0 auto;\n  padding: 4px 6px 4px 32px;\n  border: 3px solid #FFBB1C;\n  border-radius: 32px;\n  background: #FFFFFF;\n  color: #181818;\n  font-size: 16px;\n  font-weight: normal;\n  cursor: default;\n  white-space: nowrap;\n  transition: border-color 0.2s ease;\n  gap: 30px;\n  box-sizing: border-box;\n  min-width: 496px;\n}\n\n.c24-yellow-box-2-columns {\n  display: grid;\n  grid-template-columns: repeat(2, auto);\n  width: 100%;\n  height: 100%;\n  justify-content: space-between;\n}\n\n.c24-yellow-text-box-wrapper {\n  font-size: 14px;\n  line-height: 20px;\n  box-sizing: border-box;\n  border-radius: 3px;\n  border: none;\n  outline: none;\n  display: flex;\n  place-items: center;\n}\n\n.c24-yellow-text-box-wrapper:not(:last-child) {\n  margin-right: 30px;\n}\n\n.c24-yellow-box-text {\n  font-size: 16px;\n  padding-left: 10px;\n  flex: 0 0 auto;\n  cursor: default;\n  user-select: none;\n}\n\n.c24-yellow-box-button-link {\n  line-height: 22px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  padding: 13px 30px;\n  border-radius: 90px;\n  background: #0563C1;\n  color: #ffffff;\n  font-size: 16px;\n  font-weight: 400;\n  white-space: nowrap;\n  flex-shrink: 0;\n  transition: background 0.2s ease;\n  min-width: 164.468px;\n  text-decoration: none;\n  box-sizing: border-box;\n  cursor: pointer;\n}\n\n.c24-yellow-box:hover {\n  background: #FFFFFF;\n  border-color: #FFBB1C;\n}\n\n.c24-yellow-box:hover .c24-yellow-box-button-link {\n  background: #064E9C;\n}\n\n.c24-yellow-box:active {\n  background: #FFFFFF;\n  border-color: #FFBB1C;\n}\n\n.c24-yellow-box:active .c24-yellow-box-button-link {\n  background: #064E9C;\n}\n\n.teaser-discount-chip {\n  position: absolute;\n  top: ${DESKTOP_CHIP_TOP_PX}px;\n  right: ${DESKTOP_CHIP_RIGHT};\n  width: ${DESKTOP_CHIP_WIDTH_PX}px;\n  height: auto;\n  aspect-ratio: ${DISCOUNT_CHIP_INTRINSIC_WIDTH} / ${DISCOUNT_CHIP_INTRINSIC_HEIGHT};\n  object-fit: contain;\n  pointer-events: none;\n}\n\n.teaser-link {\n  position: absolute;\n  inset: 0;\n  display: none;\n  text-decoration: none;\n}\n\n@media (max-width: 959px) {\n  .teaser-link {\n    display: block;\n    cursor: pointer;\n  }\n\n  .c24-yellow-box {\n    display: none;\n  }\n}\n\n${handheldYellowBox} {\n  display: none;\n}\n`.trim();\n}\n","import {MOBILE_TEASER_CHIP_WIDTH_PX, MOBILE_TEASER_COLUMN_GAP_PX, mobileHeadlineMaxWidth} from \"../../shared/constants.js\";\nimport {shadowHandheld, shadowHandheldHost} from \"../../shared/device-selectors.js\";\n\nexport function buildShadowHandheldWideStyles(): string {\n    const headlineMaxWidth = mobileHeadlineMaxWidth();\n    const host = shadowHandheldHost();\n    const container = shadowHandheld(\".teaser-container\");\n    const chip = shadowHandheld(\".teaser-discount-chip\");\n    const headline = shadowHandheld(\".c24-teaser-headline\");\n    const headlineDesktop = shadowHandheld(\".c24-teaser-headline__desktop\");\n    const headlineMobile = shadowHandheld(\".c24-teaser-headline__mobile\");\n    const headlineMobileLine = shadowHandheld(\".c24-teaser-headline__mobile-line\");\n    const subline = shadowHandheld(\".c24-teaser-subline\");\n\n    return `\n/*\n * Narrow-viewport layout is normally driven only by @media (max-width: 768px) so LayoutCheck\n * matches the server skeleton. When the host still reports a handheld deviceoutput while the\n * viewport is wide (e.g. preview iframes), apply the same headline/subline switching.\n */\n@media (min-width: 769px) {\n  ${host} {\n    height: 230px;\n    font-family: Inter, sans-serif;\n  }\n\n  /*\n   * Handheld deviceoutput on a wide viewport: same layout as max-width 768 (LayoutCheck / skeleton).\n   */\n  ${container} {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    align-items: center;\n    text-align: center;\n    justify-content: center;\n    box-sizing: border-box;\n    padding-inline: clamp(1rem, 4vw, 1.5rem);\n    padding-block: 1rem;\n    column-gap: ${MOBILE_TEASER_COLUMN_GAP_PX}px;\n    row-gap: 0;\n  }\n\n  ${chip} {\n    position: static;\n    order: -1;\n    flex: 0 0 auto;\n    width: ${MOBILE_TEASER_CHIP_WIDTH_PX}px;\n    margin: 0;\n    top: auto;\n    right: auto;\n  }\n\n  ${headline} {\n    flex: 0 1 auto;\n    min-width: 0;\n    max-width: ${headlineMaxWidth};\n    margin: 0;\n    font-size: 20px;\n    line-height: 26px;\n  }\n\n  ${headlineDesktop} {\n    display: none;\n  }\n\n  ${headlineMobile} {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    align-self: flex-start;\n    gap: 0;\n    width: 100%;\n  }\n\n  ${headlineMobileLine} {\n    display: block;\n    font-size: inherit;\n    line-height: 26px;\n    min-height: 26px;\n  }\n\n  ${subline} {\n    display: none;\n  }\n}\n`.trim();\n}\n","import {\n    MOBILE_TEASER_CHIP_WIDTH_COMPACT_PX,\n    MOBILE_TEASER_CHIP_WIDTH_PX,\n    MOBILE_TEASER_COLUMN_GAP_PX,\n    MOBILE_TEASER_STACKED_MIN_WIDTH_PX,\n    MOBILE_TEASER_STACKED_ROW_GAP_PX,\n    mobileHeadlineMaxWidth,\n} from \"../../shared/constants.js\";\n\nexport function buildShadowMobileStyles(): string {\n    const headlineMaxWidth = mobileHeadlineMaxWidth();\n    const headlineMaxWidthCompact = mobileHeadlineMaxWidth(MOBILE_TEASER_CHIP_WIDTH_COMPACT_PX);\n\n    return `\n@media (max-width: 768px) {\n  :host {\n    height: 230px;\n    font-family: Inter, sans-serif;\n  }\n\n  /*\n   * Mobile: two-line headline (c24-teaser-headline__mobile-line) + chip; no subline.\n   */\n  .teaser-container {\n    flex-direction: row;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: center;\n    text-align: start;\n    box-sizing: border-box;\n    padding-inline: clamp(1rem, 4vw, 1.5rem);\n    padding-block: 1rem;\n    column-gap: ${MOBILE_TEASER_COLUMN_GAP_PX}px;\n    row-gap: 0;\n  }\n\n  .teaser-discount-chip {\n    position: static;\n    flex: 0 0 auto;\n    align-self: center;\n    width: ${MOBILE_TEASER_CHIP_WIDTH_PX}px;\n    top: auto;\n    right: auto;\n  }\n\n  .c24-teaser-headline {\n    flex: 0 1 auto;\n    min-width: 0;\n    max-width: ${headlineMaxWidth};\n    margin: 0;\n    font-size: 20px;\n    line-height: 26px;\n  }\n\n  .c24-teaser-headline__desktop {\n    display: none;\n  }\n\n  .c24-teaser-headline__mobile {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    align-self: flex-start;\n    gap: 0;\n    width: 100%;\n  }\n\n  .c24-teaser-headline__mobile-line {\n    display: block;\n    font-size: inherit;\n    line-height: 26px;\n    min-height: 26px;\n  }\n\n  /* Mobile layout has no subline (desktop-only copy). */\n  .c24-teaser-subline {\n    display: none;\n  }\n}\n\n/*\n * From ${MOBILE_TEASER_STACKED_MIN_WIDTH_PX}px: two centered headline lines, chip stacked\n * below them (both centered) instead of the headline + chip-beside layout above.\n */\n@media (min-width: ${MOBILE_TEASER_STACKED_MIN_WIDTH_PX}px) and (max-width: 768px) {\n  .teaser-container {\n    flex-direction: column;\n    text-align: center;\n    row-gap: ${MOBILE_TEASER_STACKED_ROW_GAP_PX}px;\n  }\n\n  .c24-teaser-headline {\n    max-width: 100%;\n  }\n\n  .c24-teaser-headline__mobile {\n    align-items: center;\n  }\n}\n\n/* Compact layout for very narrow viewports (≤ 260px) */\n@media (max-width: 260px) {\n  .teaser-discount-chip {\n    width: ${MOBILE_TEASER_CHIP_WIDTH_COMPACT_PX}px;\n  }\n\n  .c24-teaser-headline {\n    font-size: 17px;\n    max-width: ${headlineMaxWidthCompact};\n  }\n}\n`.trim();\n}\n","import {\n    DESKTOP_HEADLINE_LINE_HEIGHT_PX,\n    DESKTOP_SUBLINE_LINE_HEIGHT_PX,\n    DESKTOP_SUBLINE_MARGIN_TOP_PX,\n    DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX,\n    DISCOUNT_CHIP_INTRINSIC_HEIGHT,\n    DISCOUNT_CHIP_INTRINSIC_WIDTH,\n    TABLET_BAND_CHIP_WIDTH_PX,\n} from \"./constants.js\";\n\nexport interface ChipTextAlignMetrics {\n    textBlockMarginTopPx: number;\n    headlineLineHeightPx: number;\n    sublineMarginTopPx: number;\n    sublineLineHeightPx: number;\n}\n\n/**\n * CSS length for the rendered chip height at {@link chipWidthPx}\n * (`width` × intrinsic aspect ratio).\n */\nexport function discountChipCssHeight(chipWidthPx: number): string {\n    return `(${chipWidthPx}px * ${DISCOUNT_CHIP_INTRINSIC_HEIGHT} / ${DISCOUNT_CHIP_INTRINSIC_WIDTH})`;\n}\n\n/**\n * Shared `top` calc: chip vertical center on a headline+subline block, minus an optical nudge.\n */\nfunction chipTopCenteredOnTextBlock(chipWidthPx: number, opticalNudgePx: number, metrics: ChipTextAlignMetrics): string {\n    const textBlockHeightPx = metrics.headlineLineHeightPx + metrics.sublineMarginTopPx + metrics.sublineLineHeightPx;\n\n    return (\n        `calc(${metrics.textBlockMarginTopPx}px` +\n        ` + (${textBlockHeightPx}px) / 2` +\n        ` - ${discountChipCssHeight(chipWidthPx)} / 2` +\n        ` - ${opticalNudgePx}px)`\n    );\n}\n\n/** Mid band (960–1139): smaller chip `top` aligned to the desktop text metrics. */\nexport function tabletChipTopCenteredOnText(opticalNudgePx: number): string {\n    return chipTopCenteredOnTextBlock(TABLET_BAND_CHIP_WIDTH_PX, opticalNudgePx, {\n        textBlockMarginTopPx: DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX,\n        headlineLineHeightPx: DESKTOP_HEADLINE_LINE_HEIGHT_PX,\n        sublineMarginTopPx: DESKTOP_SUBLINE_MARGIN_TOP_PX,\n        sublineLineHeightPx: DESKTOP_SUBLINE_LINE_HEIGHT_PX,\n    });\n}\n","import {tabletChipTopCenteredOnText} from \"../../shared/chip-position.js\";\nimport {\n    CHIP_TEXT_OPTICAL_NUDGE_WIDE_PX,\n    DESKTOP_CHIP_RIGHT,\n    DESKTOP_SUBLINE_MARGIN_TOP_PX,\n    DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX,\n    TABLET_BAND_CHIP_WIDTH_PX,\n    TABLET_BAND_MAX_WIDTH_PX,\n    TABLET_NARROW_CHIP_LEFT,\n    TABLET_NARROW_CHIP_TOP,\n    TABLET_NARROW_CHIP_WIDTH_PX,\n    TABLET_SUBLINE_LINE_HEIGHT_PX,\n    TABLET_SUBLINE_MARGIN_TOP_PX,\n    TABLET_TEXT_BLOCK_MARGIN_TOP_PX,\n} from \"../../shared/constants.js\";\nimport {shadowNotHandheld} from \"../../shared/device-selectors.js\";\n\nexport function buildShadowTabletStyles(): string {\n    const textBlock = shadowNotHandheld(\".teaser-text-block\");\n    const headline = shadowNotHandheld(\".c24-teaser-headline\");\n    const subline = shadowNotHandheld(\".c24-teaser-subline\");\n    const chip = shadowNotHandheld(\".teaser-discount-chip\");\n    const container = shadowNotHandheld(\".teaser-container\");\n    const chipTopWide = tabletChipTopCenteredOnText(CHIP_TEXT_OPTICAL_NUDGE_WIDE_PX);\n\n    return `\n/*\n * 960–${TABLET_BAND_MAX_WIDTH_PX}: smaller chip, same right anchoring as desktop, vertically centered\n * to the headline+subline block.\n */\n@media (min-width: 960px) and (max-width: ${TABLET_BAND_MAX_WIDTH_PX}px) {\n  ${textBlock} {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    margin: ${DESKTOP_TEXT_BLOCK_MARGIN_TOP_PX}px 30px 0;\n  }\n\n  ${headline} {\n    margin: 0;\n  }\n\n  ${subline} {\n    margin: ${DESKTOP_SUBLINE_MARGIN_TOP_PX}px 0 0;\n  }\n\n  ${chip} {\n    position: absolute;\n    top: ${chipTopWide};\n    right: ${DESKTOP_CHIP_RIGHT};\n    left: auto;\n    width: ${TABLET_BAND_CHIP_WIDTH_PX}px;\n    max-width: ${TABLET_BAND_CHIP_WIDTH_PX}px;\n    margin: 0;\n    transform: none;\n  }\n}\n\n/*\n * 769–959: column layout — headline+subline block stays horizontally centered\n * (vertical position unchanged); chip sits below the headline, right of the subline.\n * No flex-row. Handheld deviceoutput uses the mobile / handheld-wide blocks instead.\n */\n@media (max-width: 959px) and (min-width: 769px) {\n  ${container} {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: flex-start;\n    min-height: 100%;\n    max-width: 100%;\n    margin: 0 auto;\n    padding: 0 0 16px;\n    box-sizing: border-box;\n  }\n\n  ${textBlock} {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    flex: 0 1 auto;\n    min-width: 0;\n    margin: ${TABLET_TEXT_BLOCK_MARGIN_TOP_PX}px 30px 0;\n  }\n\n  ${headline} {\n    margin: 0;\n    text-align: center;\n  }\n\n  ${subline} {\n    margin: ${TABLET_SUBLINE_MARGIN_TOP_PX}px 0 0;\n    font-size: ${TABLET_SUBLINE_LINE_HEIGHT_PX}px;\n    min-width: 0;\n    text-align: center;\n    width: auto;\n    max-width: none;\n    box-sizing: border-box;\n  }\n\n  ${chip} {\n    position: absolute;\n    top: ${TABLET_NARROW_CHIP_TOP};\n    right: auto;\n    left: ${TABLET_NARROW_CHIP_LEFT};\n    width: ${TABLET_NARROW_CHIP_WIDTH_PX}px;\n    max-width: ${TABLET_NARROW_CHIP_WIDTH_PX}px;\n    height: auto;\n    margin: 0;\n    transform: none;\n  }\n}\n`.trim();\n}\n","import {buildShadowCoreStyles} from \"./styles/core.js\";\nimport {buildShadowHandheldWideStyles} from \"./styles/handheld-wide.js\";\nimport {buildShadowMobileStyles} from \"./styles/mobile.js\";\nimport {buildShadowTabletStyles} from \"./styles/tablet.js\";\n\n/**\n * Shadow-only styles for the Möbel teaser (no innerHTML for the stylesheet).\n */\nexport const MOEBEL_TEASER_SHADOW_STYLES = [\n    buildShadowCoreStyles(),\n    buildShadowTabletStyles(),\n    buildShadowMobileStyles(),\n    buildShadowHandheldWideStyles(),\n].join(\"\\n\\n\");\n","import type {HomeClientComponent, HomeClientComponentElement, HomeClientComponentProps} from \"../../.check24-home/types/client\";\nimport discountChipImage from \"../assets/teaser_moebel_discount_chip.webp\";\nimport {\n    DEFAULT_PRODUCT_SLUG,\n    DISCOUNT_CHIP_INTRINSIC_HEIGHT,\n    DISCOUNT_CHIP_INTRINSIC_WIDTH,\n    getTeaserStrings,\n} from \"../shared/constants.js\";\nimport {buildMoebelCtaUrl} from \"./core/cta-url.js\";\nimport {normalizeDeviceOutput, normalizeLanguage} from \"./core/host-normalization.js\";\nimport {MOEBEL_TEASER_SHADOW_STYLES} from \"./moebel-teaser.shadow-styles.js\";\n\nclass MoebelTeaserClient extends HTMLElement implements HomeClientComponentElement {\n    onStyleLoaded?: (style: string) => void;\n    onRender?: () => void;\n\n    private shadow: ShadowRoot | null = null;\n    private hostProps: HomeClientComponentProps = this.createFallbackHostProps();\n    private ctaUrl = \"\";\n    private ctaText = \"\";\n    private ctaPillText = \"\";\n\n    static get observedAttributes(): string[] {\n        return [\"deviceoutput\", \"data-deviceoutput\", \"language\", \"user\", \"platform\", \"env\", \"sso-env\", \"product-slug\", \"system-time\"];\n    }\n\n    private getDeviceOutputAttributeValue(): string | undefined {\n        const fromPlain = this.getAttribute(\"deviceoutput\");\n        if (fromPlain) {\n            return fromPlain;\n        }\n        return this.getAttribute(\"data-deviceoutput\") ?? undefined;\n    }\n\n    private createFallbackHostProps(): HomeClientComponentProps {\n        const env = this.getAttribute(\"env\") ?? \"\";\n        const deviceOutput = normalizeDeviceOutput(this.getDeviceOutputAttributeValue());\n        const language = normalizeLanguage(this.getAttribute(\"language\") ?? this.getAttribute(\"lang\") ?? undefined);\n        const platform = this.getAttribute(\"platform\") === \"app\" ? \"app\" : \"web\";\n        const productSlug = this.getAttribute(\"product-slug\") ?? DEFAULT_PRODUCT_SLUG;\n        const ssoEnvRaw = this.getAttribute(\"sso-env\");\n        const ssoEnv = ssoEnvRaw === null || ssoEnvRaw === \"\" ? undefined : ssoEnvRaw;\n        const userRaw = this.getAttribute(\"user\");\n        let user: HomeClientComponentProps[\"user\"];\n        if (userRaw) {\n            try {\n                user = JSON.parse(userRaw) as HomeClientComponentProps[\"user\"];\n            } catch {\n                user = undefined;\n            }\n        }\n\n        return {\n            productSlug,\n            deviceOutput,\n            language,\n            platform,\n            user,\n            env,\n            ssoEnv,\n        };\n    }\n\n    private getValidateAttributes(): ((attributes: NamedNodeMap) => HomeClientComponentProps) | undefined {\n        if (typeof globalThis === \"undefined\") {\n            return undefined;\n        }\n\n        const c24Home = (globalThis as unknown as {C24Home?: {validateAttributes?: (attributes: NamedNodeMap) => HomeClientComponentProps}})\n            .C24Home;\n\n        if (!c24Home || typeof c24Home.validateAttributes !== \"function\") {\n            return undefined;\n        }\n\n        return c24Home.validateAttributes.bind(c24Home) as (attributes: NamedNodeMap) => HomeClientComponentProps;\n    }\n\n    private readHostProps(): HomeClientComponentProps {\n        const validate = this.getValidateAttributes();\n        if (validate) {\n            return validate(this.attributes);\n        }\n\n        return this.createFallbackHostProps();\n    }\n\n    private syncFromHost(): void {\n        const hostProps = this.readHostProps();\n        const normalizedLanguage = normalizeLanguage(hostProps.language);\n        this.hostProps = {\n            productSlug: hostProps.productSlug,\n            deviceOutput: hostProps.deviceOutput,\n            language: normalizedLanguage,\n            platform: hostProps.platform,\n            user: hostProps.user,\n            env: hostProps.env,\n            ssoEnv: hostProps.ssoEnv,\n        };\n        this.ctaUrl = buildMoebelCtaUrl(this.hostProps.env ?? \"\");\n        const teaserStrings = getTeaserStrings(normalizedLanguage);\n        this.ctaText = teaserStrings.ctaText;\n        this.ctaPillText = teaserStrings.ctaPill;\n        this.setAttribute(\"lang\", normalizedLanguage);\n    }\n\n    attributeChangedCallback(_name: string, oldValue: string, newValue: string): void {\n        if (oldValue === newValue) {\n            return;\n        }\n\n        this.syncFromHost();\n\n        if (this.shadow) {\n            this.render();\n        }\n    }\n\n    connectedCallback(): void {\n        if (!this.shadow) {\n            this.shadow = this.attachShadow({mode: \"closed\"});\n        }\n\n        this.syncFromHost();\n        this.render();\n        this.dispatchBackgroundUpdate();\n    }\n\n    private dispatchBackgroundUpdate(): void {\n        this.dispatchEvent(\n            new CustomEvent(\"c24-background-update\", {\n                bubbles: true,\n                detail: {\n                    productSlug: this.hostProps.productSlug,\n                    styles: {},\n                },\n            }),\n        );\n    }\n\n    private render(): void {\n        if (!this.shadow) {\n            return;\n        }\n\n        const teaserStrings = getTeaserStrings(normalizeLanguage(this.hostProps.language));\n        const shadow = this.shadow;\n\n        while (shadow.firstChild) {\n            shadow.removeChild(shadow.firstChild);\n        }\n\n        const style = document.createElement(\"style\");\n        style.textContent = MOEBEL_TEASER_SHADOW_STYLES;\n        shadow.append(style);\n\n        const container = document.createElement(\"div\");\n        container.className = \"teaser-container\";\n\n        const discountChip = document.createElement(\"img\");\n        discountChip.className = \"teaser-discount-chip\";\n        discountChip.src = discountChipImage;\n        discountChip.alt = \"\";\n        discountChip.setAttribute(\"aria-hidden\", \"true\");\n        discountChip.width = DISCOUNT_CHIP_INTRINSIC_WIDTH;\n        discountChip.height = DISCOUNT_CHIP_INTRINSIC_HEIGHT;\n\n        const teaserLink = document.createElement(\"a\");\n        teaserLink.className = \"teaser-link\";\n        teaserLink.href = this.ctaUrl;\n        teaserLink.setAttribute(\"aria-label\", this.ctaText);\n        teaserLink.tabIndex = -1;\n\n        const headline = document.createElement(\"h2\");\n        headline.className = \"c24-teaser-headline\";\n        const headlineDesktop = document.createElement(\"span\");\n        headlineDesktop.className = \"c24-teaser-headline__desktop\";\n        headlineDesktop.textContent = teaserStrings.headlineDesktop;\n        const headlineMobile = document.createElement(\"span\");\n        headlineMobile.className = \"c24-teaser-headline__mobile\";\n        teaserStrings.headlineMobileLines.forEach((line) => {\n            const lineEl = document.createElement(\"span\");\n            lineEl.className = \"c24-teaser-headline__mobile-line\";\n            lineEl.textContent = line;\n            headlineMobile.append(lineEl);\n        });\n        headline.append(headlineDesktop, headlineMobile);\n\n        const subline = document.createElement(\"p\");\n        subline.className = \"c24-teaser-subline\";\n        const sublineDesktop = document.createElement(\"span\");\n        sublineDesktop.className = \"c24-teaser-subline__desktop\";\n        sublineDesktop.textContent = teaserStrings.sublineDesktop;\n        subline.append(sublineDesktop);\n        const textBlock = document.createElement(\"div\");\n        textBlock.className = \"teaser-text-block\";\n        textBlock.append(headline, subline, discountChip);\n\n        const yellowBox = document.createElement(\"div\");\n        yellowBox.className = \"c24-yellow-box\";\n\n        const columns = document.createElement(\"div\");\n        columns.className = \"c24-yellow-box-2-columns\";\n\n        const textWrapper = document.createElement(\"div\");\n        textWrapper.className = \"c24-yellow-text-box-wrapper\";\n\n        const yellowText = document.createElement(\"div\");\n        yellowText.className = \"c24-yellow-box-text\";\n        yellowText.textContent = this.ctaText;\n\n        const pill = document.createElement(\"a\");\n        pill.className = \"c24-yellow-box-button-link\";\n        pill.href = this.ctaUrl;\n        pill.setAttribute(\"aria-label\", `${this.ctaPillText} (${this.ctaText})`);\n        pill.textContent = this.ctaPillText;\n\n        textWrapper.append(yellowText);\n        columns.append(textWrapper, pill);\n        yellowBox.append(columns);\n\n        container.append(teaserLink, textBlock, yellowBox);\n        shadow.append(container);\n    }\n}\n\nconst homeClientComponent: HomeClientComponent = {\n    component: MoebelTeaserClient,\n};\n\nconst TEASER_CUSTOM_ELEMENT_TAG = \"shofur-teaser-bestprice-guarantee-october\";\nconst TEASER_SKELETON_SELECTOR = \".c24-shofur-teaser-skeleton\";\n\n/**\n * Replace server-rendered skeleton nodes with the real custom element (same pattern as DSL demo).\n * Attributes on the skeleton element are copied onto the host element.\n */\nfunction replaceSkeletonWithComponent(): void {\n    if (typeof document === \"undefined\") {\n        return;\n    }\n\n    const skeletons = document.querySelectorAll(TEASER_SKELETON_SELECTOR);\n    skeletons.forEach((el) => {\n        if (el.closest(TEASER_CUSTOM_ELEMENT_TAG)) {\n            return;\n        }\n\n        if (!(el instanceof HTMLElement)) {\n            return;\n        }\n\n        const replacement = document.createElement(TEASER_CUSTOM_ELEMENT_TAG);\n        for (const attr of Array.from(el.attributes)) {\n            replacement.setAttribute(attr.name, attr.value);\n        }\n\n        el.replaceWith(replacement);\n    });\n}\n\n/**\n * Register the element, then upgrade skeleton placeholders.\n * Holding `SlugTagMatchStep` requires `customElements.define(\"…\", …)` with a string literal tag\n * matching manifest `slug` — keep the define call literal below.\n */\nfunction bootstrapMoebelTeaserClient(): void {\n    if (typeof customElements === \"undefined\") {\n        return;\n    }\n\n    if (!customElements.get(\"shofur-teaser-bestprice-guarantee-october\")) {\n        customElements.define(\"shofur-teaser-bestprice-guarantee-october\", MoebelTeaserClient);\n    }\n\n    replaceSkeletonWithComponent();\n}\n\nif (typeof document !== \"undefined\" && document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", bootstrapMoebelTeaserClient);\n} else {\n    bootstrapMoebelTeaserClient();\n}\n\nexport default homeClientComponent;\n"],"names":["discountChipImage","DEFAULT_PRODUCT_SLUG","DESKTOP_CHIP_RIGHT","TABLET_NARROW_CHIP_TOP","TABLET_NARROW_CHIP_LEFT","mobileHeadlineMaxWidth","chipWidthPx","GERMAN_TEASER_STRINGS","ENGLISH_TEASER_STRINGS","TEASER_DICTIONARY","getTeaserStrings","language","PROD_DOMAIN","NON_PROD_DOMAIN","CTA_URL_TEMPLATE","isNonProdEnv","env","buildMoebelCtaUrl","domain","LANGUAGES","normalizeLanguage","value","normalizeDeviceOutput","HANDHELD_DEVICE_ATTRS","NOT_HANDHELD","attr","shadowHandheldHost","shadowHandheld","descendant","shadowNotHandheld","buildShadowCoreStyles","handheldYellowBox","buildShadowHandheldWideStyles","headlineMaxWidth","host","container","chip","headline","headlineDesktop","headlineMobile","headlineMobileLine","subline","buildShadowMobileStyles","headlineMaxWidthCompact","discountChipCssHeight","chipTopCenteredOnTextBlock","opticalNudgePx","metrics","textBlockHeightPx","tabletChipTopCenteredOnText","buildShadowTabletStyles","textBlock","chipTopWide","MOEBEL_TEASER_SHADOW_STYLES","MoebelTeaserClient","__publicField","fromPlain","deviceOutput","platform","productSlug","ssoEnvRaw","ssoEnv","userRaw","user","c24Home","validate","hostProps","normalizedLanguage","teaserStrings","_name","oldValue","newValue","shadow","style","discountChip","teaserLink","line","lineEl","sublineDesktop","yellowBox","columns","textWrapper","yellowText","pill","homeClientComponent","TEASER_CUSTOM_ELEMENT_TAG","TEASER_SKELETON_SELECTOR","replaceSkeletonWithComponent","el","replacement","bootstrapMoebelTeaserClient"],"mappings":"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"}