@vio-live/web-sdk 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/tokens.ts","../src/ui/components/vio-product.ts","../src/ui/components/vio-product-carousel.ts","../src/core/checkout/method-taxonomy.ts","../src/ui/dialog-focus.ts","../src/ui/components/vio-product-detail.ts","../src/ui/components/vio-cart.ts","../src/ui/checkout-errors.ts","../src/ui/components/vio-checkout.ts","../src/ui/elements.ts"],"names":["LitElement","css","html","property","state","STRIPE_LOGO_SRC","o"],"mappings":"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;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;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;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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;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;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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","file":"chunk-MRJR6DG5.js","sourcesContent":["/**\n * Vio Design Tokens — editorial commerce aesthetic.\n *\n * Extracted from the Allermedia \"Mote & Livsstil\" reference (the target\n * pilot site). Mood: Vogue-like fashion magazine — serif headlines,\n * sans-serif body, near-monochrome palette, terracotta accent for\n * editorial labels (\"REDAKSJONENS FAVORITTER\").\n *\n * Tokens are exposed both as a typed TS object (`VioTokens`) and as\n * CSS custom properties on `:root` (auto-injected when this module is\n * imported in a browser). Consumers can override individual variables\n * to re-skin without touching SDK source.\n */\n\nexport const VioTokens = {\n color: {\n text: {\n primary: '#0a0a0a',\n secondary: '#666666',\n tertiary: '#999999',\n onPrimary: '#ffffff',\n },\n accent: {\n editorial: '#c14a3b', // \"REDAKSJONENS FAVORITTER\" red\n },\n surface: {\n base: '#ffffff',\n muted: '#f2f2f2', // product image background\n hover: '#fafafa',\n },\n border: {\n subtle: '#e5e5e5',\n default: '#cccccc',\n },\n },\n font: {\n serif: '\"Tinos\", \"Playfair Display\", Georgia, serif',\n sans: '\"Inter\", -apple-system, \"Helvetica Neue\", Arial, sans-serif',\n },\n size: {\n xs: '12px',\n sm: '14px',\n md: '16px',\n lg: '20px',\n xl: '24px',\n '2xl': '32px',\n '3xl': '40px',\n },\n weight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n tracking: {\n label: '0.1em', // uppercase labels (BRAND, RETAILER, REDAKSJONENS FAVORITTER)\n title: '0',\n },\n lineHeight: {\n tight: 1.1,\n snug: 1.3,\n normal: 1.5,\n },\n space: {\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '24px',\n xl: '32px',\n '2xl': '48px',\n '3xl': '64px',\n },\n radius: {\n none: '0',\n sm: '2px',\n md: '4px',\n lg: '8px',\n /** Sheet/drawer corners — the largest surface radius in the checkout. */\n xl: '16px',\n full: '9999px',\n },\n} as const\n\n/**\n * CSS Custom Properties — generated from VioTokens. Injected once into\n * the document head on first import. Consumers can override any\n * `--vio-*` var on their root or component selector to customise.\n */\nconst VIO_TOKENS_CSS = `\n :root {\n /* color — text */\n --vio-color-text: ${VioTokens.color.text.primary};\n --vio-color-text-secondary: ${VioTokens.color.text.secondary};\n --vio-color-text-tertiary: ${VioTokens.color.text.tertiary};\n --vio-color-text-on-primary:${VioTokens.color.text.onPrimary};\n\n /* color — accent */\n --vio-color-accent: ${VioTokens.color.accent.editorial};\n\n /* color — surface */\n --vio-color-surface: ${VioTokens.color.surface.base};\n --vio-color-surface-muted: ${VioTokens.color.surface.muted};\n --vio-color-surface-hover: ${VioTokens.color.surface.hover};\n\n /* color — border */\n --vio-color-border: ${VioTokens.color.border.subtle};\n --vio-color-border-default: ${VioTokens.color.border.default};\n\n /* font */\n --vio-font-serif: ${VioTokens.font.serif};\n --vio-font-sans: ${VioTokens.font.sans};\n\n /* size */\n --vio-size-xs: ${VioTokens.size.xs};\n --vio-size-sm: ${VioTokens.size.sm};\n --vio-size-md: ${VioTokens.size.md};\n --vio-size-lg: ${VioTokens.size.lg};\n --vio-size-xl: ${VioTokens.size.xl};\n\n /* tracking (uppercase letterspacing) */\n --vio-tracking-label: ${VioTokens.tracking.label};\n\n /* space */\n --vio-space-xs: ${VioTokens.space.xs};\n --vio-space-sm: ${VioTokens.space.sm};\n --vio-space-md: ${VioTokens.space.md};\n --vio-space-lg: ${VioTokens.space.lg};\n --vio-space-xl: ${VioTokens.space.xl};\n\n /* radius */\n --vio-radius-sm: ${VioTokens.radius.sm};\n --vio-radius-md: ${VioTokens.radius.md};\n --vio-radius-lg: ${VioTokens.radius.lg};\n --vio-radius-xl: ${VioTokens.radius.xl};\n }\n`\n\nfunction injectTokens(): void {\n if (typeof document === 'undefined') return\n if (document.querySelector('style[data-vio=\"tokens\"]') !== null) return\n const style = document.createElement('style')\n style.setAttribute('data-vio', 'tokens')\n style.textContent = VIO_TOKENS_CSS\n document.head.appendChild(style)\n}\n\ninjectTokens()\n\n/**\n * Theming — override design tokens without touching SDK source.\n *\n * Every `<vio-*>` component reads colors/fonts via `var(--vio-color-accent,\n * …)` etc. (shadow DOM inherits CSS custom properties from the light DOM,\n * so this reaches every component including Apple Pay/Klarna/Vipps panels).\n * `applyVioTheme` is the one supported way to set them: an inline style on\n * `:root` (or a scoped element) always wins over the stylesheet rule\n * `injectTokens` installs above, regardless of import/injection order — no\n * specificity fights, no reaching for `!important`.\n *\n * A curated subset on purpose — colors, fonts, corner radius and the spacing\n * steps the checkout actually uses. Radius and spacing were added once the\n * need was real (brand panels in Vev/Replit): corner shape is the strongest\n * identity lever after colour, and the spacing steps drive comfortable-vs-\n * compact density. The rest of the token set (sizes, tracking, line heights)\n * stays internal — don't speculatively surface it as public API.\n *\n * Panels are expected to present these as a few opinionated choices (e.g.\n * \"Sharp / Default / Rounded\") rather than four raw pixel inputs; the API\n * stays per-token so a panel can compose whatever presets it wants.\n *\n * Host integrations (the Vio Config panel in Vev, a future Replit CMS\n * panel, anything else) should call this ONE function — never set\n * `--vio-*` custom properties by hand. If the injection mechanism changes\n * later, only this function needs updating, not every panel that theme.\n */\nexport interface VioThemeOverrides {\n colorText?: string\n colorTextSecondary?: string\n colorTextTertiary?: string\n colorTextOnPrimary?: string\n colorAccent?: string\n colorSurface?: string\n colorSurfaceMuted?: string\n colorSurfaceHover?: string\n colorBorder?: string\n colorBorderDefault?: string\n fontSerif?: string\n fontSans?: string\n /** Corner radius. `sm` = drag handles, `lg` = controls (chips, notices,\n * shipping options), `xl` = the sheet/drawer itself. Set all three to `0`\n * for a square look, or raise `xl` for a softer one. */\n radiusSm?: string\n radiusMd?: string\n radiusLg?: string\n radiusXl?: string\n /** Spacing steps — drive checkout density (compact vs comfortable). */\n spaceSm?: string\n spaceMd?: string\n spaceLg?: string\n spaceXl?: string\n}\n\nconst THEME_KEY_TO_CSS_VAR: Record<keyof VioThemeOverrides, string> = {\n colorText: '--vio-color-text',\n colorTextSecondary: '--vio-color-text-secondary',\n colorTextTertiary: '--vio-color-text-tertiary',\n colorTextOnPrimary: '--vio-color-text-on-primary',\n colorAccent: '--vio-color-accent',\n colorSurface: '--vio-color-surface',\n colorSurfaceMuted: '--vio-color-surface-muted',\n colorSurfaceHover: '--vio-color-surface-hover',\n colorBorder: '--vio-color-border',\n colorBorderDefault: '--vio-color-border-default',\n fontSerif: '--vio-font-serif',\n fontSans: '--vio-font-sans',\n radiusSm: '--vio-radius-sm',\n radiusMd: '--vio-radius-md',\n radiusLg: '--vio-radius-lg',\n radiusXl: '--vio-radius-xl',\n spaceSm: '--vio-space-sm',\n spaceMd: '--vio-space-md',\n spaceLg: '--vio-space-lg',\n spaceXl: '--vio-space-xl',\n}\n\n/**\n * Apply (or clear) theme overrides. Pass `null`/`undefined` for a key to\n * revert it to the SDK default instead of leaving a stale override behind\n * — lets a host re-apply a full overrides object on every save without\n * having to track which keys it previously set.\n *\n * `target` defaults to `document.documentElement` (`:root`, matching where\n * `injectTokens` installs the defaults). Pass a specific element to scope\n * the theme to one subtree instead of the whole page — e.g. multiple\n * differently-branded sponsors on the same page.\n */\nexport function applyVioTheme(\n overrides: VioThemeOverrides,\n target: HTMLElement | null = typeof document !== 'undefined' ? document.documentElement : null,\n): void {\n if (!target) return\n for (const key of Object.keys(THEME_KEY_TO_CSS_VAR) as Array<keyof VioThemeOverrides>) {\n const cssVar = THEME_KEY_TO_CSS_VAR[key]\n const value = overrides[key]\n if (value) {\n target.style.setProperty(cssVar, value)\n } else if (key in overrides) {\n target.style.removeProperty(cssVar)\n }\n }\n}\n","/**\n * <vio-product> — single product card matching the editorial style of the\n * Allermedia \"Shop Favorittene\" carousel. Image-forward, brand top,\n * sans-serif body, bold price, retailer at the bottom. Whole card is\n * clickable; emits `vio:product-click` with productId/sponsorId for the\n * host site to drive checkout opening.\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\n\nexport class VioProduct extends LitElement {\n /** Brand label shown at the top (uppercase, gray, small). */\n @property({ type: String }) brand = ''\n /** Product display name. Two-line truncation. */\n @property({ type: String }) name = ''\n /** Pre-formatted price string (e.g. \"990 kr\"). Bold. */\n @property({ type: String }) price = ''\n /** Retailer / sponsor name shown at the bottom (uppercase, gray). */\n @property({ type: String }) retailer = ''\n /** Product image URL. Square aspect, gray bg if missing. */\n @property({ type: String, attribute: 'image-url' }) imageUrl = ''\n /** Vio product id, propagated to click event. */\n @property({ type: String, attribute: 'product-id' }) productId = ''\n /** Vio sponsor id, propagated to click event. */\n @property({ type: String, attribute: 'sponsor-id' }) sponsorId = ''\n /** Whether the product has selectable variants — the quick-add button then\n * opens the detail to pick one instead of adding directly. */\n @property({ type: Boolean, attribute: 'has-variants' }) hasVariants = false\n /** Optional raw variants/options from the host — extra signal that a\n * variant must be picked before adding (selection is mandatory). */\n @property({ attribute: false }) variants: unknown[] | undefined = undefined\n @property({ attribute: false }) options: unknown[] | undefined = undefined\n\n /** Image-only mode: hide the meta block (brand / name / price / retailer)\n * and show just the image + the quick-add button. Click still opens the\n * detail. */\n @property({ type: Boolean, attribute: 'hide-meta' }) hideMeta = false\n\n /** True when this product currently sits in the cart (persistent mark). */\n @state() private inCart = false\n /** Total units of this product in the cart (shown as a count when > 1). */\n @state() private cartQty = 0\n /** Transient flag driving the add \"pop\" animation. */\n @state() private justAdded = false\n\n private boundCartChange = (): void => this.updateInCart()\n\n static override styles = css`\n :host {\n display: block;\n box-sizing: border-box;\n width: 100%;\n cursor: pointer;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n -webkit-tap-highlight-color: transparent;\n }\n .card {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .image {\n position: relative;\n aspect-ratio: 1 / 1;\n width: 100%;\n background-color: var(--vio-color-surface-muted, #f2f2f2);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n transition: opacity 0.2s ease;\n }\n :host(:hover) .image img { opacity: 0.92; }\n\n /* Quick add-to-cart button — overlaid bottom-right of the image, like the\n reference card's wishlist heart but wired to add the product to the cart. */\n .add-btn {\n position: absolute;\n right: 10px;\n bottom: 10px;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.96);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #0a0a0a;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.16);\n transition: transform 0.14s ease, background 0.14s ease, color 0.14s ease;\n padding: 0;\n z-index: 2;\n }\n .add-btn:hover { background: #fff; transform: scale(1.08); }\n .add-btn:active { transform: scale(0.95); }\n /* In cart → black circle with a white tick (matches the floating cart). */\n .add-btn.in-cart { background: #0a0a0a; color: #fff; }\n .add-btn.in-cart:hover { background: #222; }\n .add-btn.pop { animation: vio-add-pop 0.42s cubic-bezier(0.34, 1.56, 0.64, 1); }\n .add-btn svg { width: 18px; height: 18px; }\n .add-btn .add-count { font-size: 15px; font-weight: 700; line-height: 1; }\n @keyframes vio-add-pop {\n 0% { transform: scale(1); }\n 35% { transform: scale(1.32); }\n 60% { transform: scale(0.9); }\n 100% { transform: scale(1); }\n }\n .image img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n .meta {\n padding-top: 14px;\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n .brand {\n font-size: var(--vio-size-xs, 12px);\n letter-spacing: var(--vio-tracking-label, 0.1em);\n text-transform: uppercase;\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n margin-bottom: 6px;\n }\n .name {\n font-size: var(--vio-size-md, 16px);\n font-weight: 500;\n line-height: 1.3;\n margin: 0 0 10px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .price {\n font-size: var(--vio-size-md, 16px);\n font-weight: 700;\n margin-bottom: 16px;\n }\n .retailer {\n font-size: var(--vio-size-xs, 12px);\n letter-spacing: var(--vio-tracking-label, 0.1em);\n text-transform: uppercase;\n color: var(--vio-color-text-tertiary, #999);\n font-weight: 500;\n margin-top: auto;\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateInCart()\n Vio.cart.addEventListener('change', this.boundCartChange)\n }\n\n override disconnectedCallback(): void {\n Vio.cart.removeEventListener('change', this.boundCartChange)\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\n // product-id / sponsor-id are set as attributes after construction.\n if (changed.has('productId') || changed.has('sponsorId')) this.updateInCart()\n }\n\n /** Reflect whether (and how many units of) this product sit in the cart. */\n private updateInCart(): void {\n const pid = Number(this.productId)\n if (!Number.isFinite(pid) || pid <= 0) {\n this.inCart = false\n this.cartQty = 0\n return\n }\n const sid = Number(this.sponsorId)\n let qty = 0\n for (const cart of Vio.cart.getAllCarts().values()) {\n if (Number.isFinite(sid) && sid > 0 && cart.sponsorId !== sid) continue\n for (const i of cart.items) if (Number(i.productId) === pid) qty += i.quantity\n }\n this.inCart = qty > 0\n this.cartQty = qty\n }\n\n private onClick(): void {\n this.dispatchEvent(\n new CustomEvent('vio:product-click', {\n bubbles: true,\n composed: true,\n detail: {\n productId: this.productId,\n sponsorId: this.sponsorId,\n brand: this.brand,\n name: this.name,\n price: this.price,\n retailer: this.retailer,\n imageUrl: this.imageUrl,\n },\n }),\n )\n }\n\n private onKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n this.onClick()\n }\n }\n\n /** Quick add-to-cart. If the product has selectable variants, open the detail\n * to pick one instead (the host can't choose for the user). Otherwise emit\n * `vio:product-add` so the host adds it (bumping quantity on repeat taps). */\n private onAdd(e: Event): void {\n e.stopPropagation()\n if (\n this.hasVariants ||\n (Array.isArray(this.variants) && this.variants.length > 1) ||\n (Array.isArray(this.options) && this.options.length > 0)\n ) {\n this.onClick()\n return\n }\n this.dispatchEvent(\n new CustomEvent('vio:product-add', {\n bubbles: true,\n composed: true,\n detail: {\n productId: this.productId,\n sponsorId: this.sponsorId,\n brand: this.brand,\n name: this.name,\n price: this.price,\n retailer: this.retailer,\n imageUrl: this.imageUrl,\n },\n }),\n )\n // Optimistic pop; the persistent \"in cart\" mark follows from the cart event.\n this.justAdded = true\n setTimeout(() => {\n this.justAdded = false\n }, 450)\n }\n\n override render() {\n return html`\n <div\n class=\"card\"\n @click=${this.onClick}\n @keydown=${this.onKeydown}\n role=\"button\"\n tabindex=\"0\"\n aria-label=${`${this.brand} ${this.name} ${this.price}`}\n >\n <div class=\"image\">\n ${this.imageUrl\n ? html`<img src=${this.imageUrl} alt=${this.name || this.brand} loading=\"lazy\" />`\n : ''}\n <button\n class=\"add-btn ${this.inCart ? 'in-cart' : ''} ${this.justAdded ? 'pop' : ''}\"\n @click=${this.onAdd}\n aria-label=${this.inCart ? 'I handlekurven – legg til en til' : 'Legg i kurv'}\n title=${this.inCart ? 'I handlekurven' : 'Legg i kurv'}\n >\n ${this.inCart\n ? this.cartQty > 1\n ? html`<span class=\"add-count\">${this.cartQty}</span>`\n : html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>`\n : html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\">\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\n </svg>`}\n </button>\n </div>\n ${this.hideMeta\n ? ''\n : html`\n <div class=\"meta\">\n ${this.brand ? html`<div class=\"brand\">${this.brand}</div>` : ''}\n ${this.name ? html`<div class=\"name\">${this.name}</div>` : ''}\n ${this.price ? html`<div class=\"price\">${this.price}</div>` : ''}\n ${this.retailer ? html`<div class=\"retailer\">${this.retailer}</div>` : ''}\n </div>`}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-product': VioProduct\n }\n}\n","/**\n * <vio-product-carousel> — horizontal product carousel matching the\n * Allermedia \"Shop Favorittene\" pattern.\n *\n * Two render modes:\n * 1. Slotted — the consumer puts <vio-product> children inside the tag\n * (manual / SSR-friendly).\n * 2. Auto-fetch — set `product-ids=\"123,456,789\"` plus either\n * `commerce-key=\"...\"` (explicit per-sponsor commerce apiKey) or\n * `sponsor-id=\"3\"` (looked up via Vio.bootstrap). The carousel\n * fetches products from Vio Commerce GraphQL and renders them.\n *\n * Visual layout in both modes:\n * - Editorial label (red, uppercase) above the heading\n * - Serif heading + inline gray disclaimer\n * - \"Se alle\" link right-aligned\n * - Snap-scroll viewport with round white chevron nav buttons\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { Vio } from '../../core/client.js'\nimport {\n displayPrice,\n primaryImageUrl,\n type Product,\n} from '../../core/types.js'\n\nexport class VioProductCarousel extends LitElement {\n /** Small uppercase label in accent color (e.g. \"REDAKSJONENS FAVORITTER\"). */\n @property({ type: String }) label = ''\n /** Big serif heading (e.g. \"Shop Favorittene\"). */\n @property({ type: String }) heading = ''\n /** Inline gray disclaimer next to the heading (e.g. \"annonselenker\"). */\n @property({ type: String }) disclaimer = ''\n /** URL for the \"Se alle\" link. Hidden if empty. */\n @property({ type: String, attribute: 'see-all-href' }) seeAllHref = ''\n /** Label for the see-all link. Defaults to Norwegian. */\n @property({ type: String, attribute: 'see-all-label' }) seeAllLabel = 'Se alle'\n\n /** Auto-fetch mode: comma-separated product ids (e.g. \"408895,408896\"). */\n @property({ type: String, attribute: 'product-ids' }) productIds = ''\n /** Auto-fetch mode option A: explicit per-sponsor commerce apiKey. */\n @property({ type: String, attribute: 'commerce-key' }) commerceKey = ''\n /** Auto-fetch mode option B: sponsor id looked up via Vio.bootstrap. */\n @property({ type: Number, attribute: 'sponsor-id' }) sponsorId = 0\n /**\n * Multi-sponsor mode: `\"sponsorId:productId,sponsorId:productId,…\"`. Each\n * pair resolves its own commerce client via `Vio.commerceFor(sponsorId)`;\n * fetches run in parallel and results are merged preserving input order.\n * Each rendered <vio-product> carries the per-item sponsor-id so taps go\n * to <vio-product-detail> with the right commerce context.\n *\n * Takes precedence over `product-ids` if both are set.\n */\n @property({ type: String, attribute: 'product-refs' }) productRefs = ''\n /** Currency for product prices. */\n @property({ type: String }) currency = 'NOK'\n\n @query('.scroller') private scroller!: HTMLElement\n @state() private fetched: Array<{ product: Product; sponsorId: number }> | null = null\n @state() private isLoading = false\n @state() private fetchError = ''\n\n static override styles = css`\n :host {\n display: block;\n box-sizing: border-box;\n width: 100%;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n padding: var(--vio-space-xl, 32px) 0;\n }\n .header {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--vio-space-md, 16px);\n margin-bottom: var(--vio-space-lg, 24px);\n padding: 0 var(--vio-space-lg, 24px);\n }\n .header-text { flex: 1; min-width: 0; }\n .label {\n font-size: var(--vio-size-xs, 12px);\n letter-spacing: var(--vio-tracking-label, 0.1em);\n text-transform: uppercase;\n color: var(--vio-color-accent, #c14a3b);\n font-weight: 500;\n margin-bottom: var(--vio-space-sm, 8px);\n }\n .heading-row {\n display: flex;\n align-items: baseline;\n gap: var(--vio-space-sm, 8px);\n flex-wrap: wrap;\n }\n .heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: clamp(28px, 4vw, 40px);\n font-weight: 400;\n line-height: 1.1;\n margin: 0;\n }\n .disclaimer {\n color: var(--vio-color-text-tertiary, #999);\n font-size: var(--vio-size-sm, 14px);\n font-style: italic;\n }\n .see-all {\n font-size: var(--vio-size-sm, 14px);\n color: var(--vio-color-text, #0a0a0a);\n text-decoration: underline;\n text-underline-offset: 4px;\n white-space: nowrap;\n font-weight: 500;\n }\n .see-all:hover { color: var(--vio-color-text-secondary, #666); }\n\n .viewport {\n position: relative;\n }\n .scroller {\n display: flex;\n gap: var(--vio-space-md, 16px);\n /* Extra left padding so the first card clears the prev chevron. */\n padding: 0 var(--vio-space-lg, 24px) 8px 72px;\n overflow-x: auto;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch;\n }\n @media (max-width: 600px) {\n .scroller { padding: 0 var(--vio-space-lg, 24px) 8px; }\n }\n .scroller::-webkit-scrollbar { display: none; }\n ::slotted(*),\n vio-product {\n flex: 0 0 240px;\n scroll-snap-align: start;\n }\n @media (max-width: 600px) {\n ::slotted(*),\n vio-product {\n /* Two complete cards per screen (+ a sliver of the next), matching the\n reference: card = (viewport − side padding − gap) / 2. */\n flex: 0 0 calc((100vw - 64px) / 2);\n }\n }\n\n .nav-btn {\n position: absolute;\n top: 30%;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #fff;\n border: none;\n box-shadow: 0 2px 14px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: #0a0a0a;\n z-index: 2;\n transition: background 0.15s, transform 0.15s;\n font-family: inherit;\n padding: 0;\n }\n .nav-btn:hover { background: #fafafa; transform: scale(1.05); }\n .nav-btn:active { transform: scale(0.98); }\n .nav-btn.prev { left: 8px; }\n .nav-btn.next { right: 8px; }\n @media (max-width: 600px) {\n .nav-btn { display: none; }\n }\n\n .state {\n padding: 60px var(--vio-space-lg, 24px);\n text-align: center;\n color: var(--vio-color-text-secondary, #666);\n font-size: 14px;\n }\n .state.error { color: var(--vio-color-accent, #c14a3b); }\n .skeleton {\n flex: 0 0 240px;\n scroll-snap-align: start;\n }\n .skeleton-image {\n aspect-ratio: 1 / 1;\n background: var(--vio-color-surface-muted, #f2f2f2);\n animation: vio-pulse 1.6s ease-in-out infinite;\n }\n .skeleton-text {\n height: 12px;\n background: var(--vio-color-surface-muted, #f2f2f2);\n margin-top: 12px;\n animation: vio-pulse 1.6s ease-in-out infinite;\n }\n .skeleton-text.shorter { width: 60%; }\n @keyframes vio-pulse {\n 0%,\n 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.observeForAnalytics()\n if (this.productRefs.trim() || this.productIds.trim()) {\n void this.autoFetch()\n }\n }\n\n override disconnectedCallback(): void {\n this.unobserveImpression?.()\n this.unobserveImpression = null\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\n const propChanged =\n changed.has('productRefs') ||\n changed.has('productIds') ||\n changed.has('commerceKey') ||\n changed.has('sponsorId')\n if (propChanged && (this.productRefs.trim() || this.productIds.trim())) {\n void this.autoFetch()\n }\n }\n\n private async autoFetch(): Promise<void> {\n if (!Vio.isInitialized) {\n this.fetchError = 'Vio not initialized — call Vio.init({ apiKey }) first'\n return\n }\n this.isLoading = true\n this.fetchError = ''\n try {\n const refs = this.productRefs.trim()\n ? this.parseRefs(this.productRefs)\n : this.productIds\n .split(',')\n .map((s) => parseInt(s.trim(), 10))\n .filter((n) => !Number.isNaN(n))\n .map((id) => ({ sponsorId: this.sponsorId, productId: id }))\n\n if (refs.length === 0) {\n this.fetched = []\n return\n }\n\n // Group by sponsorId so we can issue one GraphQL request per sponsor.\n const bySponsor = new Map<number, number[]>()\n for (const r of refs) {\n const arr = bySponsor.get(r.sponsorId) ?? []\n arr.push(r.productId)\n bySponsor.set(r.sponsorId, arr)\n }\n\n const fetched = await Promise.all(\n Array.from(bySponsor.entries()).map(async ([sponsorId, ids]) => {\n const commerce =\n this.commerceKey && this.productRefs.trim() === ''\n ? Vio.commerceWithKey(this.commerceKey)\n : Vio.commerceFor(sponsorId)\n const products = await commerce.channel.product.getByIds({\n product_ids: ids,\n currency: this.currency,\n image_size: 'large',\n })\n return { sponsorId, products }\n }),\n )\n\n // Index for O(1) lookup, then re-emit in original ref order.\n const lookup = new Map<string, Product>()\n for (const { sponsorId, products } of fetched) {\n for (const p of products) lookup.set(`${sponsorId}:${p.id}`, p)\n }\n this.fetched = refs\n .map(({ sponsorId, productId }) => {\n const product = lookup.get(`${sponsorId}:${productId}`)\n return product ? { product, sponsorId } : null\n })\n .filter((x): x is { product: Product; sponsorId: number } => x !== null)\n this.maybeTrackList()\n } catch (err) {\n this.fetchError = err instanceof Error ? err.message : String(err)\n // Keep `fetched` null so slotted fallback can still render.\n } finally {\n this.isLoading = false\n }\n }\n\n // ── Analytics (auto) ──────────────────────────────────────────────\n // component_impression on the contract rule (≥50% visible ≥1s, once per\n // session) + view_item_list with the rendered products. No-ops unless\n // Vio.analytics.start() ran.\n private unobserveImpression: (() => void) | null = null\n private impressed = false\n private listTracked = false\n\n private observeForAnalytics(): void {\n if (this.unobserveImpression) return\n try {\n this.unobserveImpression = Vio.analytics.observeImpression(\n this,\n {\n sponsorId: this.sponsorId > 0 ? this.sponsorId : undefined,\n componentTemplateId: 'product-carousel',\n locationId: this.label || undefined,\n },\n {\n key: `carousel:${this.label || this.productIds || this.productRefs || 'default'}`,\n onImpression: () => {\n this.impressed = true\n this.maybeTrackList()\n },\n },\n )\n } catch {\n /* analytics must never break rendering */\n }\n }\n\n /** view_item_list needs BOTH the viewport dwell and loaded products —\n * whichever lands last fires it (once). */\n private maybeTrackList(): void {\n if (!this.impressed || this.listTracked) return\n const entries = this.fetched ?? []\n if (entries.length === 0) return\n this.listTracked = true\n try {\n Vio.analytics.track('view_item_list', {\n context: {\n sponsorId: this.sponsorId > 0 ? this.sponsorId : undefined,\n componentTemplateId: 'product-carousel',\n locationId: this.label || undefined,\n },\n commerce: {\n items: entries.map(({ product, sponsorId }) => ({\n productId: product.id,\n name: product.title,\n price: Number(product.price?.amount_incl_taxes ?? product.price?.amount) || undefined,\n })),\n currency: entries[0]?.product.price?.currency_code,\n },\n props: this.label ? { list_name: this.label } : undefined,\n })\n } catch {\n /* never break rendering */\n }\n }\n\n private parseRefs(raw: string): Array<{ sponsorId: number; productId: number }> {\n return raw\n .split(',')\n .map((pair) => pair.trim())\n .filter((s) => s.length > 0)\n .map((pair) => {\n const [sidStr, pidStr] = pair.split(':')\n const sid = parseInt((sidStr ?? '').trim(), 10)\n const pid = parseInt((pidStr ?? '').trim(), 10)\n if (Number.isNaN(sid) || Number.isNaN(pid)) return null\n return { sponsorId: sid, productId: pid }\n })\n .filter((x): x is { sponsorId: number; productId: number } => x !== null)\n }\n\n private scrollByDirection(direction: 1 | -1): void {\n if (!this.scroller) return\n const item = this.scroller.querySelector(':scope > *') as HTMLElement | null\n const step = (item?.offsetWidth ?? 240) + 16\n this.scroller.scrollBy({ left: direction * step * 2, behavior: 'smooth' })\n }\n\n private renderScrollerContent() {\n if (this.isLoading && !this.fetched) {\n // Skeleton cards while fetching.\n return html`${Array.from({ length: 5 }).map(\n () => html`\n <div class=\"skeleton\">\n <div class=\"skeleton-image\"></div>\n <div class=\"skeleton-text\"></div>\n <div class=\"skeleton-text shorter\"></div>\n </div>\n `,\n )}`\n }\n if (this.fetched && this.fetched.length > 0) {\n return html`${this.fetched.map(({ product: p, sponsorId }) => {\n const img = primaryImageUrl(p) ?? ''\n const retailer = sponsorNameFromBootstrap(sponsorId) ?? p.brand ?? ''\n return html`\n <vio-product\n product-id=${String(p.id)}\n sponsor-id=${String(sponsorId)}\n brand=${p.brand ?? ''}\n name=${p.title}\n price=${displayPrice(p)}\n retailer=${retailer}\n image-url=${img}\n ?has-variants=${(p.variants?.length ?? 0) > 1}\n ></vio-product>\n `\n })}`\n }\n // Fallback to slotted children (manual mode) — also used when fetch fails.\n return html`<slot></slot>`\n }\n\n override render() {\n return html`\n <div class=\"header\">\n <div class=\"header-text\">\n ${this.label ? html`<div class=\"label\">${this.label}</div>` : ''}\n <div class=\"heading-row\">\n ${this.heading ? html`<h2 class=\"heading\">${this.heading}</h2>` : ''}\n ${this.disclaimer ? html`<span class=\"disclaimer\">(${this.disclaimer})</span>` : ''}\n </div>\n </div>\n ${this.seeAllHref\n ? html`<a class=\"see-all\" href=${this.seeAllHref}>${this.seeAllLabel}</a>`\n : ''}\n </div>\n <div class=\"viewport\">\n <button\n class=\"nav-btn prev\"\n @click=${() => this.scrollByDirection(-1)}\n aria-label=\"Forrige\"\n >\n ‹\n </button>\n <div class=\"scroller\">${this.renderScrollerContent()}</div>\n <button\n class=\"nav-btn next\"\n @click=${() => this.scrollByDirection(1)}\n aria-label=\"Neste\"\n >\n ›\n </button>\n </div>\n ${this.fetchError && !this.fetched\n ? html`<div class=\"state error\">${this.fetchError}</div>`\n : ''}\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-product-carousel': VioProductCarousel\n }\n}\n\n/** Resolve a sponsor's display name from `Vio.bootstrap()` cache. */\nfunction sponsorNameFromBootstrap(sponsorId: number): string | undefined {\n const boot = Vio.bootstrapCache\n if (!boot) return undefined\n if (boot.primarySponsor?.id === sponsorId) return boot.primarySponsor.name\n return boot.secondarySponsors?.find((s) => s.id === sponsorId)?.name\n}\n","/**\n * What kind of thing each payment method is — in ONE place.\n *\n * This exists because the answer used to be spelled out by hand wherever it\n * was needed: `methodEnabled` was reimplemented in three components with three\n * slightly different signatures, and the list `kustom | qliro | walley`\n * appeared in five separate places in the checkout alone plus the product\n * page. Adding a method meant remembering all of them.\n *\n * Nobody remembered. On 2026-09-08 the same omission produced two separate\n * defects: the cart footer had no button at all for a channel offering only an\n * embedded checkout, and the product page had no buy button for the same\n * reason — the same mistake, twice, in two files. A code review the same day\n * named this as the mechanism.\n *\n * So: adding a payment method should mean editing this file, and the type\n * checker should find the rest.\n */\n\n/** Backend names arrive as \"Apple Pay\", \"Qliro\", \"STRIPE\" — compare letters. */\nexport function normalizeMethodName(name: string): string {\n return String(name ?? '')\n .toLowerCase()\n .replace(/[^a-z]/g, '')\n}\n\n/**\n * Methods whose provider runs the whole purchase inside its own widget:\n * address, shipping, email AND payment.\n *\n * Two consequences follow, and both were defects before this list existed:\n * they have no branded express button, so a page offering only these needs a\n * generic \"go to checkout\" CTA; and our delivery-address form is pointless\n * when every offered method is one of them.\n */\nexport const EMBEDDED_METHODS = ['kustom', 'qliro', 'walley', 'nexi'] as const\n\n/**\n * Methods whose provider renders ONLY the payment inside our page, after the\n * shopper filled our own form and picked our shipping. Adyen's Drop-in lists\n * cards, Vipps, Klarna… and charges; it collects no email, address or\n * shipping. So these are NOT embedded checkouts: the delivery-address form\n * stays, and the widget is created with the final amount.\n */\nexport const FORM_FIRST_WIDGET_METHODS = ['adyen'] as const\n\n/**\n * Methods with no branded express button of their own. A page offering only\n * these needs the generic \"buy now\" / \"go to checkout\" CTA, or it has no way\n * into the checkout at all (the defect of 2026-09-08, for every new method).\n */\nexport const NO_EXPRESS_BUTTON_METHODS = [\n ...EMBEDDED_METHODS,\n ...FORM_FIRST_WIDGET_METHODS,\n] as const\n\n/**\n * Methods that collect the shipping address themselves. The embedded ones do,\n * and so does Vipps inside its own flow — it just isn't embedded in our page.\n *\n * Vipps Express is NOT a method of its own here (unlike Apple Pay, a distinct\n * instrument with its own channel switch): it is a mode of Vipps, announced\n * by Vio Commerce as `config.express` on the method — read with\n * `Vio.checkout.getVippsExpressEnabled()` — the way Stripe announces `mode`.\n */\nexport const COLLECTS_OWN_ADDRESS = [...EMBEDDED_METHODS, 'vipps'] as const\n\n/** Runs inside its own widget in our page (no branded express button). */\nexport const isEmbeddedMethod = (name: string): boolean =>\n (EMBEDDED_METHODS as readonly string[]).includes(normalizeMethodName(name))\n\n/** Renders only the payment, after our own form (no address of its own). */\nexport const isFormFirstWidgetMethod = (name: string): boolean =>\n (FORM_FIRST_WIDGET_METHODS as readonly string[]).includes(normalizeMethodName(name))\n\n/** Asks the shopper for their address itself, so our form would ask twice. */\nexport const collectsOwnAddress = (name: string): boolean =>\n (COLLECTS_OWN_ADDRESS as readonly string[]).includes(normalizeMethodName(name))\n\n/**\n * Is `name` among the methods the channel offers?\n *\n * `available === null` means \"we do not know\" — either not asked yet or the\n * lookup failed — and answers `true` for everything, so a backend blip shows\n * too many methods rather than none and nobody is blocked from paying. The\n * caller decides whether \"do not know\" should render a spinner instead; see\n * `paymentMethodsResolved` in vio-checkout.\n *\n * Several names match if any of them does: some call sites pass both spellings\n * of a method (`'apple-pay'`, `'applepay'`).\n */\nexport function isMethodEnabled(\n available: string[] | null,\n ...names: string[]\n): boolean {\n if (available === null) return true\n return available.some((m) =>\n names.some((n) => normalizeMethodName(m) === normalizeMethodName(n)),\n )\n}\n","/**\n * Keyboard and focus for the SDK's dialogs — <vio-product-detail>, <vio-cart>\n * and <vio-checkout>.\n *\n * Each renders a `role=\"dialog\"` with a close button, and until 2026-10-09\n * nothing managed focus: a keyboard user pressed Enter on a product card, the\n * detail opened, and focus stayed on the page behind — Tab never entered the\n * dialog, Escape did nothing. A QA tester could not complete a purchase by\n * keyboard.\n *\n * One instance per component, driven from its `updated()` whenever `open`\n * changed:\n *\n * - opening remembers the element that had focus (the opener) and moves\n * focus into the dialog: its first tabbable element, which is the close\n * button — or the container itself (`tabindex=\"-1\"`) when there is none;\n * - while open, a `keydown` listener on the host closes on Escape (unless\n * the component says it cannot close right now: a payment in flight) and\n * keeps Tab / Shift+Tab cycling inside the dialog;\n * - closing removes the listener and gives focus back to the opener, if it\n * is still in the document.\n *\n * \"Inside the dialog\" is the COMPOSED tree: the components render into a\n * shadow root, the checkout projects the third-party widgets from its light\n * DOM through named slots (see `lightContainer` there), and Vipps' own button\n * is a web component of its own. Slots are followed into their assigned\n * elements, and open shadow roots are walked.\n *\n * Two document-level guards complete the trap, both for Safari (QA\n * 2026-10-12): its native Tab order skips buttons, so focus leaving a\n * third-party iframe (Stripe's payment element) landed on the page's next\n * text field instead of our pay button, and a re-render that dropped focus\n * on the body left Tab wandering the page. `focusin` outside the host pulls\n * focus back to the element next to the one that had it; Tab pressed outside\n * the host enters the dialog. Another OPEN Vio dialog is left alone: in Vev\n * the cart view opens on top of the checkout, outside this component.\n */\n\nexport interface DialogFocusOptions {\n /** The component. The keydown listener lives on it; its render root holds the dialog. */\n host: HTMLElement\n /** The dialog container (`role=\"dialog\"`), looked up on every use — Lit re-renders it. */\n container: () => HTMLElement | null\n /** What Escape does: the component's `close()`. */\n close: () => void\n /** Answer false while the dialog must stay open (a payment in flight): Escape is then ignored. */\n canClose?: () => boolean\n}\n\nexport class DialogFocus {\n private opener: Element | null = null\n private active = false\n /** The element inside the dialog that had focus last — where a pull-back continues from. */\n private lastInside: HTMLElement | null = null\n\n constructor(private readonly opts: DialogFocusOptions) {}\n\n /**\n * Call from `updated()` when `open` changed. Lit reports `open` as changed\n * on the first render too (from undefined to its initial value): with the\n * same value twice this is a no-op, so that first call does nothing.\n */\n update(open: boolean): void {\n if (open === this.active) return\n this.active = open\n if (open) this.opened()\n else this.closed()\n }\n\n private opened(): void {\n this.opener = deepActiveElement()\n this.lastInside = null\n this.opts.host.addEventListener('keydown', this.onKeydown)\n document.addEventListener('focusin', this.onFocusIn, true)\n document.addEventListener('keydown', this.onDocumentKeydown, true)\n const container = this.opts.container()\n if (container) focusInto(container)\n }\n\n private closed(): void {\n this.opts.host.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('focusin', this.onFocusIn, true)\n document.removeEventListener('keydown', this.onDocumentKeydown, true)\n const opener = this.opener\n this.opener = null\n // The shopper may have moved on already (another dialog, the page): then\n // focus is theirs. Otherwise it sits on an element about to leave the\n // screen — give it back to the opener, or at least let go of it.\n const active = deepActiveElement()\n if (!active || !isWithin(active, this.opts.host)) return\n if (opener && opener.isConnected && isRestorable(opener)) {\n focusElement(opener)\n } else if (active instanceof HTMLElement) {\n active.blur()\n }\n }\n\n private onKeydown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented) return\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (this.opts.canClose && !this.opts.canClose()) return\n e.preventDefault()\n e.stopPropagation()\n this.opts.close()\n return\n }\n if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey) return\n const container = this.opts.container()\n if (!container) return\n const items = tabbableIn(container)\n if (items.length === 0) {\n e.preventDefault()\n focusElement(container)\n return\n }\n const active = deepActiveElement()\n const index = active ? items.indexOf(active as HTMLElement) : -1\n // Every Tab is ours, not only the wrap at the ends. Safari does not put\n // buttons and links in its Tab order unless the shopper switched on\n // \"Press Tab to highlight each item\" (off by default): left to the\n // browser, Tab from the close button skipped the whole dialog and landed\n // on the page's next text field (QA, 2026-10-12). Chrome and Edge visit\n // buttons natively, so there it looked fine.\n e.preventDefault()\n const count = items.length\n const next =\n index === -1\n ? e.shiftKey\n ? count - 1\n : 0\n : (index + (e.shiftKey ? -1 : 1) + count) % count\n focusElement(items[next]!)\n }\n\n /**\n * Focus moved somewhere. Inside the dialog: remember where. Into another\n * open Vio dialog: theirs. Onto the page: the browser walked out of the\n * dialog on its own (Safari leaving a widget iframe) — continue from the\n * element that had focus, backwards when the page element sits before\n * the host in document order.\n */\n private onFocusIn = (e: FocusEvent): void => {\n // A host that left the document without closing (torn down) must not keep pulling.\n if (!this.opts.host.isConnected) return\n const path = e.composedPath()\n if (path.includes(this.opts.host)) {\n const active = deepActiveElement()\n this.lastInside = active instanceof HTMLElement ? active : null\n return\n }\n if (path.some((n) => isOpenVioDialog(n, this.opts.host))) return\n const container = this.opts.container()\n if (!container) return\n const items = tabbableIn(container)\n if (items.length === 0) {\n focusElement(container)\n return\n }\n const target = e.target instanceof Node ? e.target : null\n const backwards = !!target && precedes(target, this.opts.host)\n const index = this.lastInside ? items.indexOf(this.lastInside) : -1\n const count = items.length\n const next = backwards\n ? index <= 0\n ? count - 1\n : index - 1\n : index === -1 || index === count - 1\n ? 0\n : index + 1\n focusElement(items[next]!)\n }\n\n /** Tab pressed while focus is on the page (or the body): enter the dialog. */\n private onDocumentKeydown = (e: KeyboardEvent): void => {\n if (!this.opts.host.isConnected) return\n if (e.defaultPrevented || e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey) return\n const active = deepActiveElement()\n if (active && isWithin(active, this.opts.host)) return\n if (active && hasOpenVioDialogAbove(active, this.opts.host)) return\n const container = this.opts.container()\n if (!container) return\n e.preventDefault()\n e.stopPropagation()\n const items = tabbableIn(container)\n focusElement(items.length === 0 ? container : e.shiftKey ? items[items.length - 1]! : items[0]!)\n }\n}\n\n/** One of our dialogs, open, other than `host`. */\nfunction isOpenVioDialog(node: EventTarget, host: Element): boolean {\n return node instanceof Element && node !== host && node.tagName.startsWith('VIO-') && node.hasAttribute('open')\n}\n\nfunction hasOpenVioDialogAbove(node: Node, host: Element): boolean {\n let n: Node | null = node\n while (n) {\n if (isOpenVioDialog(n, host)) return true\n n = n.parentNode ?? (n instanceof ShadowRoot ? n.host : null)\n }\n return false\n}\n\n/** Does `a` come before `b` in document order? (Disconnected trees count as after.) */\nfunction precedes(a: Node, b: Node): boolean {\n return (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0\n}\n\n/**\n * The element that really has focus: `document.activeElement` stops at a\n * shadow host, this follows it down through open shadow roots.\n */\nexport function deepActiveElement(): Element | null {\n if (typeof document === 'undefined') return null\n let el: Element | null = document.activeElement\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement\n return el\n}\n\nconst TABBABLE_CANDIDATES =\n 'a[href], area[href], button, input, select, textarea, iframe, summary, [tabindex], [contenteditable]'\n\n/**\n * The elements Tab can reach inside `container`, in the order the browser\n * visits them: the composed tree, so slotted content is taken where its slot\n * is and open shadow roots are looked into.\n */\nexport function tabbableIn(container: Element): HTMLElement[] {\n const out: HTMLElement[] = []\n walkChildren(container, out)\n return out\n}\n\nfunction walkChildren(parent: Element | ShadowRoot, out: HTMLElement[]): void {\n for (const child of Array.from(parent.children)) {\n if (child instanceof HTMLSlotElement) {\n // What a slot shows is its assigned elements; its own children only\n // when nothing is assigned (fallback content).\n const assigned = child.assignedElements({ flatten: true })\n if (assigned.length > 0) {\n for (const el of assigned) visit(el, out)\n continue\n }\n }\n visit(child, out)\n }\n}\n\nfunction visit(el: Element, out: HTMLElement[]): void {\n if (isTabbable(el)) out.push(el)\n // A shadow root replaces the light children on screen — they only show\n // through its slots, which walkChildren follows.\n if (el.shadowRoot) walkChildren(el.shadowRoot, out)\n else walkChildren(el, out)\n}\n\nfunction isTabbable(el: Element): el is HTMLElement {\n if (!(el instanceof HTMLElement) || !el.matches(TABBABLE_CANDIDATES)) return false\n const tabindex = el.getAttribute('tabindex')\n if (tabindex !== null && Number(tabindex) < 0) return false\n if (el.hasAttribute('disabled')) return false\n if (el instanceof HTMLInputElement && el.type === 'hidden') return false\n if (el.getAttribute('contenteditable') === 'false' && !el.matches('a[href], button, input, select, textarea, iframe, [tabindex]')) return false\n if (el.hidden || el.getAttribute('aria-hidden') === 'true') return false\n // Not rendered (display: none somewhere up the tree). jsdom has no layout\n // and no checkVisibility: there everything counts, which is fine for tests.\n if (typeof el.checkVisibility === 'function' && !el.checkVisibility()) return false\n return true\n}\n\nfunction focusInto(container: HTMLElement): void {\n const first = tabbableIn(container)[0]\n focusElement(first ?? container)\n}\n\nfunction focusElement(el: HTMLElement): void {\n // The dialog is a fixed panel sliding in: nothing to scroll the page for.\n el.focus({ preventScroll: true })\n}\n\n/** The opener is worth focusing again — the page's body is not. */\nfunction isRestorable(el: Element): el is HTMLElement {\n return el instanceof HTMLElement && el !== document.body && el !== document.documentElement\n}\n\n/** Is `node` inside `ancestor` in the composed tree (through shadow roots and slots)? */\nfunction isWithin(node: Node, ancestor: Node): boolean {\n let n: Node | null = node\n while (n) {\n if (n === ancestor) return true\n n = n.parentNode ?? (n instanceof ShadowRoot ? n.host : null)\n }\n return false\n}\n","/**\n * <vio-product-detail> — full-screen product detail modal.\n *\n * Auto-opens when `vio:product-click` fires anywhere in the document\n * (delegated). Fetches the full Product DTO via `Vio.commerceFor(sponsorId)`,\n * shows brand + name + price + description + image gallery + variant\n * pickers + stock indicator + add-to-cart CTA.\n *\n * For affiliate products (non-numeric productId), the modal skips —\n * those are handled by the host page's direct cart logic.\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { ensureVippsButton } from '../../core/checkout/payments/vipps-button.js'\nimport { Vio } from '../../core/client.js'\nimport {\n formatPrice,\n getGlobalCurrency,\n type Product,\n type ProductImage,\n type ProductOption,\n type ProductVariant,\n} from '../../core/types.js'\nimport { isMethodEnabled, NO_EXPRESS_BUTTON_METHODS } from '../../core/checkout/method-taxonomy.js'\nimport { DialogFocus } from '../dialog-focus.js'\n\ninterface SelectedOptions {\n [optionName: string]: string\n}\n\n/** Stripe wordmark, inlined so the published article needs no asset path.\n * (Also in vio-cart.ts / vio-checkout.ts — tiny constant, no shared module.) */\nconst STRIPE_LOGO_SRC =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n '<svg width=\"360\" height=\"150\" viewBox=\"0 0 360 150\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M360 77.4001C360 51.8001 347.6 31.6001 323.9 31.6001C300.1 31.6001 285.7 51.8001 285.7 77.2001C285.7 107.3 302.7 122.5 327.1 122.5C339 122.5 348 119.8 354.8 116V96.0001C348 99.4001 340.2 101.5 330.3 101.5C320.6 101.5 312 98.1001 310.9 86.3001H359.8C359.8 85.0001 360 79.8001 360 77.4001ZM310.6 67.9001C310.6 56.6001 317.5 51.9001 323.8 51.9001C329.9 51.9001 336.4 56.6001 336.4 67.9001H310.6Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M247.1 31.6001C237.3 31.6001 231 36.2001 227.5 39.4001L226.2 33.2001H204.2V149.8L229.2 144.5L229.3 116.2C232.9 118.8 238.2 122.5 247 122.5C264.9 122.5 281.2 108.1 281.2 76.4001C281.1 47.4001 264.6 31.6001 247.1 31.6001ZM241.1 100.5C235.2 100.5 231.7 98.4001 229.3 95.8001L229.2 58.7001C231.8 55.8001 235.4 53.8001 241.1 53.8001C250.2 53.8001 256.5 64.0001 256.5 77.1001C256.5 90.5001 250.3 100.5 241.1 100.5Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M169.8 25.7L194.9 20.3V0L169.8 5.3V25.7Z\" fill=\"#533AFD\"/><path d=\"M194.9 33.3H169.8V120.8H194.9V33.3Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M142.9 40.7L141.3 33.3H119.7V120.8H144.7V61.5C150.6 53.8 160.6 55.2 163.7 56.3V33.3C160.5 32.1 148.8 29.9 142.9 40.7Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M92.8999 11.6001L68.4999 16.8001L68.3999 96.9001C68.3999 111.7 79.4999 122.6 94.2999 122.6C102.5 122.6 108.5 121.1 111.8 119.3V99.0001C108.6 100.3 92.7999 104.9 92.7999 90.1001V54.6001H111.8V33.3001H92.7999L92.8999 11.6001Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M25.3 58.7001C25.3 54.8001 28.5 53.3001 33.8 53.3001C41.4 53.3001 51 55.6001 58.6 59.7001V36.2001C50.3 32.9001 42.1 31.6001 33.8 31.6001C13.5 31.6001 0 42.2001 0 59.9001C0 87.5001 38 83.1001 38 95.0001C38 99.6001 34 101.1 28.4 101.1C20.1 101.1 9.5 97.7001 1.1 93.1001V116.9C10.4 120.9 19.8 122.6 28.4 122.6C49.2 122.6 63.5 112.3 63.5 94.4001C63.4 64.6001 25.3 69.9001 25.3 58.7001Z\" fill=\"#533AFD\"/></svg>',\n )\n\nexport class VioProductDetail extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String, attribute: 'product-id' }) productId = ''\n @property({ type: Number, attribute: 'sponsor-id' }) sponsorId = 0\n /** Subscribe to `vio:product-click` on the document and auto-open. */\n @property({ type: Boolean, attribute: 'auto-open' }) autoOpen = true\n @property({ type: String }) currency = 'NOK'\n\n @state() private product: Product | null = null\n /**\n * The header: the seller's Company name (Settings → Company), not the\n * product's brand, which the body already shows (Angelo, 2026-10-08).\n * Asked on its own after the product; until it answers the header waits,\n * and if there is none it falls back to the brand.\n */\n @state() private sellerName: string | null = null\n @state() private sellerSettled = false\n @state() private isLoading = false\n @state() private fetchError = ''\n @state() private selectedOptions: SelectedOptions = {}\n @state() private quantity = 1\n @state() private activeImageIndex = 0\n @state() private adding = false\n /** Apple Pay actually usable (real Stripe + registered domain) — set on load. */\n @state() private applePayOk = false\n /** Payment method names enabled for the sponsor (backend-configured).\n * null = not loaded yet → all buy buttons render; [] = none enabled. */\n @state() private availableMethods: string[] | null = null\n @state() private vippsOfficial = false\n /** Race guard: only the latest fetch may write state (two quick taps on\n * different cards would otherwise let the slow response win). */\n private fetchSeq = 0\n /** Memoised option maps per variant object (recomputed per product). */\n private optMapCache = new WeakMap<object, { map: Record<string, string>; titleParts: string[] }>()\n /** Pre-prepared Apple Pay handle — show() fires synchronously on tap. */\n private applePayHandle: { show: () => Promise<void> } | null = null\n /** Keyboard and focus while open: Escape closes, Tab stays inside, focus returns to the opener. */\n private readonly dialogFocus = new DialogFocus({\n host: this,\n container: () => this.renderRoot.querySelector<HTMLElement>('.modal'),\n close: () => this.close(),\n })\n\n private boundProductClick = (e: Event): void => {\n if (!this.autoOpen) return\n const ev = e as CustomEvent<{ productId: string; sponsorId: string; currency?: string }>\n const productIdNum = parseInt(ev.detail.productId, 10)\n // Skip non-numeric IDs (affiliate products) — host handles those.\n if (Number.isNaN(productIdNum)) return\n const sponsorIdNum = parseInt(ev.detail.sponsorId, 10)\n if (Number.isNaN(sponsorIdNum) || sponsorIdNum <= 0) return\n this.productId = ev.detail.productId\n this.sponsorId = sponsorIdNum\n // The event may carry the page currency; otherwise use the global one.\n this.currency = ev.detail.currency || getGlobalCurrency()\n this.show()\n void this.fetchProduct()\n }\n\n static override styles = css`\n :host { display: contents; }\n\n .backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease;\n z-index: 1100;\n }\n :host([open]) .backdrop { opacity: 1; pointer-events: auto; }\n\n .modal {\n position: fixed;\n inset: 0;\n background: var(--vio-color-surface, #fff);\n transform: translateY(100%);\n transition: transform 0.35s cubic-bezier(0.32, 0.72, 0, 1);\n display: flex;\n flex-direction: column;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n z-index: 1101;\n overflow-y: auto;\n }\n :host([open]) .modal { transform: translateY(0); }\n /* Focus lands on the panel itself only as a fallback — no ring for it. */\n .modal:focus { outline: none; }\n\n .handle { display: none; }\n\n /* Mobile: bottom sheet (not fullscreen), rounded top, drag handle. */\n @media (max-width: 600px) {\n .modal {\n top: auto;\n height: 92vh;\n border-radius: var(--vio-radius-xl, 16px) var(--vio-radius-xl, 16px) 0 0;\n box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08);\n }\n .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n flex-shrink: 0;\n }\n .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: var(--vio-radius-sm, 2px);\n }\n }\n\n /* Desktop: right-side drawer (matches the cart/checkout), so the product\n shows \"al lado\" instead of a centered modal. Info stacks in one column. */\n @media (min-width: 601px) {\n .modal {\n inset: 0 0 0 auto;\n width: min(440px, 100%);\n max-width: 440px;\n border-radius: 0;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.1);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n }\n :host([open]) .modal { transform: translateX(0); }\n /* Content overrides are prefixed with .modal so they beat the base\n .body / .name / .gallery-main rules defined LATER in this stylesheet\n (equal specificity, later wins; the extra class tips the cascade). */\n .modal .body {\n max-width: none;\n grid-template-columns: 1fr;\n gap: 20px;\n padding: 20px 24px 40px;\n }\n .modal .name { font-size: 26px; line-height: 1.2; }\n .modal .gallery-main { width: 100%; }\n }\n\n .topbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px var(--vio-space-lg, 24px);\n position: sticky;\n top: 0;\n background: var(--vio-color-surface, #fff);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n z-index: 1;\n }\n .topbar-brand {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .close {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n line-height: 1;\n padding: 0;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .close:hover { color: var(--vio-color-text-secondary, #666); }\n\n .body {\n flex: 1;\n max-width: 1200px;\n width: 100%;\n margin: 0 auto;\n padding: 48px var(--vio-space-lg, 24px) 80px;\n box-sizing: border-box;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 64px;\n }\n @media (max-width: 800px) {\n .body { grid-template-columns: 1fr; gap: 32px; padding: 24px var(--vio-space-lg, 24px) 64px; }\n }\n\n /* Gallery */\n .gallery { display: flex; flex-direction: column; gap: 16px; }\n .gallery-main {\n aspect-ratio: 1;\n background: var(--vio-color-surface-muted, #f2f2f2);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n }\n .gallery-main img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n padding: 24px;\n box-sizing: border-box;\n }\n .gallery-thumbs {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n }\n .gallery-thumb {\n width: 72px;\n height: 72px;\n background: var(--vio-color-surface-muted, #f2f2f2);\n border: 1px solid transparent;\n cursor: pointer;\n padding: 0;\n overflow: hidden;\n }\n .gallery-thumb img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n padding: 6px;\n box-sizing: border-box;\n }\n .gallery-thumb.active { border-color: var(--vio-color-text, #0a0a0a); }\n\n /* Info column */\n .info { display: flex; flex-direction: column; gap: 24px; }\n .brand {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .name {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: clamp(28px, 4vw, 40px);\n font-weight: 400;\n line-height: 1.15;\n margin: 0;\n letter-spacing: -0.01em;\n }\n .price-row {\n display: flex;\n align-items: baseline;\n gap: 16px;\n }\n .price {\n font-size: 24px;\n font-weight: 700;\n }\n .compare-at {\n font-size: 16px;\n color: var(--vio-color-text-tertiary, #999);\n text-decoration: line-through;\n }\n .stock {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 500;\n }\n .stock.in-stock { color: #2e7d32; }\n .stock.low-stock { color: #ed6c02; }\n .stock.out-of-stock { color: var(--vio-color-text-tertiary, #999); }\n\n /* Option pickers */\n .option-group { display: flex; flex-direction: column; gap: 8px; }\n .option-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .option-values { display: flex; flex-wrap: wrap; gap: 8px; }\n .option-pill {\n padding: 10px 18px;\n background: #fff;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n cursor: pointer;\n font-family: inherit;\n font-size: 13px;\n font-weight: 500;\n color: inherit;\n transition: border-color 0.15s, background 0.15s;\n }\n .option-pill:hover { border-color: var(--vio-color-text, #0a0a0a); }\n .option-pill[aria-pressed='true'] {\n border-color: var(--vio-color-text, #0a0a0a);\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n }\n .option-pill.unavailable {\n opacity: 0.4;\n cursor: not-allowed;\n text-decoration: line-through;\n background: repeating-linear-gradient(-45deg, #fafafa, #fafafa 5px, #f0f0f0 5px, #f0f0f0 10px);\n }\n .option-pill.unavailable:hover { border-color: var(--vio-color-border, #e5e5e5); }\n\n /* Qty + CTA row */\n .qty-cta-row {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 16px;\n align-items: stretch;\n }\n .qty-stepper {\n display: flex;\n align-items: center;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n }\n .qty-btn {\n width: 44px;\n height: 56px;\n background: #fff;\n border: none;\n cursor: pointer;\n font-size: 18px;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .qty-btn:hover { background: var(--vio-color-surface-hover, #fafafa); }\n .qty-value {\n width: 40px;\n text-align: center;\n font-weight: 600;\n }\n .add-to-cart {\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n border: none;\n padding: 18px 24px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n transition: background 0.15s;\n }\n .add-to-cart:hover:not(:disabled) { background: #222; }\n .add-to-cart:disabled {\n background: var(--vio-color-text-tertiary, #999);\n cursor: not-allowed;\n }\n /* Klarna express button — sits full-width below the add-to-cart row. */\n /* Generic buy-now for the embedded checkouts, which have no branded\n express button of their own. */\n .buy-now {\n width: 100%;\n margin-top: 10px;\n padding: 14px 24px;\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n border: none;\n border-radius: var(--vio-radius-md, 4px);\n font-family: var(--vio-font-sans, inherit);\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 700;\n cursor: pointer;\n }\n .buy-now:hover:not(:disabled) { opacity: 0.9; }\n .buy-now:disabled { opacity: 0.5; cursor: not-allowed; }\n .buy-klarna {\n width: 100%;\n margin-top: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: #ffb3c7; /* Klarna pink */\n color: #0b051d;\n border: none;\n padding: 14px 24px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 700;\n cursor: pointer;\n font-family: inherit;\n transition: background 0.15s;\n }\n .buy-klarna .klarna-badge { height: 22px; width: auto; display: block; }\n .buy-klarna:hover:not(:disabled) { background: #ffa0b9; }\n .buy-klarna:disabled { opacity: 0.5; cursor: not-allowed; }\n .buy-applepay .ap-logo { width: 20px; height: 20px; }\n /* Vipps — brand orange buy button. */\n .buy-vipps {\n width: 100%;\n margin-top: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: #ff5b24;\n color: #fff;\n border: none;\n padding: 14px 24px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 700;\n cursor: pointer;\n font-family: inherit;\n transition: background 0.15s;\n }\n .buy-vipps .vipps-badge {\n font-size: 20px;\n font-weight: 800;\n letter-spacing: -0.02em;\n text-transform: none;\n }\n .buy-vipps:hover:not(:disabled) { background: #ec4f1c; }\n .buy-vipps:disabled { opacity: 0.5; cursor: not-allowed; }\n /* Vipps' own button (web component) — same slot, their drawing. */\n .buy-vipps-official { display: block; width: 100%; margin-top: 10px; cursor: pointer; }\n /* Apple Pay express button — black, per Apple's button guidelines. Only\n shown in Safari (canApplePay). The glyph is the Apple logo (Safari). */\n .buy-applepay {\n width: 100%;\n margin-top: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n background: #000;\n color: #fff;\n border: none;\n padding: 15px 24px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n letter-spacing: 0.01em;\n }\n .buy-applepay:hover:not(:disabled) { background: #1a1a1a; }\n .buy-applepay:disabled { opacity: 0.5; cursor: not-allowed; }\n\n /* Description */\n .description {\n font-size: 14px;\n line-height: 1.6;\n color: var(--vio-color-text-secondary, #444);\n margin-top: 8px;\n }\n .description-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n margin-bottom: 8px;\n }\n\n /* Skeleton loader: shimmer placeholders mirroring the product layout\n (image, brand, title, price, CTA) for a smooth load-in. */\n .skeleton {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 20px 24px 40px;\n }\n .skeleton > * {\n background: linear-gradient(\n 100deg,\n var(--vio-color-surface-muted, #f1f1f1) 30%,\n rgba(255, 255, 255, 0.65) 50%,\n var(--vio-color-surface-muted, #f1f1f1) 70%\n );\n background-size: 200% 100%;\n animation: vio-skeleton-shimmer 1.4s ease-in-out infinite;\n border-radius: var(--vio-radius-lg, 8px);\n }\n .sk-image { width: 100%; aspect-ratio: 1; border-radius: var(--vio-radius-lg, 12px); }\n .sk-line { height: 14px; }\n .sk-brand { width: 38%; height: 10px; margin-top: 6px; }\n .sk-title { width: 85%; height: 26px; }\n .sk-title-2 { width: 55%; height: 26px; }\n .sk-price { width: 30%; height: 20px; margin-top: 6px; }\n .sk-button { width: 100%; height: 54px; border-radius: 0; margin-top: 10px; }\n @keyframes vio-skeleton-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n @media (prefers-reduced-motion: reduce) {\n .skeleton > * {\n animation: none;\n background: var(--vio-color-surface-muted, #f1f1f1);\n }\n }\n .error {\n padding: 80px 24px;\n text-align: center;\n color: var(--vio-color-accent, #c14a3b);\n font-size: 14px;\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n void this.loadVippsButton()\n document.addEventListener('vio:product-click', this.boundProductClick)\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('vio:product-click', this.boundProductClick)\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('open')) this.dialogFocus.update(this.open)\n }\n\n show(): void { this.open = true }\n close(): void {\n this.open = false\n // Reset state after the slide-out animation completes.\n setTimeout(() => {\n if (!this.open) {\n this.product = null\n this.sellerName = null\n this.sellerSettled = false\n this.selectedOptions = {}\n this.quantity = 1\n this.activeImageIndex = 0\n this.fetchError = ''\n }\n }, 400)\n }\n\n private async fetchProduct(): Promise<void> {\n const productIdNum = parseInt(this.productId, 10)\n if (Number.isNaN(productIdNum) || !this.sponsorId) {\n this.product = null\n return\n }\n // Race guard: two quick taps on different cards → only the LATEST\n // request may write state (else the slow response paints product A\n // under product B's id).\n const seq = ++this.fetchSeq\n this.isLoading = true\n this.fetchError = ''\n this.sellerName = null\n this.sellerSettled = false\n\n // Fetch with retry: the commerce backend intermittently returns\n // \"Authentication failed\" under concurrent requests (many cards + the\n // detail firing at once). Retry a few times before surfacing the error.\n let products: Product[] | null = null\n let lastError: unknown = null\n for (let attempt = 0; attempt < 4; attempt++) {\n try {\n // Re-resolve the page currency on every fetch — the host may have\n // switched it since this element was mounted.\n const activeCurrency = getGlobalCurrency() || this.currency\n this.currency = activeCurrency\n const commerce = Vio.commerceFor(this.sponsorId)\n products = await commerce.channel.product.getByIds({\n product_ids: [productIdNum],\n currency: activeCurrency,\n image_size: 'large',\n })\n lastError = null\n break\n } catch (err) {\n lastError = err\n await new Promise((resolve) => setTimeout(resolve, 300))\n }\n }\n\n if (seq !== this.fetchSeq) return // superseded by a newer open\n\n if (lastError) {\n this.fetchError = lastError instanceof Error ? lastError.message : String(lastError)\n console.warn('[VioDetail] fetch failed after retries →', this.fetchError)\n this.isLoading = false\n return\n }\n\n this.optMapCache = new WeakMap()\n this.product = products?.[0] ?? null\n if (this.product) void this.loadSeller(productIdNum, seq)\n if (this.product) {\n // Analytics (auto): the detail opened with a concrete product.\n try {\n const price = Number(\n this.product.price?.amount_incl_taxes ?? this.product.price?.amount,\n )\n Vio.analytics.track('view_item', {\n context: {\n sponsorId: this.sponsorId > 0 ? Number(this.sponsorId) : undefined,\n componentTemplateId: 'product-detail',\n },\n commerce: {\n items: [\n {\n productId: this.product.id,\n name: this.product.title,\n price: Number.isFinite(price) ? price : undefined,\n },\n ],\n value: Number.isFinite(price) ? price : undefined,\n currency: this.product.price?.currency_code,\n },\n })\n } catch {\n /* never break rendering */\n }\n }\n if (!this.product) {\n // Empty response without an exception — never leave a blank open modal.\n this.fetchError = 'Fant ikke produktet.'\n }\n\n if (this.product) {\n // Auto-select the first value of each option (so qty + add fire correctly\n // even when the user doesn't actively pick).\n const initial: SelectedOptions = {}\n for (const opt of this.product.options ?? []) {\n const values = normalizeValues(opt.values)\n if (values.length > 0) initial[opt.name] = values[0]!\n }\n this.selectedOptions = initial\n // Pre-prepare Apple Pay so its sheet can open synchronously on tap\n // (Apple blocks it otherwise). The button only shows if Apple Pay actually\n // works (real Stripe account + domain registered for Apple Pay).\n void Vio.checkout\n .prepareApplePayFor(this.unitPrice * this.quantity, this.currency)\n .then((handle) => {\n this.applePayHandle = handle\n this.applePayOk = handle.available\n })\n .catch(() => {\n this.applePayHandle = null\n this.applePayOk = false\n })\n void this.loadAvailablePaymentMethods()\n }\n this.isLoading = false\n }\n\n /** Which buy buttons to render — backend-configured per sponsor. */\n private async loadAvailablePaymentMethods(): Promise<void> {\n const spId =\n this.sponsorId ||\n (globalThis as { __VIO_SPONSOR_ID__?: number }).__VIO_SPONSOR_ID__\n if (!spId) return\n try {\n const methods = (await Vio.checkout.getAvailablePaymentMethods(spId)) as\n | Array<{ name: string }>\n | unknown\n if (Array.isArray(methods)) {\n this.availableMethods = methods.map((m) => m.name)\n } else {\n this.availableMethods = null\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioProductDetail] Failed to load payment methods:', err)\n }\n // Unknown (not \"none\") — render everything rather than nothing.\n this.availableMethods = null\n }\n }\n\n /** Backend names arrive as e.g. \"Apple Pay\" — compare letters only. */\n private methodEnabled(...names: string[]): boolean {\n return isMethodEnabled(this.availableMethods, ...names)\n }\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n\n /**\n * Build an option-name → value map for a variant, from every shape the feeds\n * ship: option1/2/3 columns, options/selected_options/variant arrays, plain\n * object maps, and finally the title (value scan first, position fallback).\n */\n private getVariantOptionMap(\n v: ProductVariant | any,\n productOptions: ProductOption[] | undefined,\n ): { map: Record<string, string>; titleParts: string[] } {\n // Memoised per variant object — this runs per variant × option × render\n // (a 20-variant product recomputed it ~700× per render otherwise).\n if (v && typeof v === 'object') {\n const cached = this.optMapCache.get(v)\n if (cached) return cached\n }\n const map: Record<string, string> = {}\n if (!v) return { map, titleParts: [] }\n\n if (v.option1 != null && productOptions?.[0]) {\n map[productOptions[0].name.toLowerCase()] = String(v.option1).trim().toLowerCase()\n }\n if (v.option2 != null && productOptions?.[1]) {\n map[productOptions[1].name.toLowerCase()] = String(v.option2).trim().toLowerCase()\n }\n if (v.option3 != null && productOptions?.[2]) {\n map[productOptions[2].name.toLowerCase()] = String(v.option3).trim().toLowerCase()\n }\n\n const optArray = Array.isArray(v.options)\n ? v.options\n : Array.isArray(v.selected_options)\n ? v.selected_options\n : Array.isArray(v.variant)\n ? v.variant\n : null\n if (optArray) {\n for (const item of optArray) {\n const key = (item.name || item.option || '').trim().toLowerCase()\n const val = (item.value || '').trim().toLowerCase()\n if (key && val) map[key] = val\n }\n } else if (v.options && typeof v.options === 'object') {\n for (const [k, val] of Object.entries(v.options)) {\n map[k.trim().toLowerCase()] = String(val).trim().toLowerCase()\n }\n }\n\n const title = String(v.title ?? '').trim()\n const titleLower = title.toLowerCase()\n\n if (Array.isArray(productOptions)) {\n for (const opt of productOptions) {\n const key = opt.name.toLowerCase()\n if (!map[key]) {\n // Skip values that exist in ANOTHER option too — a title scan can't\n // tell which option \"30\" belongs to when Midje and Lengde both have\n // it, and guessing corrupts the whole map (wrong-variant purchases).\n // Ambiguous values are resolved by the positional fallback below.\n const rawValues = normalizeValues(opt.values).filter(\n (val) =>\n !productOptions.some(\n (other) =>\n other !== opt &&\n normalizeValues(other.values).some(\n (ov) => ov.trim().toLowerCase() === val.trim().toLowerCase(),\n ),\n ),\n )\n const sortedVals = [...rawValues].sort((a, b) => b.length - a.length)\n for (const valStr of sortedVals) {\n const valLower = valStr.trim().toLowerCase()\n const escaped = valLower.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const regex = new RegExp(`(?:^|[/|\\\\-,;\\\\s])${escaped}(?:$|[/|\\\\-,;\\\\s])`, 'i')\n if (regex.test(titleLower) || titleLower === valLower) {\n map[key] = valLower\n break\n }\n }\n }\n }\n }\n\n const titleParts = title\n .split(/\\s*[/|,]\\s*|\\s+-\\s+/)\n .map((s) => s.trim())\n .filter(Boolean)\n\n if (Array.isArray(productOptions)) {\n productOptions.forEach((opt, idx) => {\n const key = opt.name.toLowerCase()\n if (!map[key] && titleParts[idx] != null) {\n map[key] = titleParts[idx]!.toLowerCase()\n }\n })\n }\n\n const result = { map, titleParts }\n if (v && typeof v === 'object') this.optMapCache.set(v, result)\n return result\n }\n\n /** Option values a variant represents (map values ∪ title parts). */\n private variantOptionValues(v: ProductVariant): string[] {\n const { map, titleParts } = this.getVariantOptionMap(v, this.product?.options)\n const set = new Set(titleParts.map((s) => s.toLowerCase()))\n for (const val of Object.values(map)) set.add(val)\n return Array.from(set)\n }\n\n /** Does a variant part represent this option value? Exact match, plus a\n * whole-token match ONLY for numeric values (\"30\" matches \"30 ml\") — word\n * subsets of text values are not matches (\"Large\" must NOT match\n * \"Extra Large\"). */\n private partMatchesValue(part: string, value: string): boolean {\n if (!part || !value) return false\n const p = String(part).trim().toLowerCase()\n const v = String(value).trim().toLowerCase()\n if (p === v) return true\n if (!/^[\\d.,]+$/.test(v)) return false\n return p.split(/\\s+/).includes(v)\n }\n\n /** Does a variant satisfy every currently-selected option value? */\n private variantMatchesSelection(v: ProductVariant, selection: SelectedOptions): boolean {\n if (!v || !selection) return false\n const entries = Object.entries(selection)\n if (entries.length === 0) return true\n\n const { map, titleParts } = this.getVariantOptionMap(v, this.product?.options)\n const titlePartsLower = titleParts.map((t) => t.toLowerCase())\n\n return entries.every(([optName, val]) => {\n const key = optName.trim().toLowerCase()\n const targetVal = String(val).trim().toLowerCase()\n if (map[key]) {\n return this.partMatchesValue(map[key]!, targetVal)\n }\n return titlePartsLower.some((part) => this.partMatchesValue(part, targetVal))\n })\n }\n\n /** Sellable quantity for a variant, across the stock field zoo. Boolean\n * availability flags win; a numeric field wins next; `null` = the feed does\n * not report stock for this variant (callers fall back to product stock —\n * never assume \"in stock\" from absent data). */\n private getVariantQty(v: ProductVariant | any): number | null {\n if (!v) return 0\n if (v.available === false || v.in_stock === false || v.is_available === false) return 0\n if (v.available === true || v.in_stock === true || v.is_available === true) return 999\n\n const rawQty =\n v.quantity ?? v.inventory_quantity ?? v.stock ?? v.available_quantity ?? v.stock_quantity\n if (rawQty !== null && rawQty !== undefined && rawQty !== '') {\n const parsed = Number(rawQty)\n if (!Number.isNaN(parsed)) return parsed\n }\n\n return null\n }\n\n /** Variant stock with the product-level fallback applied (0 = not sellable). */\n private variantSellableQty(v: ProductVariant | any): number {\n const q = this.getVariantQty(v)\n if (q !== null) return q\n return this.product?.quantity ?? 0\n }\n\n /** Resolve the active variant: full in-stock match → full match → best score\n * (2 per mapped option match, 1 per title match, +0.5 if in stock). */\n private selectedVariant(): ProductVariant | null {\n if (!this.product || !Array.isArray(this.product.variants) || this.product.variants.length === 0) {\n return null\n }\n const sel = this.selectedOptions\n const entries = Object.entries(sel)\n if (entries.length === 0) return this.product.variants[0] ?? null\n\n const fullInStock = this.product.variants.find(\n (v) => this.variantMatchesSelection(v, sel) && this.variantSellableQty(v) > 0,\n )\n if (fullInStock) return fullInStock\n\n const full = this.product.variants.find((v) => this.variantMatchesSelection(v, sel))\n if (full) return full\n\n let bestVariant: ProductVariant | null = null\n let maxScore = -1\n\n for (const v of this.product.variants) {\n const { map, titleParts } = this.getVariantOptionMap(v, this.product?.options)\n const titlePartsLower = titleParts.map((t) => t.toLowerCase())\n let score = 0\n\n for (const [optName, val] of entries) {\n const key = optName.trim().toLowerCase()\n const targetVal = String(val).trim().toLowerCase()\n if (map[key] && this.partMatchesValue(map[key]!, targetVal)) {\n score += 2\n } else if (titlePartsLower.some((part) => this.partMatchesValue(part, targetVal))) {\n score += 1\n }\n }\n\n if (this.variantSellableQty(v) > 0) score += 0.5\n\n if (score > maxScore) {\n maxScore = score\n bestVariant = v\n }\n }\n\n return bestVariant ?? this.product.variants[0] ?? null\n }\n\n /** True if some in-stock variant carries this option value. */\n private isValueAvailable(optionName: string, value: string): boolean {\n if (!this.product || !Array.isArray(this.product.variants) || this.product.variants.length === 0) {\n return true\n }\n const valLower = String(value).trim().toLowerCase()\n const key = optionName.trim().toLowerCase()\n\n return this.product.variants.some((v) => {\n const { map, titleParts } = this.getVariantOptionMap(v, this.product?.options)\n if (this.variantSellableQty(v) <= 0) return false\n if (map[key]) return this.partMatchesValue(map[key]!, valLower)\n return titleParts.some((part) => this.partMatchesValue(part.toLowerCase(), valLower))\n })\n }\n\n private get unitPrice(): number {\n const v = this.selectedVariant()\n const price = v?.price ?? this.product?.price\n // Tax-inclusive is the consumer-facing price (NO convention); `amount` is the\n // fallback when the feed doesn't ship it.\n return price?.amount_incl_taxes ?? price?.amount ?? 0\n }\n\n private get compareAt(): number | null {\n const v = this.selectedVariant()\n const price = v?.price ?? this.product?.price\n return price?.compare_at_incl_taxes ?? price?.compare_at ?? null\n }\n\n private get availableQuantity(): number {\n const v = this.selectedVariant()\n if (v) return this.variantSellableQty(v)\n return this.product?.quantity ?? 0\n }\n\n private stockLabel(): { text: string; cls: 'in-stock' | 'low-stock' | 'out-of-stock' } {\n const qty = this.availableQuantity\n if (qty <= 0) return { text: 'Utsolgt', cls: 'out-of-stock' }\n if (qty <= 3) return { text: `Få igjen — ${qty} stk`, cls: 'low-stock' }\n return { text: 'På lager', cls: 'in-stock' }\n }\n\n /** Pick an option value. If the exact combination doesn't exist, jump to an\n * in-stock variant that carries the value and adopt its full option map\n * (keeps the selection always resolvable to a real variant). */\n private selectOption(optionName: string, value: string): void {\n const newSelection = { ...this.selectedOptions, [optionName]: value }\n const exactInStock = this.product?.variants?.find(\n (v) => this.variantMatchesSelection(v, newSelection) && this.variantSellableQty(v) > 0,\n )\n if (exactInStock) {\n this.selectedOptions = newSelection\n return\n }\n const exactAnyStock = this.product?.variants?.find((v) =>\n this.variantMatchesSelection(v, newSelection),\n )\n if (exactAnyStock) {\n this.selectedOptions = newSelection\n return\n }\n\n const valLower = String(value).trim().toLowerCase()\n const key = optionName.trim().toLowerCase()\n const anyInStockWithVal = this.product?.variants?.find((v) => {\n const { map, titleParts } = this.getVariantOptionMap(v, this.product?.options)\n if (this.variantSellableQty(v) <= 0) return false\n if (map[key]) return this.partMatchesValue(map[key]!, valLower)\n return titleParts.some((p) => this.partMatchesValue(p.toLowerCase(), valLower))\n })\n\n if (anyInStockWithVal) {\n const { map } = this.getVariantOptionMap(anyInStockWithVal, this.product?.options)\n const updated = { ...newSelection }\n for (const opt of this.product?.options ?? []) {\n const k = opt.name.toLowerCase()\n if (map[k]) {\n const optValues = normalizeValues(opt.values)\n const origCase = optValues.find((val) => val.toLowerCase() === map[k]) || map[k]!\n updated[opt.name] = origCase\n }\n }\n this.selectedOptions = updated\n } else {\n this.selectedOptions = newSelection\n }\n }\n\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n private allImages(): ProductImage[] {\n if (!this.product) return []\n const variantImages = this.selectedVariant()?.images ?? []\n if (variantImages.length > 0) return variantImages\n return this.product.images\n }\n\n private get activeImage(): ProductImage | undefined {\n return this.allImages()[this.activeImageIndex]\n }\n\n /** Add the current product + selected variant + qty to the cart. Returns the variant id used. */\n private addCurrentToCart(): number | undefined {\n if (!this.product) return undefined\n const variant = this.selectedVariant()\n const sponsor = Vio.bootstrapCache?.primarySponsor\n const secondaries = Vio.bootstrapCache?.secondarySponsors ?? []\n const sponsorName =\n sponsor?.id === this.sponsorId\n ? sponsor.name\n : secondaries.find((s) => s.id === this.sponsorId)?.name\n Vio.cart.addProduct({\n product: this.product,\n sponsorId: this.sponsorId,\n sponsorName,\n quantity: this.quantity,\n variantId: variant?.id,\n })\n return variant?.id\n }\n\n private async addToCart(): Promise<void> {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.adding = true\n try {\n const variantId = this.addCurrentToCart()\n this.dispatchEvent(\n new CustomEvent('vio:added-to-cart', {\n bubbles: true,\n composed: true,\n detail: {\n productId: this.product.id,\n sponsorId: this.sponsorId,\n quantity: this.quantity,\n variantId,\n },\n }),\n )\n this.close()\n } finally {\n this.adding = false\n }\n }\n\n /**\n * Express buy: add to cart, then open the checkout overlay with Klarna\n * preselected. The host app handles `vio:checkout-open` (same event the cart\n * uses) — the `paymentMethod` hint tells it to preselect Klarna so its widget\n * loads immediately. Reuses the working Klarna Payments flow (no express SDK).\n */\n private async buyWithKlarna(): Promise<void> {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.adding = true\n try {\n this.addCurrentToCart()\n this.close()\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: this.sponsorId, paymentMethod: 'klarna', express: true },\n }),\n )\n } finally {\n this.adding = false\n }\n }\n\n /** Buy with Vipps — opens the checkout with Vipps preselected. */\n /**\n * Buy now with an embedded checkout (Kustom, Qliro, Walley).\n *\n * Those three have no express path of their own, so the product page showed\n * a \"Kjøp nå\" for Apple Pay, Stripe, Klarna and Vipps and nothing at all for\n * them — the same structural gap the cart footer had. Opens the checkout\n * without preselecting: with a single method the checkout selects it itself,\n * with several the shopper picks.\n *\n * Like every other \"Kjøp nå\" here, it adds to the cart first — so a cart\n * that already had items buys those too. Isolating a single-product purchase\n * needs a checkout that is not bound to the sponsor's cart, which is a\n * separate piece of work and deliberately not done here.\n */\n private buyNow(): void {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.addCurrentToCart()\n this.close()\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: this.sponsorId, express: false },\n }),\n )\n }\n\n /**\n * Buy with Vipps — Express: the app opens with address and delivery\n * already there, nothing to fill in here (Vipps' own recommendation,\n * 2026-09-29). When this cart cannot have Express, or Vipps cannot be\n * started, the checkout opens with Vipps preselected, as before.\n */\n /** Vipps' own button when its script answers; our orange one otherwise. */\n private async loadVippsButton(): Promise<void> {\n this.vippsOfficial = await ensureVippsButton()\n }\n\n private buyWithVipps(): void {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.addCurrentToCart()\n this.close()\n void this.startVippsExpressOrCheckout()\n }\n\n private async startVippsExpressOrCheckout(): Promise<void> {\n let fallback = true\n try {\n // The seller may have switched Express off on its Vipps row: then the\n // button is an ordinary way into the checkout, with Vipps preselected.\n if (!(await Vio.checkout.getVippsExpressEnabled(this.sponsorId))) throw new Error('express off')\n const res = await Vio.checkout.startVippsExpress(this.sponsorId)\n // A redirect is on its way; anything else opens the checkout.\n fallback = !res?.payment_url\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioProductDetail] Vipps Express not started:', err)\n }\n }\n if (!fallback) return\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: this.sponsorId, paymentMethod: 'vipps', express: false },\n }),\n )\n }\n\n /** Buy with Stripe — opens the checkout with Stripe preselected. */\n private buyWithStripe(): void {\n if (!this.product || this.availableQuantity <= 0 || this.adding) return\n this.addCurrentToCart()\n this.close()\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: this.sponsorId, paymentMethod: 'stripe', express: false },\n }),\n )\n }\n\n /**\n * Express buy with Apple Pay. Runs synchronously inside the click so the\n * Apple Pay sheet keeps the user gesture: add to cart → open checkout (sets\n * state) → launch the sheet. On authorize, `payment-complete` drives the\n * confirmation drawer (same path as the in-checkout Apple Pay button).\n */\n private buyWithApplePay(): void {\n if (!this.product || this.availableQuantity <= 0 || !this.applePayHandle) return\n this.addCurrentToCart()\n try {\n Vio.checkout.open(this.sponsorId)\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioProductDetail] checkout open failed:', err)\n }\n return\n }\n // Fire the pre-prepared Apple Pay sheet SYNCHRONOUSLY (no await before it)\n // so it stays inside the tap gesture — Apple blocks the sheet otherwise.\n // On approval, show() dispatches payment-complete → the confirmation drawer.\n void this.applePayHandle.show()\n this.close()\n }\n\n /** The seller's Company name; the brand when there is none; nothing while asking. */\n private headerName(): string {\n if (this.sellerName) return this.sellerName\n return this.sellerSettled ? (this.product?.brand ?? '') : ''\n }\n\n private async loadSeller(productId: number, seq: number): Promise<void> {\n let name: string | null = null\n try {\n name = await Vio.commerceFor(this.sponsorId).channel.product.getSellerCompany(productId)\n } catch {\n name = null\n }\n if (seq !== this.fetchSeq) return // another product opened meanwhile\n this.sellerName = name\n this.sellerSettled = true\n }\n\n override render() {\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <div class=\"modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Produkt\" tabindex=\"-1\">\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"topbar\">\n <span class=\"topbar-brand\">${this.headerName()}</span>\n <button class=\"close\" @click=${this.close} aria-label=\"Lukk\">×</button>\n </div>\n\n ${this.renderBody()}\n </div>\n `\n }\n\n private renderBody() {\n if (this.isLoading && !this.product) {\n return html`\n <div class=\"skeleton\" role=\"status\" aria-busy=\"true\" aria-label=\"Laster produkt\">\n <div class=\"sk-image\"></div>\n <div class=\"sk-line sk-brand\"></div>\n <div class=\"sk-line sk-title\"></div>\n <div class=\"sk-line sk-title-2\"></div>\n <div class=\"sk-line sk-price\"></div>\n <div class=\"sk-button\"></div>\n </div>\n `\n }\n if (this.fetchError) {\n return html`<div class=\"error\">Kunne ikke laste produkt: ${this.fetchError}</div>`\n }\n if (!this.product) return html``\n\n const p = this.product\n const stock = this.stockLabel()\n const compare = this.compareAt\n const showCompare = compare !== null && compare > this.unitPrice\n const images = this.allImages()\n const activeImage = this.activeImage\n\n return html`\n <div class=\"body\">\n <div class=\"gallery\">\n <div class=\"gallery-main\">\n ${activeImage?.url\n ? html`<img src=${activeImage.url} alt=${p.title} />`\n : ''}\n </div>\n ${images.length > 1\n ? html`\n <div class=\"gallery-thumbs\">\n ${images.map(\n (img, idx) => html`\n <button\n class=\"gallery-thumb ${idx === this.activeImageIndex ? 'active' : ''}\"\n @click=${() => (this.activeImageIndex = idx)}\n aria-label=${`Bilde ${idx + 1}`}\n >\n <img src=${img.url} alt=\"\" />\n </button>\n `,\n )}\n </div>\n `\n : ''}\n </div>\n\n <div class=\"info\">\n ${p.brand ? html`<div class=\"brand\">${p.brand}</div>` : ''}\n <h2 class=\"name\">${p.title}</h2>\n\n <div class=\"price-row\">\n <span class=\"price\">${formatPrice(this.unitPrice, p.price.currency_code)}</span>\n ${showCompare\n ? html`<span class=\"compare-at\">${formatPrice(\n compare,\n p.price.currency_code,\n )}</span>`\n : ''}\n </div>\n\n <div class=\"stock ${stock.cls}\">${stock.text}</div>\n\n ${this.renderOptionPickers(p.options)}\n\n <div class=\"qty-cta-row\">\n <div class=\"qty-stepper\">\n <button\n class=\"qty-btn\"\n @click=${() => (this.quantity = Math.max(1, this.quantity - 1))}\n aria-label=\"Reduser antall\"\n >\n −\n </button>\n <span class=\"qty-value\">${this.quantity}</span>\n <button\n class=\"qty-btn\"\n @click=${() =>\n (this.quantity = Math.min(this.availableQuantity, this.quantity + 1))}\n aria-label=\"Øk antall\"\n ?disabled=${this.quantity >= this.availableQuantity}\n >\n +\n </button>\n </div>\n <button\n class=\"add-to-cart\"\n @click=${this.addToCart}\n ?disabled=${this.availableQuantity <= 0 || this.adding}\n >\n ${this.adding\n ? 'Legger til…'\n : this.availableQuantity <= 0\n ? 'Utsolgt'\n : 'Legg i handlekurv'}\n </button>\n </div>\n\n ${this.availableQuantity > 0 &&\n this.methodEnabled(...NO_EXPRESS_BUTTON_METHODS)\n ? html`\n <button\n class=\"buy-now\"\n @click=${this.buyNow}\n ?disabled=${this.adding}\n aria-label=\"Kjøp nå\"\n >\n Kjøp nå\n </button>\n `\n : ''}\n\n ${this.availableQuantity > 0 &&\n this.applePayOk &&\n this.methodEnabled('apple-pay', 'applepay')\n ? html`\n <button\n class=\"buy-applepay\"\n @click=${this.buyWithApplePay}\n ?disabled=${this.adding}\n aria-label=\"Kjøp nå med Apple Pay\"\n >\n <span>Kjøp nå med</span>\n <svg class=\"ap-logo\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>\n <span>Apple Pay</span>\n </button>\n `\n : ''}\n ${this.availableQuantity > 0 && this.methodEnabled('stripe')\n ? html`\n <button\n class=\"buy-stripe\"\n @click=${this.buyWithStripe}\n ?disabled=${this.adding}\n aria-label=\"Kjøp nå med Stripe\"\n style=\"width: 100%; margin-top: 10px; display: flex; align-items: center; justify-content: center; gap: 6px; background: #635bff; color: #fff; border: none; padding: 14px 24px; font-size: 15px; font-weight: 600; cursor: pointer; font-family: inherit;\"\n >\n <span>Kjøp nå med</span>\n <img\n src=${STRIPE_LOGO_SRC}\n style=\"height: 20px; display: block; filter: brightness(0) invert(1);\"\n alt=\"Stripe\"\n />\n </button>\n `\n : ''}\n ${this.availableQuantity > 0 && this.methodEnabled('klarna')\n ? html`\n <button\n class=\"buy-klarna\"\n @click=${this.buyWithKlarna}\n ?disabled=${this.adding}\n >\n <span>Kjøp nå med</span>\n <img\n class=\"klarna-badge\"\n src=\"https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg\"\n alt=\"Klarna\"\n />\n </button>\n `\n : ''}\n\n ${this.availableQuantity > 0 && this.methodEnabled('vipps')\n ? this.vippsOfficial\n ? html`\n <vipps-mobilepay-button\n class=\"buy-vipps-official\"\n brand=\"vipps\"\n language=\"no\"\n verb=\"buy\"\n variant=\"primary\"\n rounded=\"true\"\n stretched=\"true\"\n role=\"button\"\n aria-label=\"Kjøp nå med Vipps\"\n @click=${this.buyWithVipps}\n ></vipps-mobilepay-button>\n `\n : html`\n <button\n class=\"buy-vipps\"\n @click=${this.buyWithVipps}\n ?disabled=${this.adding}\n aria-label=\"Kjøp nå med Vipps\"\n >\n <span>Kjøp nå med</span>\n <span class=\"vipps-badge\">vipps</span>\n </button>\n `\n : ''}\n\n ${p.description\n ? html`\n <div>\n <div class=\"description-label\">Beskrivelse</div>\n <div class=\"description\">${this.stripHtml(p.description)}</div>\n </div>\n `\n : ''}\n </div>\n </div>\n `\n }\n\n private renderOptionPickers(options: ProductOption[]) {\n if (options.length === 0) return ''\n return html`${options.map((opt) => {\n const values = normalizeValues(opt.values)\n if (values.length === 0) return ''\n return html`\n <div class=\"option-group\">\n <div class=\"option-label\">${opt.name}</div>\n <div class=\"option-values\">\n ${values.map((val) => {\n const available = this.isValueAvailable(opt.name, val)\n const currentVal = this.selectedOptions[opt.name] ?? ''\n const isSelected =\n String(currentVal).trim().toLowerCase() === String(val).trim().toLowerCase()\n return html`\n <button\n class=\"option-pill ${available ? '' : 'unavailable'}\"\n @click=${() => this.selectOption(opt.name, val)}\n aria-pressed=${isSelected}\n ?disabled=${!available}\n title=${available ? '' : 'Utsolgt'}\n >\n ${val}\n </button>\n `\n })}\n </div>\n </div>\n `\n })}`\n }\n\n /** Best-effort HTML strip for description. */\n private stripHtml(html: string): string {\n return html\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .trim()\n }\n}\n\n/**\n * GraphQL sometimes returns `ProductOption.values` as a comma-joined string\n * (\"S,M,L,XL\") instead of an array. Normalize defensively.\n */\nfunction normalizeValues(raw: unknown): string[] {\n if (Array.isArray(raw)) {\n return raw.map((v) => String(v).trim()).filter((v) => v.length > 0)\n }\n if (typeof raw === 'string') {\n return raw\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0)\n }\n return []\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-product-detail': VioProductDetail\n }\n}\n","/**\n * <vio-cart> — slide-in cart drawer, reactively bound to `Vio.cart`.\n *\n * Subscribes to CartManager's `change` events on connect; auto-renders\n * the current multi-sponsor state. Express-only checkout: Apple Pay pays\n * the whole cart in-drawer; the Klarna button dispatches `vio:checkout-open`\n * (express) for the host to open <vio-checkout>.\n *\n * For the visual demo without `Vio.init`, the CartManager works standalone\n * (state is purely local + localStorage).\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { ensureVippsButton } from '../../core/checkout/payments/vipps-button.js'\nimport { Vio } from '../../core/client.js'\nimport { formatPrice } from '../../core/types.js'\nimport type { CartChangeDetail } from '../../core/cart/cart-manager.js'\nimport type { SponsorCartState } from '../../core/cart/types.js'\nimport { isMethodEnabled, isEmbeddedMethod } from '../../core/checkout/method-taxonomy.js'\nimport { DialogFocus } from '../dialog-focus.js'\n\n/** Stripe wordmark, inlined so the published article needs no asset path. */\nconst STRIPE_LOGO_SRC =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n '<svg width=\"360\" height=\"150\" viewBox=\"0 0 360 150\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M360 77.4001C360 51.8001 347.6 31.6001 323.9 31.6001C300.1 31.6001 285.7 51.8001 285.7 77.2001C285.7 107.3 302.7 122.5 327.1 122.5C339 122.5 348 119.8 354.8 116V96.0001C348 99.4001 340.2 101.5 330.3 101.5C320.6 101.5 312 98.1001 310.9 86.3001H359.8C359.8 85.0001 360 79.8001 360 77.4001ZM310.6 67.9001C310.6 56.6001 317.5 51.9001 323.8 51.9001C329.9 51.9001 336.4 56.6001 336.4 67.9001H310.6Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M247.1 31.6001C237.3 31.6001 231 36.2001 227.5 39.4001L226.2 33.2001H204.2V149.8L229.2 144.5L229.3 116.2C232.9 118.8 238.2 122.5 247 122.5C264.9 122.5 281.2 108.1 281.2 76.4001C281.1 47.4001 264.6 31.6001 247.1 31.6001ZM241.1 100.5C235.2 100.5 231.7 98.4001 229.3 95.8001L229.2 58.7001C231.8 55.8001 235.4 53.8001 241.1 53.8001C250.2 53.8001 256.5 64.0001 256.5 77.1001C256.5 90.5001 250.3 100.5 241.1 100.5Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M169.8 25.7L194.9 20.3V0L169.8 5.3V25.7Z\" fill=\"#533AFD\"/><path d=\"M194.9 33.3H169.8V120.8H194.9V33.3Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M142.9 40.7L141.3 33.3H119.7V120.8H144.7V61.5C150.6 53.8 160.6 55.2 163.7 56.3V33.3C160.5 32.1 148.8 29.9 142.9 40.7Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M92.8999 11.6001L68.4999 16.8001L68.3999 96.9001C68.3999 111.7 79.4999 122.6 94.2999 122.6C102.5 122.6 108.5 121.1 111.8 119.3V99.0001C108.6 100.3 92.7999 104.9 92.7999 90.1001V54.6001H111.8V33.3001H92.7999L92.8999 11.6001Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M25.3 58.7001C25.3 54.8001 28.5 53.3001 33.8 53.3001C41.4 53.3001 51 55.6001 58.6 59.7001V36.2001C50.3 32.9001 42.1 31.6001 33.8 31.6001C13.5 31.6001 0 42.2001 0 59.9001C0 87.5001 38 83.1001 38 95.0001C38 99.6001 34 101.1 28.4 101.1C20.1 101.1 9.5 97.7001 1.1 93.1001V116.9C10.4 120.9 19.8 122.6 28.4 122.6C49.2 122.6 63.5 112.3 63.5 94.4001C63.4 64.6001 25.3 69.9001 25.3 58.7001Z\" fill=\"#533AFD\"/></svg>',\n )\n\nexport class VioCart extends LitElement {\n /** Drawer visibility. Reflects to attribute for `:host([open])`. */\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String }) heading = 'Handlekurv'\n @property({ type: String, attribute: 'empty-label' }) emptyLabel = 'Handlekurven er tom'\n @property({ type: String, attribute: 'subtotal-label' }) subtotalLabel = 'Sum'\n\n @state() private carts: Map<number, SponsorCartState> = new Map()\n @state() private itemCount = 0\n /** True when Apple Pay is usable (Safari + device + Stripe configured). */\n @state() private applePayAvailable = false\n /** Payment method names enabled for the sponsor (backend-configured).\n * null = not loaded yet → all buttons render; [] = none enabled. */\n @state() private availableMethods: string[] | null = null\n @state() private vippsOfficial = false\n /** Whether the method lookup has been attempted — see boundOnCartChange. */\n private paymentMethodsAttempted = false\n /** Set after an Apple Pay express purchase — switches the drawer to the\n * confirmation screen (so the rest of the cart/checkout is not shown). */\n @state() private confirmedOrder: {\n items: Array<{\n brand?: string\n name: string\n quantity: number\n unitPrice: number\n currency: string\n }>\n total: number\n currency: string\n } | null = null\n\n /** Pre-resolved Apple Pay handle; `show()` fires the sheet synchronously. */\n private applePayHandle: { available: boolean; show: () => Promise<unknown> } | null = null\n /** Cart total Apple Pay was last prepared for (avoids redundant prep). */\n private preparedTotal = -1\n /** In-flight guard for loadAvailablePaymentMethods. */\n private loadingPaymentMethods = false\n /** Keyboard and focus while open: Escape closes, Tab stays inside, focus returns to the opener. */\n private readonly dialogFocus = new DialogFocus({\n host: this,\n container: () => this.renderRoot.querySelector<HTMLElement>('.drawer'),\n close: () => this.close(),\n })\n\n private boundOnCartChange = (e: Event): void => {\n const detail = (e as CustomEvent<CartChangeDetail>).detail\n this.carts = detail.cartsBySponsor\n this.itemCount = detail.itemCount\n // Cart changes fire often, so ask ONCE. The condition is \"not attempted\",\n // not \"availableMethods is null\": null also means \"asked and failed\", and\n // retrying on every cart mutation turns one bad response into a refetch\n // per click for the rest of the session.\n if (!this.paymentMethodsAttempted) {\n this.paymentMethodsAttempted = true\n void this.loadAvailablePaymentMethods()\n }\n }\n\n static override styles = css`\n :host { display: contents; }\n\n .backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease;\n z-index: 998;\n }\n :host([open]) .backdrop { opacity: 1; pointer-events: auto; }\n\n .drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(440px, 100%);\n background: var(--vio-color-surface, #fff);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n display: flex;\n flex-direction: column;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n z-index: 999;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.06);\n }\n :host([open]) .drawer { transform: translateX(0); }\n /* Focus lands on the drawer itself only as a fallback — no ring for it. */\n .drawer:focus { outline: none; }\n\n .handle { display: none; }\n\n /* Mobile: bottom sheet (slide up, rounded top, drag handle). */\n @media (max-width: 600px) {\n .drawer {\n top: auto;\n right: 0;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 88vh;\n border-radius: var(--vio-radius-xl, 16px) var(--vio-radius-xl, 16px) 0 0;\n transform: translateY(100%);\n box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08);\n }\n :host([open]) .drawer { transform: translateY(0); }\n .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n }\n .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: var(--vio-radius-sm, 2px);\n }\n }\n\n .header {\n padding: var(--vio-space-lg, 24px);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0;\n }\n .close {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n line-height: 1;\n padding: 0;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .close:hover { color: var(--vio-color-text-secondary, #666); }\n\n .body {\n flex: 1;\n overflow-y: auto;\n }\n\n .sponsor-group {\n padding: var(--vio-space-md, 16px) var(--vio-space-lg, 24px);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n }\n .sponsor-group:last-child { border-bottom: none; }\n .sponsor-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-tertiary, #999);\n font-weight: 500;\n margin: 0 0 var(--vio-space-md, 16px);\n }\n\n .item {\n display: grid;\n grid-template-columns: 80px 1fr;\n gap: var(--vio-space-md, 16px);\n padding: var(--vio-space-md, 16px) 0;\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n }\n .item:last-child { border-bottom: none; }\n .item-image {\n aspect-ratio: 1;\n background: var(--vio-color-surface-muted, #f2f2f2);\n overflow: hidden;\n }\n .item-image img { width: 100%; height: 100%; object-fit: cover; display: block; }\n .item-brand {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .item-name {\n font-size: 14px;\n margin: 4px 0;\n font-weight: 500;\n line-height: 1.3;\n }\n .item-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: var(--vio-space-sm, 8px);\n }\n .item-qty {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--vio-color-text-secondary, #666);\n font-size: 12px;\n }\n .qty-btn {\n width: 24px;\n height: 24px;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n background: #fff;\n border-radius: var(--vio-radius-sm, 2px);\n cursor: pointer;\n font-size: 12px;\n color: var(--vio-color-text, #0a0a0a);\n line-height: 1;\n padding: 0;\n font-family: inherit;\n }\n .qty-btn:hover { border-color: var(--vio-color-text, #0a0a0a); }\n .item-price { font-size: 14px; font-weight: 700; }\n\n .empty {\n padding: 80px var(--vio-space-lg, 24px);\n text-align: center;\n color: var(--vio-color-text-secondary, #666);\n font-size: 14px;\n }\n\n /* Always present: the express buttons below are shortcuts, not the only\n way out of the cart. Without this a channel offering only an embedded\n checkout (Kustom, Qliro, Walley) had no button at all. */\n .checkout-btn {\n width: 100%;\n padding: 14px;\n margin-bottom: var(--vio-space-sm, 8px);\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n border: none;\n border-radius: var(--vio-radius-md, 4px);\n font-family: var(--vio-font-sans, inherit);\n font-size: var(--vio-size-sm, 14px);\n font-weight: 600;\n cursor: pointer;\n }\n .checkout-btn:hover { opacity: 0.9; }\n .footer {\n padding: var(--vio-space-lg, 24px);\n border-top: 1px solid var(--vio-color-border, #e5e5e5);\n background: var(--vio-color-surface, #fff);\n }\n .subtotal-row {\n display: flex;\n justify-content: space-between;\n margin-bottom: var(--vio-space-md, 16px);\n font-size: 14px;\n }\n .subtotal-label { color: var(--vio-color-text-secondary, #666); }\n .subtotal-value { font-weight: 700; font-size: 16px; }\n\n /* Apple Pay express — pay the whole cart directly. */\n .applepay-btn {\n width: 100%;\n padding: 15px;\n margin-bottom: 10px;\n background: #000;\n color: #fff;\n border: none;\n border-radius: var(--vio-radius-lg, 8px);\n font-size: 19px;\n font-weight: 500;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n transition: opacity 0.15s;\n }\n .applepay-btn:hover { opacity: 0.86; }\n .applepay-btn .ap-logo { width: 20px; height: 20px; }\n /* Klarna express — pink brand button, same express row as Apple Pay. */\n .klarna-btn {\n width: 100%;\n padding: 15px;\n margin-bottom: 10px;\n background: #ffb3c7;\n color: #0a0a0a;\n border: none;\n border-radius: var(--vio-radius-lg, 8px);\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n transition: background 0.15s;\n }\n .klarna-btn:hover { background: #ffa1ba; }\n .klarna-btn .klarna-logo { height: 15px; width: auto; display: inline-block; }\n /* Vipps — brand orange button, same express row. */\n .vipps-btn {\n width: 100%;\n padding: 15px;\n margin-bottom: 10px;\n background: #ff5b24;\n color: #fff;\n border: none;\n border-radius: var(--vio-radius-lg, 8px);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n transition: background 0.15s;\n }\n .vipps-btn:hover { background: #ec4f1c; }\n .vipps-btn-official { display: block; width: 100%; margin-bottom: 10px; cursor: pointer; }\n .vipps-btn .vipps-logo {\n font-size: 20px;\n font-weight: 800;\n letter-spacing: -0.02em;\n line-height: 1;\n }\n /* Stripe — brand blurple button, same express row. */\n .stripe-btn {\n width: 100%;\n padding: 15px;\n margin-bottom: 10px;\n background: #635bff;\n color: #fff;\n border: none;\n border-radius: var(--vio-radius-lg, 8px);\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n transition: background 0.15s;\n }\n .stripe-btn:hover { background: #5248ff; }\n .stripe-btn .stripe-logo { height: 20px; width: auto; display: inline-block; filter: brightness(0) invert(1); }\n\n /* In-drawer confirmation after Apple Pay (nothing else is shown). */\n .confirm {\n padding: 56px var(--vio-space-lg, 24px) 40px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n .confirm-check {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: #0a8a3f;\n color: #fff;\n font-size: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 20px;\n }\n .confirm h3 {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0 0 8px;\n }\n .confirm p {\n color: var(--vio-color-text-secondary, #666);\n font-size: 14px;\n margin: 0 0 24px;\n }\n .confirm-summary {\n width: 100%;\n border-top: 1px solid var(--vio-color-border, #e5e5e5);\n padding-top: 16px;\n margin-bottom: 28px;\n text-align: left;\n }\n .order-row {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 14px;\n margin-bottom: 10px;\n color: var(--vio-color-text, #0a0a0a);\n }\n .order-row.total {\n border-top: 1px solid var(--vio-color-border, #e5e5e5);\n padding-top: 12px;\n margin-top: 4px;\n font-weight: 700;\n }\n .confirm-close {\n width: 100%;\n padding: 16px;\n background: var(--vio-color-text, #0a0a0a);\n color: #fff;\n border: none;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n cursor: pointer;\n font-weight: 600;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n }\n .confirm-close:hover { background: #222; }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n void this.loadVippsButton()\n // Seed initial state from manager.\n this.carts = Vio.cart.getAllCarts()\n this.itemCount = Vio.cart.itemCount\n Vio.cart.addEventListener('change', this.boundOnCartChange)\n void this.loadAvailablePaymentMethods()\n }\n\n override disconnectedCallback(): void {\n Vio.cart.removeEventListener('change', this.boundOnCartChange)\n super.disconnectedCallback()\n }\n\n close(): void { this.open = false }\n show(): void {\n // `vio:open-cart` es un COMANDO (\"abrí el carrito\") y varios hosts lo\n // escuchan para llamar a este show() — Vev entre ellos. Si show()\n // reemitiera el mismo evento siempre, se arma un lazo: comando → show →\n // comando → … Cada vuelta disparaba un `view_cart` (24.172 en 12\n // sesiones el 2026-09-07 en staging, ~2.000 por sesión).\n //\n // Notificar solo en la TRANSICIÓN cerrado→abierto rompe el lazo: la\n // segunda vuelta encuentra `open` en true y no reemite.\n const wasClosed = !this.open\n this.open = true\n if (wasClosed) {\n // Hook de analytics/host — `view_cart` en cualquier host, no solo Vev.\n this.dispatchEvent(\n new CustomEvent('vio:open-cart', { bubbles: true, composed: true }),\n )\n }\n void this.loadAvailablePaymentMethods()\n }\n\n /** Which payment buttons to render — backend-configured per sponsor.\n * Falls back to showing everything if the query fails or none is set. */\n private async loadAvailablePaymentMethods(): Promise<void> {\n if (this.loadingPaymentMethods) return\n this.loadingPaymentMethods = true\n const firstSponsorId =\n [...this.carts.keys()][0] ??\n (globalThis as { __VIO_SPONSOR_ID__?: number }).__VIO_SPONSOR_ID__\n if (firstSponsorId === undefined) {\n this.loadingPaymentMethods = false\n return\n }\n try {\n const methods = (await Vio.checkout.getAvailablePaymentMethods(firstSponsorId)) as\n | Array<{ name: string }>\n | unknown\n if (Array.isArray(methods)) {\n this.availableMethods = methods.map((m) => m.name)\n } else {\n this.availableMethods = null\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCart] Failed to load payment methods:', err)\n }\n // Unknown (not \"none\") — render everything rather than nothing.\n this.availableMethods = null\n } finally {\n this.loadingPaymentMethods = false\n }\n }\n\n /** Backend names arrive as e.g. \"Apple Pay\" — compare letters only. */\n private methodEnabled(...names: string[]): boolean {\n return isMethodEnabled(this.availableMethods, ...names)\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('open')) this.dialogFocus.update(this.open)\n // Fresh open → drop any previous confirmation, force an Apple Pay re-prep.\n if (changed.has('open') && this.open) {\n this.confirmedOrder = null\n this.preparedTotal = -1\n }\n // (Re)prepare Apple Pay whenever the open cart's total changes.\n if (this.open && this.itemCount > 0) {\n const total = this.totalAcrossSponsors\n if (total !== this.preparedTotal) {\n this.preparedTotal = total\n void this.refreshApplePay(total)\n }\n }\n }\n\n /** Pre-resolve the Apple Pay sheet for the current cart total. */\n private async refreshApplePay(total: number): Promise<void> {\n if (total <= 0) {\n this.applePayHandle = null\n this.applePayAvailable = false\n return\n }\n try {\n const handle = await Vio.checkout.prepareApplePayExpress(total, this.primaryCurrency)\n // A newer prep may have superseded this one while awaiting.\n if (this.preparedTotal !== total) return\n this.applePayHandle = handle\n this.applePayAvailable = handle.available\n } catch {\n this.applePayHandle = null\n this.applePayAvailable = false\n }\n }\n\n /** Apple Pay express — pay the whole cart, then show the confirmation. */\n private onApplePay(): void {\n const handle = this.applePayHandle\n if (!handle || !handle.available || this.itemCount === 0) return\n // Snapshot items + total BEFORE clearing the cart (confirmation needs them).\n const snapshot = this.buildConfirmation()\n // Fire the sheet synchronously inside the tap (Apple gesture rule); handle\n // the result asynchronously.\n void handle.show().then((result) => {\n if (!result) return // user cancelled / failed — keep the cart as-is\n this.confirmedOrder = snapshot\n for (const sponsorId of [...this.carts.keys()]) {\n Vio.cart.clearSponsorCart(sponsorId)\n }\n this.dispatchEvent(\n new CustomEvent('vio:payment-success', {\n bubbles: true,\n composed: true,\n detail: { method: 'apple-pay', result },\n }),\n )\n })\n }\n\n private buildConfirmation(): NonNullable<VioCart['confirmedOrder']> {\n const items: NonNullable<VioCart['confirmedOrder']>['items'] = []\n for (const cart of this.carts.values()) {\n for (const it of cart.items) {\n items.push({\n brand: it.brand,\n name: it.name,\n quantity: it.quantity,\n unitPrice: it.unitPrice,\n currency: it.currency,\n })\n }\n }\n return { items, total: this.totalAcrossSponsors, currency: this.primaryCurrency }\n }\n\n private closeConfirmation(): void {\n this.confirmedOrder = null\n this.close()\n }\n\n /** Klarna express — opens the side-drawer Klarna checkout for the whole cart,\n * skipping the address form (leveringsadresse) and method picker\n * (betalingsmetode). The host's checkout-open handler closes this cart and\n * opens <vio-checkout> in express mode with Klarna preselected. */\n private onKlarnaExpress(): void {\n if (this.itemCount === 0) return\n const firstSponsorId = [...this.carts.keys()][0]\n if (firstSponsorId === undefined) return\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: firstSponsorId, paymentMethod: 'klarna', express: true },\n }),\n )\n }\n\n /** Vipps — opens the checkout with Vipps preselected. */\n /**\n * Open the checkout without preselecting a method.\n *\n * The footer used to be express-only — Apple Pay, Stripe, Klarna, Vipps —\n * so a channel offering just an embedded checkout (Kustom, Qliro, Walley)\n * had NO button at all and the cart was a dead end. Even with an express\n * method present the others were unreachable from here.\n */\n private onCheckout(): void {\n if (this.itemCount === 0) return\n const firstSponsorId = [...this.carts.keys()][0]\n if (firstSponsorId === undefined) return\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: firstSponsorId, express: false },\n }),\n )\n }\n\n /**\n * Vipps — Express: the app collects address and delivery, so the cart\n * goes straight to Vipps. When this cart cannot have Express (several\n * suppliers, digital goods, no rate) or Vipps cannot be started, the\n * checkout opens with Vipps preselected, as before.\n */\n private onVipps(): void {\n if (this.itemCount === 0) return\n const firstSponsorId = [...this.carts.keys()][0]\n if (firstSponsorId === undefined) return\n void this.startVippsExpressOrCheckout(firstSponsorId)\n }\n\n /** Vipps' own button when its script answers; our orange one otherwise. */\n private async loadVippsButton(): Promise<void> {\n this.vippsOfficial = await ensureVippsButton()\n }\n\n private async startVippsExpressOrCheckout(sponsorId: number): Promise<void> {\n let fallback = true\n try {\n // The seller may have switched Express off on its Vipps row: then the\n // button is an ordinary way into the checkout, with Vipps preselected.\n if (!(await Vio.checkout.getVippsExpressEnabled(sponsorId))) throw new Error('express off')\n const res = await Vio.checkout.startVippsExpress(sponsorId)\n fallback = !res?.payment_url\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCart] Vipps Express not started:', err)\n }\n }\n if (!fallback) return\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId, paymentMethod: 'vipps', express: false },\n }),\n )\n }\n\n /** Stripe — opens the checkout with Stripe preselected. */\n private onStripe(): void {\n if (this.itemCount === 0) return\n const firstSponsorId = [...this.carts.keys()][0]\n if (firstSponsorId === undefined) return\n this.dispatchEvent(\n new CustomEvent('vio:checkout-open', {\n bubbles: true,\n composed: true,\n detail: { sponsorId: firstSponsorId, paymentMethod: 'stripe', express: false },\n }),\n )\n }\n\n private get totalAcrossSponsors(): number {\n let sum = 0\n for (const cart of this.carts.values()) {\n for (const item of cart.items) sum += item.unitPrice * item.quantity\n }\n return sum\n }\n\n private get primaryCurrency(): string {\n for (const cart of this.carts.values()) return cart.currency\n return 'NOK'\n }\n\n private onIncrement(item: { id: string; sponsorId: number; quantity: number }): void {\n Vio.cart.updateQuantity(item.id, item.sponsorId, item.quantity + 1)\n }\n\n private onDecrement(item: { id: string; sponsorId: number; quantity: number }): void {\n Vio.cart.updateQuantity(item.id, item.sponsorId, item.quantity - 1)\n }\n\n private onRemove(item: { id: string; sponsorId: number }): void {\n Vio.cart.removeItem(item.id, item.sponsorId)\n }\n\n override render() {\n const isEmpty = this.itemCount === 0\n const sponsorCarts = [...this.carts.values()].filter((c) => c.items.length > 0)\n\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <aside class=\"drawer\" role=\"dialog\" aria-modal=\"true\" aria-label=${this.heading} tabindex=\"-1\">\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"header\">\n <h2 class=\"heading\">${this.confirmedOrder ? 'Takk!' : this.heading}</h2>\n <button class=\"close\" @click=${this.close} aria-label=\"Lukk\">×</button>\n </div>\n\n ${this.confirmedOrder\n ? this.renderConfirmation()\n : isEmpty\n ? html`<div class=\"empty\">${this.emptyLabel}</div>`\n : html`\n <div class=\"body\">\n ${sponsorCarts.map(\n (cart) => html`\n <div class=\"sponsor-group\">\n ${cart.sponsorName\n ? html`<div class=\"sponsor-label\">${cart.sponsorName}</div>`\n : ''}\n ${cart.items.map(\n (item) => html`\n <div class=\"item\">\n <div class=\"item-image\">\n ${item.imageUrl\n ? html`<img src=${item.imageUrl} alt=${item.name} />`\n : ''}\n </div>\n <div>\n <div class=\"item-brand\">${item.brand}</div>\n <div class=\"item-name\">${item.name}</div>\n <div class=\"item-row\">\n <span class=\"item-qty\">\n <button\n class=\"qty-btn\"\n @click=${() => this.onDecrement(item)}\n aria-label=\"Reduser\"\n >\n −\n </button>\n ${item.quantity}\n <button\n class=\"qty-btn\"\n @click=${() => this.onIncrement(item)}\n aria-label=\"Øk\"\n >\n +\n </button>\n <button\n class=\"qty-btn\"\n @click=${() => this.onRemove(item)}\n aria-label=\"Fjern\"\n style=\"margin-left: 8px;\"\n >\n ×\n </button>\n </span>\n <span class=\"item-price\">\n ${formatPrice(\n item.unitPrice * item.quantity,\n item.currency,\n )}\n </span>\n </div>\n </div>\n </div>\n `,\n )}\n </div>\n `,\n )}\n </div>\n <div class=\"footer\">\n <div class=\"subtotal-row\">\n <span class=\"subtotal-label\">${this.subtotalLabel}</span>\n <span class=\"subtotal-value\">\n ${formatPrice(this.totalAcrossSponsors, this.primaryCurrency)}\n </span>\n </div>\n <button\n class=\"checkout-btn\"\n @click=${this.onCheckout}\n aria-label=\"Til kassen\"\n >\n Til kassen\n </button>\n ${this.methodEnabled('apple-pay') && this.applePayAvailable\n ? html`\n <button\n class=\"applepay-btn\"\n @click=${this.onApplePay}\n aria-label=\"Betal med Apple Pay\"\n >\n <svg class=\"ap-logo\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>\n Apple Pay\n </button>\n `\n : ''}\n ${this.methodEnabled('stripe')\n ? html`\n <button\n class=\"stripe-btn\"\n @click=${this.onStripe}\n aria-label=\"Betal med Stripe\"\n >\n <img class=\"stripe-logo\" src=${STRIPE_LOGO_SRC} alt=\"Stripe\" />\n </button>\n `\n : ''}\n ${this.methodEnabled('klarna')\n ? html`\n <button\n class=\"klarna-btn\"\n @click=${this.onKlarnaExpress}\n aria-label=\"Betal med Klarna\"\n >\n Kjøp med\n <img\n class=\"klarna-logo\"\n src=\"https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg\"\n alt=\"Klarna\"\n />\n </button>\n `\n : ''}\n ${this.methodEnabled('vipps')\n ? this.vippsOfficial\n ? html`\n <vipps-mobilepay-button\n class=\"vipps-btn-official\"\n brand=\"vipps\"\n language=\"no\"\n verb=\"pay\"\n variant=\"primary\"\n rounded=\"true\"\n stretched=\"true\"\n role=\"button\"\n aria-label=\"Betal med Vipps\"\n @click=${this.onVipps}\n ></vipps-mobilepay-button>\n `\n : html`\n <button\n class=\"vipps-btn\"\n @click=${this.onVipps}\n aria-label=\"Betal med Vipps\"\n >\n <span class=\"vipps-logo\">vipps</span>\n </button>\n `\n : ''}\n </div>\n `}\n </aside>\n `\n }\n\n private renderConfirmation() {\n const o = this.confirmedOrder\n if (!o) return html``\n return html`\n <div class=\"confirm\">\n <div class=\"confirm-check\" aria-hidden=\"true\">✓</div>\n <h3>Takk for handelen!</h3>\n <p>Betaling med Apple Pay er bekreftet.</p>\n <div class=\"confirm-summary\">\n ${o.items.map(\n (it) => html`\n <div class=\"order-row\">\n <span>${it.brand ? `${it.brand} ` : ''}${it.name} ×${it.quantity}</span>\n <span>${formatPrice(it.unitPrice * it.quantity, it.currency)}</span>\n </div>\n `,\n )}\n <div class=\"order-row total\">\n <span>Totalt</span>\n <span>${formatPrice(o.total, o.currency)}</span>\n </div>\n </div>\n <button class=\"confirm-close\" @click=${this.closeConfirmation}>Lukk</button>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-cart': VioCart\n }\n}\n","/**\n * What the shopper reads when a payment cannot be STARTED.\n *\n * Until 2026-10-09 the gateway's own text went straight to the screen:\n * \"Kunne ikke starte Vipps-betaling: Payment Vipps not initialize: [vipps]\n * amount must be a positive integer in minor units, got 0\" (a cart emptied\n * from another tab), or \"Kunne ikke laste betaling: Payment Stripe not intent\n * execute: : Cannot read properties of undefined (reading 'id')\". The known\n * causes map to a short Norwegian sentence that says what to do; anything\n * else gets a generic one. The raw text is for `console.warn`, never the\n * panel.\n *\n * Return-flow messages (\"Betalingen ble avbrutt eller feilet…\", the\n * unverified-return text) are not this: they are already written for the\n * shopper and stay where they are.\n */\n\n/** The cart has no lines: the gateway refuses a zero amount. */\nexport const EMPTY_CART_MESSAGE = 'Handlekurven er tom. Legg til et produkt og prøv igjen.'\n/** A newer checkout replaced this one — the cart changed in another tab. */\nexport const CART_CHANGED_MESSAGE =\n 'Handlekurven ble endret i en annen fane. Last siden på nytt og prøv igjen.'\n/** This cart was already paid for. */\nexport const CART_PAID_MESSAGE = 'Denne handlekurven er allerede betalt. Start en ny handlekurv.'\n/** Everything else. */\nexport const PAYMENT_START_FAILED_MESSAGE =\n 'Betalingen kunne ikke startes. Prøv igjen, eller velg en annen betalingsmåte.'\n\n/** The one backend message that is already written for the shopper. */\nconst SHIPS_APART = 'kan ikke sendes sammen'\n\n/**\n * The sentence to show for a payment that could not start.\n *\n * `raw` is the gateway's or the backend's text, as thrown. `method` is the\n * Vio payment method the start was for (`stripe`, `vipps`, …): the texts are\n * the same for every method today, it is here so a call site says which one\n * failed and a method-specific text can be added without touching them.\n */\nexport function friendlyPaymentError(raw: string, method: string): string {\n void method\n const text = String(raw ?? '')\n const lower = text.toLowerCase()\n if (lower.includes('got 0') || lower.includes('amount must be a positive')) {\n return EMPTY_CART_MESSAGE\n }\n if (lower.includes('replaced by a newer') || text.includes('CHECKOUT_SUPERSEDED')) {\n return CART_CHANGED_MESSAGE\n }\n if (lower.includes('already been paid') || text.includes('CART_ALREADY_PAID')) {\n return CART_PAID_MESSAGE\n }\n if (text.includes(SHIPS_APART)) return norwegianSentence(text)\n return PAYMENT_START_FAILED_MESSAGE\n}\n\n/**\n * The Norwegian sentence inside a gateway message, without the technical\n * prefix in front of it (\"Payment Vipps not initialize: Produktene …\").\n */\nfunction norwegianSentence(text: string): string {\n const at = text.indexOf(SHIPS_APART)\n const prefixEnd = text.lastIndexOf(': ', at)\n return (prefixEnd === -1 ? text : text.slice(prefixEnd + 2)).trim()\n}\n\n/** A thrown value as text — what the call sites used to build the message from. */\nexport function errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n","/**\n * <vio-checkout> — full-screen native checkout overlay, reactively bound\n * to `Vio.checkout` (CheckoutManager).\n *\n * Subscribes to checkout state on connect, renders address form + payment\n * method buttons + order summary. Apple Pay is auto-detected via Stripe\n * Payment Request — button is hidden when unavailable (e.g. Chrome on\n * non-Apple device, or no Stripe key configured).\n */\n\nimport { LitElement, css, html } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { ensureVippsButton } from '../../core/checkout/payments/vipps-button.js'\nimport { Vio } from '../../core/client.js'\nimport { formatPrice, getGlobalCurrency } from '../../core/types.js'\nimport type { CartLineItem } from '../../core/cart/types.js'\nimport type {\n CheckoutChangeDetail,\n KlarnaPaymentsHandle,\n KlarnaShippingOption,\n} from '../../core/checkout/checkout-manager.js'\nimport type {\n CheckoutAddress,\n CheckoutState,\n PaymentMethod,\n} from '../../core/checkout/types.js'\nimport {\n isMethodEnabled,\n isEmbeddedMethod,\n isFormFirstWidgetMethod,\n collectsOwnAddress,\n} from '../../core/checkout/method-taxonomy.js'\nimport { KUSTOM_RETURN_QUERY_KEYS, kustomReturnOutcome } from '../../core/checkout/payments/kustom.js'\nimport {\n nexiReturnPaymentId,\n readNexiPending,\n type NexiShippingUpdate,\n} from '../../core/checkout/payments/nexi.js'\nimport {\n ADYEN_RETURN_METHOD,\n ADYEN_RETURN_QUERY_KEYS,\n AdyenOriginError,\n adyenReturnOutcome,\n adyenReturnParams,\n type AdyenPayment,\n type AdyenSession,\n} from '../../core/checkout/payments/adyen.js'\nimport type { StripeElementHandle } from '../../core/checkout/payments/stripe-embedded.js'\nimport { DialogFocus } from '../dialog-focus.js'\nimport { errorText, friendlyPaymentError, CART_PAID_MESSAGE } from '../checkout-errors.js'\n\n/** Stripe wordmark, inlined so the published article needs no asset path.\n * (Duplicated in vio-cart.ts — tiny constant, avoids a shared-module dance.) */\nconst STRIPE_LOGO_SRC =\n 'data:image/svg+xml;utf8,' +\n encodeURIComponent(\n '<svg width=\"360\" height=\"150\" viewBox=\"0 0 360 150\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M360 77.4001C360 51.8001 347.6 31.6001 323.9 31.6001C300.1 31.6001 285.7 51.8001 285.7 77.2001C285.7 107.3 302.7 122.5 327.1 122.5C339 122.5 348 119.8 354.8 116V96.0001C348 99.4001 340.2 101.5 330.3 101.5C320.6 101.5 312 98.1001 310.9 86.3001H359.8C359.8 85.0001 360 79.8001 360 77.4001ZM310.6 67.9001C310.6 56.6001 317.5 51.9001 323.8 51.9001C329.9 51.9001 336.4 56.6001 336.4 67.9001H310.6Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M247.1 31.6001C237.3 31.6001 231 36.2001 227.5 39.4001L226.2 33.2001H204.2V149.8L229.2 144.5L229.3 116.2C232.9 118.8 238.2 122.5 247 122.5C264.9 122.5 281.2 108.1 281.2 76.4001C281.1 47.4001 264.6 31.6001 247.1 31.6001ZM241.1 100.5C235.2 100.5 231.7 98.4001 229.3 95.8001L229.2 58.7001C231.8 55.8001 235.4 53.8001 241.1 53.8001C250.2 53.8001 256.5 64.0001 256.5 77.1001C256.5 90.5001 250.3 100.5 241.1 100.5Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M169.8 25.7L194.9 20.3V0L169.8 5.3V25.7Z\" fill=\"#533AFD\"/><path d=\"M194.9 33.3H169.8V120.8H194.9V33.3Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M142.9 40.7L141.3 33.3H119.7V120.8H144.7V61.5C150.6 53.8 160.6 55.2 163.7 56.3V33.3C160.5 32.1 148.8 29.9 142.9 40.7Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M92.8999 11.6001L68.4999 16.8001L68.3999 96.9001C68.3999 111.7 79.4999 122.6 94.2999 122.6C102.5 122.6 108.5 121.1 111.8 119.3V99.0001C108.6 100.3 92.7999 104.9 92.7999 90.1001V54.6001H111.8V33.3001H92.7999L92.8999 11.6001Z\" fill=\"#533AFD\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M25.3 58.7001C25.3 54.8001 28.5 53.3001 33.8 53.3001C41.4 53.3001 51 55.6001 58.6 59.7001V36.2001C50.3 32.9001 42.1 31.6001 33.8 31.6001C13.5 31.6001 0 42.2001 0 59.9001C0 87.5001 38 83.1001 38 95.0001C38 99.6001 34 101.1 28.4 101.1C20.1 101.1 9.5 97.7001 1.1 93.1001V116.9C10.4 120.9 19.8 122.6 28.4 122.6C49.2 122.6 63.5 112.3 63.5 94.4001C63.4 64.6001 25.3 69.9001 25.3 58.7001Z\" fill=\"#533AFD\"/></svg>',\n )\n\nexport class VioCheckout extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: String }) heading = 'Kasse'\n @property({ type: String, attribute: 'shipping-label' })\n shippingLabel = 'Beregnes ved kasse'\n /** Express mode — render only the Klarna widget (no address form / method grid). */\n @property({ type: Boolean, reflect: true }) express = false\n\n @state() private checkoutState: CheckoutState | null = null\n @state() private items: CartLineItem[] = []\n @state() private applePayAvailable = false\n @state() private applePayInProgress = false\n @state() private klarnaAvailable = false\n @state() private orderConfirmed = false\n /**\n * The embedded provider whose OWN receipt is on screen after a completed\n * purchase (Qliro, Walley). Set instead of `orderConfirmed`: when the\n * provider renders a receipt, that is the one the shopper sees, not ours\n * (Angelo, 2026-09-15). See showProviderReceipt.\n */\n @state() private providerReceipt: 'qliro' | 'walley' | 'kustom' | null = null\n @state() private confirmedMethod: PaymentMethod | null = null\n @state() private paymentError: string | null = null\n /** Neutral (non-error) status line: \"verifying payment…\" / \"still processing\". */\n @state() private paymentNotice: string | null = null\n /**\n * Back from a payment page and asking whether it was paid. While set, the\n * drawer shows only this — never the checkout behind it: a form you can\n * type into, and a \"Betal\" you can press, for a purchase that may already\n * be paid (Angelo, 2026-10-08; Vipps can take two minutes to answer).\n */\n @state() private verifyingReturn: string | null = null\n /** The checkout whose confirmation is on screen — see fillOrderNumber. */\n private confirmedCheckoutId: string | null = null\n /** Snapshot of the placed order, for the confirmation screen. */\n @state() private confirmedOrder: {\n items: CartLineItem[]\n currency: string\n total: number\n /** The Vio order number, digits only (#4497) — never the checkout's\n * uuid, which is no order number. Often arrives a moment after the\n * confirmation: see fillOrderNumber. */\n orderId?: string\n /** The shipping charged, when there was one. */\n shipping?: { name: string; price: number }\n /** The provider's own reference for the payment (e.g. Nexi's paymentId). */\n providerRef?: { label: string; value: string }\n /** \"Visa •••• 4847\", once the provider says. */\n paidWith?: string\n /** Where the receipt goes. */\n email?: string\n } | null = null\n\n /** Active Klarna Payments widget handle + the subtotal it was mounted for. */\n private klarnaHandle: KlarnaPaymentsHandle | null = null\n private klarnaMountedAmount: number | null = null\n private klarnaMountedShipping: string | null = null\n private klarnaMounting = false\n /** Categories offered by the active Klarna session + the selected one. */\n @state() private klarnaCategories: KlarnaPaymentsHandle['categories'] = []\n @state() private klarnaSelectedCat = ''\n @state() private klarnaAuthorizing = false\n /** Chosen shipping option id (express flow) — drives the Klarna order total. */\n @state() private selectedShipping = ''\n /** Real per-supplier shippings from the backend. */\n @state() private availableShippingsList: KlarnaShippingOption[] = []\n /** Payment method names enabled for the sponsor (backend-configured).\n * null = not loaded yet → all buttons render; [] = none enabled. */\n @state() private availableMethods: string[] | null = null\n @state() private vippsOfficial = false\n @state() private kustomMounting = false\n /** The widget is being told about a cart change (suspend → sync → resume). */\n @state() private kustomSyncing = false\n /** What the widget shows: the rate picked inside it and its total (major). */\n @state() private kustomShipping: { name?: string; price?: number } | null = null\n @state() private kustomTotal: number | null = null\n @state() private kustomNotice: string | null = null\n /** The cart the mounted Kustom order describes — see kustomCartKey. */\n private kustomMountedKey: string | null = null\n private kustomMountedOrderId: string | null = null\n /** The checkout session (see embedSession) each embedded widget's order belongs to. */\n private kustomMountedFor: string | null = null\n private qliroMountedFor: string | null = null\n private walleyMountedFor: string | null = null\n private nexiMountedFor: string | null = null\n @state() private qliroMounting = false\n private qliroMountedOrderId: string | null = null\n @state() private walleyMounting = false\n private walleyMountedOrderId: string | null = null\n @state() private nexiMounting = false\n private nexiMountedOrderId: string | null = null\n /** What Nexi's shipping re-pricing last said, shown under the widget. */\n @state() private nexiShippingNotice: string | null = null\n /** Nexi's last re-pricing: the rate on the payment and the ones to pick from. */\n @state() private nexiShipping: NexiShippingUpdate | null = null\n /** A picked rate is being pushed to the payment. */\n @state() private nexiPicking = false\n /** The Nexi payment to resume on the next mount — set only by the ?paymentId= return. */\n private nexiResumePaymentId: string | null = null\n @state() private adyenMounting = false\n /**\n * The shopper ASKED for the payment step (chose the method, or pressed the\n * panel's button). Adyen needs our form first, so nothing creates a session\n * while they are still typing: a session is a photo of a finished form.\n */\n @state() private adyenRequested = false\n /** Drop-in is on screen. */\n @state() private adyenMounted = false\n /** The form, the shipping or the cart changed under a mounted session. */\n @state() private adyenStale = false\n /** Paid or pending in this opening: never offer to pay again. */\n @state() private adyenSettled = false\n /** The checkout session (see embedSession) and the purchase the mounted photo is of. */\n private adyenMountedFor: string | null = null\n private adyenMountedKey: string | null = null\n /**\n * Which Stripe this channel offers: `native` pays with Stripe's Payment\n * Element on THIS page, `link` sends the shopper to a page hosted by\n * Stripe. It travels in the method's config and is resolved with the\n * method list; null means \"not known yet\", and the pay button asks.\n */\n @state() private stripeMode: 'native' | 'link' | null = null\n /** The shopper asked for the payment step (see adyenRequested). */\n @state() private stripeRequested = false\n @state() private stripeMounting = false\n /** The Payment Element is on screen. */\n @state() private stripeMounted = false\n /** The form, the shipping or the cart changed under a mounted Element. */\n @state() private stripeStale = false\n /** Paid or pending in this opening: never offer to pay again. */\n @state() private stripeSettled = false\n /** Stripe is confirming right now — one press, not two. */\n @state() private stripePaying = false\n /** Stripe has PAINTED its form: until then the panel says it is loading. */\n @state() private stripeReady = false\n private stripeMountedFor: string | null = null\n private stripeMountedKey: string | null = null\n /** The checkout the mounted PaymentIntent pays for. */\n private stripeCheckoutId: string | null = null\n private stripeElement: StripeElementHandle | null = null\n /**\n * The shipping the customer picked INSIDE the Qliro widget, as Qliro\n * reports it. Qliro owns that choice in the modes where it shows a picker,\n * so while Qliro is the method the summary follows it instead of our own\n * preselected rate. Null until Qliro reports one — in `Vio rate as an order\n * line` it never does, and our rate is the one Qliro charges.\n */\n @state() private qliroShipping: { ref?: string; price?: number } | null = null\n /**\n * Set while this page load is showing the outcome of an embedded checkout's\n * confirmation redirect (Kustom, Qliro, Walley). While set, nothing may start\n * a new payment.\n *\n * The return handler selects the method so the panel has something to show,\n * and only THEN asks the provider whether the order was paid. Selecting is a\n * state change; the render it schedules runs `updated()` → `mount*IfNeeded()`\n * long before the provider answers, and in a fresh page load there is no\n * mounted order to stop it — so every return created a new backend checkout\n * and a new provider order for a cart that had just been paid. Not a race\n * that needs a slow network: a microtask always beats a round trip.\n * Reproduced in `vio-checkout.return.dom.test.ts` before this existed.\n *\n * Cleared when the checkout closes: reopening it is a fresh checkout.\n */\n private returningFrom: PaymentMethod | null = null\n /** Redirecting to the Stripe / Vipps hosted page. */\n @state() private stripeLoading = false\n @state() private vippsLoading = false\n @state() private form: CheckoutAddress = {\n firstName: '',\n lastName: '',\n email: '',\n address: '',\n postalCode: '',\n city: '',\n }\n /** In-flight guard for loadAvailablePaymentMethods. */\n private loadingPaymentMethods = false\n /**\n * Keyboard and focus while open: Escape closes — not while a payment is\n * in flight — Tab stays inside, focus returns to the opener.\n */\n private readonly dialogFocus = new DialogFocus({\n host: this,\n container: () => this.renderRoot.querySelector<HTMLElement>('.modal'),\n close: () => this.close(),\n canClose: () => !this.paymentInFlight,\n })\n /** A payment is being started or confirmed right now: the overlay must not close under it. */\n private get paymentInFlight(): boolean {\n return (\n this.stripePaying ||\n this.stripeLoading ||\n this.vippsLoading ||\n this.klarnaAuthorizing ||\n this.applePayInProgress\n )\n }\n /**\n * Whether a load has COMPLETED, either way. `availableMethods === null`\n * cannot tell \"not asked yet\" from \"asked and failed\", and rendering every\n * button while we still do not know shows methods the channel may not have\n * enabled — a shopper can click one that is not there.\n */\n @state() private paymentMethodsResolved = false\n /** Guards `autoSelectSoleMethod` to ONE attempt per opening — see there. */\n private autoSelectAttempted = false\n /** In-flight + attempted guards for loadAvailableShippings (change events\n * fire per keystroke — without these, typing an address hammers the API). */\n private loadingShippings = false\n private shippingsAttempted = false\n /**\n * The cart's products cannot ship together (see `someLineShipsOnItsOwn`).\n * While set, no payment can start and the payment step says why.\n */\n @state() private shippingBlocked = false\n /** The opening whose shippings have been answered for — see\n * `shippingsSettled`. */\n @state() private shippingsReadyFor: string | null = null\n\n private boundOnQliroEvent = (e: Event): void => {\n const event = (e as CustomEvent<any>).detail\n if (!event) return\n if (event.type === 'shipping-price-changed' && typeof event.price === 'number') {\n this.qliroShipping = { ...(this.qliroShipping ?? {}), price: event.price }\n } else if (event.type === 'shipping-changed') {\n const shipping = event.shipping ?? {}\n const ref = shipping.method ?? shipping.merchantReference ?? shipping.MerchantReference\n const price =\n typeof shipping.price === 'number'\n ? shipping.price\n : this.availableShippingsList.find((o) => o.id === String(ref))?.priceMajor\n this.qliroShipping = {\n ...(this.qliroShipping ?? {}),\n ...(ref != null ? { ref: String(ref) } : {}),\n ...(typeof price === 'number' ? { price } : {}),\n }\n }\n }\n\n private boundOnCheckoutChange = (e: Event): void => {\n const detail = (e as CustomEvent<CheckoutChangeDetail>).detail\n const prevSponsorId = this.checkoutState?.sponsorId\n const sponsorChanged = !prevSponsorId || prevSponsorId !== detail.state?.sponsorId\n this.checkoutState = detail.state\n this.items = Vio.checkout.items\n // Re-check vendor availability when the sponsor changes (state changes fire\n // on every selection — refetching each time hammers the backend).\n //\n // The condition is \"not resolved yet\", NOT \"availableMethods is null\":\n // null also means \"asked and failed\", and `setAddress` emits on every\n // KEYSTROKE in the address form. One transient failure of the methods\n // lookup used to turn every subsequent keypress into a full refresh of\n // methods, shippings, Apple Pay and Klarna — for the rest of the session.\n // Same hammering shape as the mount loop of 2026-09-08, one layer up.\n if (this.checkoutState) {\n if (sponsorChanged || !this.paymentMethodsResolved) {\n // A different sponsor is a different channel: what it offers has to be\n // asked again, so the previous answer stops counting as resolved.\n if (sponsorChanged) this.paymentMethodsResolved = false\n void this.refreshApplePay()\n void this.refreshKlarna()\n void this.loadAvailablePaymentMethods()\n void this.loadAvailableShippings()\n } else if (!this.shippingsAttempted) {\n void this.loadAvailableShippings()\n }\n } else {\n this.applePayAvailable = false\n this.klarnaAvailable = false\n this.orderConfirmed = false\n this.providerReceipt = null\n this.confirmedMethod = null\n this.confirmedOrder = null\n this.paymentError = null\n this.paymentNotice = null\n this.verifyingReturn = null\n this.confirmedCheckoutId = null\n this.express = false\n this.availableMethods = null\n this.paymentMethodsResolved = false\n this.autoSelectAttempted = false\n this.returningFrom = null\n // The next opening asks again: the cart may have changed meanwhile.\n this.shippingBlocked = false\n this.unmountKlarna()\n // The embedded widgets go with the checkout they were opened for, as\n // \"Endre\" already does. Kept, the \"already mounted\" guard reused them on\n // the next open — with the order they were created for: Alan\n // (2026-09-14) closed with the X, changed the cart, reopened, and Qliro\n // still asked for the old total. Paying there charges the old cart.\n this.unmountKustom()\n this.unmountQliro()\n this.unmountWalley()\n this.unmountNexi()\n this.unmountAdyen()\n this.adyenSettled = false\n this.unmountStripe()\n this.stripeSettled = false\n }\n }\n\n private boundOnPaymentComplete = (e: Event): void => {\n const detail = (\n e as CustomEvent<{ method: string; state?: { sponsorId: number }; result: unknown }>\n ).detail\n // Klarna (after server order creation) and Apple Pay (after the sheet\n // authorizes) both reach the same confirmation drawer. Other methods\n // (Vipps/Card) confirm via the plain CTA, not this event.\n if (detail.method !== 'klarna' && detail.method !== 'apple-pay') return\n const sponsorId = detail.state?.sponsorId ?? this.checkoutState?.sponsorId\n if (sponsorId == null) return\n this.confirmOrder(detail.method as PaymentMethod, sponsorId, detail.result)\n }\n\n private boundOnPaymentError = (e: Event): void => {\n const detail = (e as CustomEvent<{ method: string; error: string }>).detail\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] payment-error:', detail.method, detail.error)\n }\n // Klarna's own reason stays on screen while that flow is being\n // stabilised (see the manager). The others — Apple Pay's sheet failing\n // to start — get the shopper's sentence; the raw text is above.\n this.paymentError =\n detail.method === 'klarna'\n ? `Klarna-betalingen kunne ikke fullføres: ${detail.error}`\n : friendlyPaymentError(detail.error, detail.method)\n // A redirect failure lands with the overlay closed — open it so the error\n // is visible rather than silently dropping the user on the home page.\n this.open = true\n }\n\n static override styles = css`\n :host { display: contents; }\n .backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease;\n z-index: 999;\n }\n :host([open]) .backdrop { opacity: 1; pointer-events: auto; }\n\n .modal {\n position: fixed;\n inset: 0;\n background: var(--vio-color-surface, #fff);\n transform: translateY(100%);\n transition: transform 0.35s cubic-bezier(0.32, 0.72, 0, 1);\n display: flex;\n flex-direction: column;\n font-family: var(--vio-font-sans, -apple-system, sans-serif);\n color: var(--vio-color-text, #0a0a0a);\n z-index: 1000;\n overflow-y: auto;\n }\n :host([open]) .modal { transform: translateY(0); }\n /* Focus lands on the panel itself only as a fallback — no ring for it. */\n .modal:focus { outline: none; }\n\n /* Confirmation drawer — compact bottom sheet, not the full-screen overlay. */\n .modal.as-drawer {\n inset: auto 0 0 0;\n height: auto;\n max-height: 88vh;\n max-width: 460px;\n margin: 0 auto;\n border-radius: var(--vio-radius-xl, 16px) var(--vio-radius-xl, 16px) 0 0;\n box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.18);\n }\n .modal.as-drawer .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n flex-shrink: 0;\n }\n .modal.as-drawer .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: var(--vio-radius-sm, 2px);\n }\n\n /* Express (Apple Pay-style): right-side drawer, like the cart. Slides in\n from the right instead of the full-screen overlay. */\n .modal.as-side {\n inset: 0 0 0 auto;\n width: min(440px, 100%);\n max-width: 440px;\n transform: translateX(100%);\n border-radius: 0;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.1);\n }\n :host([open]) .modal.as-side { transform: translateX(0); }\n\n /* Desktop: the checkout ALWAYS lives as a right-side panel (like the cart,\n product detail and express drawer) — never a full-width overlay. The\n confirmation stays in that panel too: a centered card jumped out of the\n panel the shopper was in and looked like the phone layout (Angelo,\n 2026-09-16). */\n @media (min-width: 601px) {\n .modal {\n inset: 0 0 0 auto;\n width: min(440px, 100%);\n max-width: 440px;\n transform: translateX(100%);\n border-radius: 0;\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.1);\n }\n :host([open]) .modal { transform: translateX(0); }\n }\n @media (max-width: 600px) {\n /* On phones, keep it a bottom sheet for reachability. */\n .modal.as-side {\n inset: auto 0 0 0;\n width: 100%;\n max-width: none;\n height: 92vh;\n transform: translateY(100%);\n border-radius: var(--vio-radius-xl, 16px) var(--vio-radius-xl, 16px) 0 0;\n }\n :host([open]) .modal.as-side { transform: translateY(0); }\n }\n\n /* Phones: the confirmation is a compact bottom sheet, as tall as it needs. */\n @media (max-width: 600px) {\n .modal.as-confirm {\n height: auto;\n max-height: 88vh;\n }\n }\n\n .handle { display: none; }\n\n /* Mobile: bottom sheet with rounded top + drag handle. */\n @media (max-width: 600px) {\n .modal {\n top: auto;\n height: 92vh;\n border-radius: var(--vio-radius-xl, 16px) var(--vio-radius-xl, 16px) 0 0;\n box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08);\n }\n .handle {\n display: flex;\n justify-content: center;\n padding: 10px 0 4px;\n flex-shrink: 0;\n }\n .handle::before {\n content: '';\n width: 40px;\n height: 4px;\n background: var(--vio-color-border, #e5e5e5);\n border-radius: var(--vio-radius-sm, 2px);\n }\n }\n\n .topbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px var(--vio-space-lg, 24px);\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n position: sticky;\n top: 0;\n background: var(--vio-color-surface, #fff);\n z-index: 1;\n }\n .heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0;\n }\n .close {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n line-height: 1;\n padding: 0;\n color: var(--vio-color-text, #0a0a0a);\n font-family: inherit;\n }\n .close:hover { color: var(--vio-color-text-secondary, #666); }\n\n .body {\n max-width: 720px;\n margin: 0 auto;\n width: 100%;\n padding: 56px var(--vio-space-lg, 24px) 80px;\n box-sizing: border-box;\n }\n .section { margin-bottom: 56px; }\n .section-label {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-accent, #c14a3b);\n margin-bottom: 12px;\n font-weight: 500;\n }\n .section-heading {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 28px;\n margin: 0 0 var(--vio-space-lg, 24px);\n font-weight: 400;\n line-height: 1.2;\n }\n\n .form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--vio-space-md, 16px);\n }\n .field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: var(--vio-space-md, 16px);\n }\n .field label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n font-weight: 500;\n }\n .field input {\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid var(--vio-color-border, #e5e5e5);\n font-size: 16px;\n font-family: inherit;\n color: inherit;\n background: transparent;\n outline: none;\n transition: border-color 0.15s;\n }\n .field input:focus { border-bottom-color: var(--vio-color-text, #0a0a0a); }\n\n .payment-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--vio-space-md, 16px);\n }\n /* Shown until we know which methods the channel offers. Rendering every\n button meanwhile would let a shopper click one that is not enabled. */\n .payment-loading {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 20px 0;\n font-size: 13px;\n color: var(--vio-color-text-secondary, #666);\n }\n .payment-spinner {\n width: 14px;\n height: 14px;\n border: 2px solid var(--vio-color-border, #e5e5e5);\n border-top-color: var(--vio-color-text-secondary, #666);\n border-radius: 50%;\n animation: vio-payment-spin 0.7s linear infinite;\n }\n @keyframes vio-payment-spin {\n to { transform: rotate(360deg); }\n }\n @media (prefers-reduced-motion: reduce) {\n .payment-spinner { animation: none; }\n }\n /* Back from a payment page: only this until we know. */\n .verifying {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 10px;\n padding: 56px 16px;\n }\n .verifying-spinner {\n width: 28px;\n height: 28px;\n border: 3px solid var(--vio-color-border, #e5e5e5);\n border-top-color: var(--vio-color-accent, #c14a3b);\n border-radius: 50%;\n animation: vio-payment-spin 0.8s linear infinite;\n }\n .verifying-text {\n margin: 6px 0 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--vio-color-text, #1a1a1a);\n }\n .verifying-hint {\n margin: 0;\n font-size: 13px;\n color: var(--vio-color-text-secondary, #666);\n }\n @media (prefers-reduced-motion: reduce) {\n .verifying-spinner { animation: none; }\n }\n .payment-btn {\n padding: 20px;\n background: #fff;\n border: 1px solid var(--vio-color-border, #e5e5e5);\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: border-color 0.15s, background 0.15s;\n color: var(--vio-color-text, #0a0a0a);\n }\n .payment-btn:hover:not(:disabled) {\n border-color: var(--vio-color-text, #0a0a0a);\n background: var(--vio-color-surface-hover, #fafafa);\n }\n .payment-btn:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n pointer-events: none;\n }\n .payment-btn.primary {\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n grid-column: 1 / -1;\n border-color: var(--vio-color-text, #0a0a0a);\n padding: 22px;\n font-weight: 600;\n }\n .payment-btn.primary:hover:not(:disabled) { background: #222; border-color: #222; }\n .payment-btn[aria-pressed='true'] {\n border-color: var(--vio-color-accent, #c14a3b);\n }\n /* Klarna Payments — inline widget panel, shown once Klarna is selected. */\n .klarna-panel {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 4px;\n }\n /* Klarna remembers the customer's preferred payment_method_category\n * server-side across sessions/browsers — exposing a category-switcher\n * chip UI on top of that just confuses users. Hidden per Alan's\n * 2026-08-18 cross-browser investigation; the switching logic (onKlarnaCategory)\n * stays wired for when/if this becomes configurable again. */\n .klarna-cats {\n display: none !important;\n }\n .klarna-cat {\n flex: 1 1 auto;\n padding: 8px 12px;\n border: 1px solid var(--vio-color-border, #ddd);\n border-radius: var(--vio-radius-lg, 8px);\n background: #fff;\n font-size: 13px;\n cursor: pointer;\n }\n .klarna-cat.active {\n border-color: var(--vio-color-text, #111);\n background: var(--vio-color-surface-2, #f6f6f6);\n font-weight: 600;\n }\n .klarna-widget {\n min-height: 48px;\n }\n .express-summary {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n }\n /* Shipping selector (express) — Standard / Express options. */\n .ship-select { display: flex; flex-direction: column; gap: 8px; }\n .nexi-ship { margin-bottom: 12px; }\n .ship-opt {\n display: flex; align-items: center; justify-content: space-between; gap: 12px;\n padding: 12px 14px; border: 1px solid var(--vio-color-border, #ddd);\n border-radius: var(--vio-radius-lg, 8px); background: #fff; cursor: pointer; font-family: inherit;\n text-align: left;\n }\n .ship-opt.active {\n border-color: var(--vio-color-text, #111);\n background: var(--vio-color-surface-2, #f6f6f6);\n }\n .ship-opt:disabled { opacity: 0.6; cursor: default; }\n .ship-meta { display: flex; flex-direction: column; gap: 2px; }\n .ship-meta b { font-weight: 600; font-size: 13px; }\n .ship-meta span { color: var(--vio-color-text-secondary, #666); font-size: 12px; }\n .ship-price { font-weight: 600; font-size: 13px; }\n .payment-error {\n grid-column: 1 / -1;\n padding: 12px 16px;\n background: #fdecea;\n border: 1px solid var(--vio-color-accent, #c14a3b);\n border-radius: var(--vio-radius-lg, 8px);\n font-size: 13px;\n color: var(--vio-color-accent, #c14a3b);\n text-align: center;\n }\n .payment-notice {\n grid-column: 1 / -1;\n padding: 12px 16px;\n background: #f4f4f2;\n border: 1px solid var(--vio-color-border, #ddd);\n border-radius: var(--vio-radius-lg, 8px);\n font-size: 13px;\n color: var(--vio-color-text, #1a1a1a);\n text-align: center;\n }\n /* \"Betal\" CTA — sits full-width below the method grid once a method is\n picked. Reuses .payment-btn.primary (its grid-column spans the row). */\n .complete-cta {\n width: 100% !important;\n box-sizing: border-box !important;\n margin-top: 8px;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n text-align: center !important;\n }\n\n /* Order confirmation — compact, shown inside the drawer. */\n .confirmation {\n padding: 8px 0 28px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .confirm-head {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n .confirm-details {\n margin: 0;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--vio-color-border, #eee);\n border-radius: var(--vio-radius-lg, 8px);\n }\n .confirm-details > div {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n padding: 10px 14px;\n font-size: 13px;\n }\n .confirm-details > div + div { border-top: 1px solid var(--vio-color-border, #eee); }\n .confirm-details dt { color: var(--vio-color-text-secondary, #666); white-space: nowrap; }\n .confirm-details dd.ref { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 500; font-size: 12px; }\n .confirm-details dd {\n margin: 0;\n font-weight: 600;\n text-align: right;\n font-variant-numeric: tabular-nums;\n word-break: break-all;\n }\n .confirm-label {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n color: var(--vio-color-text-secondary, #666);\n }\n .confirm-line {\n display: grid;\n grid-template-columns: 56px 1fr auto;\n gap: 12px;\n align-items: center;\n }\n .confirm-thumb {\n width: 56px;\n height: 56px;\n object-fit: cover;\n background: var(--vio-color-surface-muted, #f2f2f2);\n display: block;\n }\n .confirm-line-name { display: flex; flex-direction: column; gap: 2px; font-size: 14px; }\n .confirm-line-name small { font-size: 11px; color: var(--vio-color-text-secondary, #666); }\n .confirm-line-price { font-size: 14px; font-weight: 600; }\n .confirm-check {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #2e7d32;\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n line-height: 1;\n }\n .confirm-title {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 24px;\n font-weight: 400;\n margin: 0;\n }\n .confirm-text {\n font-size: 14px;\n color: var(--vio-color-text-secondary, #666);\n line-height: 1.5;\n margin: 4px 0 0;\n }\n .confirm-order-id {\n font-size: 13px;\n color: var(--vio-color-text-secondary, #666);\n }\n .confirm-order-id b {\n color: var(--vio-color-text, #0a0a0a);\n font-variant-numeric: tabular-nums;\n }\n .confirm-summary {\n display: flex;\n flex-direction: column;\n gap: 12px;\n font-size: 13px;\n }\n .confirm-close {\n width: 100%;\n border: none;\n background: var(--vio-color-text, #0a0a0a);\n color: var(--vio-color-text-on-primary, #fff);\n padding: 16px 48px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n margin-top: 16px;\n }\n .confirm-close:hover { background: #222; }\n\n .order-summary {\n background: var(--vio-color-surface-muted, #f2f2f2);\n padding: var(--vio-space-lg, 24px);\n margin-top: var(--vio-space-xl, 32px);\n }\n .order-line {\n display: grid;\n grid-template-columns: 56px 1fr auto;\n gap: 12px;\n padding: 8px 0;\n align-items: center;\n }\n .order-line-img {\n aspect-ratio: 1;\n background: #fff;\n overflow: hidden;\n }\n .order-line-img img { width: 100%; height: 100%; object-fit: cover; display: block; }\n .order-line-meta { font-size: 13px; }\n .order-line-meta b { display: block; }\n .order-line-meta span {\n color: var(--vio-color-text-secondary, #666);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: var(--vio-tracking-label, 0.1em);\n }\n .order-line-price { font-weight: 700; font-size: 14px; }\n .order-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n font-size: 14px;\n }\n .order-row.total {\n border-top: 1px solid var(--vio-color-border-default, #ccc);\n margin-top: var(--vio-space-sm, 8px);\n padding-top: var(--vio-space-md, 16px);\n font-weight: 700;\n font-size: 16px;\n }\n\n @media (max-width: 600px) {\n .form-row { grid-template-columns: 1fr; gap: 0; }\n .payment-grid { grid-template-columns: 1fr; }\n .body { padding: 32px var(--vio-space-lg, 24px) 64px; }\n }\n `\n\n override connectedCallback(): void {\n super.connectedCallback()\n void this.loadVippsButton()\n this.checkoutState = Vio.checkout.currentState\n this.items = Vio.checkout.items\n Vio.checkout.addEventListener('change', this.boundOnCheckoutChange)\n Vio.checkout.addEventListener('payment-complete', this.boundOnPaymentComplete)\n Vio.checkout.addEventListener('payment-error', this.boundOnPaymentError)\n Vio.checkout.addEventListener('qliro-event', this.boundOnQliroEvent)\n if (this.checkoutState) {\n void this.refreshApplePay()\n void this.refreshKlarna()\n void this.loadAvailablePaymentMethods()\n }\n // Klarna redirect-return first: it must consume its pending context and\n // create the order BEFORE the generic return check runs.\n void Vio.checkout.resumeKlarnaReturn()\n // Landing back from a Stripe/Vipps/Klarna redirect? Verify, then confirm.\n void this.checkReturnPaymentStatus()\n // Reattached after a removal: disconnectedCallback unmounted the widgets\n // and updated() skips mounting while detached, so look again now.\n this.requestUpdate()\n }\n\n /**\n * Detect the redirect return from a hosted payment page (Stripe / Vipps /\n * Klarna): the return URL carries vio_payment/vio_method/vio_sponsor. On\n * success: clear that sponsor's cart, show the confirmation drawer, emit\n * vio:payment-success (analytics/host hooks) and scrub the URL params.\n */\n /** Backend checkout statuses that mean the payment went through. */\n private static readonly PAID_STATUSES = new Set([\n 'paid', 'completed', 'complete', 'success', 'succeeded', 'confirmed', 'captured',\n ])\n\n /** Statuses that mean the payment definitively did NOT go through. */\n private static readonly FAILED_STATUSES = new Set([\n 'failed', 'cancelled', 'canceled', 'rejected', 'declined', 'expired', 'aborted',\n 'terminated', 'error', 'voided', 'unpaid',\n ])\n\n /**\n * Shown instead of the payment step when the cart's products cannot ship\n * together. Angelo, 2026-09-16: block the purchase rather than sell it\n * without shipping, or with a rate that does not fit every product.\n */\n private static readonly SHIPPING_BLOCKED_MESSAGE =\n 'Produktene i handlekurven kan ikke sendes sammen. Fjern ett av dem for å fullføre kjøpet.'\n\n /** The payment may or may not have gone through, and we could not find out. */\n private static readonly RETURN_UNVERIFIED_MESSAGE =\n 'Vi kunne ikke bekrefte betalingen. Handlekurven er uendret — prøv igjen, eller kontakt support hvis du ble belastet.'\n\n /** Waits between GetCheckout attempts — PSP webhooks (Vipps especially) can\n * land seconds after the shopper is redirected back, so a single immediate\n * check misreads a successful charge as unpaid. ~20s total. */\n private static readonly RETURN_VERIFY_DELAYS_MS = [0, 2000, 4000, 6000, 8000]\n\n /** Vipps polling cadence — up to 2 minutes. Its webhook can lag well behind\n * the redirect; this window was verified against a live checkout. */\n private static readonly VIPPS_STATUS_MAX_ATTEMPTS = 24\n private static readonly VIPPS_STATUS_DELAY_MS = 5000\n\n /**\n * Vipps redirects to our return URL the same way on cancel as on success —\n * the URL alone can't tell them apart, and the generic checkout status can\n * lag behind Vipps' own webhook. Poll Vipps' own state directly instead:\n * AUTHORIZED confirms, CREATED means still processing (keep polling),\n * anything else (including an unrecognized state) is treated as failed —\n * fail-closed by default rather than guessing.\n */\n /** Vipps' own button when its script answers; our orange one otherwise. */\n private async loadVippsButton(): Promise<void> {\n this.vippsOfficial = await ensureVippsButton()\n }\n\n private async pollVippsStatus(\n checkoutId: string,\n sponsorId: number,\n ): Promise<{ outcome: 'paid' | 'failed' | 'pending' | 'duplicate'; sawStatus: boolean }> {\n let sawStatus = false\n for (let attempt = 0; attempt < VioCheckout.VIPPS_STATUS_MAX_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, VioCheckout.VIPPS_STATUS_DELAY_MS))\n }\n try {\n const vippsStatus = await Vio.checkout.getVippsStatus(checkoutId, sponsorId || undefined)\n const state = String(vippsStatus?.state ?? '').toUpperCase()\n sawStatus = true\n // The cart was paid through another checkout (another tab): not a failure.\n if (vippsStatus?.duplicate_of) return { outcome: 'duplicate', sawStatus }\n if (state === 'AUTHORIZED') return { outcome: 'paid', sawStatus }\n if (state === 'CREATED') continue\n return { outcome: 'failed', sawStatus }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] GetVippsStatus attempt failed:', err)\n }\n }\n }\n // Exhausted every attempt without a definitive state — honestly \"still\n // processing\", not a fabricated failure (Vipps' webhook may still land\n // and the backend order still get created).\n return { outcome: 'pending', sawStatus }\n }\n\n /** Shared outcome handler for both the generic (GetCheckout) and the\n * Vipps-specific (GetVippsStatus) return-verification paths. */\n private applyReturnOutcome(\n outcome: 'paid' | 'failed' | 'pending' | 'duplicate',\n sawStatus: boolean,\n vioMethod: string,\n sponsorId: number,\n checkoutId: string,\n ): void {\n if (outcome === 'paid') {\n if (sponsorId > 0) Vio.cart.clearSponsorCart(sponsorId)\n this.confirmedOrder = {\n items: [],\n currency: getGlobalCurrency(),\n total: 0,\n }\n this.confirmedMethod = vioMethod as PaymentMethod\n this.orderConfirmed = true\n this.open = true\n void this.fillOrderNumber(checkoutId, sponsorId)\n this.dispatchEvent(\n new CustomEvent('vio:payment-success', {\n bubbles: true,\n composed: true,\n detail: { method: vioMethod, sponsorId, orderId: checkoutId },\n }),\n )\n } else if (outcome === 'duplicate') {\n this.paymentError = CART_PAID_MESSAGE\n this.open = true\n } else if (outcome === 'failed') {\n this.paymentError = 'Betalingen ble avbrutt eller feilet. Vennligst prøv igjen.'\n this.open = true\n } else if (sawStatus) {\n // Backend reachable but the checkout is still processing (webhook not\n // landed yet). Fail-closed: keep the cart, set expectations.\n this.paymentNotice =\n 'Betalingen behandles fortsatt. Du får ordrebekreftelse på e-post når den er gjennomført. Handlekurven er uendret.'\n this.open = true\n } else {\n // Never got an answer from the backend: keep the cart, tell the user.\n this.paymentError = VioCheckout.RETURN_UNVERIFIED_MESSAGE\n this.open = true\n }\n }\n\n private async checkReturnPaymentStatus(): Promise<void> {\n if (typeof window === 'undefined' || !window.location || !window.location.search) return\n try {\n const urlParams = new URLSearchParams(window.location.search)\n // ONLY our own vio_* params — generic names like ?payment= belong to the\n // publisher's page and must never trigger our confirmation flow.\n const vioPayment = urlParams.get('vio_payment')\n const vioMethod = urlParams.get('vio_method') || 'stripe'\n const sponsorId = Number(urlParams.get('vio_sponsor') || 0)\n const checkoutId = urlParams.get('checkout_id') || ''\n // Vipps is handled below without needing vioPayment at all (it\n // re-verifies against Vipps directly, never trusts the URL) — so only\n // bail here when there's neither a payment param NOR a checkout to\n // check.\n // Nexi's third-party return (Vipps/Swish/MobilePay inside the widget):\n // Nexi sends the shopper back to the SAME page with ?paymentId=…. If it\n // is the session we remembered, re-open and re-mount on it — the widget\n // then finishes and fires payment-completed.\n const nexiPaymentId = nexiReturnPaymentId()\n const nexiPending = readNexiPending()\n if (nexiPaymentId && nexiPending && nexiPending.paymentId === nexiPaymentId) {\n this.nexiResumePaymentId = nexiPaymentId\n this.cleanReturnQueryParams(['paymentId'])\n if (!this.checkoutState && nexiPending.sponsorId) {\n try {\n Vio.checkout.open(nexiPending.sponsorId)\n } catch {\n /* noop */\n }\n }\n try {\n Vio.checkout.selectPaymentMethod('nexi')\n } catch {\n /* noop */\n }\n this.open = true\n return\n }\n\n // Kustom's round trip. The confirmation URL is\n // ?order_id=…&payment_processor=KUSTOM&checkout_id=… (the href is\n // query-less by contract); a purchase our validation callback refused\n // comes back as ?vio_payment=rejected&vio_method=kustom. The backend\n // completes a paid order as we read it; the browser confirms nothing.\n const kustomReturn = kustomReturnOutcome(urlParams)\n if (kustomReturn?.kind === 'rejected') {\n // The widget already told the shopper why. Cleaning the URL FIRST:\n // a reload must not repeat the notice as if it just happened.\n this.cleanReturnQueryParams([...KUSTOM_RETURN_QUERY_KEYS])\n this.kustomNotice = 'Bestillingen ble endret. Betalingen ble ikke gjennomført — prøv igjen.'\n return\n }\n if (kustomReturn?.kind === 'confirmation') {\n const kustomOrderId = kustomReturn.orderId\n // BEFORE open()/selectPaymentMethod(): both emit, and the render they\n // schedule must already see it — see `returningFrom`.\n this.returningFrom = 'kustom'\n if (!this.checkoutState) {\n const spIdToUse = sponsorId || [...Vio.cart.getAllCarts().keys()][0] || 0\n if (spIdToUse) {\n try {\n Vio.checkout.open(spIdToUse)\n } catch {\n /* noop */\n }\n }\n }\n try {\n Vio.checkout.selectPaymentMethod('kustom')\n } catch {\n /* noop */\n }\n this.open = true\n this.verifyingReturn = 'Bekrefter betalingen…'\n // A reload must not read a used return twice.\n this.cleanReturnQueryParams([...KUSTOM_RETURN_QUERY_KEYS])\n try {\n const order = await Vio.checkout.getKustomOrder(\n kustomOrderId,\n this.checkoutState?.sponsorId,\n )\n this.verifyingReturn = null\n if (order?.status === 'checkout_complete' && order.html_snippet) {\n // Kustom's own receipt, in the light DOM, projected into the\n // receipt view — which does not depend on the cart we clear.\n const spId = this.checkoutState?.sponsorId ?? 0\n // Kustom's `order` is its own (order_id, checkout_id are Kustom's):\n // Vio's checkout id comes from the return URL.\n this.showProviderReceipt('kustom', spId, order, kustomReturn.checkoutId)\n await this.updateComplete\n const container = this.lightContainer('vio-kustom-checkout-container', 'vio-kustom')\n Vio.checkout.renderKustomSnippet(container, order.html_snippet)\n } else {\n // Sent back, but Kustom does not call it paid: nothing to show\n // as a receipt, and nothing to charge again from here.\n this.paymentError = VioCheckout.RETURN_UNVERIFIED_MESSAGE\n }\n } catch (err) {\n this.verifyingReturn = null\n // The order may well be paid — offering to pay again is the one\n // thing this must not do. Same wording as the redirect methods.\n this.paymentError = VioCheckout.RETURN_UNVERIFIED_MESSAGE\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Kustom confirmation read failed:', err)\n }\n }\n return\n }\n\n if (!vioPayment && !checkoutId) return\n\n // Qliro's confirmation return: ?checkout_id=…&payment_processor=QLIRO\n // (the href is query-less by contract). Re-read the order BY CHECKOUT\n // and render Qliro's own receipt; the Commerce order is created\n // server-side by the push webhook, never from the browser.\n if (urlParams.get('payment_processor') === 'QLIRO' && checkoutId) {\n // BEFORE open()/selectPaymentMethod(): both emit, and the render they\n // schedule must already see it — see `returningFrom`.\n this.returningFrom = 'qliro'\n if (!this.checkoutState) {\n const spIdToUse = sponsorId || [...Vio.cart.getAllCarts().keys()][0] || 0\n if (spIdToUse) {\n try {\n Vio.checkout.open(spIdToUse)\n } catch {\n /* noop */\n }\n }\n }\n try {\n Vio.checkout.selectPaymentMethod('qliro')\n } catch {\n /* noop */\n }\n // A return is not a fresh checkout: whatever the order turns out to be,\n // nothing here should offer to start paying again.\n this.autoSelectAttempted = true\n this.open = true\n this.verifyingReturn = 'Bekrefter betalingen…'\n try {\n const order = await Vio.checkout.getQliroOrder(\n checkoutId,\n this.checkoutState?.sponsorId,\n )\n this.verifyingReturn = null\n if (order?.status === 'Completed') {\n // Qliro's own receipt is the one shown, not ours (Angelo,\n // 2026-09-15). It goes through showProviderReceipt, whose view does\n // not depend on the cart — clearing the cart is what took the\n // receipt away on 2026-09-08 and brought back the payment step.\n // No order is created meanwhile: mayStartEmbeddedPayment() is false\n // while a receipt is on screen. If Qliro sends no receipt, ours.\n const spId = this.checkoutState?.sponsorId ?? sponsorId ?? 0\n const result = { order: { orderId: order.order_id }, chargedTotal: order.total_price }\n this.qliroMountedOrderId = order.order_id\n if (order.html_snippet) {\n this.showProviderReceipt('qliro', spId, result, checkoutId)\n await this.updateComplete\n const container = this.lightContainer('vio-qliro-checkout-container', 'vio-qliro')\n Vio.checkout.renderKustomSnippet(container, order.html_snippet)\n } else {\n this.confirmOrder('qliro', spId, result, checkoutId)\n }\n } else if (order?.html_snippet) {\n // Not completed (OnHold, still InProcess): Qliro's own screen explains\n // that state better than we could.\n this.qliroMountedOrderId = order.order_id\n await this.updateComplete\n const container = this.lightContainer('vio-qliro-checkout-container', 'vio-qliro')\n if (container) {\n Vio.checkout.renderKustomSnippet(container, order.html_snippet)\n }\n }\n } catch (err) {\n this.verifyingReturn = null\n // The order may well be paid — offering to pay again is the one\n // thing this must not do. Same wording as the redirect methods.\n this.paymentError = VioCheckout.RETURN_UNVERIFIED_MESSAGE\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Qliro confirmation read failed:', err)\n }\n }\n this.cleanReturnQueryParams(['checkout_id', 'payment_processor'])\n return\n }\n\n // Walley's confirmation return: ?checkout_id=…&payment_processor=WALLEY\n // — the SAFETY-NET path (the primary success signal is the DOM event\n // handled inline by mountWalleyIfNeeded; this only fires if that event\n // was missed — tab backgrounded, page reload). Re-read the session BY\n // CHECKOUT and render Walley's own receipt.\n if (urlParams.get('payment_processor') === 'WALLEY' && checkoutId) {\n // BEFORE open()/selectPaymentMethod(): both emit, and the render they\n // schedule must already see it — see `returningFrom`.\n this.returningFrom = 'walley'\n if (!this.checkoutState) {\n const spIdToUse = sponsorId || [...Vio.cart.getAllCarts().keys()][0] || 0\n if (spIdToUse) {\n try {\n Vio.checkout.open(spIdToUse)\n } catch {\n /* noop */\n }\n }\n }\n try {\n Vio.checkout.selectPaymentMethod('walley')\n } catch {\n /* noop */\n }\n this.open = true\n this.verifyingReturn = 'Bekrefter betalingen…'\n try {\n const order = await Vio.checkout.getWalleyOrder(\n checkoutId,\n this.checkoutState?.sponsorId,\n )\n this.verifyingReturn = null\n if (order?.html_snippet) {\n this.walleyMountedOrderId = order.order_id\n await this.updateComplete\n const container = this.lightContainer('vio-walley-checkout-container', 'vio-walley')\n if (container) {\n Vio.checkout.renderKustomSnippet(container, order.html_snippet)\n }\n if (order.status === 'PurchaseCompleted') {\n // Walley's receipt stays on screen — see showProviderReceipt.\n this.showProviderReceipt(\n 'walley',\n this.checkoutState?.sponsorId ?? 0,\n { orderId: order.order_id },\n checkoutId,\n )\n }\n }\n } catch (err) {\n this.verifyingReturn = null\n // The order may well be paid — offering to pay again is the one\n // thing this must not do. Same wording as the redirect methods.\n this.paymentError = VioCheckout.RETURN_UNVERIFIED_MESSAGE\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Walley confirmation read failed:', err)\n }\n }\n this.cleanReturnQueryParams(['checkout_id', 'payment_processor'])\n return\n }\n\n // Klarna's own return path (resumeKlarnaReturn) creates the order and\n // fires payment-complete — don't double-handle while it's pending.\n if (\n vioMethod === 'klarna' &&\n typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('vio.klarna.pending.v1')\n ) {\n this.cleanReturnQueryParams(['vio_payment', 'vio_method', 'vio_sponsor', 'checkout_id'])\n return\n }\n\n // Adyen's return (Vipps, Klarna, Trustly, redirect-3DS): OUR return URL\n // names the checkout and Adyen appended `redirectResult`. It is\n // finalised on the SERVER, so it works in a browser that never saw the\n // session. The query is cleaned FIRST: a reload must not submit a used\n // redirectResult again.\n if (vioMethod === ADYEN_RETURN_METHOD && checkoutId) {\n const adyenReturn = adyenReturnParams(window.location.search)\n this.cleanReturnQueryParams(ADYEN_RETURN_QUERY_KEYS)\n if (!adyenReturn) return\n this.returningFrom = 'adyen'\n this.adyenSettled = true\n this.autoSelectAttempted = true\n if (!this.checkoutState) {\n const spIdToUse = sponsorId || [...Vio.cart.getAllCarts().keys()][0] || 0\n if (spIdToUse) {\n try {\n Vio.checkout.open(spIdToUse)\n Vio.checkout.selectPaymentMethod('adyen')\n } catch {\n /* noop */\n }\n }\n }\n this.open = true\n this.verifyingReturn = 'Bekrefter betalingen…'\n let payment: AdyenPayment | null = null\n let sawStatus = false\n try {\n payment = await Vio.checkout.getAdyenPayment(\n checkoutId,\n { redirectResult: adyenReturn.redirectResult },\n sponsorId || undefined,\n )\n sawStatus = !!payment\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Adyen return could not be verified:', err)\n }\n }\n this.verifyingReturn = null\n const outcome = sawStatus ? adyenReturnOutcome(payment) : 'pending'\n this.applyReturnOutcome(outcome, sawStatus, 'adyen', sponsorId, checkoutId)\n if (outcome === 'paid' && this.confirmedOrder) {\n this.confirmedOrder = {\n ...this.confirmedOrder,\n currency: payment?.purchase_currency ?? this.confirmedOrder.currency,\n total: payment?.total_price ?? this.confirmedOrder.total,\n }\n this.addAdyenPaymentDetails(payment)\n }\n if (outcome === 'failed') {\n // Nothing was charged: the shopper may pay again, on a new session.\n this.returningFrom = null\n this.adyenSettled = false\n }\n return\n }\n\n if (vioMethod === 'vipps' && checkoutId) {\n // Vipps-specific path: check Vipps' own state instead of the generic\n // checkout status (see pollVippsStatus for why) — deliberately\n // ignores vioPayment's value entirely (not just 'success'), since\n // that URL param can't be trusted either way for Vipps.\n //\n // A fresh page load (redirect back from Vipps) never called\n // Vio.checkout.open() this session, so checkoutState is still null —\n // populate it before showing the notice so the overlay has a\n // coherent state to render instead of a blank/broken shell.\n if (!this.checkoutState) {\n const spIdToUse =\n sponsorId || [...Vio.cart.getAllCarts().keys()][0] || 0\n if (spIdToUse) {\n try {\n Vio.checkout.open(spIdToUse)\n Vio.checkout.selectPaymentMethod('vipps')\n } catch {\n /* noop */\n }\n }\n }\n this.open = true\n this.verifyingReturn = 'Bekrefter betalingen med Vipps…'\n const { outcome, sawStatus } = await this.pollVippsStatus(checkoutId, sponsorId)\n this.verifyingReturn = null\n this.applyReturnOutcome(outcome, sawStatus, vioMethod, sponsorId, checkoutId)\n this.cleanReturnQueryParams(['vio_payment', 'vio_method', 'vio_sponsor', 'checkout_id'])\n } else if (vioPayment === 'success') {\n // The URL is forgeable (and some PSPs reuse one return URL for\n // cancellations) — the BACKEND decides whether this checkout is paid.\n // Webhooks can lag the redirect, so poll a few times before deciding;\n // a genuinely-pending checkout gets a neutral \"processing\" notice, never\n // a fabricated success.\n let outcome: 'paid' | 'failed' | 'pending' | 'duplicate' = 'pending'\n let sawStatus = false\n if (checkoutId) {\n this.open = true\n this.verifyingReturn = 'Bekrefter betalingen…'\n for (const delayMs of VioCheckout.RETURN_VERIFY_DELAYS_MS) {\n if (delayMs > 0) await new Promise((r) => setTimeout(r, delayMs))\n try {\n const checkout = await Vio.checkout.getCheckout(checkoutId, sponsorId || undefined)\n const status = String(checkout?.status ?? '').toLowerCase()\n sawStatus = true\n if (checkout?.duplicate_of) {\n outcome = 'duplicate'\n break\n }\n if (VioCheckout.FAILED_STATUSES.has(status)) {\n outcome = 'failed'\n break\n }\n if (\n VioCheckout.PAID_STATUSES.has(status) ||\n // A Stripe checkout carries `origin_payment_id` from the\n // moment the link or the intent is CREATED (shopcart), so for\n // Stripe that pointer says nothing about who paid. Only the\n // status does, and it is the webhook that sets it.\n (vioMethod !== 'stripe' && Boolean(checkout?.origin_payment_id))\n ) {\n outcome = 'paid'\n break\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] return verification attempt failed:', err)\n }\n }\n }\n this.verifyingReturn = null\n }\n\n this.applyReturnOutcome(outcome, sawStatus, vioMethod, sponsorId, checkoutId)\n this.cleanReturnQueryParams(['vio_payment', 'vio_method', 'vio_sponsor', 'checkout_id'])\n } else if (vioPayment === 'cancel' || vioPayment === 'error') {\n this.paymentError = 'Betalingen ble avbrutt eller feilet. Vennligst prøv igjen.'\n this.open = true\n this.cleanReturnQueryParams(['vio_payment', 'vio_method', 'vio_sponsor', 'checkout_id'])\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] checkReturnPaymentStatus failed:', err)\n }\n }\n }\n\n /** Remove our payment-return params from the URL without a reload. */\n private cleanReturnQueryParams(keys: string[]): void {\n try {\n if (typeof window === 'undefined' || !window.history || !window.location) return\n const url = new URL(window.location.href)\n let changed = false\n keys.forEach((k) => {\n if (url.searchParams.has(k)) {\n url.searchParams.delete(k)\n changed = true\n }\n })\n if (changed) {\n const newSearch = url.searchParams.toString()\n const newUrl = url.pathname + (newSearch ? '?' + newSearch : '') + url.hash\n window.history.replaceState({}, document.title, newUrl)\n }\n } catch {\n // Ignore URL cleanup failures.\n }\n }\n\n override disconnectedCallback(): void {\n Vio.checkout.removeEventListener('change', this.boundOnCheckoutChange)\n Vio.checkout.removeEventListener('payment-complete', this.boundOnPaymentComplete)\n Vio.checkout.removeEventListener('payment-error', this.boundOnPaymentError)\n Vio.checkout.removeEventListener('qliro-event', this.boundOnQliroEvent)\n this.unmountKlarna()\n this.unmountNexi()\n this.unmountAdyen()\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('open')) this.dialogFocus.update(this.open)\n // Opening the overlay: make sure the real shippings are loaded. Gated on\n // items.length — fetching shippings for an empty cart is wasted work and\n // can race the cart's own in-flight mutations.\n if (\n changed.has('open') &&\n this.open &&\n this.items.length > 0 &&\n this.availableShippingsList.length === 0\n ) {\n void this.loadAvailableShippings()\n }\n // The list may have resolved while the overlay was closed, in which case\n // the auto-selection at load time was skipped on purpose.\n if (changed.has('open') && this.open) {\n this.autoSelectSoleMethod()\n }\n // A sole Klarna or Apple Pay can turn usable after the list resolved (its\n // script loads, the browser answers). One more try, only on that flip —\n // the once-per-opening guard exists to stop a livelock, not this.\n if (\n ((changed.has('klarnaAvailable') && this.klarnaAvailable) ||\n (changed.has('applePayAvailable') && this.applePayAvailable)) &&\n this.paymentMethodsResolved &&\n !this.checkoutState?.paymentMethod\n ) {\n this.autoSelectAttempted = false\n this.autoSelectSoleMethod()\n }\n // A cart that cannot ship takes down whatever payment is already on\n // screen: a widget mounted before the shippings answered must not stay\n // payable, and its load error is superseded by the reason.\n if (changed.has('shippingBlocked') && this.shippingBlocked) {\n this.unmountKlarna()\n this.unmountKustom()\n this.unmountQliro()\n this.unmountWalley()\n this.unmountNexi()\n this.unmountAdyen()\n this.unmountStripe()\n this.paymentError = null\n }\n // A checkout taken out of the page (a route change, the host re-rendering\n // it) creates no payment sessions. Its own teardown unmounts the widgets,\n // and the update that follows would otherwise mount them again, detached —\n // a new Klarna, Nexi or Adyen session for a checkout nobody can see.\n // Reattached, it mounts them again (connectedCallback asks for an update).\n if (!this.isConnected) return\n // Mount the Klarna Express button once its slot is in the DOM, the\n // express flow is available, and the overlay is open. Re-mount when the\n // amount changes (the payment request is captured at mount time).\n void this.mountKlarnaIfNeeded()\n void this.mountKustomIfNeeded()\n this.syncKustomIfStale()\n void this.mountQliroIfNeeded()\n void this.mountWalleyIfNeeded()\n void this.mountNexiIfNeeded()\n this.dropStaleAdyen()\n void this.mountAdyenIfNeeded()\n this.dropStaleStripe()\n void this.mountStripeIfNeeded()\n }\n\n close(): void {\n this.open = false\n this.express = false\n Vio.checkout.close()\n }\n\n show(): void {\n this.open = true\n if (this.items.length > 0 && this.availableShippingsList.length === 0) {\n void this.loadAvailableShippings()\n }\n }\n\n /**\n * Fetch the real per-supplier shippings and preselect + persist the first.\n *\n * Also decides whether the cart can ship at all (`shippingBlocked`), and\n * records which opening the answer belongs to (`shippingsReadyFor`).\n */\n private async loadAvailableShippings(): Promise<void> {\n const spId = this.checkoutState?.sponsorId\n if (!spId) return\n if (this.items.length === 0) return\n if (this.loadingShippings) return\n const session = this.embedSession()\n this.loadingShippings = true\n this.shippingsAttempted = true\n try {\n const shippings = await Vio.checkout.fetchAvailableShippings(spId)\n // A newer opening owns the list now; its own load answers for it.\n if (session !== this.embedSession()) return\n if (!Array.isArray(shippings) || shippings.length === 0) {\n if (Vio.checkout.lastShippingsResolved) {\n // The backend answered: nothing ships this cart. A failed lookup\n // keeps the list, and blocks nothing.\n this.availableShippingsList = []\n this.shippingBlocked = this.someLineShipsOnItsOwn()\n }\n } else {\n this.shippingBlocked = false\n this.availableShippingsList = shippings\n if (!this.selectedShipping || !shippings.some((s) => s.id === this.selectedShipping)) {\n const firstOpt = shippings[0]!\n this.selectedShipping = firstOpt.id\n if (firstOpt.supplierId) {\n void Vio.checkout.updateShippingsBySupplier(\n [{ shipping_id: firstOpt.id, supplier_id: Number(firstOpt.supplierId) }],\n spId,\n )\n }\n }\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] loadAvailableShippings failed:', err)\n }\n } finally {\n this.loadingShippings = false\n if (session === this.embedSession()) {\n this.shippingsReadyFor = session\n } else if (this.checkoutState && this.items.length > 0) {\n // This answer came too late for its opening, and it held the guard\n // while the new opening asked. Ask again for the one on screen.\n void this.loadAvailableShippings()\n }\n }\n }\n\n /**\n * Whether some product in the cart has shipping rates of its own. With no\n * rate shared by all of them, that means they cannot ship TOGETHER. A cart\n * where no line has rates is left alone: digital products have none, and\n * shopcart refuses the physical case on its side.\n */\n private someLineShipsOnItsOwn(): boolean {\n return this.items.some(\n (i) => Array.isArray(i.availableShippings) && i.availableShippings.length > 0,\n )\n }\n\n /** Whether all mandatory Leveringsadresse fields are filled. */\n private get isAddressValid(): boolean {\n const f = this.form\n if (!f) return false\n return Boolean(\n f.firstName && String(f.firstName).trim().length > 0 &&\n f.lastName && String(f.lastName).trim().length > 0 &&\n f.email && String(f.email).trim().length > 0 && String(f.email).includes('@') &&\n f.address && String(f.address).trim().length > 0 &&\n f.postalCode && String(f.postalCode).trim().length > 0 &&\n f.city && String(f.city).trim().length > 0,\n )\n }\n\n /** Whether a valid shipping option is selected (when shippings exist). */\n private get hasSelectedShipping(): boolean {\n if (this.availableShippingsList.length === 0) return true\n return Boolean(\n this.selectedShipping && this.shippingList.some((s) => s.id === this.selectedShipping),\n )\n }\n\n /** Which payment buttons to render — backend-configured per sponsor. */\n private async loadAvailablePaymentMethods(): Promise<void> {\n if (!this.checkoutState) return\n if (this.loadingPaymentMethods) return\n this.loadingPaymentMethods = true\n try {\n const spId = this.checkoutState.sponsorId\n const methods = (await Vio.checkout.getAvailablePaymentMethods(\n spId,\n )) as Array<{ name: string }> | unknown\n if (Array.isArray(methods)) {\n this.availableMethods = methods.map((m) => m.name)\n // Which Stripe: the flow travels in the method's own config, and the\n // list is memoised, so this costs nothing extra.\n this.stripeMode = await Vio.checkout.getStripeMode(spId)\n } else {\n this.availableMethods = null\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Failed to load payment methods:', err)\n }\n // Unknown (not \"none\") — render everything rather than an empty grid.\n this.availableMethods = null\n } finally {\n this.loadingPaymentMethods = false\n this.paymentMethodsResolved = true\n this.autoSelectSoleMethod()\n }\n }\n\n /**\n * With exactly one payment method there is no choice to make, so making the\n * shopper click it is a step that can only have one outcome. Select it —\n * and since the checkout asks for the method first (2026-09-22), this is\n * what skips that step: the form, or the provider's widget, comes straight\n * up.\n *\n * Deliberately narrow:\n * - never overrides a method the shopper already picked;\n * - only for methods usable RIGHT NOW — Apple Pay and Klarna depend on the\n * browser and on their script loading, and auto-selecting an unusable one\n * would strand the shopper on a panel that cannot pay (see `updated`: a\n * late \"available\" gets one more try);\n * - selecting never pays: Stripe and Vipps still wait for their own button.\n */\n private autoSelectSoleMethod(): void {\n if (!this.open) return\n // Nothing to decide before the list is in, and returning here must not\n // use up the one attempt: on a first opening the list answers AFTER the\n // overlay opens, and the attempt spent by the opening left a sole method\n // unselected for good (found writing the method-first tests, 2026-09-22).\n if (!this.paymentMethodsResolved) return\n // ONCE per opening, whatever the outcome. `selectPaymentMethod` is a\n // request, not a guarantee: if it does not stick, the resulting state\n // change reloads the method list, which calls this again, selects again,\n // and spins — remounting the provider's widget on every pass. Observed\n // hammering Qliro's orders endpoint with hundreds of requests. A\n // convenience must never be able to livelock the checkout.\n if (this.autoSelectAttempted) return\n this.autoSelectAttempted = true\n if (this.checkoutState?.paymentMethod) return\n const methods = this.offeredMethods()\n if (!Array.isArray(methods) || methods.length !== 1) return\n const id = String(methods[0] ?? '').toLowerCase().replace(/[^a-z]/g, '')\n const usable: Record<string, PaymentMethod | undefined> = {\n kustom: 'kustom',\n qliro: 'qliro',\n walley: 'walley',\n nexi: 'nexi',\n // Selected, not mounted: Adyen waits for the form (see adyenRequested).\n adyen: 'adyen',\n vipps: 'vipps',\n stripe: 'stripe',\n klarna: this.klarnaAvailable ? 'klarna' : undefined,\n applepay: this.applePayAvailable ? 'apple-pay' : undefined,\n }\n const only = usable[id]\n if (!only) return\n Vio.checkout.selectPaymentMethod(only)\n }\n\n /** Backend names arrive as e.g. \"Apple Pay\" — compare letters only. */\n private methodEnabled(...names: string[]): boolean {\n return isMethodEnabled(this.availableMethods, ...names)\n }\n\n /**\n * Stripe's Payment Element shows the wallets of the account that charges —\n * Apple Pay and Google Pay among them. Offering our own Apple Pay button\n * next to it is the same wallet twice, on the same screen, paying through\n * the same account: when Stripe pays on our page, Stripe owns the wallets\n * (Angelo, 2026-09-24). The cart's express button is another surface and\n * keeps its own Apple Pay — the Element does not exist there.\n */\n private stripeOwnsWallets(): boolean {\n return this.stripeMode === 'native' && this.methodEnabled('stripe')\n }\n\n /** The methods the shopper actually sees (see stripeOwnsWallets). */\n private offeredMethods(): string[] | null {\n const methods = this.availableMethods\n if (!Array.isArray(methods) || !this.stripeOwnsWallets()) return methods\n return methods.filter((m) => !isMethodEnabled([m], 'apple-pay'))\n }\n\n private async refreshApplePay(): Promise<void> {\n Vio.checkout.clearApplePayCache()\n this.applePayAvailable = await Vio.checkout.isApplePayAvailable('NO')\n }\n\n private async refreshKlarna(): Promise<void> {\n // Klarna Payments (classic widget) is available if its lib can load — it\n // uses a server-minted client_token, no public clientId / origin handshake.\n const available = await Vio.checkout.klarnaPaymentsAvailable()\n if (available !== this.klarnaAvailable) {\n if (!available) this.unmountKlarna()\n this.klarnaAvailable = available\n }\n }\n\n /** Mount (or re-mount on amount change) the Klarna Payments widget. */\n private async mountKlarnaIfNeeded(): Promise<void> {\n if (!this.klarnaAvailable || !this.open || !this.checkoutState) return\n // Only mount once Klarna is the chosen method — creating a session is a\n // backend call, so don't fire it until the user picks Klarna (or we're in\n // express mode, which is Klarna-only).\n if (this.checkoutState.paymentMethod !== 'klarna' && !this.express) return\n // Method first: Klarna can now be chosen before the form is filled. Its\n // session is still created only once the form is complete, as before.\n if (!this.express && (!this.isAddressValid || !this.hasSelectedShipping)) return\n if (this.klarnaMounting) return\n // Make sure the real shippings are in before mounting — Klarna's total\n // needs to reflect them, not the (removed) static fallback.\n if (this.items.length > 0 && this.availableShippingsList.length === 0 && !this.shippingsAttempted) {\n await this.loadAvailableShippings()\n }\n if (this.shippingBlocked) return\n const amount = this.checkoutState.subtotal\n // Re-mount when the amount OR the chosen shipping changes (a new shipping\n // option means a new session/total — Klarna's widget can't be updated live).\n if (\n this.klarnaHandle &&\n this.klarnaMountedAmount === amount &&\n this.klarnaMountedShipping === this.selectedShipping\n ) {\n return\n }\n const container = this.renderRoot?.querySelector(\n '#vio-klarna-payments-container',\n ) as HTMLElement | null\n if (!container) return\n\n this.klarnaMounting = true\n this.unmountKlarna()\n container.innerHTML = ''\n try {\n const handle = await Vio.checkout.mountKlarnaPayments(container, {\n withShipping: this.express,\n shippingId: this.selectedShipping,\n })\n this.klarnaHandle = handle\n this.klarnaMountedAmount = amount\n this.klarnaMountedShipping = this.selectedShipping\n this.klarnaCategories = handle.categories\n this.klarnaSelectedCat = handle.selected\n // Adopt the backend shippings the mount resolved; keep the selection valid.\n if (Array.isArray(handle.shippings) && handle.shippings.length > 0) {\n this.availableShippingsList = handle.shippings\n if (\n !this.selectedShipping ||\n !handle.shippings.some((s) => s.id === this.selectedShipping)\n ) {\n this.selectedShipping = handle.shippings[0]!.id\n }\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna Payments mount failed:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'klarna')\n } finally {\n this.klarnaMounting = false\n }\n }\n\n private unmountKlarna(): void {\n if (this.klarnaHandle) {\n this.klarnaHandle.unmount()\n this.klarnaHandle = null\n }\n this.klarnaMountedAmount = null\n this.klarnaMountedShipping = null\n // A fresh [] is a change to Lit even when the list is already empty: every\n // mount attempt would schedule another update, and a mount that fails\n // fast would retry forever.\n if (this.klarnaCategories.length > 0) this.klarnaCategories = []\n this.klarnaSelectedCat = ''\n this.klarnaAuthorizing = false\n }\n\n /** Shippings in effect: backend per-supplier when loaded. */\n private get shippingList(): KlarnaShippingOption[] {\n return this.availableShippingsList\n }\n\n /** Selected shipping option (express flow). */\n private get shippingOption() {\n const list = this.shippingList\n return list.find((o) => o.id === this.selectedShipping) ?? list[0] ?? null\n }\n\n /** Pick a shipping option → re-mounts the Klarna widget with the new total.\n * Also persists the choice on the backend cart (per supplier). */\n private async onSelectShipping(id: string): Promise<void> {\n if (this.selectedShipping === id || this.klarnaMounting) return\n this.selectedShipping = id\n const selectedOpt = this.shippingList.find((s) => s.id === id)\n if (selectedOpt?.supplierId) {\n try {\n await Vio.checkout.updateShippingsBySupplier(\n [{ shipping_id: selectedOpt.id, supplier_id: Number(selectedOpt.supplierId) }],\n this.checkoutState?.sponsorId,\n )\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] updateShippingsBySupplier failed:', err)\n }\n }\n }\n }\n\n /** Switch the Klarna widget to a different payment_method_category. */\n private async onKlarnaCategory(identifier: string): Promise<void> {\n if (!this.klarnaHandle) return\n this.klarnaSelectedCat = identifier\n if (typeof console !== 'undefined') {\n console.log('[VioCheckout] User selected payment_method_category:', identifier)\n }\n try {\n await this.klarnaHandle.load(identifier)\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna category switch failed:', err)\n }\n }\n }\n\n /** Authorize the selected Klarna method → backend creates the order. */\n private async onKlarnaAuthorize(): Promise<void> {\n if (!this.klarnaHandle || this.klarnaAuthorizing || this.shippingBlocked) return\n this.paymentError = null\n this.paymentNotice = null\n this.klarnaAuthorizing = true\n const cat = this.klarnaSelectedCat || this.klarnaHandle.selected || 'pay_now'\n if (typeof console !== 'undefined') {\n console.log('[VioCheckout] Authorizing Klarna with payment_method_category:', cat)\n }\n try {\n // Resolves once the order is created (payment-complete) or surfaces a\n // payment-error event handled by boundOnPaymentError.\n await this.klarnaHandle.authorize(cat)\n } finally {\n this.klarnaAuthorizing = false\n }\n }\n\n private onFieldChange<K extends keyof CheckoutAddress>(field: K, value: string): void {\n this.form = { ...this.form, [field]: value }\n Vio.checkout.setAddress(this.form)\n }\n\n /** After choosing a method that needs our form, bring the form into view. */\n private revealAddressForm(): void {\n void this.updateComplete.then(() => {\n const form = this.renderRoot?.querySelector<HTMLElement>('.address-section')\n if (!form) return\n // The topbar is sticky inside the scrolling modal: aligned to the top,\n // the form's \"Steg 1 · Leveringsadresse\" heading would land under it.\n const bar = this.renderRoot?.querySelector<HTMLElement>('.topbar')\n form.style.scrollMarginTop = `${(bar?.offsetHeight ?? 0) + 8}px`\n form.scrollIntoView?.({ behavior: 'smooth', block: 'start' })\n })\n }\n\n /**\n * Vipps from the checkout: Express when the channel allows it, so the\n * shopper picks the delivery inside the app — our rate on the cart is the\n * one preselected there — and never silently keeps the default our form\n * chose for them. When the cart cannot have Express (several suppliers)\n * the backend says so without creating a payment, and the plain payment\n * follows: profile shared, the rate already on the cart.\n */\n private async startVippsFromCheckout(): Promise<void> {\n const sponsorId = this.checkoutState?.sponsorId\n const express = await Vio.checkout.getVippsExpressEnabled(sponsorId)\n if (express) {\n const res = await Vio.checkout.startVippsPayment(sponsorId, this.form, { express: true })\n if (res?.payment_url) return\n }\n await Vio.checkout.startVippsPayment(sponsorId, this.form)\n }\n\n private async onApplePay(): Promise<void> {\n if (this.applePayInProgress) return\n this.applePayInProgress = true\n try {\n // On authorize, startApplePay dispatches `payment-complete` →\n // boundOnPaymentComplete → confirmOrder shows the confirmation drawer\n // (and emits vio:payment-success). No manual close/emit here.\n await Vio.checkout.startApplePay({ country: 'NO', label: 'Vio' })\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Apple Pay flow ended:', err)\n }\n } finally {\n this.applePayInProgress = false\n }\n }\n\n private async onPay(method: PaymentMethod): Promise<void> {\n // The payment step already says why nothing can be paid.\n if (this.shippingBlocked) return\n this.paymentError = null\n this.paymentNotice = null\n // Apple Pay collects address, shipping AND email inside its own sheet —\n // skip the manual form validation entirely.\n if (method === 'apple-pay') {\n void this.onApplePay()\n return\n }\n // Kustom's embedded checkout collects address, shipping, email AND\n // payment — nothing to validate before mounting it.\n if (method === 'kustom') {\n Vio.checkout.selectPaymentMethod('kustom')\n return\n }\n // Qliro: same widget-does-everything category as Kustom.\n if (method === 'qliro') {\n Vio.checkout.selectPaymentMethod('qliro')\n return\n }\n // Walley: same widget-does-everything category as Kustom/Qliro.\n if (method === 'walley') {\n Vio.checkout.selectPaymentMethod('walley')\n return\n }\n // Nexi: same widget-does-everything category.\n if (method === 'nexi') {\n Vio.checkout.selectPaymentMethod('nexi')\n return\n }\n // Vipps collects address, delivery AND email in its own flow (Express,\n // 2026-09-29) — nothing of ours has to be filled in first, so one click\n // selects it and starts it. An email the shopper already typed (the\n // \"Kontakt\" section, or another method's form) travels along.\n if (method !== 'vipps') {\n const missing = !this.isAddressValid\n ? 'Vennligst fyll ut alle feltene i leveringsadresse.'\n : !this.hasSelectedShipping\n ? 'Vennligst velg en fraktmetode.'\n : null\n if (missing) {\n // Method first (Angelo, 2026-09-22): our delivery form appears only\n // once a method that needs it is chosen, so choosing the method IS\n // the way to the form. Refusing before selecting would leave the\n // shopper with an error and no form — the Vipps dead end again.\n if (this.checkoutState?.paymentMethod !== method) {\n Vio.checkout.selectPaymentMethod(method)\n this.revealAddressForm()\n return\n }\n this.paymentError = missing\n return\n }\n }\n Vio.checkout.selectPaymentMethod(method)\n // Adyen: the form and the shipping are valid (checked above), and choosing\n // the method is asking for the payment step — mountAdyenIfNeeded takes over.\n if (method === 'adyen') {\n this.adyenRequested = true\n return\n }\n // Stripe / Vipps: hosted payment pages — mint the link and redirect. The\n // return trip lands in checkReturnPaymentStatus().\n if (method === 'stripe') {\n // …unless this channel offers the native flow, where the shopper pays\n // here (Angelo, 2026-09-24). Asking is what mints the PaymentIntent:\n // mountStripeIfNeeded takes over, exactly as Adyen does.\n if (this.stripeMode === null) {\n this.stripeMode = await Vio.checkout.getStripeMode(this.checkoutState?.sponsorId)\n }\n if (this.stripeMode === 'native') {\n this.stripeRequested = true\n return\n }\n // Persist the chosen shipping before the link is minted (total depends on it).\n const selectedOpt = this.shippingList.find((s) => s.id === this.selectedShipping)\n if (selectedOpt?.supplierId) {\n try {\n await Vio.checkout.updateShippingsBySupplier(\n [{ shipping_id: selectedOpt.id, supplier_id: Number(selectedOpt.supplierId) }],\n this.checkoutState?.sponsorId,\n )\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] updateShippingsBySupplier on stripe pay failed:', err)\n }\n }\n }\n this.stripeLoading = true\n void Vio.checkout\n .startStripePayment(this.checkoutState?.sponsorId, this.form)\n .catch((err: unknown) => {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Stripe payment could not start:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'stripe')\n })\n .finally(() => {\n this.stripeLoading = false\n })\n }\n if (method === 'vipps') {\n this.vippsLoading = true\n void this.startVippsFromCheckout()\n .catch((err: unknown) => {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Vipps payment could not start:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'vipps')\n })\n .finally(() => {\n this.vippsLoading = false\n })\n }\n }\n\n /**\n * Complete the order for the selected method. Apple Pay and Klarna Express\n * finish inside their own sheet/popup; Stripe and Vipps redirect to their\n * hosted pages (via onPay). Anything else confirms state-only.\n */\n private onCompleteOrder(): void {\n const s = this.checkoutState\n if (!s || !s.paymentMethod) return\n if (this.shippingBlocked) return\n if (s.paymentMethod !== 'vipps' && !this.isAddressValid) {\n this.paymentError = 'Vennligst fyll ut alle feltene i leveringsadresse.'\n return\n }\n if (s.paymentMethod === 'stripe' || s.paymentMethod === 'vipps') {\n void this.onPay(s.paymentMethod)\n return\n }\n // Only methods with a real payment flow may confirm. 'card' has no PSP\n // wired — confirming would show success without charging.\n if (s.paymentMethod !== 'klarna' && s.paymentMethod !== 'apple-pay') {\n this.paymentError = 'Betalingsmetoden er ikke tilgjengelig ennå.'\n return\n }\n this.confirmOrder(s.paymentMethod, s.sponsorId)\n }\n\n /**\n * Shared order confirmation — reached from both the plain \"Betal\" CTA\n * (Vipps/Card/Klarna) and the Klarna Express authorize callback. Shows\n * the confirmation screen, emits `vio:payment-success`, and clears the\n * paid sponsor's cart so the badge + drawer reflect the purchase.\n */\n private confirmOrder(\n method: PaymentMethod,\n sponsorId: number,\n result?: unknown,\n returnCheckoutId?: string,\n ): void {\n // Snapshot the order BEFORE clearing the cart — the confirmation needs it.\n const r = (result ?? {}) as { order?: { orderId?: string }; chargedTotal?: number }\n const shippingPrice = this.shippingMajor()\n const email = String(this.form.email ?? '').trim()\n // Before the cart is cleared: the checkout id goes with it. Back from a\n // redirect the state was re-opened without one, so the return URL's id\n // is passed in explicitly.\n const checkoutId = returnCheckoutId || this.checkoutState?.checkoutId\n // An id a provider hands back is ITS order (Qliro's, say), not Vio's: it\n // is the provider's reference, under the provider's name.\n const providerOrderId = r.order?.orderId != null ? String(r.order.orderId) : ''\n this.confirmedOrder = {\n items: [...this.items],\n currency: this.checkoutState?.currency ?? '',\n total:\n typeof r.chargedTotal === 'number' ? r.chargedTotal : (this.checkoutState?.subtotal ?? 0),\n ...(providerOrderId\n ? { providerRef: { label: `Ordre hos ${this.methodLabel(method)}`, value: providerOrderId } }\n : {}),\n ...(shippingPrice > 0\n ? { shipping: { name: this.summaryShippingName() || 'Frakt', price: shippingPrice } }\n : {}),\n ...(email ? { email } : {}),\n }\n this.confirmedMethod = method\n this.orderConfirmed = true\n // A redirect completion lands with the overlay closed — open it so the\n // confirmation screen is visible.\n this.open = true\n this.dispatchEvent(\n new CustomEvent('vio:payment-success', {\n bubbles: true,\n composed: true,\n // `checkoutId` is Vio's own reference for the purchase — what the\n // redirect path already sends as `orderId`; analytics falls back to it\n // when the provider's result carries no order id.\n detail: { method, sponsorId, result, checkoutId },\n }),\n )\n Vio.cart.clearSponsorCart(sponsorId)\n void this.fillOrderNumber(checkoutId, sponsorId)\n }\n\n /** Waits between asks for the Vio order number: the order is often born a\n * moment after the payment (Vipps and Stripe through their webhook). */\n private static readonly ORDER_NUMBER_DELAYS_MS = [0, 1500, 3000, 5000, 8000]\n\n /**\n * Puts the Vio order number (#4497) on the confirmation once the order\n * exists. Until then the line is simply not there — never the checkout's\n * uuid in its place, which is what it used to print. Stops if the shopper\n * closes the drawer or another confirmation takes its place.\n */\n private async fillOrderNumber(checkoutId: string | undefined, sponsorId: number): Promise<void> {\n this.confirmedCheckoutId = checkoutId || null\n if (!checkoutId) return\n const stillShowing = () => this.orderConfirmed && this.confirmedCheckoutId === checkoutId\n for (const delayMs of VioCheckout.ORDER_NUMBER_DELAYS_MS) {\n if (delayMs > 0) await new Promise((r) => setTimeout(r, delayMs))\n if (!stillShowing()) return\n const n = await Vio.checkout.getOrderNumber(checkoutId, sponsorId || undefined)\n if (!stillShowing()) return\n if (n && this.confirmedOrder) {\n this.confirmedOrder = { ...this.confirmedOrder, orderId: String(n) }\n return\n }\n }\n }\n\n private methodLabel(method: PaymentMethod | null): string {\n switch (method) {\n case 'apple-pay':\n return 'Apple Pay'\n case 'klarna':\n return 'Klarna'\n case 'kustom':\n return 'Kustom'\n case 'qliro':\n return 'Qliro'\n case 'walley':\n return 'Walley'\n case 'nexi':\n return 'Nexi'\n // Adyen is not a name shoppers know; what they pick from is inside it.\n case 'adyen':\n return 'Kort, Vipps og flere'\n case 'vipps':\n return 'Vipps'\n case 'stripe':\n return 'Stripe'\n case 'card':\n return 'Kort'\n default:\n return ''\n }\n }\n\n /** True for methods that complete via a separate sheet/widget, not the CTA. */\n private isExpressMethod(method: PaymentMethod | undefined): boolean {\n // Apple Pay finishes in its sheet; Klarna finishes via its widget's\n // authorize() button; Kustom's embedded checkout has its own buy button —\n // none of them uses the generic \"Betal\" CTA.\n return (\n method === 'apple-pay' ||\n method === 'klarna' ||\n isEmbeddedMethod(method ?? '') ||\n // Adyen's Drop-in brings its own Pay button.\n isFormFirstWidgetMethod(method ?? '')\n )\n }\n\n private orderTotal(): string {\n const s = this.checkoutState\n if (!s) return ''\n return formatPrice(s.subtotal, s.currency)\n }\n\n /** Shipping cost (major units) whenever a shipping option is in effect —\n * express always has one; the normal flow has one once the backend\n * shippings loaded (the choice IS persisted on the cart and charged). */\n private shippingMajor(): number {\n if (this.checkoutState?.paymentMethod === 'qliro' && typeof this.qliroShipping?.price === 'number') {\n return this.qliroShipping.price\n }\n if (this.checkoutState?.paymentMethod === 'nexi' && typeof this.nexiShipping?.shipping_price === 'number') {\n return this.nexiShipping.shipping_price\n }\n if (this.checkoutState?.paymentMethod === 'kustom' && typeof this.kustomShipping?.price === 'number') {\n return this.kustomShipping.price\n }\n if (!this.express && this.availableShippingsList.length === 0) return 0\n const o = this.shippingOption\n if (!o) return 0\n return o.priceMajor ?? o.price / 100\n }\n\n /** The rate the summary names — Qliro's own pick while Qliro is the method. */\n private summaryShippingName(): string {\n if (this.checkoutState?.paymentMethod === 'qliro' && this.qliroShipping) {\n const ref = this.qliroShipping.ref\n const picked = ref ? this.availableShippingsList.find((o) => o.id === ref) : undefined\n // A price with no rate we recognise: show the price, never another name.\n return picked ? picked.method || picked.name || '' : ''\n }\n if (this.checkoutState?.paymentMethod === 'nexi' && this.nexiShipping) {\n return this.nexiShipping.shipping_name ?? ''\n }\n const o = this.shippingOption\n return o ? o.method || o.name || '' : ''\n }\n\n /** Total to charge — items + shipping (express). */\n private payTotalLabel(): string {\n const s = this.checkoutState\n if (!s) return ''\n return formatPrice(s.subtotal + this.shippingMajor(), s.currency)\n }\n\n override render() {\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <div\n class=\"modal ${this.express ? 'as-side' : this.orderConfirmed ? 'as-confirm' : ''}\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.heading}\n tabindex=\"-1\"\n >\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"topbar\">\n <h2 class=\"heading\">${this.orderConfirmed ? 'Takk!' : this.heading}</h2>\n <button class=\"close\" @click=${this.close} aria-label=\"Lukk\">×</button>\n </div>\n\n <div class=\"body\">\n ${this.providerReceipt\n ? this.renderProviderReceipt()\n : this.orderConfirmed\n ? this.renderConfirmation()\n : this.verifyingReturn\n ? this.renderVerifying()\n : this.express\n ? this.renderKlarnaExpress()\n : this.renderCheckoutBody()}\n </div>\n </div>\n `\n }\n\n /**\n * The provider's receipt on its own. It must not depend on the cart: the\n * payment step is rendered from the cart, and clearing the cart after a\n * purchase is what took Qliro's receipt away on 2026-09-08 and brought back\n * \"how do you want to pay\". The provider's container lives in the light DOM\n * and is projected here, untouched.\n */\n private renderProviderReceipt() {\n const slot =\n this.providerReceipt === 'walley'\n ? 'vio-walley'\n : this.providerReceipt === 'kustom'\n ? 'vio-kustom'\n : 'vio-qliro'\n return html`\n <section class=\"section provider-receipt\">\n <slot name=${slot}></slot>\n <button class=\"confirm-close\" @click=${this.close}>Lukk</button>\n </section>\n `\n }\n\n /**\n * A completed purchase whose receipt the PROVIDER shows. Same side effects as\n * confirmOrder — `vio:payment-success` for the host and analytics, the\n * sponsor's cart cleared — but the screen is the provider's receipt, not our\n * \"Takk!\": two receipts for one purchase is one too many.\n */\n private showProviderReceipt(\n method: 'qliro' | 'walley' | 'kustom',\n sponsorId: number,\n result?: unknown,\n returnCheckoutId?: string,\n ): void {\n this.providerReceipt = method\n this.confirmedMethod = method\n this.open = true\n // Before the cart is cleared below: the checkout id goes with it. Back\n // from a redirect the state was re-opened without one (`Vio.checkout.open`\n // knows no checkout yet), so the return URL's id is passed in explicitly.\n const checkoutId = returnCheckoutId || this.checkoutState?.checkoutId\n this.dispatchEvent(\n new CustomEvent('vio:payment-success', {\n bubbles: true,\n composed: true,\n detail: { method, sponsorId, result, checkoutId },\n }),\n )\n if (sponsorId) {\n try {\n Vio.cart.clearSponsorCart(sponsorId)\n } catch {\n /* noop */\n }\n }\n }\n\n /** Back from the payment page, asking whether it was paid — and nothing\n * else on screen while we do. */\n private renderVerifying() {\n return html`\n <section class=\"verifying\" role=\"status\" aria-live=\"polite\">\n <span class=\"verifying-spinner\" aria-hidden=\"true\"></span>\n <p class=\"verifying-text\">${this.verifyingReturn}</p>\n <p class=\"verifying-hint\">Dette kan ta litt tid. Ikke lukk siden.</p>\n </section>\n `\n }\n\n private renderConfirmation() {\n const o = this.confirmedOrder\n const email = o?.email || String(this.form.email ?? '').trim()\n const details: Array<[string, string]> = []\n if (o?.orderId) details.push(['Ordrenummer', `#${o.orderId}`])\n details.push(['Betalingsmåte', o?.paidWith || this.methodLabel(this.confirmedMethod)])\n if (o?.providerRef) details.push([o.providerRef.label, o.providerRef.value])\n if (email) details.push(['Kvittering til', email])\n return html`\n <section class=\"confirmation\">\n <header class=\"confirm-head\">\n <div class=\"confirm-check\" aria-hidden=\"true\">✓</div>\n <div>\n <h3 class=\"confirm-title\">Takk for bestillingen!</h3>\n <p class=\"confirm-text\">\n Betalingen er bekreftet.${email\n ? html` Du får en ordrebekreftelse på e-post.`\n : ''}\n </p>\n </div>\n </header>\n\n <dl class=\"confirm-details\">\n ${details.map(\n ([k, v]) =>\n html`<div><dt>${k}</dt><dd class=${k === o?.providerRef?.label ? 'ref' : ''}>${v}</dd></div>`,\n )}\n </dl>\n\n ${o && o.items.length > 0\n ? html`\n <div class=\"confirm-summary\">\n <div class=\"confirm-label\">Din bestilling</div>\n ${o.items.map(\n (it) => html`\n <div class=\"confirm-line\">\n ${it.imageUrl\n ? html`<img class=\"confirm-thumb\" src=${it.imageUrl} alt=\"\" loading=\"lazy\" />`\n : html`<span class=\"confirm-thumb\" aria-hidden=\"true\"></span>`}\n <span class=\"confirm-line-name\">\n ${it.brand ? html`<small>${it.brand}</small>` : ''}\n <span>${it.name}</span>\n <small>Antall: ${it.quantity}</small>\n </span>\n <span class=\"confirm-line-price\">\n ${formatPrice(it.unitPrice * it.quantity, it.currency)}\n </span>\n </div>\n `,\n )}\n ${o.shipping\n ? html`\n <div class=\"order-row\">\n <span>Frakt – ${o.shipping.name}</span>\n <span>${formatPrice(o.shipping.price, o.currency)}</span>\n </div>\n `\n : ''}\n <div class=\"order-row total\">\n <span>Totalt</span><span>${formatPrice(o.total, o.currency)}</span>\n </div>\n </div>\n `\n : ''}\n <button class=\"confirm-close\" @click=${this.close}>Fortsett å handle</button>\n </section>\n `\n }\n\n /**\n * Whether mounting an embedded checkout now would be starting a payment the\n * shopper asked for. Mounting CREATES an order at the provider (and a backend\n * checkout if there is none), so it must not happen on a confirmation return,\n * once this checkout's order is confirmed, or for a cart that cannot ship.\n */\n private mayStartEmbeddedPayment(): boolean {\n return (\n !this.returningFrom &&\n !this.orderConfirmed &&\n !this.providerReceipt &&\n !this.shippingBlocked &&\n this.shippingsSettled()\n )\n }\n\n /**\n * Whether we know enough about shipping to create an order. The provider\n * prices the order when it is created, so a first opening waits for the\n * shippings to answer: the cart may turn out unable to ship at all. A list\n * already on screen counts, and a later answer that blocks the cart takes\n * the widget down again (see `updated`).\n */\n private shippingsSettled(): boolean {\n return (\n this.items.length === 0 ||\n this.availableShippingsList.length > 0 ||\n this.shippingsReadyFor === this.embedSession()\n )\n }\n\n /** Why nothing can be paid: the cart's products cannot ship together. */\n private renderShippingBlocked() {\n return html`<div class=\"payment-error\" role=\"alert\">${VioCheckout.SHIPPING_BLOCKED_MESSAGE}</div>`\n }\n\n /**\n * The checkout an embedded widget's order belongs to. Kustom, Qliro and\n * Walley price the order when it is created, so a widget kept into a NEW\n * checkout shows — and charges — the cart it was created for.\n *\n * Closing drops the widgets, but a checkout can start again without a\n * close: in Vev the cart view opens on top of the checkout and \"Til kassen\"\n * calls `Vio.checkout.open()` again (Angelo, 2026-09-14: quantities raised\n * in the cart view, Qliro kept the old total). Every `open()` is a new\n * session, so a widget from an earlier one starts over.\n *\n * 0.11.3 compared the cart LINES instead, and that was wrong: within one\n * session the backend rewrites them (saving the shipping re-reads the cart),\n * so the first Qliro event after that — the customer picking a shipping —\n * tore the widget down mid-purchase (Alan, 2026-09-14). The session does\n * not change under the customer's hands.\n */\n private embedSession(): string {\n const s = this.checkoutState\n return `${s?.sponsorId ?? ''}|${s?.session ?? ''}`\n }\n\n /** Klarna Payments widget panel: shipping + category chips + widget + pay button. */\n /**\n * The cart a Kustom order describes. When it changes under a mounted\n * widget, the order is UPDATED in place (Kustom's rule) — see\n * syncKustomIfStale. The order is a photo of the lines, not of the form:\n * address and shipping live inside the widget.\n */\n private kustomCartKey(): string {\n return JSON.stringify([\n this.items.map((i) => [i.productId, i.variantId ?? '', i.quantity]),\n this.checkoutState?.subtotal ?? 0,\n ])\n }\n\n /** Mount the Kustom embedded checkout once it's the chosen method. */\n private async mountKustomIfNeeded(): Promise<void> {\n if (!this.open || !this.checkoutState) return\n if (this.checkoutState.paymentMethod !== 'kustom') return\n if (!this.mayStartEmbeddedPayment()) return\n if (this.kustomMounting || this.kustomSyncing) return\n // Already mounted for THIS checkout session — the KCO iframe manages\n // itself (address, shipping and totals live inside it). A new session\n // (closed and reopened) asks the backend again, which updates the same\n // order if it is still open.\n if (this.kustomMountedOrderId) {\n if (this.kustomMountedFor === this.embedSession()) return\n this.unmountKustom()\n }\n // Kustom's snippet resolves its mount point from the document: the\n // container lives in the light DOM and is projected into the panel\n // through a named slot, like every other third-party embed here.\n const container = this.lightContainer('vio-kustom-checkout-container', 'vio-kustom')\n\n const mountedFor = this.embedSession()\n const mountedKey = this.kustomCartKey()\n this.kustomMounting = true\n this.kustomNotice = null\n this.paymentError = null\n container.innerHTML = ''\n try {\n const order = await Vio.checkout.mountKustomCheckout(\n container,\n this.checkoutState.sponsorId,\n this.kustomHandlers(),\n )\n this.kustomMountedOrderId = order.order_id\n this.kustomMountedFor = mountedFor\n this.kustomMountedKey = mountedKey\n this.kustomShipping =\n order.shipping_name !== undefined || order.shipping_price !== undefined\n ? { name: order.shipping_name, price: order.shipping_price }\n : null\n this.kustomTotal = typeof order.total_price === 'number' ? order.total_price : null\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Kustom mount failed:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'kustom')\n Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n } finally {\n this.kustomMounting = false\n }\n }\n\n /** What the widget tells us, kept only to show — never acted on server-side. */\n private kustomHandlers() {\n return {\n onOrderTotalChange: (minor: number) => {\n this.kustomTotal = minor / 100\n },\n onShippingOptionChange: (o: { name?: string; price?: number }) => {\n this.kustomShipping = {\n name: o?.name,\n price: typeof o?.price === 'number' ? o.price / 100 : undefined,\n }\n },\n onCannotComplete: () => {\n this.kustomNotice = 'Betalingen kunne ikke gjennomføres med valgt metode. Velg en annen betalingsmåte.'\n },\n onNetworkError: () => {\n this.kustomNotice = 'Mistet kontakt med betalingsvinduet. Last inn siden på nytt.'\n },\n }\n }\n\n /**\n * The cart changed under a mounted Kustom widget: suspend it, push the\n * cart into the same order, resume it. Never a second order, never a\n * widget showing a total the backend will not charge (the validation\n * callback would refuse it). A failed sync takes the widget down.\n */\n private syncKustomIfStale(): void {\n if (!this.kustomMountedOrderId || this.kustomMounting || this.kustomSyncing) return\n if (this.providerReceipt || this.returningFrom) return\n const key = this.kustomCartKey()\n if (key === this.kustomMountedKey) return\n this.kustomSyncing = true\n this.kustomMountedKey = key\n void Vio.checkout.syncKustomOrder(this.checkoutState?.sponsorId)\n .then((order) => {\n if (!order) throw new Error('no order')\n this.kustomMountedOrderId = order.order_id\n this.kustomTotal = typeof order.total_price === 'number' ? order.total_price : this.kustomTotal\n })\n .catch((err) => {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Kustom sync failed:', err)\n }\n this.unmountKustom()\n this.kustomNotice = 'Bestillingen ble endret. Last inn betalingen på nytt.'\n })\n .finally(() => {\n this.kustomSyncing = false\n })\n }\n\n private unmountKustom(): void {\n this.kustomMountedOrderId = null\n this.kustomMountedFor = null\n this.kustomMountedKey = null\n this.kustomShipping = null\n this.kustomTotal = null\n Vio.checkout.destroyKustomListeners()\n this.querySelector<HTMLElement>('#vio-kustom-checkout-container')?.remove()\n }\n\n private renderKustomPanel() {\n return html`\n <div class=\"kustom-panel\">\n ${this.kustomMounting\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Laster Kustom…</div>`\n : ''}\n ${this.kustomSyncing\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Oppdaterer bestillingen…</div>`\n : ''}\n ${this.kustomNotice\n ? html`<div class=\"payment-notice\">${this.kustomNotice}</div>`\n : ''}\n <slot name=\"vio-kustom\"></slot>\n </div>\n `\n }\n\n /** Mount the Qliro embedded checkout once it's the chosen method. */\n\n /**\n * Container for a third-party embed, living in the LIGHT DOM.\n *\n * Qliro's (and Walley's) bootstrap script resolves its mount point from the\n * document, so a container inside this component's shadow root is invisible\n * to it and the widget silently never renders — verified against Qliro's\n * staging widget: identical snippet, light DOM renders the iframe, shadow\n * DOM renders nothing at all. The element is a child of the host (light DOM)\n * and is projected back into the panel through a named slot, so the layout\n * is unchanged. Kustom's KCO snippet resolves its own script's parent, so it\n * works either way and keeps using the shadow-root container.\n */\n private lightContainer(id: string, slotName: string): HTMLElement {\n let el = this.querySelector<HTMLElement>(`#${id}`)\n if (!el) {\n el = document.createElement('div')\n el.id = id\n el.setAttribute('slot', slotName)\n this.appendChild(el)\n }\n return el\n }\n\n private async mountQliroIfNeeded(): Promise<void> {\n if (!this.open || !this.checkoutState) return\n if (this.checkoutState.paymentMethod !== 'qliro') return\n if (!this.mayStartEmbeddedPayment()) return\n if (this.qliroMounting) return\n let container = this.lightContainer('vio-qliro-checkout-container', 'vio-qliro')\n if (this.qliroMountedOrderId && container.childElementCount > 0) {\n if (this.qliroMountedFor === this.embedSession()) return\n this.unmountQliro()\n container = this.lightContainer('vio-qliro-checkout-container', 'vio-qliro')\n }\n\n const mountedFor = this.embedSession()\n this.qliroMounting = true\n container.innerHTML = ''\n try {\n const order = await Vio.checkout.mountQliroCheckout(\n container,\n this.checkoutState.sponsorId,\n )\n this.qliroMountedOrderId = order.order_id\n this.qliroMountedFor = mountedFor\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Qliro mount failed:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'qliro')\n Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n } finally {\n this.qliroMounting = false\n }\n }\n\n private unmountQliro(): void {\n this.qliroMountedOrderId = null\n this.qliroMountedFor = null\n this.qliroShipping = null\n // Release the q1 listeners with the widget they belong to — and any lock\n // still held, which would otherwise outlive the iframe.\n Vio.checkout.destroyQliroListeners()\n this.querySelector<HTMLElement>('#vio-qliro-checkout-container')?.remove()\n }\n\n private renderQliroPanel() {\n return html`\n <div class=\"qliro-panel\">\n ${this.qliroMounting\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Laster Qliro…</div>`\n : ''}\n <slot name=\"vio-qliro\"></slot>\n </div>\n `\n }\n\n /**\n * Mount the Walley embedded checkout once it's the chosen method. Unlike\n * Kustom/Qliro, success is signalled INLINE by Walley's own DOM event\n * (`walleyCheckoutPurchaseCompleted`) — no redirect round-trip needed, so\n * we handle it here instead of only in the confirmation-return branch.\n */\n private async mountWalleyIfNeeded(): Promise<void> {\n if (!this.open || !this.checkoutState) return\n if (this.checkoutState.paymentMethod !== 'walley') return\n if (!this.mayStartEmbeddedPayment()) return\n if (this.walleyMounting) return\n let container = this.lightContainer('vio-walley-checkout-container', 'vio-walley')\n if (this.walleyMountedOrderId && container.childElementCount > 0) {\n if (this.walleyMountedFor === this.embedSession()) return\n this.unmountWalley()\n container = this.lightContainer('vio-walley-checkout-container', 'vio-walley')\n }\n\n const mountedFor = this.embedSession()\n this.walleyMounting = true\n container.innerHTML = ''\n try {\n const order = await Vio.checkout.mountWalleyCheckout(\n container,\n this.checkoutState.sponsorId,\n () => {\n // The widget confirmed the purchase inline and shows its own\n // receipt — keep it on screen, as the confirmation-URL path does.\n this.showProviderReceipt('walley', this.checkoutState?.sponsorId ?? 0, {\n orderId: order.order_id,\n })\n },\n )\n this.walleyMountedOrderId = order.order_id\n this.walleyMountedFor = mountedFor\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Walley mount failed:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'walley')\n Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n } finally {\n this.walleyMounting = false\n }\n }\n\n private unmountWalley(): void {\n this.walleyMountedOrderId = null\n this.walleyMountedFor = null\n this.querySelector<HTMLElement>('#vio-walley-checkout-container')?.remove()\n }\n\n private renderWalleyPanel() {\n return html`\n <div class=\"walley-panel\">\n ${this.walleyMounting\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Laster Walley…</div>`\n : ''}\n <slot name=\"vio-walley\"></slot>\n </div>\n `\n }\n\n /**\n * Mount the Nexi embedded checkout once it's the chosen method. Nexi's own\n * JS SDK renders into a LIGHT-DOM container (it refuses a shadow root);\n * completion is its `payment-completed` event — Nexi neither redirects nor\n * shows a receipt, so success lands in Vio's confirmation drawer. Shipping\n * is re-priced on `address-changed` (see the manager).\n */\n private async mountNexiIfNeeded(): Promise<void> {\n if (!this.open || !this.checkoutState) return\n if (this.checkoutState.paymentMethod !== 'nexi') return\n if (!this.mayStartEmbeddedPayment()) return\n if (this.nexiMounting) return\n let container = this.lightContainer('vio-nexi-checkout-container', 'vio-nexi')\n if (this.nexiMountedOrderId && container.childElementCount > 0) {\n if (this.nexiMountedFor === this.embedSession()) return\n this.unmountNexi()\n container = this.lightContainer('vio-nexi-checkout-container', 'vio-nexi')\n }\n\n const mountedFor = this.embedSession()\n const resumePaymentId = this.nexiResumePaymentId\n this.nexiResumePaymentId = null\n this.nexiMounting = true\n this.nexiShippingNotice = null\n container.innerHTML = ''\n try {\n const order = await Vio.checkout.mountNexiCheckout(container, this.checkoutState.sponsorId, {\n onCompleted: (paid) => this.onNexiCompleted(paid.order_id),\n onShipping: (result, err) => {\n const wanted = this.nexiShipping?.shipping_id\n const pickedNow = this.nexiPicking\n this.nexiPicking = false\n if (err || !result) {\n this.nexiShipping = null\n this.nexiShippingNotice = 'Kunne ikke beregne frakt. Prøv å endre adressen.'\n } else if (result.reason === 'AWAITING_ADDRESS') {\n // The rates of the market, shown before any address; nothing charged.\n this.nexiShipping = result\n this.nexiShippingNotice = null\n } else if (!result.ok) {\n this.nexiShipping = null\n this.nexiShippingNotice = 'Vi kan dessverre ikke sende til dette landet.'\n } else {\n this.nexiShipping = result\n if (result.repriced_at_pay) {\n // The payment was stopped: the total changed as the shopper pressed pay.\n this.nexiShippingNotice =\n 'Frakten er oppdatert for leveringsadressen din. Sjekk totalen og trykk «Betal» igjen.'\n } else {\n // The address changed and the rate the shopper had does not reach it.\n this.nexiShippingNotice =\n !pickedNow && wanted && result.shipping_id !== wanted\n ? `Valgt frakt leveres ikke til denne adressen. Vi har valgt ${result.shipping_name ?? 'en annen'}.`\n : null\n }\n }\n },\n }, resumePaymentId ? { paymentId: resumePaymentId } : undefined)\n this.nexiMountedOrderId = order.order_id\n this.nexiMountedFor = mountedFor\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Nexi mount failed:', err)\n }\n this.paymentError = friendlyPaymentError(errorText(err), 'nexi')\n Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n } finally {\n this.nexiMounting = false\n }\n }\n\n /** payment-completed: the reservation exists — confirm like the redirect methods do. */\n private onNexiCompleted(paymentId: string): void {\n const spId = this.checkoutState?.sponsorId ?? 0\n const checkoutId = this.checkoutState?.checkoutId ?? ''\n // Nexi shows no receipt of its own (its docs leave the confirmation to the\n // merchant), so ours says what was bought. Snapshot BEFORE unmounting:\n // the charged total and the shipping live in Nexi's last re-pricing.\n const charged = this.nexiShipping?.ok ? this.nexiShipping.total_price : undefined\n this.confirmOrder('nexi', spId, { chargedTotal: charged })\n if (this.confirmedOrder) {\n this.confirmedOrder = {\n ...this.confirmedOrder,\n providerRef: { label: 'Nexi betalings-ID', value: paymentId },\n }\n }\n this.unmountNexi()\n if (checkoutId) void this.addNexiPaymentDetails(checkoutId, spId, paymentId)\n }\n\n /**\n * How it was paid and where the receipt goes — Nexi knows, we ask. Its\n * payment details can lag the completion event by a moment, hence the\n * few retries. Best effort: the confirmation stands without them.\n */\n private async addNexiPaymentDetails(\n checkoutId: string,\n sponsorId: number,\n paymentId: string,\n ): Promise<void> {\n for (const delay of VioCheckout.NEXI_DETAILS_DELAYS_MS) {\n if (delay) await new Promise((r) => setTimeout(r, delay))\n const o = await Vio.checkout.getNexiOrder(checkoutId, sponsorId).catch(() => null)\n const current = this.confirmedOrder\n // The shopper may have closed it, or started another purchase.\n if (!current || current.providerRef?.value !== paymentId) return\n if (!o) continue\n const paidWith = o.payment_method\n ? o.card_last4\n ? `${o.payment_method} •••• ${o.card_last4}`\n : o.payment_method\n : undefined\n this.confirmedOrder = {\n ...current,\n ...(paidWith ? { paidWith } : {}),\n ...(o.email ? { email: o.email } : {}),\n }\n if (paidWith) return\n }\n }\n\n private static readonly NEXI_DETAILS_DELAYS_MS = [0, 1500, 3000]\n\n private unmountNexi(): void {\n this.nexiMountedOrderId = null\n this.nexiMountedFor = null\n this.nexiShippingNotice = null\n this.nexiShipping = null\n this.nexiPicking = false\n Vio.checkout.destroyNexi()\n this.querySelector<HTMLElement>('#vio-nexi-checkout-container')?.remove()\n }\n\n /**\n * Nexi has no shipping picker: once an address is typed in the widget, the\n * rates that reach it are listed here and the pick is pushed to the payment.\n * With a single rate there is nothing to choose, so nothing is shown.\n */\n private renderNexiShippingChoice() {\n const options = this.nexiShipping?.options ?? []\n if (options.length < 2) return ''\n const currency = this.checkoutState?.currency || getGlobalCurrency()\n const current = this.nexiShipping?.shipping_id\n return html`\n <div class=\"ship-select nexi-ship\" role=\"radiogroup\" aria-label=\"Frakt\">\n ${options.map(\n (o) => html`\n <button\n class=\"ship-opt ${current === o.id ? 'active' : ''}\"\n role=\"radio\"\n aria-checked=${current === o.id}\n ?disabled=${this.nexiPicking}\n @click=${() => void this.onPickNexiShipping(o.id)}\n >\n <span class=\"ship-meta\"><b>${o.name}</b></span>\n <span class=\"ship-price\">${formatPrice(o.price, currency)}</span>\n </button>\n `,\n )}\n </div>\n `\n }\n\n private async onPickNexiShipping(id: string): Promise<void> {\n if (this.nexiPicking || id === this.nexiShipping?.shipping_id) return\n this.nexiPicking = true\n try {\n // The answer arrives through onShipping, which clears nexiPicking.\n await Vio.checkout.pickNexiShipping(id)\n } finally {\n this.nexiPicking = false\n }\n }\n\n /* ── Adyen: our form first, then Adyen's Drop-in on a session ─────────── */\n\n /**\n * What an embedded payment is a photo OF — an Adyen session, a Stripe\n * PaymentIntent. When any of it changes underneath, that photo no longer\n * describes the purchase: it is dropped, and the shopper asks for the\n * payment step again.\n */\n private embedPurchaseKey(): string {\n return JSON.stringify([\n this.embedFormKey(),\n this.items.map((i) => [i.productId, i.variantId ?? '', i.quantity]),\n this.checkoutState?.subtotal ?? 0,\n ])\n }\n\n /** The part of the photo the shopper types and picks. */\n private embedFormKey(): string {\n const f = this.form\n return JSON.stringify([\n f.firstName, f.lastName, f.email, f.address, f.postalCode, f.city, f.country ?? '',\n this.selectedShipping,\n ])\n }\n\n /** A mounted session whose purchase changed is taken down — never patched. */\n private dropStaleAdyen(): void {\n if (!this.adyenMounted || this.adyenMounting) return\n if (this.adyenMountedKey === this.embedPurchaseKey()) return\n this.unmountAdyen()\n this.adyenStale = true\n }\n\n private async mountAdyenIfNeeded(): Promise<void> {\n if (!this.open || !this.checkoutState) return\n if (this.checkoutState.paymentMethod !== 'adyen') return\n if (!this.mayStartEmbeddedPayment() || this.adyenSettled) return\n if (this.adyenMounting) return\n if (this.adyenMounted) {\n if (this.adyenMountedFor === this.embedSession()) return\n // A new checkout session: the photo belongs to the previous one.\n this.unmountAdyen()\n }\n // Only on the shopper's request, and only with a finished form.\n if (!this.adyenRequested || !this.isAddressValid || !this.hasSelectedShipping) return\n this.adyenRequested = false\n this.adyenMounting = true\n this.adyenStale = false\n this.paymentError = null\n const spId = this.checkoutState.sponsorId\n const mountedFor = this.embedSession()\n const formKey = this.embedFormKey()\n try {\n // The total depends on the shipping: persist the pick before the photo.\n const selectedOpt = this.shippingList.find((o) => o.id === this.selectedShipping)\n if (selectedOpt?.supplierId) {\n await Vio.checkout.updateShippingsBySupplier(\n [{ shipping_id: selectedOpt.id, supplier_id: Number(selectedOpt.supplierId) }],\n spId,\n )\n }\n await this.updateComplete\n const container = this.lightContainer('vio-adyen-checkout-container', 'vio-adyen')\n container.innerHTML = ''\n await Vio.checkout.mountAdyenCheckout(container, spId, this.form, {\n onCompleted: (payment, session) => this.onAdyenCompleted(spId, payment, session),\n onFailed: () => {\n // Refused or cancelled inside Drop-in. The session may be spent, so\n // the next attempt starts on a new one — on the shopper's request.\n this.unmountAdyen()\n this.paymentError = 'Betalingen ble ikke gjennomført. Prøv igjen, eller velg en annen betalingsmåte.'\n },\n onReplaced: (reason) => {\n // \"Pay\" was pressed on a session that no longer pays for this\n // checkout: nothing was charged. Take it down and say why.\n this.unmountAdyen()\n this.adyenStale = true\n if (reason === 'ALREADY_PAID') {\n this.adyenSettled = true\n this.paymentNotice = 'Denne bestillingen er allerede betalt.'\n }\n },\n onError: (error) => {\n if (typeof console !== 'undefined') console.warn('[VioCheckout] Adyen error:', error)\n },\n })\n // The shopper may have moved on while the session was being created.\n if (this.embedSession() !== mountedFor || this.checkoutState?.paymentMethod !== 'adyen' || !this.open) {\n this.unmountAdyen()\n return\n }\n // …or kept typing: the session was created from the form as it was.\n if (this.embedFormKey() !== formKey) {\n this.unmountAdyen()\n this.adyenStale = true\n return\n }\n this.adyenMounted = true\n this.adyenMountedFor = mountedFor\n // Taken NOW, not before: saving the shipping makes the backend rewrite\n // the cart lines, and that refresh is not a change by the shopper.\n this.adyenMountedKey = this.embedPurchaseKey()\n } catch (err) {\n this.unmountAdyen()\n this.paymentError =\n err instanceof AdyenOriginError\n ? 'Betaling er ikke aktivert for denne siden ennå. Ta kontakt med butikken.'\n : friendlyPaymentError(errorText(err), 'adyen')\n if (typeof console !== 'undefined') console.warn('[VioCheckout] Adyen mount failed:', err)\n } finally {\n this.adyenMounting = false\n }\n }\n\n private onAdyenCompleted(sponsorId: number, payment: AdyenPayment | null, session: AdyenSession): void {\n const outcome = adyenReturnOutcome(payment)\n // Whatever Adyen said, this session is spent.\n this.unmountAdyen()\n if (outcome === 'paid') {\n this.adyenSettled = true\n this.confirmOrder('adyen', sponsorId, {\n chargedTotal: payment?.total_price ?? session.total_price,\n })\n this.addAdyenPaymentDetails(payment)\n } else if (outcome === 'pending') {\n // Swish, Trustly…: Adyen confirms later, through its webhook. Same\n // promise the redirect methods make, and the cart stays as it is.\n this.adyenSettled = true\n this.paymentNotice =\n 'Betalingen behandles fortsatt. Du får ordrebekreftelse på e-post når den er gjennomført. Handlekurven er uendret.'\n } else {\n this.paymentError = 'Betalingen ble ikke gjennomført. Prøv igjen, eller velg en annen betalingsmåte.'\n }\n }\n\n /** What Adyen told us about the payment, on Vio's confirmation. */\n private addAdyenPaymentDetails(payment: AdyenPayment | null): void {\n if (!this.confirmedOrder || !payment) return\n this.confirmedOrder = {\n ...this.confirmedOrder,\n ...(payment.psp_reference\n ? { providerRef: { label: 'Betalingsreferanse', value: payment.psp_reference } }\n : {}),\n ...(payment.payment_method ? { paidWith: payment.payment_method } : {}),\n ...(payment.email && !this.confirmedOrder.email ? { email: payment.email } : {}),\n ...(payment.shipping_name && !this.confirmedOrder.shipping\n ? { shipping: { name: payment.shipping_name, price: payment.shipping_price ?? 0 } }\n : {}),\n }\n }\n\n private unmountAdyen(): void {\n Vio.checkout.destroyAdyen()\n this.adyenMounted = false\n this.adyenMountedFor = null\n this.adyenMountedKey = null\n this.adyenRequested = false\n this.adyenStale = false\n this.querySelector('#vio-adyen-checkout-container')?.remove()\n }\n\n private renderAdyenPanel() {\n const ready = this.isAddressValid && this.hasSelectedShipping\n const showButton = !this.adyenMounted && !this.adyenMounting && !this.adyenSettled\n return html`\n <div class=\"adyen-panel\">\n ${this.adyenMounting\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Laster betaling…</div>`\n : ''}\n ${this.adyenStale && showButton\n ? html`<div class=\"payment-notice\">Bestillingen ble endret. Oppdater betalingen for å fortsette.</div>`\n : ''}\n ${showButton\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n ?disabled=${!ready}\n title=${!this.isAddressValid\n ? 'Vennligst fyll ut leveringsadresse'\n : !this.hasSelectedShipping\n ? 'Vennligst velg en fraktmetode'\n : ''}\n @click=${() => {\n this.adyenRequested = true\n }}\n >\n ${this.adyenStale ? 'Oppdater betaling' : `Gå til betaling · ${this.payTotalLabel()}`}\n </button>\n `\n : ''}\n <slot name=\"vio-adyen\"></slot>\n </div>\n `\n }\n\n /* ── Stripe, native: the Payment Element on our own page ──────────────── */\n\n /** A mounted Element whose purchase changed is taken down — never patched. */\n private dropStaleStripe(): void {\n if (!this.stripeMounted || this.stripeMounting) return\n if (this.stripeMountedKey === this.embedPurchaseKey()) return\n this.unmountStripe()\n this.stripeStale = true\n }\n\n private async mountStripeIfNeeded(): Promise<void> {\n if (!this.open || !this.checkoutState) return\n if (this.checkoutState.paymentMethod !== 'stripe' || this.stripeMode !== 'native') return\n if (!this.mayStartEmbeddedPayment() || this.stripeSettled) return\n if (this.stripeMounting) return\n if (this.stripeMounted) {\n if (this.stripeMountedFor === this.embedSession()) return\n // A new checkout session: the PaymentIntent belongs to the previous one.\n this.unmountStripe()\n }\n // Only on the shopper's request, and only with a finished form: creating\n // the Element mints a PaymentIntent for the total as it stands.\n if (!this.stripeRequested || !this.isAddressValid || !this.hasSelectedShipping) return\n this.stripeRequested = false\n this.stripeMounting = true\n this.stripeStale = false\n this.paymentError = null\n const spId = this.checkoutState.sponsorId\n const mountedFor = this.embedSession()\n const formKey = this.embedFormKey()\n try {\n // The total depends on the shipping: persist the pick before the photo.\n const selectedOpt = this.shippingList.find((o) => o.id === this.selectedShipping)\n if (selectedOpt?.supplierId) {\n await Vio.checkout.updateShippingsBySupplier(\n [{ shipping_id: selectedOpt.id, supplier_id: Number(selectedOpt.supplierId) }],\n spId,\n )\n }\n await this.updateComplete\n const container = this.lightContainer('vio-stripe-checkout-container', 'vio-stripe')\n container.innerHTML = ''\n this.stripeReady = false\n const mounted = await Vio.checkout.mountStripeCheckout(container, spId, this.form, {\n // `mount()` resolves before Stripe paints anything — seconds before,\n // on a cold cache. Its own \"ready\" is what turns the spinner off.\n onReady: () => {\n this.stripeReady = true\n },\n onLoadError: (message) => {\n this.unmountStripe()\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Stripe Payment Element failed to load:', message)\n }\n this.paymentError = friendlyPaymentError(message, 'stripe')\n },\n })\n // The shopper may have moved on while the intent was being created.\n if (\n this.embedSession() !== mountedFor ||\n this.checkoutState?.paymentMethod !== 'stripe' ||\n !this.open\n ) {\n this.unmountStripe()\n return\n }\n // …or kept typing: the intent was minted from the form as it was.\n if (this.embedFormKey() !== formKey) {\n this.unmountStripe()\n this.stripeStale = true\n return\n }\n this.stripeElement = mounted.handle\n this.stripeCheckoutId = mounted.checkoutId\n this.stripeMounted = true\n this.stripeMountedFor = mountedFor\n // Taken NOW: saving the shipping makes the backend rewrite the cart\n // lines, and that refresh is not a change by the shopper.\n this.stripeMountedKey = this.embedPurchaseKey()\n } catch (err) {\n this.unmountStripe()\n this.paymentError = friendlyPaymentError(errorText(err), 'stripe')\n if (typeof console !== 'undefined') console.warn('[VioCheckout] Stripe mount failed:', err)\n } finally {\n this.stripeMounting = false\n }\n }\n\n /**\n * Pay with the mounted Element. Stripe answers the BROWSER; the order is\n * created server-side by the `payment_intent.succeeded` webhook, so a\n * success is then waited for on the checkout itself.\n */\n private async onStripePay(): Promise<void> {\n if (!this.stripeElement || this.stripePaying) return\n const spId = this.checkoutState?.sponsorId ?? 0\n const checkoutId = this.stripeCheckoutId\n // Taken before the Element goes away: the receipt prints what was charged.\n const charged = (this.checkoutState?.subtotal ?? 0) + this.shippingMajor()\n this.stripePaying = true\n this.paymentError = null\n try {\n const outcome = await this.stripeElement.confirm()\n if (outcome.status === 'failed') {\n // Nothing was charged and the Element is still usable: a declined\n // card or a wrong CVC is fixed in place, without a new intent.\n this.paymentError =\n outcome.message ||\n 'Betalingen ble ikke gjennomført. Prøv igjen, eller velg en annen betalingsmåte.'\n return\n }\n // Authorised. Whatever happens next, this intent is spent.\n this.stripeSettled = true\n this.unmountStripe()\n const settled = checkoutId\n ? await this.waitForStripeOrder(checkoutId, spId)\n : ('pending' as const)\n if (settled === 'paid') {\n // What Stripe charged is the total WITH shipping — the subtotal alone\n // would print a receipt for less than the shopper paid.\n this.confirmOrder('stripe', spId, { chargedTotal: charged })\n } else if (settled === 'duplicate') {\n // The cart was paid in another tab; the server gives Stripe's charge back.\n this.stripeSettled = false\n this.paymentError = CART_PAID_MESSAGE\n } else if (settled === 'failed') {\n this.stripeSettled = false\n this.paymentError = 'Betalingen ble avbrutt eller feilet. Vennligst prøv igjen.'\n } else {\n // The charge went through but the order has not landed yet (or Stripe\n // is still processing). Same promise the redirect methods make.\n this.paymentNotice =\n 'Betalingen behandles fortsatt. Du får ordrebekreftelse på e-post når den er gjennomført. Handlekurven er uendret.'\n }\n } catch (err) {\n this.paymentError = `Betalingen kunne ikke fullføres: ${\n err instanceof Error ? err.message : String(err)\n }`\n if (typeof console !== 'undefined') console.warn('[VioCheckout] Stripe confirm failed:', err)\n } finally {\n this.stripePaying = false\n }\n }\n\n /**\n * Wait for Stripe's webhook to make the checkout paid — the same window the\n * redirect return uses, and ONLY the status: a Stripe checkout carries\n * `origin_payment_id` from the moment the intent is created, so that\n * pointer would read as paid before anyone paid.\n */\n private async waitForStripeOrder(\n checkoutId: string,\n sponsorId: number,\n ): Promise<'paid' | 'failed' | 'pending' | 'duplicate'> {\n for (const delayMs of VioCheckout.RETURN_VERIFY_DELAYS_MS) {\n if (delayMs > 0) await new Promise((r) => setTimeout(r, delayMs))\n try {\n const checkout = await Vio.checkout.getCheckout(checkoutId, sponsorId || undefined)\n const status = String(checkout?.status ?? '').toLowerCase()\n if (checkout?.duplicate_of) return 'duplicate'\n if (VioCheckout.FAILED_STATUSES.has(status)) return 'failed'\n if (VioCheckout.PAID_STATUSES.has(status)) return 'paid'\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Stripe order check failed:', err)\n }\n }\n }\n return 'pending'\n }\n\n private unmountStripe(): void {\n Vio.checkout.destroyStripe()\n this.stripeReady = false\n this.stripeElement = null\n this.stripeCheckoutId = null\n this.stripeMounted = false\n this.stripeMountedFor = null\n this.stripeMountedKey = null\n this.stripeRequested = false\n this.stripeStale = false\n this.querySelector('#vio-stripe-checkout-container')?.remove()\n }\n\n private renderStripePanel() {\n const ready = this.isAddressValid && this.hasSelectedShipping\n const showButton = !this.stripeMounted && !this.stripeMounting && !this.stripeSettled\n return html`\n <div class=\"stripe-panel\">\n ${this.stripeMounting || (this.stripeMounted && !this.stripeReady)\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Laster betaling…</div>`\n : ''}\n ${this.stripeStale && showButton\n ? html`<div class=\"payment-notice\">Bestillingen ble endret. Oppdater betalingen for å fortsette.</div>`\n : ''}\n ${showButton\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n ?disabled=${!ready}\n title=${!this.isAddressValid\n ? 'Vennligst fyll ut leveringsadresse'\n : !this.hasSelectedShipping\n ? 'Vennligst velg en fraktmetode'\n : ''}\n @click=${() => {\n this.stripeRequested = true\n }}\n >\n ${this.stripeStale ? 'Oppdater betaling' : `Gå til betaling · ${this.payTotalLabel()}`}\n </button>\n `\n : ''}\n <slot name=\"vio-stripe\"></slot>\n ${this.stripeMounted\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n ?disabled=${this.stripePaying || !this.stripeReady}\n @click=${() => void this.onStripePay()}\n >\n ${this.stripePaying ? 'Betaler…' : `Betal ${this.payTotalLabel()}`}\n </button>\n `\n : ''}\n </div>\n `\n }\n\n private renderNexiPanel() {\n return html`\n <div class=\"nexi-panel\">\n ${this.nexiMounting\n ? html`<div style=\"font-size:13px;opacity:0.7;padding:8px 0;\">Laster Nexi…</div>`\n : ''}\n ${this.renderNexiShippingChoice()}\n <slot name=\"vio-nexi\"></slot>\n ${this.nexiShippingNotice\n ? html`<div class=\"payment-notice\">${this.nexiShippingNotice}</div>`\n : ''}\n </div>\n `\n }\n\n private renderKlarnaPanel() {\n const currency = this.checkoutState?.currency || getGlobalCurrency()\n return html`\n <div class=\"klarna-panel\">\n ${this.express\n ? html`\n <div class=\"ship-select\" role=\"radiogroup\" aria-label=\"Frakt\">\n ${this.shippingList.map(\n (o) => html`\n <button\n class=\"ship-opt ${this.selectedShipping === o.id ? 'active' : ''}\"\n role=\"radio\"\n aria-checked=${this.selectedShipping === o.id}\n ?disabled=${this.klarnaMounting}\n @click=${() => void this.onSelectShipping(o.id)}\n >\n <span class=\"ship-meta\">\n <b>${o.method || o.name}</b><span>${o.description}</span>\n </span>\n <span class=\"ship-price\">\n ${formatPrice(o.priceMajor ?? o.price / 100, o.currency || currency)}\n </span>\n </button>\n `,\n )}\n </div>\n `\n : ''}\n ${this.klarnaCategories.length > 1\n ? html`\n <div class=\"klarna-cats\">\n ${this.klarnaCategories.map(\n (c) => html`\n <button\n class=\"klarna-cat ${this.klarnaSelectedCat === c.identifier ? 'active' : ''}\"\n @click=${() => void this.onKlarnaCategory(c.identifier)}\n >\n ${c.name}\n </button>\n `,\n )}\n </div>\n `\n : ''}\n ${this.klarnaMounting\n ? html`\n <div style=\"padding: 20px; text-align: center; color: var(--vio-color-text-secondary, #666); font-size: 14px;\">\n Klargjør Klarna-betaling…\n </div>\n `\n : ''}\n <div class=\"klarna-widget\" id=\"vio-klarna-payments-container\"></div>\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${() => void this.onKlarnaAuthorize()}\n ?disabled=${this.klarnaAuthorizing ||\n !this.klarnaHandle ||\n this.klarnaMounting ||\n (!this.express && (!this.isAddressValid || !this.hasSelectedShipping))}\n >\n ${this.klarnaAuthorizing\n ? 'Behandler…'\n : this.klarnaMounting\n ? 'Klargjør Klarna…'\n : `Betal ${this.payTotalLabel()} med Klarna`}\n </button>\n </div>\n `\n }\n\n /** Express layout — only the Klarna widget + a compact order summary. */\n private renderKlarnaExpress() {\n const currency = this.checkoutState?.currency || getGlobalCurrency()\n if (!this.klarnaAvailable) {\n // Klarna's script can be blocked (adblocker / CSP) — never leave the\n // buyer in a dead end with a permanently disabled button.\n return html`\n <section class=\"section\">\n <h3 class=\"section-heading\">Kjøp med Klarna</h3>\n <div class=\"payment-error\">\n Klarna er ikke tilgjengelig akkurat nå (kan være blokkert av nettleseren).\n </div>\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${() => {\n this.express = false\n }}\n >\n Gå til vanlig kasse\n </button>\n </section>\n `\n }\n return html`\n <section class=\"section\">\n <h3 class=\"section-heading\">Kjøp med Klarna</h3>\n ${this.items.length > 0\n ? html`\n <div class=\"express-summary\">\n ${this.items.map(\n (item) => html`\n <div class=\"order-row\">\n <span>${item.brand ? `${item.brand} ` : ''}${item.name} ×${item.quantity}</span>\n <span>${formatPrice(item.unitPrice * item.quantity, item.currency || currency)}</span>\n </div>\n `,\n )}\n <div class=\"order-row\">\n <span>Frakt${this.shippingOption ? ` – ${this.shippingOption.method}` : ''}</span>\n <span>${formatPrice(this.shippingMajor(), currency)}</span>\n </div>\n <div class=\"order-row total\">\n <span>Totalt</span><span>${this.payTotalLabel()}</span>\n </div>\n </div>\n `\n : ''}\n ${this.shippingBlocked ? this.renderShippingBlocked() : this.renderKlarnaPanel()}\n ${this.paymentNotice\n ? html`<div class=\"payment-notice\">${this.paymentNotice}</div>`\n : ''}\n ${this.paymentError\n ? html`<div class=\"payment-error\">${this.paymentError}</div>`\n : ''}\n </section>\n `\n }\n\n private renderCheckoutBody() {\n const method = this.checkoutState?.paymentMethod\n const showCompleteCta = !!method && !this.isExpressMethod(method)\n // Vipps collects the address in its own flow; it only needs an email.\n const isVipps = method === 'vipps'\n // Method first (Angelo, 2026-09-22): our delivery form is asked only once\n // the shopper has chosen a method that needs it. Asking it up front made\n // anyone who then chose Nexi, Qliro, Kustom or Walley type it all again\n // in the provider's widget (Alan, QA 2026-09-21). With a single method\n // there is no choice to make: it is selected on opening\n // (autoSelectSoleMethod), so the form — or the widget — comes straight up.\n const needsOurForm = !!method && !collectsOwnAddress(method)\n return html`\n ${needsOurForm\n ? html`\n <section class=\"section address-section\">\n <div class=\"section-label\">Steg 1</div>\n <h3 class=\"section-heading\">Leveringsadresse</h3>\n <div class=\"form-row\">\n <div class=\"field\">\n <label>Fornavn *</label>\n <input\n type=\"text\"\n required\n autocomplete=\"given-name\"\n .value=${this.form.firstName}\n @input=${(e: InputEvent) =>\n this.onFieldChange('firstName', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label>Etternavn *</label>\n <input\n type=\"text\"\n required\n autocomplete=\"family-name\"\n .value=${this.form.lastName}\n @input=${(e: InputEvent) =>\n this.onFieldChange('lastName', (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n <div class=\"field\">\n <label>E-post *</label>\n <input\n type=\"email\"\n required\n autocomplete=\"email\"\n .value=${this.form.email}\n @input=${(e: InputEvent) =>\n this.onFieldChange('email', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label>Adresse *</label>\n <input\n type=\"text\"\n required\n autocomplete=\"street-address\"\n .value=${this.form.address}\n @input=${(e: InputEvent) =>\n this.onFieldChange('address', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"form-row\">\n <div class=\"field\">\n <label>Postnummer *</label>\n <input\n type=\"text\"\n required\n autocomplete=\"postal-code\"\n .value=${this.form.postalCode}\n @input=${(e: InputEvent) =>\n this.onFieldChange('postalCode', (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label>Sted *</label>\n <input\n type=\"text\"\n required\n autocomplete=\"address-level2\"\n .value=${this.form.city}\n @input=${(e: InputEvent) =>\n this.onFieldChange('city', (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n ${this.availableShippingsList.length > 0\n ? html`\n <div style=\"margin-top: 16px;\">\n <label style=\"display: block; font-weight: 600; font-size: 13px; margin-bottom: 8px;\">\n Fraktmetode *\n </label>\n <div class=\"ship-select\">\n ${this.availableShippingsList.map(\n (o) => html`\n <button\n type=\"button\"\n class=\"ship-opt ${this.selectedShipping === o.id ? 'active' : ''}\"\n @click=${() => void this.onSelectShipping(o.id)}\n >\n <span class=\"ship-meta\">\n <b>${o.method || o.name}</b>\n ${o.description ? html`<span>${o.description}</span>` : ''}\n </span>\n <span class=\"ship-price\">\n ${formatPrice(\n o.priceMajor ?? o.price / 100,\n o.currency || this.checkoutState?.currency || 'NOK',\n )}\n </span>\n </button>\n `,\n )}\n </div>\n </div>\n `\n : ''}\n </section>\n `\n : ''}\n\n ${isVipps\n ? html`\n <section class=\"section\">\n <div class=\"section-label\">Kontakt</div>\n <div class=\"field\">\n <label>E-post * <span style=\"font-weight:400;opacity:0.6\">(for kvittering — adresse fylles ut i Vipps)</span></label>\n <input\n type=\"email\"\n required\n autocomplete=\"email\"\n .value=${this.form.email}\n @input=${(e: InputEvent) =>\n this.onFieldChange('email', (e.target as HTMLInputElement).value)}\n />\n </div>\n </section>\n `\n : ''}\n\n <section class=\"section\">\n <div class=\"section-label\">\n ${needsOurForm ? 'Steg 2' : 'Betaling'}\n </div>\n ${this.shippingBlocked\n ? this.renderShippingBlocked()\n : method\n ? html`\n <div style=\"display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;\">\n <h3 class=\"section-heading\" style=\"margin:0;\">\n Betalingsmåte: <b>${this.methodLabel(method)}</b>\n </h3>\n ${(this.availableMethods?.length ?? 2) > 1\n ? html`\n <button\n type=\"button\"\n style=\"background:none; border:none; color:var(--vio-color-accent, #c14a3b); text-decoration:underline; font-size:13px; cursor:pointer;\"\n @click=${() => {\n this.unmountKlarna()\n this.unmountKustom()\n this.unmountQliro()\n this.unmountWalley()\n this.unmountNexi()\n this.unmountAdyen()\n Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n }}\n >\n Endre\n </button>\n `\n : ''}\n </div>\n\n ${method === 'klarna' ? this.renderKlarnaPanel() : ''}\n ${method === 'kustom' ? this.renderKustomPanel() : ''}\n ${method === 'qliro' ? this.renderQliroPanel() : ''}\n ${method === 'walley' ? this.renderWalleyPanel() : ''}\n ${method === 'nexi' ? this.renderNexiPanel() : ''}\n ${method === 'adyen' ? this.renderAdyenPanel() : ''}\n ${method === 'stripe' && this.stripeMode === 'native'\n ? this.renderStripePanel()\n : ''}\n ${method === 'stripe' && this.stripeMode !== 'native'\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${() => void this.onPay('stripe')}\n ?disabled=${this.stripeLoading || !this.isAddressValid || !this.hasSelectedShipping}\n title=${!this.isAddressValid\n ? 'Vennligst fyll ut leveringsadresse'\n : !this.hasSelectedShipping\n ? 'Vennligst velg en fraktmetode'\n : ''}\n >\n ${this.stripeLoading\n ? 'Går til Stripe…'\n : `Betal ${this.payTotalLabel()} med Stripe`}\n </button>\n `\n : ''}\n ${method === 'vipps'\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${() => void this.onPay('vipps')}\n ?disabled=${this.vippsLoading}\n >\n ${this.vippsLoading\n ? 'Går til Vipps…'\n : `Betal ${this.payTotalLabel()} med Vipps`}\n </button>\n `\n : ''}\n ${method === 'apple-pay'\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${() => void this.onPay('apple-pay')}\n ?disabled=${this.applePayInProgress || !this.isAddressValid || !this.hasSelectedShipping}\n title=${!this.isAddressValid\n ? 'Vennligst fyll ut leveringsadresse'\n : !this.hasSelectedShipping\n ? 'Vennligst velg en fraktmetode'\n : ''}\n >\n ${this.applePayInProgress\n ? 'Åpner…'\n : `Betal ${this.payTotalLabel()} med Apple Pay`}\n </button>\n `\n : ''}\n ${showCompleteCta && method !== 'stripe' && method !== 'vipps'\n ? html`\n <button\n class=\"payment-btn primary complete-cta\"\n @click=${this.onCompleteOrder}\n ?disabled=${!this.isAddressValid || !this.hasSelectedShipping}\n title=${!this.isAddressValid\n ? 'Vennligst fyll ut leveringsadresse'\n : !this.hasSelectedShipping\n ? 'Vennligst velg en fraktmetode'\n : ''}\n >\n Betal ${this.payTotalLabel()} med ${this.methodLabel(method ?? null)}\n </button>\n `\n : ''}\n ${needsOurForm && !this.isAddressValid\n ? html`\n <div style=\"font-size: 12px; color: var(--vio-color-accent, #c14a3b); text-align: center; margin-top: 8px;\">\n Vennligst fyll ut leveringsadresse for å fullføre betalingen\n </div>\n `\n : needsOurForm && !this.hasSelectedShipping\n ? html`\n <div style=\"font-size: 12px; color: var(--vio-color-accent, #c14a3b); text-align: center; margin-top: 8px;\">\n Vennligst velg en fraktmetode for å fullføre betalingen\n </div>\n `\n : ''}\n `\n : !this.paymentMethodsResolved\n ? html`\n <h3 class=\"section-heading\">Velg betalingsmåte</h3>\n <div class=\"payment-loading\">\n <span class=\"payment-spinner\" aria-hidden=\"true\"></span>\n <span>Henter betalingsmåter…</span>\n </div>\n `\n : html`\n <h3 class=\"section-heading\">Velg betalingsmåte</h3>\n <div class=\"payment-grid\">\n ${this.methodEnabled('apple-pay') &&\n this.applePayAvailable &&\n !this.stripeOwnsWallets()\n ? html`\n <button\n class=\"payment-btn primary\"\n @click=${() => this.onPay('apple-pay')}\n ?disabled=${this.applePayInProgress}\n >\n ${this.applePayInProgress\n ? 'Åpner…'\n : html`<span style=\"display:inline-flex;align-items:center;gap:6px\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" style=\"width:18px;height:18px\"><path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>Apple Pay</span>`}\n </button>\n `\n : ''}\n ${this.methodEnabled('stripe')\n ? html`\n <button\n class=\"payment-btn\"\n @click=${() => this.onPay('stripe')}\n ?disabled=${this.stripeLoading}\n >\n <img src=${STRIPE_LOGO_SRC} style=\"height: 20px; display: block;\" alt=\"Stripe\" />\n </button>\n `\n : ''}\n ${this.methodEnabled('klarna') && this.klarnaAvailable\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('klarna')}>\n Klarna\n </button>\n `\n : ''}\n ${this.methodEnabled('kustom')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('kustom')}>\n <span style=\"font-weight:800;font-size:16px;letter-spacing:-0.01em\">Kustom</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('qliro')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('qliro')}>\n <span style=\"font-weight:800;font-size:16px;letter-spacing:-0.01em\">Qliro</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('walley')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('walley')}>\n <span style=\"font-weight:800;font-size:16px;letter-spacing:-0.01em\">Walley</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('nexi')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('nexi')}>\n <span style=\"font-weight:800;font-size:16px;letter-spacing:-0.01em\">Nexi</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('adyen')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('adyen')}>\n <span style=\"font-weight:700;font-size:15px;letter-spacing:-0.01em\">${this.methodLabel('adyen')}</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('vipps')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('vipps')} aria-label=\"Vipps\">\n ${this.vippsOfficial\n ? html`<vipps-mobilepay-button\n brand=\"vipps\"\n variant=\"primary\"\n rounded=\"true\"\n compact=\"true\"\n style=\"pointer-events:none\"\n ></vipps-mobilepay-button>`\n : html`<span style=\"color:#ff5b24;font-weight:800;font-size:17px;letter-spacing:-0.02em\">vipps</span>`}\n </button>\n `\n : ''}\n </div>\n `}\n ${this.paymentNotice\n ? html`<div class=\"payment-notice\">${this.paymentNotice}</div>`\n : ''}\n ${this.paymentError\n ? html`<div class=\"payment-error\">${this.paymentError}</div>`\n : ''}\n </section>\n\n ${this.items.length > 0\n ? html`\n <section class=\"order-summary\">\n ${this.items.map(\n (item) => html`\n <div class=\"order-line\">\n <div class=\"order-line-img\">\n ${item.imageUrl\n ? html`<img src=${item.imageUrl} alt=${item.name} />`\n : ''}\n </div>\n <div class=\"order-line-meta\">\n <span>${item.brand}</span>\n <b>${item.name}</b>\n <span>×${item.quantity}</span>\n </div>\n <div class=\"order-line-price\">\n ${formatPrice(item.unitPrice * item.quantity, item.currency)}\n </div>\n </div>\n `,\n )}\n <div class=\"order-row\" style=\"margin-top: 16px;\">\n <span>Sum</span><span>${this.orderTotal()}</span>\n </div>\n <div class=\"order-row\">\n <span>Frakt${this.shippingMajor() > 0 && this.summaryShippingName() ? ` – ${this.summaryShippingName()}` : ''}</span>\n <span>${this.shippingMajor() > 0\n ? formatPrice(this.shippingMajor(), this.checkoutState?.currency)\n : this.shippingLabel}</span>\n </div>\n <div class=\"order-row total\">\n <span>Totalt</span><span>${this.payTotalLabel()}</span>\n </div>\n </section>\n `\n : ''}\n </div>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vio-checkout': VioCheckout\n }\n}\n","/**\n * Vio elements — owns the `<vio-*>` custom-element classes and their registration.\n *\n * WHY REGISTRATION IS A FUNCTION (not `@customElement` module side-effects):\n * Both `./ui` and `./react` need the component classes, so the bundler hoists\n * them into a *hashed* shared chunk that package.json `sideEffects` can't name.\n * If registration were a module-eval side-effect (`@customElement`), a\n * consumer's tree-shaker would drop that chunk on a bare `import '.../ui'` and\n * the elements would never `define`. Instead, `registerVioElements()` is a\n * *called value*: any sideEffects-listed entry that calls it (see ui/index +\n * react/index) keeps the function and the classes it references — regardless of\n * chunking — while `./core` stays free of these side-effects and remains\n * tree-shakeable. See lessons/web-sdk-tsup-singleton-and-build.\n */\n\nimport { VioProduct } from './components/vio-product.js'\nimport { VioProductCarousel } from './components/vio-product-carousel.js'\nimport { VioProductDetail } from './components/vio-product-detail.js'\nimport { VioCart } from './components/vio-cart.js'\nimport { VioCheckout } from './components/vio-checkout.js'\n\nexport { VioProduct, VioProductCarousel, VioProductDetail, VioCart, VioCheckout }\n\n/**\n * Register every `<vio-*>` custom element. Idempotent (skips already-defined\n * tags, so calling it from both `./ui` and `./react` is safe) and SSR-safe\n * (no-op when `customElements` is undefined).\n */\nexport function registerVioElements(): void {\n if (\n typeof customElements === 'undefined' ||\n typeof customElements.get !== 'function' ||\n typeof customElements.define !== 'function'\n )\n return\n const defs: Array<[string, CustomElementConstructor]> = [\n ['vio-product', VioProduct],\n ['vio-product-carousel', VioProductCarousel],\n ['vio-product-detail', VioProductDetail],\n ['vio-cart', VioCart],\n ['vio-checkout', VioCheckout],\n ]\n for (const [tag, ctor] of defs) {\n if (!customElements.get(tag)) customElements.define(tag, ctor)\n }\n}\n"]}