@vio-live/web-sdk 0.5.0 → 0.6.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/tokens.ts","../src/ui/components/vio-product.ts","../src/ui/components/vio-product-carousel.ts","../src/ui/components/vio-product-detail.ts","../src/ui/components/vio-cart.ts","../src/ui/components/vio-checkout.ts","../src/ui/elements.ts"],"names":["LitElement","css","html","property","state","STRIPE_LOGO_SRC"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;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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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"chunk-5CKG3F56.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 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 }\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 are what a merchant/publisher\n * actually wants a \"brand settings\" panel for. Spacing/radius/sizes stay\n * internal — expose them here later if a real need shows up, don't\n * speculatively surface the whole token set as public API.\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}\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}\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 * <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 { 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'\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 @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 /** 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\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\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: 16px 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: 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 .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 /* 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: 8px;\n }\n .sk-image { width: 100%; aspect-ratio: 1; border-radius: 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 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 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.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\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) {\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 if (this.availableMethods === null) return true\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z]/g, '')\n return this.availableMethods.some((m) => names.some((n) => norm(m) === norm(n)))\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 private buyWithVipps(): 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: '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 override render() {\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <div class=\"modal\" role=\"dialog\" aria-label=\"Produkt\">\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"topbar\">\n <span class=\"topbar-brand\">${this.product?.brand ?? ''}</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.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 ? 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 { 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'\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 /** 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\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 — only fetch methods if we don't have them yet.\n if (this.availableMethods === null) {\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\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: 16px 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: 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: 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 .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: 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: 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: 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 .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: 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 // 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 this.open = true\n // Analytics/host hook — `view_cart` on any host, not just Vev (which\n // used to synthesize this event itself).\n this.dispatchEvent(\n new CustomEvent('vio:open-cart', { bubbles: true, composed: true }),\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(name: string): boolean {\n if (this.availableMethods === null) return true\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z]/g, '')\n return this.availableMethods.some((m) => norm(m) === norm(name))\n }\n\n override updated(changed: Map<string, unknown>): void {\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 private onVipps(): 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: '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-label=${this.heading}>\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 ${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 ? 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 * <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 { 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'\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 @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 /** Snapshot of the placed order, for the confirmation screen. */\n @state() private confirmedOrder: {\n items: CartLineItem[]\n currency: string\n total: number\n orderId?: 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 /** 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 /** 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 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 if (this.checkoutState) {\n if (sponsorChanged || this.availableMethods === null) {\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.confirmedMethod = null\n this.confirmedOrder = null\n this.paymentError = null\n this.paymentNotice = null\n this.express = false\n this.availableMethods = null\n this.unmountKlarna()\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 this.paymentError =\n detail.method === 'klarna'\n ? `Klarna-betalingen kunne ikke fullføres: ${detail.error}`\n : detail.error\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\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: 16px 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: 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. Only the\n compact confirmation card stays centered. */\n @media (min-width: 601px) {\n .modal:not(.as-confirm) {\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:not(.as-confirm) { 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: 16px 16px 0 0;\n }\n :host([open]) .modal.as-side { transform: translateY(0); }\n }\n\n /* Confirmation: a centered desktop dialog (the bottom-sheet looked like\n mobile on desktop). Falls back to a bottom sheet on phones. */\n .modal.as-confirm {\n inset: auto;\n top: 50%;\n left: 50%;\n width: min(92vw, 440px);\n max-width: 440px;\n height: auto;\n max-height: 88vh;\n border-radius: 16px;\n box-shadow: 0 30px 80px -24px rgba(0, 0, 0, 0.4);\n transform: translate(-50%, -50%) scale(0.96);\n opacity: 0;\n }\n :host([open]) .modal.as-confirm {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n @media (max-width: 600px) {\n .modal.as-confirm {\n inset: auto 0 0 0;\n top: auto;\n left: 0;\n width: 100%;\n max-width: none;\n border-radius: 16px 16px 0 0;\n transform: translateY(100%) scale(1);\n opacity: 1;\n }\n :host([open]) .modal.as-confirm { transform: translateY(0); }\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: 16px 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: 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 .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 .apple-pay-note {\n grid-column: 1 / -1;\n font-size: 12px;\n color: var(--vio-color-text-tertiary, #999);\n text-align: center;\n margin-top: 4px;\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: 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 .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: 10px; 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: 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: 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 text-align: center;\n padding: 24px 24px 28px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n }\n .confirm-check {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: #2e7d32;\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n line-height: 1;\n }\n .confirm-title {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 28px;\n font-weight: 400;\n margin: 0;\n }\n .confirm-text {\n font-size: 14px;\n color: var(--vio-color-text-secondary, #666);\n max-width: 360px;\n line-height: 1.6;\n margin: 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 width: 100%;\n max-width: 360px;\n border-top: 1px solid var(--vio-color-border, #eee);\n padding-top: 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n text-align: left;\n font-size: 13px;\n }\n .confirm-close {\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 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 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 }\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 /** 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 private async pollVippsStatus(\n checkoutId: string,\n sponsorId: number,\n ): Promise<{ outcome: 'paid' | 'failed' | 'pending'; 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 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',\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 orderId: checkoutId || undefined,\n }\n this.confirmedMethod = vioMethod as PaymentMethod\n this.orderConfirmed = true\n this.open = true\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 === '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 =\n 'Vi kunne ikke bekrefte betalingen. Handlekurven er uendret — prøv igjen, eller kontakt support hvis du ble belastet.'\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 if (!vioPayment && !checkoutId) return\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 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.paymentNotice = 'Bekrefter betalingen med Vipps…'\n const { outcome, sawStatus } = await this.pollVippsStatus(checkoutId, sponsorId)\n this.paymentNotice = 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' = 'pending'\n let sawStatus = false\n if (checkoutId) {\n this.open = true\n this.paymentNotice = '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 (VioCheckout.FAILED_STATUSES.has(status)) {\n outcome = 'failed'\n break\n }\n if (\n VioCheckout.PAID_STATUSES.has(status) ||\n 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.paymentNotice = 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 this.unmountKlarna()\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\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 // 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 }\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 /** Fetch the real per-supplier shippings and preselect + persist the first. */\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 this.loadingShippings = true\n this.shippingsAttempted = true\n try {\n const shippings = await Vio.checkout.fetchAvailableShippings(spId)\n if (Array.isArray(shippings) && shippings.length > 0) {\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 }\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 methods = (await Vio.checkout.getAvailablePaymentMethods(\n this.checkoutState.sponsorId,\n )) as Array<{ name: string }> | 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('[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 }\n }\n\n /** Backend names arrive as e.g. \"Apple Pay\" — compare letters only. */\n private methodEnabled(name: string): boolean {\n if (this.availableMethods === null) return true\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z]/g, '')\n return this.availableMethods.some((m) => norm(m) === norm(name))\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 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 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 = `Kunne ikke laste Klarna: ${\n err instanceof Error ? err.message : String(err)\n }`\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 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) 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 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 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 // Vipps collects the address in its own flow but still needs an email\n // for the order receipt; every other method needs the full form + a\n // shipping choice before we mint sessions/links.\n if (method === 'vipps') {\n const email = String(this.form.email ?? '').trim()\n if (!email || !email.includes('@')) {\n this.paymentError = 'Vennligst fyll inn e-postadressen din.'\n return\n }\n } else {\n if (!this.isAddressValid) {\n this.paymentError = 'Vennligst fyll ut alle feltene i leveringsadresse.'\n return\n }\n if (!this.hasSelectedShipping) {\n this.paymentError = 'Vennligst velg en fraktmetode.'\n return\n }\n }\n Vio.checkout.selectPaymentMethod(method)\n // Stripe / Vipps: hosted payment pages — mint the link and redirect. The\n // return trip lands in checkReturnPaymentStatus().\n if (method === 'stripe') {\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 this.paymentError = `Kunne ikke starte Stripe-betaling: ${\n err instanceof Error ? err.message : String(err)\n }`\n })\n .finally(() => {\n this.stripeLoading = false\n })\n }\n if (method === 'vipps') {\n this.vippsLoading = true\n void Vio.checkout\n .startVippsPayment(this.checkoutState?.sponsorId, this.form)\n .catch((err: unknown) => {\n this.paymentError = `Kunne ikke starte Vipps-betaling: ${\n err instanceof Error ? err.message : String(err)\n }`\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 (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(method: PaymentMethod, sponsorId: number, result?: unknown): void {\n // Snapshot the order BEFORE clearing the cart — the confirmation needs it.\n const r = (result ?? {}) as { order?: { orderId?: string }; chargedTotal?: number }\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 orderId: r.order?.orderId,\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 detail: { method, sponsorId, result },\n }),\n )\n Vio.cart.clearSponsorCart(sponsorId)\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 '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 — neither uses the generic \"Betal\" CTA.\n return method === 'apple-pay' || method === 'klarna'\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.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 /** 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-label=${this.heading}\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.orderConfirmed\n ? this.renderConfirmation()\n : this.express\n ? this.renderKlarnaExpress()\n : this.renderCheckoutBody()}\n </div>\n </div>\n `\n }\n\n private renderConfirmation() {\n const o = this.confirmedOrder\n return html`\n <section class=\"confirmation\">\n <div class=\"confirm-check\" aria-hidden=\"true\">✓</div>\n <h3 class=\"confirm-title\">Takk for bestillingen!</h3>\n <p class=\"confirm-text\">\n Betaling med ${this.methodLabel(this.confirmedMethod)} er bekreftet.${this.form.email\n ? html` Kvittering sendes til ${this.form.email}.`\n : ''}\n </p>\n ${o?.orderId\n ? html`<div class=\"confirm-order-id\">Ordrenummer: <b>${o.orderId}</b></div>`\n : ''}\n ${o && o.items.length > 0\n ? html`\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><span>${formatPrice(o.total, o.currency)}</span>\n </div>\n </div>\n `\n : ''}\n <button class=\"confirm-close\" @click=${this.close}>Lukk</button>\n </section>\n `\n }\n\n /** Klarna Payments widget panel: shipping + category chips + widget + pay button. */\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 || !this.klarnaHandle || this.klarnaMounting}\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.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 — skip the form entirely.\n const isVipps = method === 'vipps'\n return html`\n ${!isVipps\n ? html`\n <section class=\"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\">${isVipps ? 'Betaling' : 'Steg 2'}</div>\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 <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 Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n }}\n >\n Endre\n </button>\n </div>\n\n ${method === 'klarna' ? this.renderKlarnaPanel() : ''}\n ${method === 'stripe'\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 ${!isVipps && !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 : !isVipps && !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 : html`\n <h3 class=\"section-heading\">Velg betalingsmåte</h3>\n <div class=\"payment-grid\">\n ${this.methodEnabled('apple-pay') && this.applePayAvailable\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('vipps')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('vipps')}>\n <span style=\"color:#ff5b24;font-weight:800;font-size:17px;letter-spacing:-0.02em\">vipps</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('apple-pay') && !this.applePayAvailable\n ? html`\n <div class=\"apple-pay-note\">\n Pay krever Safari på iOS eller macOS med Apple Pay konfigurert.\n </div>\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.shippingOption ? ` – ${this.shippingOption.method || this.shippingOption.name}` : ''}</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"]}
1
+ {"version":3,"sources":["../src/ui/tokens.ts","../src/ui/components/vio-product.ts","../src/ui/components/vio-product-carousel.ts","../src/ui/components/vio-product-detail.ts","../src/ui/components/vio-cart.ts","../src/ui/components/vio-checkout.ts","../src/ui/elements.ts"],"names":["LitElement","css","html","property","state","STRIPE_LOGO_SRC"],"mappings":";;;;;AAcO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,6CAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,GAAA;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,OAAA;AAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM;AAAA;AAEV;AAOA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA,gCAAA,EAGW,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,gCAAA,EAC5B,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,gCAAA,EAC9B,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,gCAAA,EAC7B,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;;AAAA;AAAA,wBAAA,EAGtC,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;;AAAA;AAAA,+BAAA,EAGzB,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,+BAAA,EAC5B,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,+BAAA,EAC7B,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;;AAAA;AAAA,gCAAA,EAG5B,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,gCAAA,EAC7B,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;;AAAA;AAAA,sBAAA,EAGxC,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,sBAAA,EACpB,SAAA,CAAU,KAAK,IAAI,CAAA;;AAAA;AAAA,mBAAA,EAGtB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,mBAAA,EACjB,SAAA,CAAU,KAAK,EAAE,CAAA;;AAAA;AAAA,0BAAA,EAGV,SAAA,CAAU,SAAS,KAAK,CAAA;;AAAA;AAAA,oBAAA,EAG9B,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,oBAAA,EAClB,SAAA,CAAU,MAAM,EAAE,CAAA;;AAAA;AAAA,qBAAA,EAGjB,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,qBAAA,EACnB,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,qBAAA,EACnB,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA;AAAA,CAAA;AAI1C,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,QAAA,CAAS,aAAA,CAAc,0BAA0B,CAAA,KAAM,IAAA,EAAM;AACjE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,YAAA,CAAa,YAAY,QAAQ,CAAA;AACvC,EAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAEA,YAAA,EAAa;AAsCb,IAAM,oBAAA,GAAgE;AAAA,EACpE,SAAA,EAAW,kBAAA;AAAA,EACX,kBAAA,EAAoB,4BAAA;AAAA,EACpB,iBAAA,EAAmB,2BAAA;AAAA,EACnB,kBAAA,EAAoB,6BAAA;AAAA,EACpB,WAAA,EAAa,oBAAA;AAAA,EACb,YAAA,EAAc,qBAAA;AAAA,EACd,iBAAA,EAAmB,2BAAA;AAAA,EACnB,iBAAA,EAAmB,2BAAA;AAAA,EACnB,WAAA,EAAa,oBAAA;AAAA,EACb,kBAAA,EAAoB,4BAAA;AAAA,EACpB,SAAA,EAAW,kBAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAaO,SAAS,aAAA,CACd,WACA,MAAA,GAA6B,OAAO,aAAa,WAAA,GAAc,QAAA,CAAS,kBAAkB,IAAA,EACpF;AACN,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA,EAAqC;AACrF,IAAA,MAAM,MAAA,GAAS,qBAAqB,GAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,MAAA,CAAO,KAAA,CAAM,eAAe,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AACF;ACjNO,IAAM,UAAA,GAAN,cAAyB,UAAA,CAAW;AAAA,EAApC,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEuB,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAA;AAER,IAAA,IAAA,CAAA,IAAA,GAAO,EAAA;AAEP,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAA;AAER,IAAA,IAAA,CAAA,QAAA,GAAW,EAAA;AAEa,IAAA,IAAA,CAAA,QAAA,GAAW,EAAA;AAEV,IAAA,IAAA,CAAA,SAAA,GAAY,EAAA;AAEZ,IAAA,IAAA,CAAA,SAAA,GAAY,EAAA;AAGT,IAAA,IAAA,CAAA,WAAA,GAAc,KAAA;AAGtC,IAAA,IAAA,CAAA,QAAA,GAAkC,MAAA;AAClC,IAAA,IAAA,CAAA,OAAA,GAAiC,MAAA;AAKZ,IAAA,IAAA,CAAA,QAAA,GAAW,KAAA;AAGvD,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAEjB,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAA;AAElB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAE7B,IAAA,IAAA,CAAQ,eAAA,GAAkB,MAAY,IAAA,CAAK,YAAA,EAAa;AAAA,EAAA;AAAA,EAExD;AAAA,IAAA,IAAA,CAAgB,MAAA,GAAS,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA;AAAA,EA6GhB,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1D;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,GAAA,CAAI,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAES,QAAQ,OAAA,EAAqC;AAEpD,IAAA,IAAI,OAAA,CAAQ,IAAI,WAAW,CAAA,IAAK,QAAQ,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,YAAA,EAAa;AAAA,EAC9E;AAAA;AAAA,EAGQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACjC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,QAAQ,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAO,EAAG;AAClD,MAAA,IAAI,MAAA,CAAO,SAAS,GAAG,CAAA,IAAK,MAAM,CAAA,IAAK,IAAA,CAAK,cAAc,GAAA,EAAK;AAC/D,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,EAAO,IAAI,MAAA,CAAO,EAAE,SAAS,CAAA,KAAM,GAAA,EAAK,GAAA,IAAO,CAAA,CAAE,QAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AAAA,EACjB;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,mBAAA,EAAqB;AAAA,QACnC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK;AAAA;AACjB,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,UAAU,CAAA,EAAwB;AACxC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,CAAA,EAAgB;AAC5B,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IACE,KAAK,WAAA,IACJ,KAAA,CAAM,QAAQ,IAAA,CAAK,QAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IACvD,KAAA,CAAM,QAAQ,IAAA,CAAK,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EACtD;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,iBAAA,EAAmB;AAAA,QACjC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK;AAAA;AACjB,OACD;AAAA,KACH;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB,GAAG,GAAG,CAAA;AAAA,EACR;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAO,IAAA;AAAA;AAAA;AAAA,eAAA,EAGM,KAAK,OAAO;AAAA,iBAAA,EACV,KAAK,SAAS;AAAA;AAAA;AAAA,mBAAA,EAGZ,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAE;AAAA;AAAA;AAAA,UAAA,EAGnD,IAAA,CAAK,QAAA,GACH,IAAA,CAAA,SAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAA,kBAAA,CAAA,GAC5D,EAAE;AAAA;AAAA,2BAAA,EAEa,IAAA,CAAK,SAAS,SAAA,GAAY,EAAE,IAAI,IAAA,CAAK,SAAA,GAAY,QAAQ,EAAE,CAAA;AAAA,mBAAA,EACnE,KAAK,KAAK;AAAA,uBAAA,EACN,IAAA,CAAK,MAAA,GAAS,uCAAA,GAAqC,aAAa;AAAA,kBAAA,EACrE,IAAA,CAAK,MAAA,GAAS,gBAAA,GAAmB,aAAa;AAAA;AAAA,YAAA,EAEpD,IAAA,CAAK,SACH,IAAA,CAAK,OAAA,GAAU,IACb,IAAA,CAAA,wBAAA,EAA+B,IAAA,CAAK,OAAO,CAAA,OAAA,CAAA,GAC3C,IAAA,CAAA;AAAA;AAAA,wBAAA,CAAA,GAGF,IAAA,CAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,CAIO;AAAA;AAAA;AAAA,QAAA,EAGb,IAAA,CAAK,WACH,EAAA,GACA,IAAA;AAAA;AAAA,UAAA,EAEA,KAAK,KAAA,GAAQ,IAAA,CAAA,mBAAA,EAA0B,IAAA,CAAK,KAAK,WAAW,EAAE;AAAA,UAAA,EAC9D,KAAK,IAAA,GAAO,IAAA,CAAA,kBAAA,EAAyB,IAAA,CAAK,IAAI,WAAW,EAAE;AAAA,UAAA,EAC3D,KAAK,KAAA,GAAQ,IAAA,CAAA,mBAAA,EAA0B,IAAA,CAAK,KAAK,WAAW,EAAE;AAAA,UAAA,EAC9D,KAAK,QAAA,GAAW,IAAA,CAAA,sBAAA,EAA6B,IAAA,CAAK,QAAQ,WAAW,EAAE;AAAA,cAAA,CACpE;AAAA;AAAA,IAAA,CAAA;AAAA,EAGb;AACF;AA3R8B,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAFf,UAAA,CAEiB,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAJf,UAAA,CAIiB,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EANf,UAAA,CAMiB,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EARf,UAAA,CAQiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEwB,eAAA,CAAA;AAAA,EAAnD,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,aAAa;AAAA,CAAA,EAVvC,UAAA,CAUyC,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEC,eAAA,CAAA;AAAA,EAApD,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAZxC,UAAA,CAY0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAApD,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAdxC,UAAA,CAc0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAGG,eAAA,CAAA;AAAA,EAAvD,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAgB;AAAA,CAAA,EAjB3C,UAAA,CAiB6C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAGxB,eAAA,CAAA;AAAA,EAA/B,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO;AAAA,CAAA,EApBnB,UAAA,CAoBqB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAA/B,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,EAAO;AAAA,CAAA,EArBnB,UAAA,CAqBqB,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAKqB,eAAA,CAAA;AAAA,EAApD,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,aAAa;AAAA,CAAA,EA1BxC,UAAA,CA0B0C,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAGpC,eAAA,CAAA;AAAA,EAAhB,KAAA;AAAM,CAAA,EA7BI,UAAA,CA6BM,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhB,KAAA;AAAM,CAAA,EA/BI,UAAA,CA+BM,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhB,KAAA;AAAM,CAAA,EAjCI,UAAA,CAiCM,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;ACjBZ,IAAM,kBAAA,GAAN,cAAiCA,UAAAA,CAAW;AAAA,EAA5C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEuB,IAAA,IAAA,CAAA,KAAA,GAAQ,EAAA;AAER,IAAA,IAAA,CAAA,OAAA,GAAU,EAAA;AAEV,IAAA,IAAA,CAAA,UAAA,GAAa,EAAA;AAEc,IAAA,IAAA,CAAA,UAAA,GAAa,EAAA;AAEZ,IAAA,IAAA,CAAA,WAAA,GAAc,SAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa,EAAA;AAEZ,IAAA,IAAA,CAAA,WAAA,GAAc,EAAA;AAEhB,IAAA,IAAA,CAAA,SAAA,GAAY,CAAA;AAUV,IAAA,IAAA,CAAA,WAAA,GAAc,EAAA;AAEzC,IAAA,IAAA,CAAA,QAAA,GAAW,KAAA;AAG9B,IAAA,IAAA,CAAQ,OAAA,GAAiE,IAAA;AACzE,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,GAAa,EAAA;AA+O9B;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,mBAAA,GAA2C,IAAA;AACnD,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AAAA,EAAA;AAAA,EA/OtB;AAAA,IAAA,IAAA,CAAgB,MAAA,GAASC,GAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA;AAAA,EAgJhB,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAI,KAAK,WAAA,CAAY,IAAA,MAAU,IAAA,CAAK,UAAA,CAAW,MAAK,EAAG;AACrD,MAAA,KAAK,KAAK,SAAA,EAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,IAAA,CAAK,mBAAA,IAAsB;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAES,QAAQ,OAAA,EAAqC;AACpD,IAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,GAAA,CAAI,aAAa,KACzB,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IACxB,QAAQ,GAAA,CAAI,aAAa,CAAA,IACzB,OAAA,CAAQ,IAAI,WAAW,CAAA;AACzB,IAAA,IAAI,WAAA,KAAgB,KAAK,WAAA,CAAY,IAAA,MAAU,IAAA,CAAK,UAAA,CAAW,MAAK,CAAA,EAAI;AACtE,MAAA,KAAK,KAAK,SAAA,EAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,SAAA,GAA2B;AACvC,IAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,UAAA,GAAa,4DAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,MAAK,GAC/B,IAAA,CAAK,UAAU,IAAA,CAAK,WAAW,IAC/B,IAAA,CAAK,UAAA,CACF,MAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,SAAS,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAC,EACjC,MAAA,CAAO,CAAC,MAAM,CAAC,MAAA,CAAO,MAAM,CAAC,CAAC,EAC9B,GAAA,CAAI,CAAC,QAAQ,EAAE,SAAA,EAAW,KAAK,SAAA,EAAW,SAAA,EAAW,IAAG,CAAE,CAAA;AAEjE,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,IAAA,CAAK,UAAU,EAAC;AAChB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,SAAS,KAAK,EAAC;AAC3C,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,SAAS,CAAA;AACpB,QAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,GAAG,CAAA;AAAA,MAChC;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,SAAA,EAAW,GAAG,CAAA,KAAM;AAC9D,UAAA,MAAM,QAAA,GACJ,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAY,IAAA,EAAK,KAAM,EAAA,GAC5C,GAAA,CAAI,gBAAgB,IAAA,CAAK,WAAW,CAAA,GACpC,GAAA,CAAI,YAAY,SAAS,CAAA;AAC/B,UAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,QAAA,CAAS;AAAA,YACvD,WAAA,EAAa,GAAA;AAAA,YACb,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,OAAO,EAAE,WAAW,QAAA,EAAS;AAAA,QAC/B,CAAC;AAAA,OACH;AAGA,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAqB;AACxC,MAAA,KAAA,MAAW,EAAE,SAAA,EAAW,QAAA,EAAS,IAAK,OAAA,EAAS;AAC7C,QAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,MAChE;AACA,MAAA,IAAA,CAAK,UAAU,IAAA,CACZ,GAAA,CAAI,CAAC,EAAE,SAAA,EAAW,WAAU,KAAM;AACjC,QAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,GAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AACtD,QAAA,OAAO,OAAA,GAAU,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,IAAA;AAAA,MAC5C,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAoD,MAAM,IAAI,CAAA;AACzE,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAa,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,IAEnE,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAUQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC9B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAI,SAAA,CAAU,iBAAA;AAAA,QACvC,IAAA;AAAA,QACA;AAAA,UACE,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,CAAA,GAAI,KAAK,SAAA,GAAY,KAAA,CAAA;AAAA,UACjD,mBAAA,EAAqB,kBAAA;AAAA,UACrB,UAAA,EAAY,KAAK,KAAA,IAAS,KAAA;AAAA,SAC5B;AAAA,QACA;AAAA,UACE,GAAA,EAAK,YAAY,IAAA,CAAK,KAAA,IAAS,KAAK,UAAA,IAAc,IAAA,CAAK,eAAe,SAAS,CAAA,CAAA;AAAA,UAC/E,cAAc,MAAM;AAClB,YAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,YAAA,IAAA,CAAK,cAAA,EAAe;AAAA,UACtB;AAAA;AACF,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,WAAA,EAAa;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AACjC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,SAAA,CAAU,MAAM,gBAAA,EAAkB;AAAA,QACpC,OAAA,EAAS;AAAA,UACP,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,CAAA,GAAI,KAAK,SAAA,GAAY,KAAA,CAAA;AAAA,UACjD,mBAAA,EAAqB,kBAAA;AAAA,UACrB,UAAA,EAAY,KAAK,KAAA,IAAS,KAAA;AAAA,SAC5B;AAAA,QACA,QAAA,EAAU;AAAA,UACR,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,OAAA,EAAS,WAAU,MAAO;AAAA,YAC9C,WAAW,OAAA,CAAQ,EAAA;AAAA,YACnB,MAAM,OAAA,CAAQ,KAAA;AAAA,YACd,KAAA,EAAO,OAAO,OAAA,CAAQ,KAAA,EAAO,qBAAqB,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,IAAK,KAAA;AAAA,WAC9E,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAQ,KAAA,EAAO;AAAA,SACvC;AAAA,QACA,OAAO,IAAA,CAAK,KAAA,GAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,OAAM,GAAI,KAAA;AAAA,OACjD,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,UAAU,GAAA,EAA8D;AAC9E,IAAA,OAAO,GAAA,CACJ,MAAM,GAAG,CAAA,CACT,IAAI,CAAC,IAAA,KAAS,KAAK,IAAA,EAAM,EACzB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACvC,MAAA,MAAM,MAAM,QAAA,CAAA,CAAU,MAAA,IAAU,EAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAC9C,MAAA,MAAM,MAAM,QAAA,CAAA,CAAU,MAAA,IAAU,EAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAC9C,MAAA,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,GAAG,OAAO,IAAA;AACnD,MAAA,OAAO,EAAE,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,GAAA,EAAI;AAAA,IAC1C,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAqD,MAAM,IAAI,CAAA;AAAA,EAC5E;AAAA,EAEQ,kBAAkB,SAAA,EAAyB;AACjD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,YAAY,CAAA;AACrD,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,EAAM,WAAA,IAAe,GAAA,IAAO,EAAA;AAC1C,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,EAAE,IAAA,EAAM,YAAY,IAAA,GAAO,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EAC3E;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,OAAA,EAAS;AAEnC,MAAA,OAAOC,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA;AAAA,QACtC,MAAMA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA;AAAA,OAOP,CAAA,CAAA;AAAA,IACH;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAOA,IAAAA,CAAAA,EAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAU,KAAM;AAC5D,QAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,CAAC,CAAA,IAAK,EAAA;AAClC,QAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,SAAS,CAAA,IAAK,EAAE,KAAA,IAAS,EAAA;AACnE,QAAA,OAAOA,IAAAA;AAAA;AAAA,uBAAA,EAEU,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC;AAAA,uBAAA,EACZ,MAAA,CAAO,SAAS,CAAC;AAAA,kBAAA,EACtB,CAAA,CAAE,SAAS,EAAE;AAAA,iBAAA,EACd,EAAE,KAAK;AAAA,kBAAA,EACN,YAAA,CAAa,CAAC,CAAC;AAAA,qBAAA,EACZ,QAAQ;AAAA,sBAAA,EACP,GAAG;AAAA,0BAAA,EAAA,CACE,CAAA,CAAE,QAAA,EAAU,MAAA,IAAU,CAAA,IAAK,CAAC;AAAA;AAAA,QAAA,CAAA;AAAA,MAGnD,CAAC,CAAC,CAAA,CAAA;AAAA,IACJ;AAEA,IAAA,OAAOA,IAAAA,CAAAA,aAAAA,CAAAA;AAAA,EACT;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA,UAAA,EAGC,KAAK,KAAA,GAAQA,IAAAA,CAAAA,mBAAAA,EAA0B,IAAA,CAAK,KAAK,WAAW,EAAE;AAAA;AAAA,YAAA,EAE5D,KAAK,OAAA,GAAUA,IAAAA,CAAAA,oBAAAA,EAA2B,IAAA,CAAK,OAAO,UAAU,EAAE;AAAA,YAAA,EAClE,KAAK,UAAA,GAAaA,IAAAA,CAAAA,0BAAAA,EAAiC,IAAA,CAAK,UAAU,aAAa,EAAE;AAAA;AAAA;AAAA,QAAA,EAGrF,IAAA,CAAK,aACHA,IAAAA,CAAAA,wBAAAA,EAA+B,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,IAAA,CAAA,GAClE,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAKK,MAAM,IAAA,CAAK,iBAAA,CAAkB,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKnB,IAAA,CAAK,uBAAuB,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGzC,MAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAM1C,IAAA,CAAK,cAAc,CAAC,IAAA,CAAK,UACvBA,IAAAA,CAAAA,yBAAAA,EAAgC,IAAA,CAAK,UAAU,CAAA,MAAA,CAAA,GAC/C,EAAE;AAAA,IAAA,CAAA;AAAA,EAEV;AACF;AApa8B,eAAA,CAAA;AAAA,EAA3BC,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAFf,kBAAA,CAEiB,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAJf,kBAAA,CAIiB,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EANf,kBAAA,CAMiB,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAE2B,eAAA,CAAA;AAAA,EAAtDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,gBAAgB;AAAA,CAAA,EAR1C,kBAAA,CAQ4C,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAEC,eAAA,CAAA;AAAA,EAAvDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,iBAAiB;AAAA,CAAA,EAV3C,kBAAA,CAU6C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAGF,eAAA,CAAA;AAAA,EAArDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,eAAe;AAAA,CAAA,EAbzC,kBAAA,CAa2C,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAEC,eAAA,CAAA;AAAA,EAAtDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,gBAAgB;AAAA,CAAA,EAf1C,kBAAA,CAe4C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAEF,eAAA,CAAA;AAAA,EAApDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,CAAA,EAjBxC,kBAAA,CAiB0C,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAUE,eAAA,CAAA;AAAA,EAAtDA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,gBAAgB;AAAA,CAAA,EA3B1C,kBAAA,CA2B4C,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAE3B,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EA7Bf,kBAAA,CA6BiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAA3B,MAAM,WAAW;AAAA,CAAA,EA/BP,kBAAA,CA+BiB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACX,eAAA,CAAA;AAAA,EAAhBC,KAAAA;AAAM,CAAA,EAhCI,kBAAA,CAgCM,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAjCI,kBAAA,CAiCM,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAlCI,kBAAA,CAkCM,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AA6YnB,SAAS,yBAAyB,SAAA,EAAuC;AACvE,EAAA,MAAM,OAAO,GAAA,CAAI,cAAA;AACjB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,KAAK,cAAA,EAAgB,EAAA,KAAO,SAAA,EAAW,OAAO,KAAK,cAAA,CAAe,IAAA;AACtE,EAAA,OAAO,IAAA,CAAK,mBAAmB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,EAAG,IAAA;AAClE;AClbA,IAAM,kBACJ,0BAAA,GACA,kBAAA;AAAA,EACE;AACF,CAAA;AAEK,IAAM,gBAAA,GAAN,cAA+BJ,UAAAA,CAAW;AAAA,EAA1C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACuC,IAAA,IAAA,CAAA,IAAA,GAAO,KAAA;AACE,IAAA,IAAA,CAAA,SAAA,GAAY,EAAA;AACZ,IAAA,IAAA,CAAA,SAAA,GAAY,CAAA;AAEZ,IAAA,IAAA,CAAA,QAAA,GAAW,IAAA;AACpC,IAAA,IAAA,CAAA,QAAA,GAAW,KAAA;AAE9B,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,GAAa,EAAA;AACrB,IAAA,IAAA,CAAQ,kBAAmC,EAAC;AAC5C,IAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAEjB,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAGrB,IAAA,IAAA,CAAQ,gBAAA,GAAoC,IAAA;AAGrD;AAAA;AAAA,IAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AAEnB;AAAA,IAAA,IAAA,CAAQ,WAAA,uBAAkB,OAAA,EAAuE;AAEjG;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAuD,IAAA;AAE/D,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAC,CAAA,KAAmB;AAC9C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,MAAA,MAAM,EAAA,GAAK,CAAA;AACX,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,EAAA,CAAG,MAAA,CAAO,WAAW,EAAE,CAAA;AAErD,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,EAAG;AAChC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,EAAA,CAAG,MAAA,CAAO,WAAW,EAAE,CAAA;AACrD,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,IAAK,gBAAgB,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,SAAA,GAAY,GAAG,MAAA,CAAO,SAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,YAAA;AAEjB,MAAA,IAAA,CAAK,QAAA,GAAW,EAAA,CAAG,MAAA,CAAO,QAAA,IAAY,iBAAA,EAAkB;AACxD,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,KAAK,KAAK,YAAA,EAAa;AAAA,IACzB,CAAA;AAAA,EAAA;AAAA,EAEA;AAAA,IAAA,IAAA,CAAgB,MAAA,GAASC,GAAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;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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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA;AAAA,EAqehB,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,QAAA,CAAS,YAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,KAAA;AAC1B,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,qBAAqB,CAAA;AAClE,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AAC7E,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,CAAiB,eAAA,EAAiB,IAAA,CAAK,mBAAmB,CAAA;AACvE,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAK,KAAK,eAAA,EAAgB;AAC1B,MAAA,KAAK,KAAK,aAAA,EAAc;AACxB,MAAA,KAAK,KAAK,2BAAA,EAA4B;AAAA,IACxC;AAGA,IAAA,KAAK,GAAA,CAAI,SAAS,kBAAA,EAAmB;AAErC,IAAA,KAAK,KAAK,wBAAA,EAAyB;AAAA,EACrC;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAwB,aAAA,uBAAoB,GAAA,CAAI;AAAA,MAC9C,MAAA;AAAA,MAAQ,WAAA;AAAA,MAAa,UAAA;AAAA,MAAY,SAAA;AAAA,MAAW,WAAA;AAAA,MAAa,WAAA;AAAA,MAAa;AAAA,KACvE,CAAA;AAAA;AAAA,EAGD;AAAA;AAAA,IAAA,IAAA,CAAwB,eAAA,uBAAsB,GAAA,CAAI;AAAA,MAChD,QAAA;AAAA,MAAU,WAAA;AAAA,MAAa,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,SAAA;AAAA,MAAW,SAAA;AAAA,MACtE,YAAA;AAAA,MAAc,OAAA;AAAA,MAAS,QAAA;AAAA,MAAU;AAAA,KAClC,CAAA;AAAA;AAAA,EAKD;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAwB,0BAA0B,CAAC,CAAA,EAAG,GAAA,EAAM,GAAA,EAAM,KAAM,GAAI,CAAA;AAAA;AAAA,EAI5E;AAAA;AAAA;AAAA,IAAA,IAAA,CAAwB,yBAAA,GAA4B,EAAA;AAAA;AAAA,EACpD;AAAA,IAAA,IAAA,CAAwB,qBAAA,GAAwB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUhD,MAAc,eAAA,CACZ,UAAA,EACA,SAAA,EACyE;AACzE,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,YAAA,CAAY,2BAA2B,OAAA,EAAA,EAAW;AAChF,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,IAAI,QAAQ,CAAC,CAAA,KAAM,WAAW,CAAA,EAAG,YAAA,CAAY,qBAAqB,CAAC,CAAA;AAAA,MAC3E;AACA,MAAA,IAAI;AACF,QAAA,MAAM,cAAc,MAAM,GAAA,CAAI,SAAS,cAAA,CAAe,UAAA,EAAY,aAAa,KAAA,CAAS,CAAA;AACxF,QAAA,MAAMG,SAAQ,MAAA,CAAO,WAAA,EAAa,KAAA,IAAS,EAAE,EAAE,WAAA,EAAY;AAC3D,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,IAAIA,WAAU,YAAA,EAAc,OAAO,EAAE,OAAA,EAAS,QAAQ,SAAA,EAAU;AAChE,QAAA,IAAIA,WAAU,SAAA,EAAW;AACzB,QAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU;AAAA,MACxC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,UAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,GAAG,CAAA;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAIA,IAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAAU;AAAA,EACzC;AAAA;AAAA;AAAA,EAIQ,kBAAA,CACN,OAAA,EACA,SAAA,EACA,SAAA,EACA,WACA,UAAA,EACM;AACN,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,IAAI,SAAA,GAAY,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,iBAAiB,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,QACpB,OAAO,EAAC;AAAA,QACR,UAAU,iBAAA,EAAkB;AAAA,QAC5B,KAAA,EAAO,CAAA;AAAA,QACP,SAAS,UAAA,IAAc;AAAA,OACzB;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AACvB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,aAAA;AAAA,QACH,IAAI,YAAY,qBAAA,EAAuB;AAAA,UACrC,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,QAAQ,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAS,UAAA;AAAW,SAC7D;AAAA,OACH;AAAA,IACF,CAAA,MAAA,IAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,+DAAA;AACpB,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd,WAAW,SAAA,EAAW;AAGpB,MAAA,IAAA,CAAK,aAAA,GACH,+HAAA;AACF,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,YAAA,GACH,8HAAA;AACF,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAc,wBAAA,GAA0C;AACtD,IAAA,IAAI,OAAO,WAAW,WAAA,IAAe,CAAC,OAAO,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ;AAClF,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAG5D,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,aAAa,CAAA;AAC9C,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA,IAAK,QAAA;AACjD,MAAA,MAAM,YAAY,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,aAAa,KAAK,CAAC,CAAA;AAC1D,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,aAAa,CAAA,IAAK,EAAA;AAKnD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAIhC,MAAA,IACE,SAAA,KAAc,YACd,OAAO,cAAA,KAAmB,eAC1B,cAAA,CAAe,OAAA,CAAQ,uBAAuB,CAAA,EAC9C;AACA,QAAA,IAAA,CAAK,uBAAuB,CAAC,aAAA,EAAe,YAAA,EAAc,aAAA,EAAe,aAAa,CAAC,CAAA;AACvF,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,KAAc,WAAW,UAAA,EAAY;AAUvC,QAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,UAAA,MAAM,SAAA,GACJ,SAAA,IAAa,CAAC,GAAG,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,CAAE,IAAA,EAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AACxD,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI;AACF,cAAA,GAAA,CAAI,QAAA,CAAS,KAAK,SAAS,CAAA;AAC3B,cAAA,GAAA,CAAI,QAAA,CAAS,oBAAoB,OAAO,CAAA;AAAA,YAC1C,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,aAAA,GAAgB,sCAAA;AACrB,QAAA,MAAM,EAAE,SAAS,SAAA,EAAU,GAAI,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAY,SAAS,CAAA;AAC/E,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAW,UAAU,CAAA;AAC5E,QAAA,IAAA,CAAK,uBAAuB,CAAC,aAAA,EAAe,YAAA,EAAc,aAAA,EAAe,aAAa,CAAC,CAAA;AAAA,MACzF,CAAA,MAAA,IAAW,eAAe,SAAA,EAAW;AAMnC,QAAA,IAAI,OAAA,GAAyC,SAAA;AAC7C,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,UAAA,IAAA,CAAK,aAAA,GAAgB,4BAAA;AACrB,UAAA,KAAA,MAAW,OAAA,IAAW,aAAY,uBAAA,EAAyB;AACzD,YAAA,IAAI,OAAA,GAAU,CAAA,EAAG,MAAM,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,OAAO,CAAC,CAAA;AAChE,YAAA,IAAI;AACF,cAAA,MAAM,WAAW,MAAM,GAAA,CAAI,SAAS,WAAA,CAAY,UAAA,EAAY,aAAa,KAAA,CAAS,CAAA;AAClF,cAAA,MAAM,SAAS,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,EAAE,EAAE,WAAA,EAAY;AAC1D,cAAA,SAAA,GAAY,IAAA;AACZ,cAAA,IAAI,YAAA,CAAY,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC3C,gBAAA,OAAA,GAAU,QAAA;AACV,gBAAA;AAAA,cACF;AACA,cAAA,IACE,YAAA,CAAY,cAAc,GAAA,CAAI,MAAM,KACpC,OAAA,CAAQ,QAAA,EAAU,iBAAiB,CAAA,EACnC;AACA,gBAAA,OAAA,GAAU,MAAA;AACV,gBAAA;AAAA,cACF;AAAA,YACF,SAAS,GAAA,EAAK;AACZ,cAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,gBAAA,OAAA,CAAQ,IAAA,CAAK,qDAAqD,GAAG,CAAA;AAAA,cACvE;AAAA,YACF;AAAA,UACF;AACA,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,QACvB;AAEA,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAW,UAAU,CAAA;AAC5E,QAAA,IAAA,CAAK,uBAAuB,CAAC,aAAA,EAAe,YAAA,EAAc,aAAA,EAAe,aAAa,CAAC,CAAA;AAAA,MACzF,CAAA,MAAA,IAAW,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,OAAA,EAAS;AAC5D,QAAA,IAAA,CAAK,YAAA,GAAe,+DAAA;AACpB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,uBAAuB,CAAC,aAAA,EAAe,YAAA,EAAc,aAAA,EAAe,aAAa,CAAC,CAAA;AAAA,MACzF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,kDAAkD,GAAG,CAAA;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,uBAAuB,IAAA,EAAsB;AACnD,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,IAAe,CAAC,OAAO,OAAA,IAAW,CAAC,OAAO,QAAA,EAAU;AAC1E,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AACxC,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM;AAClB,QAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG;AAC3B,UAAA,GAAA,CAAI,YAAA,CAAa,OAAO,CAAC,CAAA;AACzB,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF,CAAC,CAAA;AACD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,QAAA,EAAS;AAC5C,QAAA,MAAM,SAAS,GAAA,CAAI,QAAA,IAAY,YAAY,GAAA,GAAM,SAAA,GAAY,MAAM,GAAA,CAAI,IAAA;AACvE,QAAA,MAAA,CAAO,QAAQ,YAAA,CAAa,EAAC,EAAG,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,MACxD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAES,oBAAA,GAA6B;AACpC,IAAA,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,qBAAqB,CAAA;AACrE,IAAA,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AAChF,IAAA,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,eAAA,EAAiB,IAAA,CAAK,mBAAmB,CAAA;AAC1E,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAAA,EAC7B;AAAA,EAES,QAAQ,OAAA,EAAqC;AAIpD,IAAA,IACE,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAClB,IAAA,CAAK,IAAA,IACL,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,IACpB,IAAA,CAAK,sBAAA,CAAuB,WAAW,CAAA,EACvC;AACA,MAAA,KAAK,KAAK,sBAAA,EAAuB;AAAA,IACnC;AAIA,IAAA,KAAK,KAAK,mBAAA,EAAoB;AAAA,EAChC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,GAAS,KAAK,IAAA,CAAK,sBAAA,CAAuB,WAAW,CAAA,EAAG;AACrE,MAAA,KAAK,KAAK,sBAAA,EAAuB;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,sBAAA,GAAwC;AACpD,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAe,SAAA;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,QAAA,CAAS,wBAAwB,IAAI,CAAA;AACjE,MAAA,IAAI,MAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACpD,QAAA,IAAA,CAAK,sBAAA,GAAyB,SAAA;AAC9B,QAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACpF,UAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,UAAA,IAAA,CAAK,mBAAmB,QAAA,CAAS,EAAA;AACjC,UAAA,IAAI,SAAS,UAAA,EAAY;AACvB,YAAA,KAAK,IAAI,QAAA,CAAS,yBAAA;AAAA,cAChB,CAAC,EAAE,WAAA,EAAa,QAAA,CAAS,EAAA,EAAI,aAAa,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG,CAAA;AAAA,cACvE;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,GAAG,CAAA;AAAA,MAClE;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAGA,IAAY,cAAA,GAA0B;AACpC,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,IAAA,OAAO,OAAA;AAAA,MACL,CAAA,CAAE,SAAA,IAAa,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,IACnD,CAAA,CAAE,QAAA,IAAY,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,IACjD,CAAA,CAAE,KAAA,IAAS,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,KAAK,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,IAC5E,CAAA,CAAE,OAAA,IAAW,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,KAC/C,CAAA,CAAE,UAAA,IAAc,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA,EAAK,CAAE,SAAS,CAAA,IACrD,CAAA,CAAE,IAAA,IAAQ,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,GAAO,MAAA,GAAS;AAAA,KAC3C;AAAA,EACF;AAAA;AAAA,EAGA,IAAY,mBAAA,GAA+B;AACzC,IAAA,IAAI,IAAA,CAAK,sBAAA,CAAuB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACrD,IAAA,OAAO,OAAA;AAAA,MACL,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB;AAAA,KACvF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,2BAAA,GAA6C;AACzD,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACzB,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,0BAAA;AAAA,QAClC,KAAK,aAAA,CAAc;AAAA,OACrB;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,MACnD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,iDAAiD,GAAG,CAAA;AAAA,MACnE;AAEA,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGQ,cAAc,IAAA,EAAuB;AAC3C,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,IAAA,EAAM,OAAO,IAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAc,CAAA,CAAE,aAAY,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACjE,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,GAAA,CAAI,SAAS,kBAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAM,GAAA,CAAI,QAAA,CAAS,oBAAoB,IAAI,CAAA;AAAA,EACtE;AAAA,EAEA,MAAc,aAAA,GAA+B;AAG3C,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,QAAA,CAAS,uBAAA,EAAwB;AAC7D,IAAA,IAAI,SAAA,KAAc,KAAK,eAAA,EAAiB;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW,IAAA,CAAK,aAAA,EAAc;AACnC,MAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,CAAC,KAAK,eAAA,IAAmB,CAAC,KAAK,IAAA,IAAQ,CAAC,KAAK,aAAA,EAAe;AAIhE,IAAA,IAAI,KAAK,aAAA,CAAc,aAAA,KAAkB,QAAA,IAAY,CAAC,KAAK,OAAA,EAAS;AACpE,IAAA,IAAI,KAAK,cAAA,EAAgB;AAGzB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,uBAAuB,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,kBAAA,EAAoB;AACjG,MAAA,MAAM,KAAK,sBAAA,EAAuB;AAAA,IACpC;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,CAAc,QAAA;AAGlC,IAAA,IACE,IAAA,CAAK,gBACL,IAAA,CAAK,mBAAA,KAAwB,UAC7B,IAAA,CAAK,qBAAA,KAA0B,KAAK,gBAAA,EACpC;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,UAAA,EAAY,aAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA,CAAS,oBAAoB,SAAA,EAAW;AAAA,QAC/D,cAAc,IAAA,CAAK,OAAA;AAAA,QACnB,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AACD,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,MAAA,IAAA,CAAK,mBAAA,GAAsB,MAAA;AAC3B,MAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,gBAAA;AAClC,MAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,UAAA;AAC/B,MAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,QAAA;AAEhC,MAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,CAAO,SAAS,KAAK,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AAClE,QAAA,IAAA,CAAK,yBAAyB,MAAA,CAAO,SAAA;AACrC,QAAA,IACE,CAAC,IAAA,CAAK,gBAAA,IACN,CAAC,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB,CAAA,EAC5D;AACA,UAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,CAAG,EAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,GAAG,CAAA;AAAA,MACjE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,4BAClB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,CAAA;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,aAAa,OAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,IAAA,IAAA,CAAK,mBAAmB,EAAC;AACzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,EAAA;AACzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,IAAY,YAAA,GAAuC;AACjD,IAAA,OAAO,IAAA,CAAK,sBAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAY,cAAA,GAAiB;AAC3B,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA;AAClB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EACxE;AAAA;AAAA;AAAA,EAIA,MAAc,iBAAiB,EAAA,EAA2B;AACxD,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,EAAA,IAAM,IAAA,CAAK,cAAA,EAAgB;AACzD,IAAA,IAAA,CAAK,gBAAA,GAAmB,EAAA;AACxB,IAAA,MAAM,WAAA,GAAc,KAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC7D,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,IAAI,QAAA,CAAS,yBAAA;AAAA,UACjB,CAAC,EAAE,WAAA,EAAa,WAAA,CAAY,EAAA,EAAI,aAAa,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA,EAAG,CAAA;AAAA,UAC7E,KAAK,aAAA,EAAe;AAAA,SACtB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,UAAA,OAAA,CAAQ,IAAA,CAAK,mDAAmD,GAAG,CAAA;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,iBAAiB,UAAA,EAAmC;AAChE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAA;AACzB,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,wDAAwD,UAAU,CAAA;AAAA,IAChF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,GAAG,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,iBAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,aAAa,QAAA,IAAY,SAAA;AACpE,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,kEAAkE,GAAG,CAAA;AAAA,IACnF;AACA,IAAA,IAAI;AAGF,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,GAAG,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,aAAA,CAA+C,OAAU,KAAA,EAAqB;AACpF,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,MAAM,CAAC,KAAK,GAAG,KAAA,EAAM;AAC3C,IAAA,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAI;AAIF,MAAA,MAAM,GAAA,CAAI,SAAS,aAAA,CAAc,EAAE,SAAS,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAAA,IAClE,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,GAAG,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,MAAA,EAAsC;AACxD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAGrB,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,KAAK,KAAK,UAAA,EAAW;AACrB,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AACjD,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,QAAA,IAAA,CAAK,YAAA,GAAe,wCAAA;AACpB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,QAAA,IAAA,CAAK,YAAA,GAAe,oDAAA;AACpB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,KAAK,mBAAA,EAAqB;AAC7B,QAAA,IAAA,CAAK,YAAA,GAAe,gCAAA;AACpB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,oBAAoB,MAAM,CAAA;AAGvC,IAAA,IAAI,WAAW,QAAA,EAAU;AAEvB,MAAA,MAAM,WAAA,GAAc,KAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB,CAAA;AAChF,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,IAAI;AACF,UAAA,MAAM,IAAI,QAAA,CAAS,yBAAA;AAAA,YACjB,CAAC,EAAE,WAAA,EAAa,WAAA,CAAY,EAAA,EAAI,aAAa,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA,EAAG,CAAA;AAAA,YAC7E,KAAK,aAAA,EAAe;AAAA,WACtB;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,YAAA,OAAA,CAAQ,IAAA,CAAK,iEAAiE,GAAG,CAAA;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,KAAK,GAAA,CAAI,QAAA,CACN,kBAAA,CAAmB,IAAA,CAAK,aAAA,EAAe,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAC3D,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,QAAA,IAAA,CAAK,YAAA,GAAe,sCAClB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,CAAA;AAAA,MACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,MACvB,CAAC,CAAA;AAAA,IACL;AACA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,KAAK,GAAA,CAAI,QAAA,CACN,iBAAA,CAAkB,IAAA,CAAK,aAAA,EAAe,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAC1D,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,QAAA,IAAA,CAAK,YAAA,GAAe,qCAClB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,CAAA;AAAA,MACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACtB,CAAC,CAAA;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,IAAI,IAAA,CAAK,aAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,aAAA,EAAe;AAC5B,IAAA,IAAI,CAAA,CAAE,aAAA,KAAkB,OAAA,IAAW,CAAC,KAAK,cAAA,EAAgB;AACvD,MAAA,IAAA,CAAK,YAAA,GAAe,oDAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,aAAA,KAAkB,QAAA,IAAY,CAAA,CAAE,kBAAkB,OAAA,EAAS;AAC/D,MAAA,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,aAAa,CAAA;AAC/B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,aAAA,KAAkB,QAAA,IAAY,CAAA,CAAE,kBAAkB,WAAA,EAAa;AACnE,MAAA,IAAA,CAAK,YAAA,GAAe,gDAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,CAAA,CAAE,aAAA,EAAe,CAAA,CAAE,SAAS,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAA,CAAa,MAAA,EAAuB,SAAA,EAAmB,MAAA,EAAwB;AAErF,IAAA,MAAM,CAAA,GAAK,UAAU,EAAC;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,MACrB,QAAA,EAAU,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,EAAA;AAAA,MAC1C,KAAA,EACE,OAAO,CAAA,CAAE,YAAA,KAAiB,WAAW,CAAA,CAAE,YAAA,GAAgB,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,CAAA;AAAA,MACzF,OAAA,EAAS,EAAE,KAAA,EAAO;AAAA,KACpB;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAGtB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,YAAY,qBAAA,EAAuB;AAAA,QACrC,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA;AAAO,OACrC;AAAA,KACH;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACrC;AAAA,EAEQ,YAAY,MAAA,EAAsC;AACxD,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,WAAA;AACH,QAAA,OAAO,WAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF;AAAA;AAAA,EAGQ,gBAAgB,MAAA,EAA4C;AAGlE,IAAA,OAAO,MAAA,KAAW,eAAe,MAAA,KAAW,QAAA;AAAA,EAC9C;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,aAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,EAAA;AACf,IAAA,OAAO,WAAA,CAAY,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,KAAK,sBAAA,CAAuB,MAAA,KAAW,GAAG,OAAO,CAAA;AACtE,IAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,CAAA;AACf,IAAA,OAAO,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,KAAA,GAAQ,GAAA;AAAA,EACnC;AAAA;AAAA,EAGQ,aAAA,GAAwB;AAC9B,IAAA,MAAM,IAAI,IAAA,CAAK,aAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,EAAA;AACf,IAAA,OAAO,YAAY,CAAA,CAAE,QAAA,GAAW,KAAK,aAAA,EAAc,EAAG,EAAE,QAAQ,CAAA;AAAA,EAClE;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAOF,IAAAA;AAAA,mCAAA,EAC0B,KAAK,KAAK,CAAA;AAAA;AAAA,qBAAA,EAExB,KAAK,OAAA,GAAU,SAAA,GAAY,IAAA,CAAK,cAAA,GAAiB,eAAe,EAAE,CAAA;AAAA;AAAA,mBAAA,EAEpE,KAAK,OAAO;AAAA;AAAA,mCAAA,EAEI,KAAK,KAAK,CAAA;AAAA;AAAA,8BAAA,EAEf,IAAA,CAAK,cAAA,GAAiB,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA;AAAA,uCAAA,EACnC,KAAK,KAAK,CAAA;AAAA;;AAAA;AAAA,UAAA,EAIvC,IAAA,CAAK,cAAA,GACH,IAAA,CAAK,kBAAA,EAAmB,GACxB,IAAA,CAAK,OAAA,GACH,IAAA,CAAK,mBAAA,EAAoB,GACzB,IAAA,CAAK,kBAAA,EAAoB;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAIvC;AAAA,EAEQ,kBAAA,GAAqB;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,cAAA;AACf,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAKc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,eAAe,CAAC,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAA,CAAK,KAAA,GAC5EA,IAAAA,CAAAA,uBAAAA,EAA8B,IAAA,CAAK,IAAA,CAAK,KAAK,MAC7C,EAAE;AAAA;AAAA,QAAA,EAEN,GAAG,OAAA,GACDA,IAAAA,CAAAA,8CAAAA,EAAqD,CAAA,CAAE,OAAO,eAC9D,EAAE;AAAA,QAAA,EACJ,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,GACpBA,IAAAA;AAAA;AAAA,gBAAA,EAEM,EAAE,KAAA,CAAM,GAAA;AAAA,MACR,CAAC,EAAA,KAAOA,IAAAA;AAAA;AAAA,4BAAA,EAEI,EAAA,CAAG,KAAA,GAAQ,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAA,EAAK,EAAA,CAAG,QAAQ,CAAA;AAAA,4BAAA,EACxD,YAAY,EAAA,CAAG,SAAA,GAAY,GAAG,QAAA,EAAU,EAAA,CAAG,QAAQ,CAAC,CAAA;AAAA;AAAA,kBAAA;AAAA,KAGjE;AAAA;AAAA,2CAAA,EAE4B,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,YAAA,CAAA,GAIjE,EAAE;AAAA,6CAAA,EACiC,KAAK,KAAK,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAGvD;AAAA;AAAA,EAGQ,iBAAA,GAAoB;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,iBAAA,EAAkB;AACnE,IAAA,OAAOA,IAAAA;AAAA;AAAA,QAAA,EAED,KAAK,OAAA,GACHA,IAAAA;AAAA;AAAA,gBAAA,EAEM,KAAK,YAAA,CAAa,GAAA;AAAA,MAClB,CAAC,CAAA,KAAMA,IAAAA;AAAA;AAAA,sCAAA,EAEe,IAAA,CAAK,gBAAA,KAAqB,CAAA,CAAE,EAAA,GAAK,WAAW,EAAE,CAAA;AAAA;AAAA,mCAAA,EAEjD,IAAA,CAAK,gBAAA,KAAqB,CAAA,CAAE,EAAE;AAAA,gCAAA,EACjC,KAAK,cAAc;AAAA,6BAAA,EACtB,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,EAAE,CAAC;AAAA;AAAA;AAAA,2BAAA,EAGxC,EAAE,MAAA,IAAU,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,EAAE,WAAW,CAAA;AAAA;AAAA;AAAA,wBAAA,EAG/C,WAAA,CAAY,EAAE,UAAA,IAAc,CAAA,CAAE,QAAQ,GAAA,EAAK,CAAA,CAAE,QAAA,IAAY,QAAQ,CAAC;AAAA;AAAA;AAAA,kBAAA;AAAA,KAI3E;AAAA;AAAA,YAAA,CAAA,GAGL,EAAE;AAAA,QAAA,EACJ,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAC7BA,IAAAA;AAAA;AAAA,gBAAA,EAEM,KAAK,gBAAA,CAAiB,GAAA;AAAA,MACtB,CAAC,CAAA,KAAMA,IAAAA;AAAA;AAAA,wCAAA,EAEiB,IAAA,CAAK,iBAAA,KAAsB,CAAA,CAAE,UAAA,GAAa,WAAW,EAAE,CAAA;AAAA,6BAAA,EAClE,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,UAAU,CAAC;AAAA;AAAA,sBAAA,EAErD,EAAE,IAAI;AAAA;AAAA,kBAAA;AAAA,KAGb;AAAA;AAAA,YAAA,CAAA,GAGL,EAAE;AAAA,QAAA,EACJ,KAAK,cAAA,GACHA,IAAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA,GAKA,EAAE;AAAA;AAAA;AAAA;AAAA,iBAAA,EAIK,MAAM,KAAK,IAAA,CAAK,iBAAA,EAAmB;AAAA,oBAAA,EAChC,KAAK,iBAAA,IAAqB,CAAC,IAAA,CAAK,YAAA,IAAgB,KAAK,cAAc;AAAA;AAAA,UAAA,EAE7E,IAAA,CAAK,iBAAA,GACH,iBAAA,GACA,IAAA,CAAK,cAAA,GACH,6BACA,CAAA,MAAA,EAAS,IAAA,CAAK,aAAA,EAAe,CAAA,WAAA,CAAa;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAIxD;AAAA;AAAA,EAGQ,mBAAA,GAAsB;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY,iBAAA,EAAkB;AACnE,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAGzB,MAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAQQ,MAAM;AACb,QAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,MACjB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,IAMT;AACA,IAAA,OAAOA,IAAAA;AAAA;AAAA;AAAA,QAAA,EAGD,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAClBA,IAAAA;AAAA;AAAA,gBAAA,EAEM,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,IAAA,KAASA,IAAAA;AAAA;AAAA,4BAAA,EAEE,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,4BAAA,EAChE,WAAA,CAAY,KAAK,SAAA,GAAY,IAAA,CAAK,UAAU,IAAA,CAAK,QAAA,IAAY,QAAQ,CAAC,CAAA;AAAA;AAAA,kBAAA;AAAA,KAGnF;AAAA;AAAA,6BAAA,EAEc,KAAK,cAAA,GAAiB,CAAA,QAAA,EAAM,KAAK,cAAA,CAAe,MAAM,KAAK,EAAE,CAAA;AAAA,wBAAA,EAClE,WAAA,CAAY,IAAA,CAAK,aAAA,EAAc,EAAG,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,2CAAA,EAGxB,IAAA,CAAK,eAAe,CAAA;AAAA;AAAA;AAAA,YAAA,CAAA,GAIrD,EAAE;AAAA,QAAA,EACJ,IAAA,CAAK,mBAAmB;AAAA,QAAA,EACxB,KAAK,aAAA,GACHA,IAAAA,CAAAA,4BAAAA,EAAmC,IAAA,CAAK,aAAa,WACrD,EAAE;AAAA,QAAA,EACJ,KAAK,YAAA,GACHA,IAAAA,CAAAA,2BAAAA,EAAkC,IAAA,CAAK,YAAY,WACnD,EAAE;AAAA;AAAA,IAAA,CAAA;AAAA,EAGZ;AAAA,EAEQ,kBAAA,GAAqB;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAe,aAAA;AACnC,IAAA,MAAM,kBAAkB,CAAC,CAAC,UAAU,CAAC,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAEhE,IAAA,MAAM,UAAU,MAAA,KAAW,OAAA;AAC3B,IAAA,OAAOA,IAAAA;AAAA,UAAA,EACC,CAAC,OAAA,GACCA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAWa,IAAA,CAAK,KAAK,SAAS;AAAA,yBAAA,EACnB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,aAAc,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAS9D,IAAA,CAAK,KAAK,QAAQ;AAAA,yBAAA,EAClB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,YAAa,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAU/D,IAAA,CAAK,KAAK,KAAK;AAAA,uBAAA,EACf,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,SAAU,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAS1D,IAAA,CAAK,KAAK,OAAO;AAAA,uBAAA,EACjB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,WAAY,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAU1D,IAAA,CAAK,KAAK,UAAU;AAAA,yBAAA,EACpB,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,cAAe,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAS/D,IAAA,CAAK,KAAK,IAAI;AAAA,yBAAA,EACd,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,QAAS,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,YAAA,EAItE,IAAA,CAAK,sBAAA,CAAuB,MAAA,GAAS,CAAA,GACnCA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAMQ,KAAK,sBAAA,CAAuB,GAAA;AAAA,MAC5B,CAAC,CAAA,KAAMA,IAAAA;AAAA;AAAA;AAAA,4CAAA,EAGe,IAAA,CAAK,gBAAA,KAAqB,CAAA,CAAE,EAAA,GAAK,WAAW,EAAE,CAAA;AAAA,mCAAA,EACvD,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,EAAE,CAAC;AAAA;AAAA;AAAA,iCAAA,EAGxC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAI,CAAA;AAAA,8BAAA,EACrB,EAAE,WAAA,GAAcA,IAAAA,CAAAA,MAAAA,EAAa,CAAA,CAAE,WAAW,YAAY,EAAE;AAAA;AAAA;AAAA,8BAAA,EAGxD,WAAA;AAAA,QACA,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,KAAA,GAAQ,GAAA;AAAA,QAC1B,CAAA,CAAE,QAAA,IAAY,IAAA,CAAK,aAAA,EAAe,QAAA,IAAY;AAAA,OAC/C;AAAA;AAAA;AAAA,wBAAA;AAAA,KAIR;AAAA;AAAA;AAAA,gBAAA,CAAA,GAIP,EAAE;AAAA;AAAA,UAAA,CAAA,GAGJ,EAAE;;AAAA,UAAA,EAEJ,OAAA,GACEA,IAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EASiB,IAAA,CAAK,KAAK,KAAK;AAAA,6BAAA,EACf,CAAC,MACR,IAAA,CAAK,aAAA,CAAc,SAAU,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAK3E,EAAE;;AAAA;AAAA,uCAAA,EAGyB,OAAA,GAAU,aAAa,QAAQ,CAAA;AAAA,YAAA,EAC1D,MAAA,GACEA,IAAAA;AAAA;AAAA;AAAA,wCAAA,EAG0B,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAKnC,MAAM;AACb,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,GAAA,CAAI,QAAA,CAAS,oBAAoB,EAAmB,CAAA;AAAA,IACtD,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA,kBAAA,EAMH,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,iBAAA,KAAsB,EAAE;AAAA,kBAAA,EACnD,WAAW,QAAA,GACTA,IAAAA;AAAA;AAAA;AAAA,iCAAA,EAGa,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC;AAAA,oCAAA,EAC5B,KAAK,aAAA,IAAiB,CAAC,KAAK,cAAA,IAAkB,CAAC,KAAK,mBAAmB;AAAA,gCAAA,EAC3E,CAAC,KAAK,cAAA,GACV,oCAAA,GACA,CAAC,IAAA,CAAK,mBAAA,GACJ,kCACA,EAAE;AAAA;AAAA,0BAAA,EAEN,KAAK,aAAA,GACH,yBAAA,GACA,SAAS,IAAA,CAAK,aAAA,EAAe,CAAA,WAAA,CAAa;AAAA;AAAA,sBAAA,CAAA,GAGlD,EAAE;AAAA,kBAAA,EACJ,WAAW,OAAA,GACTA,IAAAA;AAAA;AAAA;AAAA,iCAAA,EAGa,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC;AAAA,oCAAA,EAC3B,KAAK,YAAY;AAAA;AAAA,0BAAA,EAE3B,KAAK,YAAA,GACH,wBAAA,GACA,SAAS,IAAA,CAAK,aAAA,EAAe,CAAA,UAAA,CAAY;AAAA;AAAA,sBAAA,CAAA,GAGjD,EAAE;AAAA,kBAAA,EACJ,WAAW,WAAA,GACTA,IAAAA;AAAA;AAAA;AAAA,iCAAA,EAGa,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC;AAAA,oCAAA,EAC/B,KAAK,kBAAA,IAAsB,CAAC,KAAK,cAAA,IAAkB,CAAC,KAAK,mBAAmB;AAAA,gCAAA,EAChF,CAAC,KAAK,cAAA,GACV,oCAAA,GACA,CAAC,IAAA,CAAK,mBAAA,GACJ,kCACA,EAAE;AAAA;AAAA,0BAAA,EAEN,KAAK,kBAAA,GACH,gBAAA,GACA,SAAS,IAAA,CAAK,aAAA,EAAe,CAAA,cAAA,CAAgB;AAAA;AAAA,sBAAA,CAAA,GAGrD,EAAE;AAAA,kBAAA,EACJ,eAAA,IAAmB,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,OAAA,GACnDA,IAAAA;AAAA;AAAA;AAAA,iCAAA,EAGa,KAAK,eAAe;AAAA,oCAAA,EACjB,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,KAAK,mBAAmB;AAAA,gCAAA,EACrD,CAAC,KAAK,cAAA,GACV,oCAAA,GACA,CAAC,IAAA,CAAK,mBAAA,GACJ,kCACA,EAAE;AAAA;AAAA,gCAAA,EAEA,IAAA,CAAK,eAAe,CAAA,KAAA,EAAQ,KAAK,WAAA,CAAY,MAAA,IAAU,IAAI,CAAC;AAAA;AAAA,sBAAA,CAAA,GAGxE,EAAE;AAAA,kBAAA,EACJ,CAAC,OAAA,IAAW,CAAC,IAAA,CAAK,cAAA,GAChBA,IAAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,CAAA,GAKA,CAAC,OAAA,IAAW,CAAC,IAAA,CAAK,mBAAA,GAChBA,IAAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,CAAA,GAKA,EAAE;AAAA,gBAAA,CAAA,GAEVA,IAAAA;AAAA;AAAA;AAAA,oBAAA,EAGM,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,IAAK,KAAK,iBAAA,GACtCA,IAAAA;AAAA;AAAA;AAAA,mCAAA,EAGa,MAAM,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC;AAAA,sCAAA,EAC1B,KAAK,kBAAkB;AAAA;AAAA,4BAAA,EAEjC,IAAA,CAAK,kBAAA,GACH,gBAAA,GACAA,IAAAA,CAAAA,igBAAAA,CAAugB;AAAA;AAAA,wBAAA,CAAA,GAG/gB,EAAE;AAAA,oBAAA,EACJ,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,GACzBA,IAAAA;AAAA;AAAA;AAAA,mCAAA,EAGa,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC;AAAA,sCAAA,EACvB,KAAK,aAAa;AAAA;AAAA,qCAAA,EAEnBG,gBAAe,CAAA;AAAA;AAAA,wBAAA,CAAA,GAG9B,EAAE;AAAA,oBAAA,EACJ,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,IAAK,KAAK,eAAA,GACnCH,IAAAA;AAAA,6DAAA,EACuC,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,wBAAA,CAAA,GAIjE,EAAE;AAAA,oBAAA,EACJ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,GACxBA,IAAAA;AAAA,6DAAA,EACuC,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA,wBAAA,CAAA,GAIhE,EAAE;AAAA,oBAAA,EACJ,KAAK,aAAA,CAAc,WAAW,CAAA,IAAK,CAAC,KAAK,iBAAA,GACvCA,IAAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,CAAA,GAKA,EAAE;AAAA;AAAA,gBAAA,CAET;AAAA,YAAA,EACH,KAAK,aAAA,GACHA,IAAAA,CAAAA,4BAAAA,EAAmC,IAAA,CAAK,aAAa,WACrD,EAAE;AAAA,YAAA,EACJ,KAAK,YAAA,GACHA,IAAAA,CAAAA,2BAAAA,EAAkC,IAAA,CAAK,YAAY,WACnD,EAAE;AAAA;;AAAA,UAAA,EAGN,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAClBA,IAAAA;AAAA;AAAA,kBAAA,EAEM,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,IAAA,KAASA,IAAAA;AAAA;AAAA;AAAA,0BAAA,EAGF,IAAA,CAAK,WACHA,IAAAA,CAAAA,SAAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,GAAA,CAAA,GAC9C,EAAE;AAAA;AAAA;AAAA,gCAAA,EAGE,KAAK,KAAK,CAAA;AAAA,6BAAA,EACb,KAAK,IAAI,CAAA;AAAA,iCAAA,EACL,KAAK,QAAQ,CAAA;AAAA;AAAA;AAAA,0BAAA,EAGpB,YAAY,IAAA,CAAK,SAAA,GAAY,KAAK,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,oBAAA;AAAA,KAInE;AAAA;AAAA,0CAAA,EAEyB,IAAA,CAAK,YAAY,CAAA;AAAA;AAAA;AAAA,+BAAA,EAG5B,IAAA,CAAK,aAAA,EAAc,GAAI,CAAA,IAAK,KAAK,cAAA,GAAiB,CAAA,QAAA,EAAM,IAAA,CAAK,cAAA,CAAe,MAAA,IAAU,IAAA,CAAK,cAAA,CAAe,IAAI,KAAK,EAAE,CAAA;AAAA,0BAAA,EAC1H,IAAA,CAAK,aAAA,EAAc,GAAI,CAAA,GAC3B,WAAA,CAAY,IAAA,CAAK,aAAA,EAAc,EAAG,IAAA,CAAK,aAAA,EAAe,QAAQ,CAAA,GAC9D,KAAK,aAAa,CAAA;AAAA;AAAA;AAAA,6CAAA,EAGK,IAAA,CAAK,eAAe,CAAA;AAAA;AAAA;AAAA,cAAA,CAAA,GAIrD,EAAE;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAId;AACF,CAAA;AA7zD8C,eAAA,CAAA;AAAA,EAA3CC,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM;AAAA,CAAA,EAD/B,YAAA,CACiC,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAChB,eAAA,CAAA;AAAA,EAA3BA,QAAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAFf,YAAA,CAEiB,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAE5B,eAAA,CAAA;AAAA,EADCA,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,kBAAkB;AAAA,CAAA,EAH5C,YAAA,CAIX,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AAE4C,eAAA,CAAA;AAAA,EAA3CA,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM;AAAA,CAAA,EAN/B,YAAA,CAMiC,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;AAE3B,eAAA,CAAA;AAAA,EAAhBC,KAAAA;AAAM,CAAA,EARI,YAAA,CAQM,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EATI,YAAA,CASM,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAVI,YAAA,CAUM,SAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAXI,YAAA,CAWM,SAAA,EAAA,oBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAZI,YAAA,CAYM,SAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAbI,YAAA,CAaM,SAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAdI,YAAA,CAcM,SAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAfI,YAAA,CAeM,SAAA,EAAA,cAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAjBI,YAAA,CAiBM,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAnBI,YAAA,CAmBM,SAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;AAaA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAhCI,YAAA,CAgCM,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAjCI,YAAA,CAiCM,SAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAlCI,YAAA,CAkCM,SAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EApCI,YAAA,CAoCM,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAtCI,YAAA,CAsCM,SAAA,EAAA,wBAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EAzCI,YAAA,CAyCM,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAEA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EA3CI,YAAA,CA2CM,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EA5CI,YAAA,CA4CM,SAAA,EAAA,cAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAhBA,KAAAA;AAAM,CAAA,EA7CI,YAAA,CA6CM,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AA7CZ,IAAM,WAAA,GAAN;;;ACNA,SAAS,mBAAA,GAA4B;AAC1C,EAAA,IACE,OAAO,mBAAmB,WAAA,IAC1B,OAAO,eAAe,GAAA,KAAQ,UAAA,IAC9B,OAAO,cAAA,CAAe,MAAA,KAAW,UAAA;AAEjC,IAAA;AACF,EAAA,MAAM,IAAA,GAAkD;AAAA,IACtD,CAAC,eAAe,UAAU,CAAA;AAAA,IAC1B,CAAC,wBAAwB,kBAAkB,CAAA;AAAA,IAC3C,CAAC,sBAAsB,gBAAgB,CAAA;AAAA,IACvC,CAAC,YAAY,OAAO,CAAA;AAAA,IACpB,CAAC,gBAAgB,WAAW;AAAA,GAC9B;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,IAAA,EAAM;AAC9B,IAAA,IAAI,CAAC,eAAe,GAAA,CAAI,GAAG,GAAG,cAAA,CAAe,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAC/D;AACF","file":"chunk-6X225SGW.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 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 }\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 are what a merchant/publisher\n * actually wants a \"brand settings\" panel for. Spacing/radius/sizes stay\n * internal — expose them here later if a real need shows up, don't\n * speculatively surface the whole token set as public API.\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}\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}\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 * <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 { 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'\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 @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 /** 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\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\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: 16px 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: 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 .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 /* 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: 8px;\n }\n .sk-image { width: 100%; aspect-ratio: 1; border-radius: 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 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 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.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\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) {\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 if (this.availableMethods === null) return true\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z]/g, '')\n return this.availableMethods.some((m) => names.some((n) => norm(m) === norm(n)))\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 private buyWithVipps(): 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: '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 override render() {\n return html`\n <div class=\"backdrop\" @click=${this.close}></div>\n <div class=\"modal\" role=\"dialog\" aria-label=\"Produkt\">\n <div class=\"handle\" @click=${this.close} aria-hidden=\"true\"></div>\n <div class=\"topbar\">\n <span class=\"topbar-brand\">${this.product?.brand ?? ''}</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.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 ? 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 { 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'\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 /** 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\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 — only fetch methods if we don't have them yet.\n if (this.availableMethods === null) {\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\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: 16px 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: 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: 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 .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: 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: 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: 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 .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: 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 // 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 this.open = true\n // Analytics/host hook — `view_cart` on any host, not just Vev (which\n // used to synthesize this event itself).\n this.dispatchEvent(\n new CustomEvent('vio:open-cart', { bubbles: true, composed: true }),\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(name: string): boolean {\n if (this.availableMethods === null) return true\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z]/g, '')\n return this.availableMethods.some((m) => norm(m) === norm(name))\n }\n\n override updated(changed: Map<string, unknown>): void {\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 private onVipps(): 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: '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-label=${this.heading}>\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 ${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 ? 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 * <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 { 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'\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 @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 /** Snapshot of the placed order, for the confirmation screen. */\n @state() private confirmedOrder: {\n items: CartLineItem[]\n currency: string\n total: number\n orderId?: 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 /** 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 /** 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 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 if (this.checkoutState) {\n if (sponsorChanged || this.availableMethods === null) {\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.confirmedMethod = null\n this.confirmedOrder = null\n this.paymentError = null\n this.paymentNotice = null\n this.express = false\n this.availableMethods = null\n this.unmountKlarna()\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 this.paymentError =\n detail.method === 'klarna'\n ? `Klarna-betalingen kunne ikke fullføres: ${detail.error}`\n : detail.error\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\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: 16px 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: 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. Only the\n compact confirmation card stays centered. */\n @media (min-width: 601px) {\n .modal:not(.as-confirm) {\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:not(.as-confirm) { 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: 16px 16px 0 0;\n }\n :host([open]) .modal.as-side { transform: translateY(0); }\n }\n\n /* Confirmation: a centered desktop dialog (the bottom-sheet looked like\n mobile on desktop). Falls back to a bottom sheet on phones. */\n .modal.as-confirm {\n inset: auto;\n top: 50%;\n left: 50%;\n width: min(92vw, 440px);\n max-width: 440px;\n height: auto;\n max-height: 88vh;\n border-radius: 16px;\n box-shadow: 0 30px 80px -24px rgba(0, 0, 0, 0.4);\n transform: translate(-50%, -50%) scale(0.96);\n opacity: 0;\n }\n :host([open]) .modal.as-confirm {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n @media (max-width: 600px) {\n .modal.as-confirm {\n inset: auto 0 0 0;\n top: auto;\n left: 0;\n width: 100%;\n max-width: none;\n border-radius: 16px 16px 0 0;\n transform: translateY(100%) scale(1);\n opacity: 1;\n }\n :host([open]) .modal.as-confirm { transform: translateY(0); }\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: 16px 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: 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 .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 .apple-pay-note {\n grid-column: 1 / -1;\n font-size: 12px;\n color: var(--vio-color-text-tertiary, #999);\n text-align: center;\n margin-top: 4px;\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: 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 .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: 10px; 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: 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: 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 text-align: center;\n padding: 24px 24px 28px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n }\n .confirm-check {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: #2e7d32;\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n line-height: 1;\n }\n .confirm-title {\n font-family: var(--vio-font-serif, Georgia, serif);\n font-size: 28px;\n font-weight: 400;\n margin: 0;\n }\n .confirm-text {\n font-size: 14px;\n color: var(--vio-color-text-secondary, #666);\n max-width: 360px;\n line-height: 1.6;\n margin: 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 width: 100%;\n max-width: 360px;\n border-top: 1px solid var(--vio-color-border, #eee);\n padding-top: 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n text-align: left;\n font-size: 13px;\n }\n .confirm-close {\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 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 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 }\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 /** 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 private async pollVippsStatus(\n checkoutId: string,\n sponsorId: number,\n ): Promise<{ outcome: 'paid' | 'failed' | 'pending'; 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 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',\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 orderId: checkoutId || undefined,\n }\n this.confirmedMethod = vioMethod as PaymentMethod\n this.orderConfirmed = true\n this.open = true\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 === '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 =\n 'Vi kunne ikke bekrefte betalingen. Handlekurven er uendret — prøv igjen, eller kontakt support hvis du ble belastet.'\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 if (!vioPayment && !checkoutId) return\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 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.paymentNotice = 'Bekrefter betalingen med Vipps…'\n const { outcome, sawStatus } = await this.pollVippsStatus(checkoutId, sponsorId)\n this.paymentNotice = 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' = 'pending'\n let sawStatus = false\n if (checkoutId) {\n this.open = true\n this.paymentNotice = '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 (VioCheckout.FAILED_STATUSES.has(status)) {\n outcome = 'failed'\n break\n }\n if (\n VioCheckout.PAID_STATUSES.has(status) ||\n 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.paymentNotice = 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 this.unmountKlarna()\n super.disconnectedCallback()\n }\n\n override updated(changed: Map<string, unknown>): void {\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 // 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 }\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 /** Fetch the real per-supplier shippings and preselect + persist the first. */\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 this.loadingShippings = true\n this.shippingsAttempted = true\n try {\n const shippings = await Vio.checkout.fetchAvailableShippings(spId)\n if (Array.isArray(shippings) && shippings.length > 0) {\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 }\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 methods = (await Vio.checkout.getAvailablePaymentMethods(\n this.checkoutState.sponsorId,\n )) as Array<{ name: string }> | 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('[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 }\n }\n\n /** Backend names arrive as e.g. \"Apple Pay\" — compare letters only. */\n private methodEnabled(name: string): boolean {\n if (this.availableMethods === null) return true\n const norm = (s: string) => s.toLowerCase().replace(/[^a-z]/g, '')\n return this.availableMethods.some((m) => norm(m) === norm(name))\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 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 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 = `Kunne ikke laste Klarna: ${\n err instanceof Error ? err.message : String(err)\n }`\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 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) 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 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 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 // Vipps collects the address in its own flow but still needs an email\n // for the order receipt; every other method needs the full form + a\n // shipping choice before we mint sessions/links.\n if (method === 'vipps') {\n const email = String(this.form.email ?? '').trim()\n if (!email || !email.includes('@')) {\n this.paymentError = 'Vennligst fyll inn e-postadressen din.'\n return\n }\n } else {\n if (!this.isAddressValid) {\n this.paymentError = 'Vennligst fyll ut alle feltene i leveringsadresse.'\n return\n }\n if (!this.hasSelectedShipping) {\n this.paymentError = 'Vennligst velg en fraktmetode.'\n return\n }\n }\n Vio.checkout.selectPaymentMethod(method)\n // Stripe / Vipps: hosted payment pages — mint the link and redirect. The\n // return trip lands in checkReturnPaymentStatus().\n if (method === 'stripe') {\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 this.paymentError = `Kunne ikke starte Stripe-betaling: ${\n err instanceof Error ? err.message : String(err)\n }`\n })\n .finally(() => {\n this.stripeLoading = false\n })\n }\n if (method === 'vipps') {\n this.vippsLoading = true\n void Vio.checkout\n .startVippsPayment(this.checkoutState?.sponsorId, this.form)\n .catch((err: unknown) => {\n this.paymentError = `Kunne ikke starte Vipps-betaling: ${\n err instanceof Error ? err.message : String(err)\n }`\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 (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(method: PaymentMethod, sponsorId: number, result?: unknown): void {\n // Snapshot the order BEFORE clearing the cart — the confirmation needs it.\n const r = (result ?? {}) as { order?: { orderId?: string }; chargedTotal?: number }\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 orderId: r.order?.orderId,\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 detail: { method, sponsorId, result },\n }),\n )\n Vio.cart.clearSponsorCart(sponsorId)\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 '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 — neither uses the generic \"Betal\" CTA.\n return method === 'apple-pay' || method === 'klarna'\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.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 /** 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-label=${this.heading}\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.orderConfirmed\n ? this.renderConfirmation()\n : this.express\n ? this.renderKlarnaExpress()\n : this.renderCheckoutBody()}\n </div>\n </div>\n `\n }\n\n private renderConfirmation() {\n const o = this.confirmedOrder\n return html`\n <section class=\"confirmation\">\n <div class=\"confirm-check\" aria-hidden=\"true\">✓</div>\n <h3 class=\"confirm-title\">Takk for bestillingen!</h3>\n <p class=\"confirm-text\">\n Betaling med ${this.methodLabel(this.confirmedMethod)} er bekreftet.${this.form.email\n ? html` Kvittering sendes til ${this.form.email}.`\n : ''}\n </p>\n ${o?.orderId\n ? html`<div class=\"confirm-order-id\">Ordrenummer: <b>${o.orderId}</b></div>`\n : ''}\n ${o && o.items.length > 0\n ? html`\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><span>${formatPrice(o.total, o.currency)}</span>\n </div>\n </div>\n `\n : ''}\n <button class=\"confirm-close\" @click=${this.close}>Lukk</button>\n </section>\n `\n }\n\n /** Klarna Payments widget panel: shipping + category chips + widget + pay button. */\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 || !this.klarnaHandle || this.klarnaMounting}\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.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 — skip the form entirely.\n const isVipps = method === 'vipps'\n return html`\n ${!isVipps\n ? html`\n <section class=\"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\">${isVipps ? 'Betaling' : 'Steg 2'}</div>\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 <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 Vio.checkout.selectPaymentMethod('' as PaymentMethod)\n }}\n >\n Endre\n </button>\n </div>\n\n ${method === 'klarna' ? this.renderKlarnaPanel() : ''}\n ${method === 'stripe'\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 ${!isVipps && !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 : !isVipps && !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 : html`\n <h3 class=\"section-heading\">Velg betalingsmåte</h3>\n <div class=\"payment-grid\">\n ${this.methodEnabled('apple-pay') && this.applePayAvailable\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('vipps')\n ? html`\n <button class=\"payment-btn\" @click=${() => this.onPay('vipps')}>\n <span style=\"color:#ff5b24;font-weight:800;font-size:17px;letter-spacing:-0.02em\">vipps</span>\n </button>\n `\n : ''}\n ${this.methodEnabled('apple-pay') && !this.applePayAvailable\n ? html`\n <div class=\"apple-pay-note\">\n Pay krever Safari på iOS eller macOS med Apple Pay konfigurert.\n </div>\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.shippingOption ? ` – ${this.shippingOption.method || this.shippingOption.name}` : ''}</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"]}