{
  "version": 3,
  "sources": ["/cdn/shop/t/83/assets/pdp-clean-v4-variants-v837.js?lly=laley-custom-20260908-illustrations-v848"],
  "sourcesContent": ["/* ============================================================\n   Laley PDP Clean v4 \u2014 variants v837\n   Modul\u00E6r PDP-runtime. Den gamle v3-monolitten er kun historisk arkiv.\n   Registrerer metoder p\u00E5 LaleyPDP.prototype via PDP.registerModule.\n   Krever pdp-clean-v4-core.js lastet f\u00F8rst (defer-rekkef\u00F8lge i product-clean-v3-1.liquid).\n   ============================================================ */\n(() => {\n  const PDP = window.LaleyPDPCleanV4;\n  if (!PDP || typeof PDP.registerModule !== 'function') {\n    console.error('[PDP] Kjerne mangler \u2014 hopper over modul: variants');\n    return;\n  }\n  const { cssEscape } = PDP.utils;\n\n  PDP.registerModule('variants', {\n    cleanVariantLabel(variant) {\n      const title = String(variant?.title || '').trim();\n      if (!title || /^default title$/i.test(title)) return '';\n      return title;\n    },\n\n    // Shopify option index of the size dimension (or -1 if the product has none).\n    sizeOptionIndex() {\n      const sizeGroup = this.optionGroups.find((group) => group.hasAttribute('data-pdp-size-group'));\n      const input = sizeGroup?.querySelector('[data-pdp-option-input][data-option-index]');\n      return input ? Number(input.dataset.optionIndex) : -1;\n    },\n\n    // Human label for a sold-out notice. Prefer the SIZE value alone (\"S\") \u2014 the\n    // selected colour is already visible in the swatch, so the technical variant\n    // title (\"S / Black\") is noise. Only when the product has no size dimension do\n    // we fall back to its single stored option value (the localized colour name).\n    soldOutNoticeLabel(variant) {\n      const idx = this.sizeOptionIndex();\n      const sizeValue = idx >= 0 ? variant?.options?.[idx] : null;\n      if (sizeValue) return String(sizeValue).trim();\n      return this.cleanVariantLabel(variant);\n    },\n\n    optionGroupDisplayName(group) {\n      const triggerName = group?.querySelector?.('.pdp-clean__dropdown-trigger-name')?.textContent?.trim();\n      if (triggerName) return triggerName;\n      const legendText = group?.querySelector?.('legend')?.textContent || '';\n      const name = legendText.split(':')[0].replace(/\\s+/g, ' ').trim();\n      return name || 'delen';\n    },\n\n    requiredOptionGroups() {\n      return this.optionGroups.filter((group) => (\n        group.hasAttribute('data-pdp-size-group')\n        || group.hasAttribute('data-pdp-length-group')\n      ));\n    },\n\n    awaitingSizeCtaLabel() {\n      const groups = this.requiredOptionGroups();\n      const hasLength = groups.some((group) => group.hasAttribute('data-pdp-length-group'));\n      if (hasLength) {\n        const next = groups.find((group) => !group.querySelector('[data-pdp-option-input]:checked'));\n        return next?.hasAttribute('data-pdp-length-group') ? 'Velg benlengde' : 'Velg st\u00F8rrelse';\n      }\n      if (groups.length < 2) return 'Velg st\u00F8rrelse';\n      const sharedPicker = this.section.querySelector('[data-pdp-bundle-shared]:not([hidden])');\n      if (sharedPicker) return 'Velg st\u00F8rrelse';\n      const missing = groups.filter((group) => !group.querySelector('[data-pdp-option-input]:checked'));\n      if (missing.length !== 1) return 'Velg st\u00F8rrelser';\n      const name = this.optionGroupDisplayName(missing[0]).toLocaleLowerCase('nb-NO');\n      if (name.includes('barn')) return 'Velg barnest\u00F8rrelse';\n      if (name.includes('voksen')) return 'Velg voksenst\u00F8rrelse';\n      return `Velg ${name}`;\n    },\n\n    variantFromInput() {\n      const id = this.variantInput?.value || this.section.querySelector('[data-pdp-variant-id]')?.value;\n      return this.variants.find((variant) => String(variant.id) === String(id));\n    },\n\n    variantFromUrl() {\n      const id = new URLSearchParams(window.location.search).get('variant');\n      if (!id) return null;\n      return this.variants.find((variant) => String(variant.id) === String(id)) || null;\n    },\n\n    hasRequiredSizeSelection() {\n      const groups = this.requiredOptionGroups();\n      if (!groups.length) return true;\n      if (!this.requiresSizeSelection && !groups.some((group) => group.hasAttribute('data-pdp-length-group'))) return true;\n      return groups.every((group) => Boolean(group.querySelector('[data-pdp-option-input]:checked')));\n    },\n\n    // \u2500\u2500 ONE authoritative purchase-state resolver \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Every consumer (main CTA, sticky, variant status, Klarna, purchase options,\n    // BIS panel, analytics) reads this \u2014 no module re-derives priority. Liquid\n    // renders the matching initial state in first HTML so there is no flash.\n    isFullySoldOut() {\n      if (this.section?.dataset?.pdpFullySoldOut === 'true') {\n        return !this.variants.some((variant) => variant.available);\n      }\n      return this.variants.length > 0 && this.variants.every((variant) => !variant.available);\n    },\n\n    purchaseMode(variant) {\n      const v = variant === undefined ? this.currentVariant : variant;\n      if (this.section?.dataset?.pdpComingSoon === 'true' && !this.hasRequiredSizeSelection()) return 'awaiting_size';\n      if (this.section?.dataset?.pdpComingSoon === 'true') return 'coming_soon';\n      if (!this.hasRequiredSizeSelection()) return 'awaiting_size';\n      if (this.isFullySoldOut()) return 'fully_sold_out';\n      if (!v || !v.available) return 'selected_variant_sold_out';\n      return 'purchasable';\n    },\n\n    isRestockMode(mode) {\n      return mode === 'fully_sold_out' || mode === 'selected_variant_sold_out';\n    },\n\n    // Restock analytics on the existing CustomEvent contract \u2014 no new vendor, no PII\n    // (product/variant IDs + non-identifying size only; never email/phone). Every\n    // emission is de-duplicated: an identical event+variant+size+source inside a short\n    // window is dropped, so re-renders and double activations can't double-count.\n    emitRestockAnalytics(eventName, extra = {}) {\n      const mode = extra.state || this.purchaseMode();\n      const variant = extra.variant || this.currentVariant;\n      const detail = {\n        event: eventName,\n        product_id: this.section?.dataset?.productId || null,\n        product_handle: this.section?.dataset?.productHandle || null,\n        variant_id: extra.hasVariant === false ? null : (variant?.id || null),\n        size: extra.size || null,\n        source: extra.source || null,\n        state: this.isRestockMode(mode) ? mode : null,\n      };\n      const key = `${eventName}|${detail.variant_id}|${detail.size}|${detail.source}`;\n      const now = (window.performance && performance.now) ? performance.now() : 0;\n      this._analyticsSeen = this._analyticsSeen || new Map();\n      const last = this._analyticsSeen.get(key);\n      if (last != null && (now - last) < 600) return;\n      this._analyticsSeen.set(key, now);\n      document.dispatchEvent(new CustomEvent('laley:analytics', { bubbles: true, detail }));\n    },\n\n    // Drives the chrome that is NOT the button: fully-sold-out banner, Klarna,\n    // purchase options, and BIS-panel visibility, all from the resolved mode.\n    applyPurchaseChrome(mode) {\n      // Et helt utsolgt produkt beholder \u00E9n rolig statusmelding mens kunden\n      // velger st\u00F8rrelser. CTA-en kan samtidig eie neste steg: \u00ABVelg st\u00F8rrelser\u00BB.\n      const fully = mode === 'fully_sold_out' || (mode === 'awaiting_size' && this.isFullySoldOut());\n      const restock = this.isRestockMode(mode) || fully;\n\n      const banner = this.section.querySelector('[data-pdp-fully-soldout-msg]');\n      if (banner) banner.hidden = !fully;\n\n      const klarna = this.section.querySelector('.pdp-clean__klarna');\n      if (klarna) klarna.hidden = restock;\n\n      const options = this.purchaseOptionsWrap || this.section.querySelector('[data-pdp-purchase-options]');\n      if (options && restock) options.hidden = true;\n      // (purchasable restore is handled by updatePurchaseOptionsForVariant)\n\n      // Impression fires ONCE when the UI enters a visible restock state \u2014 not on\n      // every re-render, and not again while it stays in restock. Resets on leaving.\n      if (restock) {\n        if (!this._restockImpressionFired) {\n          this._restockImpressionFired = true;\n          this.emitRestockAnalytics('restock_cta_impression', { state: mode });\n        }\n      } else {\n        this._restockImpressionFired = false;\n      }\n    },\n\n    selectedOptions() {\n      if (!this.optionGroups.length) return this.currentVariant?.options || [];\n      // Index by the input's real Shopify option position, NOT picker DOM order.\n      // The template renders colour before size for visual reasons, but Shopify's\n      // option order can be the reverse (e.g. variant title \"XS / Black\" \u2192 size is\n      // option 1). findVariant/updateSelectedLabels/updateOptionStates all read this\n      // back by data-option-index, so it must be index-aligned or the values swap.\n      const opts = [];\n      this.optionGroups.forEach((group) => {\n        const checked = group.querySelector('[data-pdp-option-input]:checked');\n        if (!checked) return;\n        const idx = Number(checked.dataset.optionIndex);\n        opts[idx] = checked.value;\n      });\n      return opts;\n    },\n\n    notificationSelectionLabel() {\n      if (!this.bundle) return '';\n      const groups = this.optionGroups.filter((group) => group.hasAttribute('data-pdp-size-group'));\n      if (groups.length < 2) return '';\n      const parts = groups.map((group) => {\n        const selected = group.querySelector('[data-pdp-option-input]:checked');\n        if (!selected) return '';\n        let name = this.optionGroupDisplayName(group)\n          .replace(/\\s+for\\s+varsling.*$/i, '')\n          .replace(/est\u00F8rrelse.*$/i, '')\n          .replace(/st\u00F8rrelse.*$/i, '')\n          .trim();\n        if (!name) name = 'St\u00F8rrelse';\n        return `${name}: ${selected.value}`;\n      }).filter(Boolean);\n      return parts.length === groups.length ? parts.join(' \u00B7 ') : '';\n    },\n\n    syncNotificationContext(variant = this.currentVariant) {\n      const variantId = String(variant?.id || '').trim();\n      const selection = this.notificationSelectionLabel();\n      const isLaunch = this.section?.dataset?.pdpComingSoon === 'true';\n      const targets = [\n        this.atc?.matches?.('[data-kk-waitlist], [data-kk-restock]') ? this.atc : null,\n        this.section.querySelector('[data-pdp-coming-soon-cta]'),\n        this.section.querySelector('[data-pdp-restock-trigger]'),\n      ].filter((target, index, list) => target && list.indexOf(target) === index);\n\n      targets.forEach((target) => {\n        if (!target.dataset.kkBaseSubcopy) target.dataset.kkBaseSubcopy = target.dataset.kkSubcopy || '';\n        if (variantId) target.dataset.kkVariantId = variantId;\n        else target.removeAttribute('data-kk-variant-id');\n        if (!selection) {\n          target.dataset.kkSubcopy = target.dataset.kkBaseSubcopy;\n          return;\n        }\n        target.dataset.kkSubcopy = isLaunch\n          ? `${selection}. Vi varsler deg ved lansering.`\n          : `${selection}. Vi varsler deg n\u00E5r settet er tilbake.`;\n      });\n    },\n\n    findVariant(options = this.selectedOptions()) {\n      if (!options.length) return this.variants[0] || null;\n      return this.variants.find((variant) => {\n        return variant.options.length === options.length && variant.options.every((option, index) => option === options[index]);\n      }) || null;\n    },\n\n    syncOptionInputsToVariant(variant) {\n      if (!variant?.options?.length) return;\n      variant.options.forEach((value, index) => {\n        const input = this.section.querySelector(`[data-pdp-option-input][data-option-index=\"${index}\"][value=\"${cssEscape(value)}\"]`);\n        if (input && !input.checked) input.checked = true;\n      });\n    },\n\n    restoreSiblingSizeSelection() {\n      const key = 'laley:pdp:sibling-size';\n      let pending = null;\n      try {\n        pending = JSON.parse(window.sessionStorage.getItem(key) || 'null');\n        window.sessionStorage.removeItem(key);\n      } catch (error) {\n        return false;\n      }\n      if (!pending || pending.path !== window.location.pathname) return false;\n      if (Date.now() - Number(pending.savedAt || 0) > 30000) return false;\n\n      const groups = this.optionGroups.filter((group) => group.hasAttribute('data-pdp-size-group'));\n      const values = Array.isArray(pending.values) ? pending.values : [];\n      if (!groups.length || !values.length) return false;\n\n      const matches = groups.map((group, index) => {\n        const value = values[index] || values[0];\n        return Array.from(group.querySelectorAll('[data-pdp-option-input]'))\n          .find((input) => input.value === value && !input.disabled) || null;\n      });\n      if (matches.some((input) => !input)) return false;\n      matches.forEach((input) => { input.checked = true; });\n      return Boolean(this.findVariant());\n    },\n\n    bindOptions() {\n      this.optionInputs.forEach((input) => {\n        this.on(input, 'change', () => {\n          // CP-stil affordance: ATC sier \"Velg din st\u00F8rrelse\" inntil bruker\n          // har trigget minst \u00E9n option-change. Etter f\u00F8rste klikk: vis pris.\n          this.userPicked = true;\n          const variant = this.findVariant();\n          this.renderVariant(variant, { updateUrl: true, syncGallery: true, behavior: 'smooth' });\n          this.updateOptionStates();\n          // Restock: a size was chosen for varsling (only size inputs, only in a restock mode).\n          if (input.closest('[data-pdp-size-group]') && this.isRestockMode(this.purchaseMode())) {\n            this.emitRestockAnalytics('restock_size_selected', { size: input.value });\n          }\n          // Lukk dropdown etter valg + oppdater trigger-verdi\n          const dropdown = input.closest('[data-pdp-dropdown]');\n          if (dropdown) {\n            dropdown.open = false;\n            const trigger = dropdown.querySelector('[data-pdp-dropdown-value]');\n            if (trigger) trigger.textContent = input.dataset.pdpDisplayValue || input.value;\n            dropdown.querySelector('.pdp-clean__dropdown-trigger')?.focus({ preventScroll: true });\n          }\n        });\n      });\n    },\n\n    bindDropdowns() {\n      const dropdowns = Array.from(this.section.querySelectorAll('[data-pdp-dropdown]'));\n      if (!dropdowns.length) return;\n\n      const syncExpanded = (dropdown) => {\n        const trigger = dropdown.querySelector('.pdp-clean__dropdown-trigger');\n        if (trigger) trigger.setAttribute('aria-expanded', dropdown.open ? 'true' : 'false');\n      };\n\n      dropdowns.forEach((dropdown) => {\n        const trigger = dropdown.querySelector('.pdp-clean__dropdown-trigger');\n        syncExpanded(dropdown);\n        this.on(dropdown, 'toggle', () => {\n          syncExpanded(dropdown);\n          if (!dropdown.open) return;\n          dropdowns.forEach((other) => {\n            if (other === dropdown || !other.open) return;\n            other.open = false;\n            syncExpanded(other);\n          });\n        });\n        this.on(dropdown, 'keydown', (event) => {\n          if (event.key !== 'Escape' || !dropdown.open) return;\n          event.preventDefault();\n          dropdown.open = false;\n          syncExpanded(dropdown);\n          trigger.focus({ preventScroll: true });\n        });\n      });\n\n      this.on(document, 'pointerdown', (event) => {\n        dropdowns.forEach((dropdown) => {\n          if (!dropdown.open || dropdown.contains(event.target)) return;\n          dropdown.open = false;\n          syncExpanded(dropdown);\n        });\n      });\n    },\n\n    updateOptionStates() {\n      if (!this.optionInputs.length) return;\n      const selected = this.selectedOptions();\n      const bundleSizeIndexes = typeof this.bundleSizeOptionIndexes === 'function'\n        ? this.bundleSizeOptionIndexes()\n        : new Set();\n\n      this.optionInputs.forEach((input) => {\n        const optionIndex = Number(input.dataset.optionIndex);\n        const candidate = selected.slice();\n        candidate[optionIndex] = input.value;\n        const isBundleSizeOption = bundleSizeIndexes.size > 1 && bundleSizeIndexes.has(optionIndex);\n\n        const matches = this.variants.filter((variant) => {\n          return variant.options.every((value, index) => {\n            if (index === optionIndex) return value === input.value;\n            // Bundle-deler skal ikke arve \"utsolgt\" fra en annen valgt del.\n            // Eks: genser XL finnes selv om shorts XL er utsolgt.\n            if (isBundleSizeOption && bundleSizeIndexes.has(index)) return true;\n            return !candidate[index] || value === candidate[index];\n          });\n        });\n\n        const exists = matches.length > 0;\n        const anyAvailable = matches.some((variant) => variant.available);\n        const isComingSoon = this.section?.dataset?.pdpComingSoon === 'true';\n        const productFullySoldOut = this.isFullySoldOut();\n        const label = this.section.querySelector(`label[for=\"${cssEscape(input.id)}\"]`);\n\n        input.disabled = !exists;\n        // Produktstatusen over velgeren eier \u00ABKommer snart\u00BB/helt utsolgt.\n        // Gjenta bare \u00ABUtsolgt\u00BB per st\u00F8rrelse n\u00E5r andre st\u00F8rrelser kan kj\u00F8pes.\n        if (label) label.dataset.soldout = !isComingSoon && !productFullySoldOut && exists && !anyAvailable ? 'true' : 'false';\n      });\n      if (typeof this.updateBundleSharedState === 'function') this.updateBundleSharedState();\n    },\n\n    renderVariant(variant, options = {}) {\n      this.currentVariant = variant || null;\n      // Egen, stabil variantkilde for kj\u00F8psintegrasjoner. Klaviyo BIS kan\n      // erstatte eller t\u00F8mme Shopifys skjulte input, men skal ikke kunne gj\u00F8re\n      // den synlige kj\u00F8psbeslutningen tvetydig.\n      this.section.dataset.pdpCurrentVariantId = variant?.id ? String(variant.id) : '';\n      this.clearError();\n\n      if (this.variantInput && variant) {\n        this.variantInput.value = variant.id;\n        this.variantInput.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n\n      this.updateSelectedLabels();\n      this.updatePrice(variant);\n      this.updateButtons(variant);\n      if (typeof this.updatePurchaseOptionsForVariant === 'function') this.updatePurchaseOptionsForVariant(variant);\n      this.updateVariantStatus(variant);\n      this.updateBis(variant);\n      if (typeof this.updateBundle === 'function') this.updateBundle(variant);\n      this.syncNotificationContext(variant);\n      if (typeof this.updateStickyContent === 'function') this.updateStickyContent(variant);\n      this.updateSizePillsStock();\n\n      if (options.syncGallery && variant) this.syncGalleryToVariant(variant, options.behavior || 'smooth');\n      if (options.updateUrl && variant) this.updateUrl(variant);\n\n      document.dispatchEvent(new CustomEvent('variant:change', {\n        bubbles: true,\n        detail: {\n          variant,\n          productId: this.section.dataset.productId,\n          sectionId: this.section.dataset.sectionId,\n        },\n      }));\n\n      // Variant-listeners kan erstatte eller rydde et utilgjengelig ID-felt.\n      // Hent derfor den levende noden p\u00E5 nytt f\u00F8r varslingen leser den eksakte\n      // setkombinasjonen; add-to-cart er fortsatt sperret av purchaseMode.\n      const liveVariantInput = this.section.querySelector('[data-pdp-variant-id]');\n      if (liveVariantInput) {\n        this.variantInput = liveVariantInput;\n        this.variantInput.value = variant?.id || '';\n      }\n    },\n\n    updateSelectedLabels() {\n      const selected = this.selectedOptions();\n      this.section.querySelectorAll('[data-pdp-selected-option]').forEach((label) => {\n        const index = Number(label.dataset.optionIndex);\n        if (selected[index]) {\n          const group = this.optionGroups.find((item) => Number(item.dataset.optionIndex) === index);\n          const input = group?.querySelector('[data-pdp-option-input]:checked');\n          label.textContent = input?.dataset.pdpDisplayValue || this.localizeColor(selected[index]);\n        } else {\n          const group = this.optionGroups.find((item) => Number(item.dataset.optionIndex) === index);\n          const isColor = Boolean(group?.hasAttribute('data-pdp-color-group') || group?.querySelector('.pdp-clean__option--swatch'));\n          label.textContent = isColor ? '' : 'Velg';\n        }\n        const note = this.section.querySelector(`.pdp-clean__picker-note[data-option-index=\"${index}\"]`);\n        if (!note) return;\n        const input = this.section.querySelector(`[data-pdp-option-input][data-option-index=\"${index}\"]:checked`);\n        const copy = input?.dataset.pdpComingSoon === 'true'\n          ? 'Kommer snart \u2013 f\u00E5 varsel n\u00E5r den slippes'\n          : (input?.dataset.pdpOptionNote || '');\n        this.renderNote(note, copy);\n      });\n      this.updateScentIngredients();\n    },\n\n    // Notelinja tegnes i stedet for aa settes som ren tekst, fordi hver note kan\n    // ha et ikon. Registeret ligger i butikk-metafeltet custom.duftnote_ikoner og\n    // naar oss som data-pdp-note-icons. Er registeret tomt, som det er naa, faller\n    // dette tilbake til noeyaktig samme rene tekst som foer.\n    noteIcons() {\n      if (this._noteIcons) return this._noteIcons;\n      let kart = {};\n      try {\n        kart = JSON.parse(this.section.dataset.pdpNoteIcons || '{}') || {};\n      } catch (e) {\n        kart = {};\n      }\n      // Slaa opp uavhengig av store og smaa bokstaver, saa \u00ABJordbaer\u00BB matcher\n      // \u00ABjordbaer\u00BB om noen skriver noten litt annerledes i metafeltet.\n      this._noteIcons = {};\n      Object.keys(kart).forEach((k) => {\n        const url = String(kart[k] || '').trim();\n        if (url) this._noteIcons[k.trim().toLowerCase()] = url;\n      });\n      return this._noteIcons;\n    },\n\n    renderNote(note, copy) {\n      note.hidden = !copy;\n      if (!copy) {\n        note.textContent = '';\n        return;\n      }\n      const kart = this.noteIcons();\n      const biter = copy.split('\\u00b7').map((b) => b.trim()).filter(Boolean);\n      // Ingen ikoner i registeret, eller en note som ikke er en punktdelt liste:\n      // behold ren tekst. Da er DOM-en identisk med foer.\n      const harIkon = biter.some((b) => kart[b.toLowerCase()]);\n      if (!harIkon || biter.length < 1) {\n        note.textContent = copy;\n        return;\n      }\n      note.textContent = '';\n      biter.forEach((bit, i) => {\n        const url = kart[bit.toLowerCase()];\n        const chip = document.createElement('span');\n        chip.className = 'pdp-clean__note-chip';\n        if (url) {\n          const img = document.createElement('img');\n          img.className = 'pdp-clean__note-icon';\n          img.src = url;\n          img.alt = '';\n          img.width = 16;\n          img.height = 16;\n          img.loading = 'lazy';\n          img.decoding = 'async';\n          chip.appendChild(img);\n        }\n        chip.appendChild(document.createTextNode(bit));\n        note.appendChild(chip);\n        if (i < biter.length - 1) {\n          const skille = document.createElement('span');\n          skille.className = 'pdp-clean__note-sep';\n          skille.setAttribute('aria-hidden', 'true');\n          skille.textContent = '\\u00b7';\n          note.appendChild(skille);\n        }\n      });\n    },\n\n    // Ingredienslista byttes sammen med duften. Ingen produktnavn i koden:\n    // blokkens data-scent matches mot de valgte opsjonsverdiene, saa dette\n    // virker for enhver variantakse som baerer en ingrediensliste.\n    updateScentIngredients() {\n      const wrap = this.section.querySelector('[data-pdp-scent-ingredients]');\n      if (!wrap) return;\n      const selected = this.selectedOptions()\n        .map((value) => String(value == null ? '' : value).trim().toLowerCase())\n        .filter(Boolean);\n      let shown = false;\n      wrap.querySelectorAll('[data-scent]').forEach((block) => {\n        const key = String(block.dataset.scent || '').trim().toLowerCase();\n        const match = Boolean(key) && selected.indexOf(key) !== -1;\n        block.hidden = !match;\n        if (match) shown = true;\n      });\n      // Ingen treff betyr ukjent kombinasjon. Da viser vi ingenting heller enn\n      // feil liste, og raden med etiketten \u00ABIngredienser\u00BB skjules med.\n      wrap.hidden = !shown;\n    },\n\n    // Norsk VISNINGSNAVN for fargeverdier. Dictionary kommer fra theme-setting\n    // (data-pdp-color-map = \"Black:Svart, ...\"), s\u00E5 det er en redigerbar kilde, ikke\n    // hardkodet. Variantverdien beholdes uendret (f.eks. \"Black\"); kun visning byttes.\n    // Ukjente verdier (st\u00F8rrelser som XS) returneres uendret.\n    localizeColor(value) {\n      if (!this._colorMap) {\n        this._colorMap = {};\n        (this.section.dataset.pdpColorMap || '').split(',').forEach((pair) => {\n          const i = pair.indexOf(':');\n          if (i === -1) return;\n          const k = pair.slice(0, i).trim().toLowerCase().replace(/\\s+/g, '');\n          const v = pair.slice(i + 1).trim();\n          if (k && v) this._colorMap[k] = v;\n        });\n      }\n      const key = String(value).toLowerCase().replace(/\\s+/g, '');\n      return this._colorMap[key] || value;\n    },\n\n    updatePrice(variant) {\n      if (!variant) return;\n      if (this.priceCurrent) this.priceCurrent.textContent = this.money(variant.price);\n      if (this.priceCompare) {\n        this.priceCompare.textContent = variant.compareAtPrice ? this.money(variant.compareAtPrice) : '';\n        this.priceCompare.hidden = !variant.isOnSale;\n      }\n      if (this.priceSaving) {\n        const savingAmount = Math.max(0, Number(variant.compareAtPrice || 0) - Number(variant.price || 0));\n        const hasSaving = !this.bundle && variant.isOnSale && savingAmount > 0 && Number(variant.savingPercent) > 0;\n        this.priceSaving.textContent = hasSaving\n          ? `Spar ${this.money(savingAmount)}${Number(variant.savingPercent) >= 20 ? ` (${variant.savingPercent}%)` : ''}`\n          : '';\n        this.priceSaving.hidden = !hasSaving;\n      }\n      const priceWrap = this.section.querySelector('[data-pdp-price-wrap]');\n      if (priceWrap) priceWrap.classList.toggle('is-on-sale', !!variant.isOnSale);\n    },\n\n    updateButtons(variant) {\n      if (!this.atc) return;\n      const mode = this.purchaseMode(variant);\n      // dataset.mode drives runPrimaryAction: kundeklubb | pick | bis | add.\n      if (mode === 'coming_soon') {\n        this.atc.disabled = false;\n        this.atc.type = 'button';\n        this.atc.dataset.mode = 'kundeklubb';\n        this.atc.textContent = 'Varsle meg';\n      } else if (mode === 'fully_sold_out' || mode === 'selected_variant_sold_out') {\n        this.atc.disabled = false;\n        this.atc.type = 'button';\n        this.atc.dataset.mode = 'bis';\n        this.atc.textContent = 'Varsle meg';\n      } else if (mode === 'awaiting_size') {\n        // Ingen falsk add-to-cart f\u00F8r st\u00F8rrelse er valgt (pick-mode fokuserer pickeren).\n        this.atc.disabled = false;\n        this.atc.type = 'button';\n        this.atc.dataset.mode = 'pick';\n        this.atc.textContent = this.awaitingSizeCtaLabel();\n      } else if (!variant) {\n        this.atc.disabled = true;\n        this.atc.type = 'button';\n        this.atc.dataset.mode = 'unavailable';\n        this.atc.textContent = 'Velg alternativer';\n      } else {\n        this.atc.disabled = false;\n        this.atc.type = 'submit';\n        this.atc.dataset.mode = 'add';\n        this.atc.textContent = 'Legg i handlekurv \u2014 ';\n        const price = document.createElement('span');\n        price.setAttribute('data-pdp-atc-price', '');\n        price.textContent = this.money(variant.price);\n        this.atc.appendChild(price);\n      }\n      this.applyPurchaseChrome(mode);\n    },\n\n    updateSizePillsStock() {\n      // Inventory urgency belongs to the size being chosen. Keep the exact\n      // 1/2-unit signal compact enough for four- and five-column mobile grids:\n      // \"1 igjen\", \"2 igjen\", \"F\u00E5 igjen\", \"Utsolgt\". Kj\u00F8rer p\u00E5 alle ikke-color grupper (inkl.\n      // bundle-komponenter som \"Flared Yoga Tights\").\n      const productComingSoon = this.section?.dataset?.pdpComingSoon === 'true';\n      const productFullySoldOut = this.isFullySoldOut();\n      const stockLabel = (variant) => {\n        // Produktets ene statusmerke over tittel/valg eier lanseringsstatusen.\n        // Gjentatt \"Kommer snart\" ved hver st\u00F8rrelse skaper st\u00F8y, s\u00E6rlig i sett.\n        if (variant?.comingSoon) return productComingSoon ? null : { text: 'Kommer snart', cls: 'is-soon' };\n        if (!variant || !variant.available) return productFullySoldOut ? null : { text: 'Utsolgt', cls: 'is-out' };\n        // Lagersignalet er bucketet server-side (stockState/lowCount) \u2014 eksakte\n        // tall finnes ikke lenger i klienten utover det som vises (1 og 2).\n        if (variant.stockState !== 'low') return null;\n        const lowCount = Number(variant.lowCount);\n        if (lowCount === 1) return { text: '1 igjen', cls: 'is-low' };\n        if (lowCount === 2) return { text: '2 igjen', cls: 'is-low' };\n        return { text: 'F\u00E5 igjen', cls: 'is-low' };\n      };\n\n      // Iterer over alle \"size-like\" grupper (alle ikke-color picker-groups),\n      // b\u00E5de dropdown og inline pills. Inline pills trenger like tydelig lagerstatus.\n      const sizeGroups = this.optionGroups.filter((g) => !g.hasAttribute('data-pdp-color-group') && !g.querySelector('.pdp-clean__option--swatch'));\n      const bundleSizeIndexes = typeof this.bundleSizeOptionIndexes === 'function'\n        ? this.bundleSizeOptionIndexes()\n        : new Set();\n      sizeGroups.forEach((sizeGroup) => {\n        const sizeOptionIndex = Number(sizeGroup.dataset.optionIndex);\n        const isBundleSizeGroup = bundleSizeIndexes.size > 1 && bundleSizeIndexes.has(sizeOptionIndex);\n        const otherOptionValues = this.optionGroups\n          .filter((g) => g !== sizeGroup)\n          .map((g) => ({\n            index: Number(g.dataset.optionIndex),\n            value: g.querySelector('[data-pdp-option-input]:checked')?.value || null,\n          }))\n          .filter((other) => !(isBundleSizeGroup && bundleSizeIndexes.has(other.index)));\n\n        sizeGroup.querySelectorAll('[data-pdp-option-input]').forEach((input) => {\n          const sizeValue = input.value;\n          const matches = this.variants.filter((v) => {\n            if (v.options[sizeOptionIndex] !== sizeValue) return false;\n            return otherOptionValues.every((other) => {\n              if (other.value === null) return true;\n              return v.options[other.index] === other.value;\n            });\n          });\n          const variant = matches.find((v) => v.available) || matches[0] || null;\n          const label = input.nextElementSibling;\n          const stockEl = label?.querySelector('[data-pdp-option-stock]');\n          if (!stockEl) return;\n          stockEl.classList.remove('is-low', 'is-soon', 'is-out');\n          const info = stockLabel(variant);\n          if (info) {\n            stockEl.textContent = info.text;\n            stockEl.classList.add(info.cls);\n            stockEl.hidden = false;\n          } else {\n            stockEl.hidden = true;\n            stockEl.textContent = '';\n          }\n        });\n      });\n    },\n\n    updateVariantStatus(variant) {\n      // Kontekstuell beskjed under st\u00F8rrelser. Lavt lager vises p\u00E5 selve\n      // st\u00F8rrelsesknappen; denne linjen brukes kun n\u00E5r kunden velger utsolgt.\n      const slot = this.section.querySelector('[data-pdp-variant-status]');\n      const text = slot?.querySelector('[data-pdp-variant-status-text]');\n      if (!slot || !text || !variant) return;\n      slot.classList.remove('is-soldout', 'is-low');\n      // Fully sold out is owned by the [data-pdp-fully-soldout-msg] banner \u2014 don't\n      // also render the per-variant \"X er utsolgt\" line (that is the PARTIAL case).\n      if (this.purchaseMode(variant) === 'fully_sold_out') {\n        slot.removeAttribute('aria-label');\n        slot.hidden = true;\n        text.replaceChildren();\n        return;\n      }\n      if (!variant.available) {\n        if (this.section?.dataset?.pdpSelfcare === 'true') {\n          slot.removeAttribute('aria-label');\n          slot.hidden = true;\n          text.replaceChildren();\n          return;\n        }\n        const label = this.soldOutNoticeLabel(variant);\n        const sharedPill = this.section.querySelector('[data-pdp-bundle-shared]:not([hidden]) .pdp-clean__bundle-shared-pill.is-selected[data-soldout=\"true\"]');\n        if (sharedPill) {\n          slot.removeAttribute('aria-label');\n          slot.hidden = true;\n          text.replaceChildren();\n          return;\n        }\n        const bundleStatus = typeof this.bundleMixedStatusCopy === 'function'\n          ? this.bundleMixedStatusCopy(variant)\n          : null;\n        const title = document.createElement('strong');\n        const copy = document.createElement('span');\n        title.textContent = variant.comingSoon ? 'Kommer snart' : (bundleStatus?.title || (label ? `${label} er utsolgt` : 'Utsolgt'));\n        copy.textContent = variant.comingSoon ? 'Varsle meg ved lansering' : (bundleStatus?.copy || 'F\u00E5 beskjed n\u00E5r den er tilbake');\n        text.replaceChildren(title, copy);\n        slot.setAttribute('aria-label', [title.textContent, copy.textContent].filter(Boolean).join('. '));\n        slot.classList.add('is-soldout');\n        slot.hidden = false;\n      } else {\n        slot.removeAttribute('aria-label');\n        slot.hidden = true;\n      }\n    },\n\n    updateBis(variant) {\n      // State-maskin for sold-out/Varsle-meg-flow.\n      // Klaviyo injekter <a class=\"klaviyo-bis-trigger\"> direkte i form n\u00E5r\n      // den vurderer current variant som sold-out. Vi:\n      //   1. Setter data-variant-available p\u00E5 root for CSS-targeting\n      //   2. Flytter Klaviyo-trigger inn i v\u00E5r [data-pdp-bis]-slot\n      //   3. Skjuler trigger n\u00E5r variant er available\n      const isAvailable = Boolean(variant && variant.available);\n      this.section.dataset.variantAvailable = isAvailable ? 'true' : 'false';\n\n      const injectedTrigger = this.form?.querySelector('.klaviyo-bis-trigger')\n        || this.section.querySelector('.klaviyo-bis-trigger');\n\n      if (this.bis && injectedTrigger && !this.bis.contains(injectedTrigger)) {\n        this.bis.appendChild(injectedTrigger);\n      }\n\n      const hasTriggerInSlot = Boolean(this.bis?.querySelector('.klaviyo-bis-trigger'));\n\n      if (isAvailable) {\n        if (this.bis) this.bis.hidden = true;\n        if (injectedTrigger) injectedTrigger.hidden = true;\n        return;\n      }\n      // Sold-out: vis BIS-slot hvis Klaviyo har plassert trigger\n      if (this.bis) this.bis.hidden = !hasTriggerInSlot;\n      if (injectedTrigger) injectedTrigger.hidden = false;\n    },\n\n    bindBisObserver() {\n      // Klaviyo injekter trigger asynkront \u2014 observer b\u00E5de section + form\n      // (form refereres ikke alltid f\u00F8r Klaviyo hydrerer).\n      if (!this.section) return;\n      let raf = null;\n      const schedule = () => {\n        if (raf) return;\n        raf = window.requestAnimationFrame(() => {\n          raf = null;\n          // Klaviyo kan hydrerer BIS ved \u00E5 erstatte formnoder. Hold den cachede\n          // referansen og verdien synkron uten polling eller ekstra nettverkskall.\n          const liveVariantInput = this.section.querySelector('[data-pdp-variant-id]');\n          if (liveVariantInput) {\n            this.variantInput = liveVariantInput;\n            const mode = this.purchaseMode();\n            const needsExactNotificationVariant = this.section?.dataset?.pdpComingSoon === 'true'\n              || this.isRestockMode(mode);\n            if (this.currentVariant && this.hasRequiredSizeSelection() && needsExactNotificationVariant) {\n              this.variantInput.value = this.currentVariant.id;\n            }\n          }\n          this.updateBis(this.currentVariant);\n        });\n      };\n      const observer = new MutationObserver(schedule);\n      observer.observe(this.section, { childList: true, subtree: true });\n      this.unsubs.push(() => {\n        if (raf) window.cancelAnimationFrame(raf);\n        observer.disconnect();\n      });\n    },\n\n    updateUrl(variant) {\n      if (!window.history?.replaceState || !variant?.id) return;\n      const url = new URL(window.location.href);\n      url.searchParams.set('variant', variant.id);\n      window.history.replaceState({ path: url.toString() }, '', url.toString());\n    },\n  });\n})();\n"],
  "mappings": "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",
  "names": ["input"]
}
