{
  "version": 3,
  "sources": ["/cdn/shop/t/688/assets/mspa-kubbemur.js?ms_mspa_family=20260629-supportwall-audit7"],
  "sourcesContent": ["(() => {\n  \"use strict\";\n\n  const ROOT_SELECTOR = \"[data-mspa-kubbemur-calc]\";\n  const FAMILY = \"kubbemur\";\n  const PORT = \"kubbemur-v5\";\n  const VERSION = \"2026-09-12-kubbemur-stepper-v2\";\n  const HEIGHTS = [14, 28, 42, 56, 70, 84, 98];\n  const BLOCK_LENGTH_CM = 35;\n  const BLOCK_HEIGHT_CM = 14;\n  const TOP_BLOCK_LENGTH_CM = 21;\n  const BLOCKS_PER_METER = 100 / BLOCK_LENGTH_CM;\n  const TOP_BLOCKS_PER_METER = 100 / TOP_BLOCK_LENGTH_CM;\n  const PRICE_M2_FACTOR = 10000 / (BLOCK_LENGTH_CM * BLOCK_HEIGHT_CM);\n  const LINE_ORDER = [\"normalBlock\", \"halfBlock\", \"topBlock\", \"betonglim\", \"fiberduk\"];\n  const PICK_KEYS = LINE_ORDER;\n  const CART_INSERT_REVERSE = true;\n  const CART_DISPLAY_ORDER = {\n    normalBlock: 0,\n    halfBlock: 10,\n    topBlock: 20,\n    betonglim: 30,\n    fiberduk: 40\n  };\n\n  const intValue = (value) => {\n    const parsed = Number.parseInt(String(value ?? \"\").replace(/[^\\d]/g, \"\"), 10);\n    return Number.isFinite(parsed) ? parsed : 0;\n  };\n\n  const formatNumber = (value, decimals = 0) =>\n    Number(value || 0).toLocaleString(\"nb-NO\", {\n      minimumFractionDigits: decimals,\n      maximumFractionDigits: decimals\n    });\n\n  const formatMoney = (cents) => {\n    const amount = Math.round(Number(cents || 0));\n    if (!Number.isFinite(amount) || amount <= 0) return \"\";\n    const hasDecimals = amount % 100 !== 0;\n    return `${(amount / 100).toLocaleString(\"nb-NO\", {\n      minimumFractionDigits: hasDecimals ? 2 : 0,\n      maximumFractionDigits: hasDecimals ? 2 : 0\n    })} kr`;\n  };\n\n  function hardMotorMissing(root, message) {\n    const host = root?.closest?.(\"[data-ms-calculator-host]\") || root;\n    host?.setAttribute?.(\"data-mspa-motor-missing\", \"true\");\n    host?.setAttribute?.(\"data-mspa-motor-status\", \"error\");\n    host?.setAttribute?.(\"data-mspa-motor-ready\", \"false\");\n    host?.setAttribute?.(\"data-mspa-motor-disabled\", \"true\");\n    host?.setAttribute?.(\"data-mspa-motor-error\", \"true\");\n    host?.setAttribute?.(\"data-mspa-motor-reason\", \"mspa-motor-missing\");\n    console.error(message || \"MSPA-motoren er ikke lastet. Kubbemur stopper uten gammel flow.\");\n  }\n\n  function motorApi(root) {\n    if (\n      window.MSPurchaseMotor &&\n      typeof window.MSPurchaseMotor.mount === \"function\" &&\n      typeof window.MSPurchaseMotor.update === \"function\" &&\n      typeof window.MSPurchaseMotor.add === \"function\"\n    ) {\n      return window.MSPurchaseMotor;\n    }\n    hardMotorMissing(root);\n    return null;\n  }\n\n  function readJson(root, selector, fallback) {\n    try {\n      return JSON.parse(root.closest(\"[data-ms-calculator-host]\")?.querySelector(selector)?.textContent || root.querySelector(selector)?.textContent || \"\");\n    } catch (error) {\n      console.warn(\"Kunne ikke lese MSPA Kubbemur produktkontrakt:\", error);\n      return fallback;\n    }\n  }\n\n  function normalizeProduct(product, key) {\n    const source = product && typeof product === \"object\" ? product : {};\n    return {\n      key,\n      handle: String(source.handle || \"\"),\n      title: String(source.title || key),\n      productId: String(source.productId || \"\"),\n      vendor: String(source.vendor || \"\"),\n      unit: String(source.unit || \"stk\"),\n      variantId: intValue(source.variantId),\n      sku: String(source.sku || \"\"),\n      grams: Number(source.grams || 0),\n      cents: intValue(source.cents),\n      compareCents: intValue(source.compareCents || source.compare),\n      image: String(source.image || source.imageUrl || \"\"),\n      available: source.available !== false && String(source.available || \"true\") !== \"false\",\n      locked: Boolean(source.locked)\n    };\n  }\n\n  class MspaKubbemur {\n    constructor(root) {\n      this.root = root;\n      this.host = root.closest(\"[data-ms-calculator-host]\");\n      this.api = motorApi(root);\n      if (!this.api || !this.host) return;\n\n      const dataset = root.dataset || {};\n      this.products = {};\n      const productConfig = readJson(root, \"[data-mspa-kubbemur-products-json]\", {});\n      Object.keys(productConfig || {}).forEach((key) => {\n        this.products[key] = normalizeProduct(productConfig[key], key);\n      });\n\n      this.config = {\n        productId: dataset.mspaProductId || \"\",\n        handle: dataset.mspaProductHandle || \"\",\n        title: dataset.mspaProductTitle || \"Kubbemur\",\n        vendor: dataset.mspaProductVendor || \"Benders\",\n        variantId: intValue(dataset.mspaProductVariantId),\n        sku: dataset.mspaProductSku || \"\",\n        grams: Number(dataset.mspaProductGrams || 0),\n        priceCents: intValue(dataset.mspaProductPriceCents),\n        compareCents: intValue(dataset.mspaProductCompareAtCents),\n        image: dataset.mspaProductImage || \"\",\n        available: String(dataset.mspaProductAvailable || \"true\") === \"true\",\n        primary: dataset.mspaPrimaryCta || \"Legg i kurven\",\n        busy: dataset.mspaBusyCta || \"Legger i kurven...\",\n        soldOut: dataset.mspaSoldOutLabel || \"Utsolgt\",\n        modeCalculate: dataset.mspaModeCalculatorLabel || \"Beregn mur\",\n        modePick: dataset.mspaModePickLabel || \"Plukk og miks selv\",\n        priceEach: dataset.mspaPriceLabelEach || \"Pris per blokk\",\n        priceM2: dataset.mspaPriceLabelM2 || \"Pris per m\u00B2\",\n        toggleM2: dataset.mspaPriceToggleM2 || \"Vis m\u00B2-pris\",\n        toggleEach: dataset.mspaPriceToggleEach || \"Vis stykkpris\",\n        priceM2Factor: Number(dataset.mspaPriceM2Factor || PRICE_M2_FACTOR),\n        actionLength: dataset.mspaActionLength || \"Skriv inn lengde\",\n        actionHeight: dataset.mspaActionHeight || \"Velg h\u00F8yde\",\n        actionType: dataset.mspaActionType || \"Velg murtype\",\n        actionEnd: dataset.mspaActionEnd || \"Velg synlig ende\",\n        actionTop: dataset.mspaActionTop || \"Velg topphelle\",\n        actionIncomplete: dataset.mspaActionIncomplete || \"Fullf\u00F8r valg\",\n        yes: dataset.mspaYesLabel || \"Ja\",\n        no: dataset.mspaNoLabel || \"Nei\",\n        lengthLabel: dataset.mspaLengthLabel || \"Lengde p\u00E5 mur (cm)\",\n        lengthPlaceholder: dataset.mspaLengthPlaceholder || \"Skriv cm. Eks: 1000= 10 meter\",\n        lengthWarningShort: dataset.mspaLengthWarningShort || \"Lengden virker veldig kort. Har du skrevet meter i stedet for cm? 10 meter skrives som 1000.\",\n        lengthWarningLong: dataset.mspaLengthWarningLong || \"Lengden virker veldig lang. Kontroller at tallet stemmer.\",\n        heightLabel: dataset.mspaHeightLabel || \"H\u00F8yde\",\n        heightPlaceholder: dataset.mspaHeightPlaceholder || \"Velg h\u00F8yde\",\n        progressLength: \"Skriv inn lengde.\",\n        progressHeight: \"Velg h\u00F8yde.\",\n        progressReady: \"Utvalget er klart. Legg i kurven.\",\n        pickTitle: dataset.mspaPickmixTitle || \"Plukk Labyrint deler selv\",\n        initialMessage: dataset.mspaInitialMessage || \"Velg kantstein eller standard mur.\",\n        measureMessage: dataset.mspaMeasureMessage || \"Skriv inn lengde og velg h\u00F8yde.\",\n        optionsMessage: dataset.mspaOptionsMessage || \"Velg tilvalg til muren.\",\n        kantsteinLabel: dataset.mspaKantsteinLabel || \"Kantstein\",\n        kantsteinText: \"\u00C9n rad hovedblokker som kant eller avgrensning.\",\n        wallLabel: dataset.mspaWallLabel || \"Standard mur\",\n        wallText: \"Flere rader med blokker. Du kan velge synlige ender og toppheller.\",\n        endTitle: dataset.mspaEndTitle || \"Synlig ende\",\n        endText: dataset.mspaEndText || \"Legger inn halvblokker for ryddig avslutning.\",\n        topTitle: dataset.mspaTopTitle || \"Topphelle\",\n        topText: dataset.mspaTopText || \"Velg om du \u00F8nsker toppheller p\u00E5 muren.\"\n      };\n\n      this.products.normalBlock = Object.assign(\n        normalizeProduct({\n          handle: this.config.handle,\n          title: this.config.title,\n          productId: this.config.productId,\n          vendor: this.config.vendor,\n          variantId: this.config.variantId,\n          sku: this.config.sku,\n          grams: this.config.grams,\n          cents: this.config.priceCents,\n          compareCents: this.config.compareCents,\n          image: this.config.image,\n          available: this.config.available,\n          locked: true\n        }, \"normalBlock\"),\n        this.products.normalBlock || {}\n      );\n      if (!this.products.normalBlock.image) this.products.normalBlock.image = this.config.image;\n\n      this.state = {\n        mode: \"calculate\",\n        wallKind: \"\",\n        lengthCm: 0,\n        lengthCommitted: false,\n        heightCm: 0,\n        choices: {\n          end: \"\",\n          top: \"\"\n        },\n        counts: {\n          normalBlock: 0,\n          halfBlock: 0,\n          topBlock: 0,\n          betonglim: 0,\n          fiberduk: 0\n        },\n        editingStep: \"\",\n        typingField: \"\",\n        priceMode: \"each\",\n        adding: false,\n        errorMessage: \"\"\n      };\n\n      this.rendered = false;\n      this.els = {};\n      this.mount();\n      this.collect();\n      this.bind();\n      this.render();\n    }\n\n    mount() {\n      this.host.setAttribute(\"data-mspa-ui-owner\", \"mspa\");\n      this.host.setAttribute(\"data-mspa-customer-summary\", \"off\");\n      this.host.setAttribute(\"data-mspa-legacy-policy\", \"clean-family-ui\");\n      this.host.setAttribute(\"data-mspa-family-port\", PORT);\n      this.host.setAttribute(\"data-mspa-family-port-version\", VERSION);\n      this.host.removeAttribute(\"data-mspa-motor-missing\");\n      this.host.setAttribute(\"data-mspa-motor-error\", \"false\");\n      this.host.classList.remove(\"is-mspa-error\");\n      this.api.define(FAMILY, {\n        port: PORT,\n        version: VERSION,\n        source: \"mspa-kubbemur.js\"\n      });\n      this.api.mount(this.host, {\n        family: FAMILY,\n        port: PORT,\n        version: VERSION,\n        stockIntent: (selection) => this.stockIntent(selection),\n        stockContext: () => ({mode:this.state.mode,wallKind:this.state.wallKind,wallType:this.state.choices?.wallType}),\n        stockProducts: () => {\n          const selected = new Map(this.currentLines().map((line) => [line.key, line.quantity]));\n          return this.pickItems().map((item) => {\n            const product = this.productForKey(item.key);\n            return product ? {\n              ...product,\n              canAdd: product.available === true,\n              image: product.image || item.fallbackImage || \"\",\n              quantity: selected.get(item.key) || 0\n            } : null;\n          });\n        },\n        slot: \"[data-mspa-motor-root]\",\n        chrome: this.buildChrome(),\n        steps: this.buildDefinition()\n      });\n      this.rendered = true;\n    }\n\n    buildChrome() {\n      const product = this.currentMainProduct();\n      const compareCents = product.compareCents || (product.variantId === this.config.variantId || product.handle === this.config.handle ? this.config.compareCents : 0);\n      return [\n        {\n          type: \"modeSwitch\",\n          name: \"mode\",\n          value: this.state.mode,\n          label: \"Velg kj\u00F8psm\u00E5te\",\n          options: [\n            { value: \"calculate\", label: this.config.modeCalculate },\n            { value: \"pick\", label: this.config.modePick }\n          ]\n        },\n        {\n          type: \"price\",\n          name: \"price\",\n          label: this.config.priceEach,\n          value: formatMoney(product.cents || this.config.priceCents),\n          priceCents: product.cents || this.config.priceCents,\n          compareCents,\n          toggleLabel: this.config.toggleM2\n        }\n      ];\n    }\n\n    buildDefinition() {\n      return [\n        {\n          id: \"type\",\n          label: \"Velg murtype\",\n          components: [\n            {\n              type: \"choicegroup\",\n              name: \"wallKind\",\n              options: [\n                { value: \"kantstein\", label: this.config.kantsteinLabel, hint: this.config.kantsteinText },\n                { value: \"wall\", label: this.config.wallLabel, hint: this.config.wallText }\n              ],\n              choiceStatus: {\n                text: \"Velg hvordan Kubbemur skal brukes.\",\n                values: {\n                  kantstein: `Valgt: ${this.config.kantsteinLabel}.`,\n                  wall: `Valgt: ${this.config.wallLabel}.`\n                }\n              }\n            }\n          ]\n        },\n        {\n          id: \"measure\",\n          label: \"M\u00E5l p\u00E5 muren\",\n          components: [\n            {\n              type: \"field\",\n              id: \"mspa-kubbemur-length\",\n              name: \"lengthCm\",\n              inputType: \"number\",\n              inputmode: \"numeric\",\n              min: 1,\n              step: 1,\n              label: this.config.lengthLabel,\n              placeholder: this.config.lengthPlaceholder,\n              suffix: \"cm\"\n            },\n            {\n              type: \"select\",\n              id: \"mspa-kubbemur-height\",\n              name: \"heightCm\",\n              label: this.config.heightLabel,\n              options: [\n                { value: \"\", label: this.config.heightPlaceholder },\n                ...HEIGHTS.map((height) => ({ value: String(height), label: `${height} cm (${height / BLOCK_HEIGHT_CM} rader)` }))\n              ]\n            }\n          ]\n        },\n        {\n          id: \"end\",\n          label: this.config.endTitle,\n          components: [\n            {\n              type: \"choicegroup\",\n              name: \"end\",\n              options: [\n                { value: \"yes\", label: \"Ja\" },\n                { value: \"no\", label: \"Nei\" }\n              ],\n              choiceStatus: {\n                text: \"Skal muren ha synlige ender?\",\n                values: {\n                  yes: \"Valgt: legg til synlig ende.\",\n                  no: \"Valgt: uten synlig ende.\"\n                }\n              },\n              info: \"Halvblokker gir en ferdig avslutning der enden av muren blir synlig. Vi legger til to halvblokker p\u00E5 annenhver rad.\"\n            }\n          ]\n        },\n        {\n          id: \"top\",\n          label: this.config.topTitle,\n          components: [\n            {\n              type: \"choicegroup\",\n              name: \"top\",\n              options: [\n                { value: \"yes\", label: \"Ja\" },\n                { value: \"no\", label: \"Nei\" }\n              ],\n              choiceStatus: {\n                text: \"Vil du ha toppheller p\u00E5 muren?\",\n                values: {\n                  yes: \"Valgt: legg til topphelle.\",\n                  no: \"Valgt: uten topphelle.\"\n                }\n              },\n              info: \"Labyrint Antikk Makro (21 \u00D7 21 \u00D7 6 cm) gir en ferdig topp p\u00E5 muren. Antallet beregnes fra murens lengde.\"\n            }\n          ]\n        },\n        {\n          id: \"pick\",\n          label: \"Velg deler og antall\",\n          components: [\n            {\n              type: \"pickMix\",\n              id: \"kubbemur-pick\",\n              title: this.config.pickTitle,\n              groupTitle: \"Andre deler\",\n              items: this.pickItems()\n            }\n          ]\n        }\n      ];\n    }\n\n    collect() {\n      const scope = this.host.querySelector(\"[data-mspa-motor-root]\") || this.host;\n      this.els.scope = scope;\n      this.els.steps = {};\n      scope.querySelectorAll(\"[data-mspa-step]\").forEach((step) => {\n        this.els.steps[step.getAttribute(\"data-mspa-step\")] = step;\n      });\n      this.els.status = scope.querySelector('[data-mspa-status=\"status\"]');\n      this.els.modeSwitch = scope.querySelector('[data-mspa-component=\"mode-switch\"][data-mspa-choice-group=\"mode\"]');\n      this.els.priceLabel = scope.querySelector('[data-mspa-price-label=\"price\"]');\n      this.els.priceValue = scope.querySelector('[data-mspa-price-value=\"price\"]');\n      this.els.priceToggle = scope.querySelector('[data-mspa-price-toggle=\"price\"]');\n      this.els.length = scope.querySelector('[data-mspa-control=\"lengthCm\"]');\n      this.els.lengthUnit = this.els.length?.closest(\"[data-mspa-field]\")?.querySelector(\".mspa-field__input-wrap em\");\n      this.els.lengthWarning = scope.querySelector('[data-mspa-field-warning=\"lengthCm\"]');\n      this.els.height = scope.querySelector('[data-mspa-select=\"heightCm\"]');\n      this.els.pickInputs = {};\n      PICK_KEYS.forEach((key) => {\n        this.els.pickInputs[key] = scope.querySelector(`[data-mspa-quantity=\"pick_${key}\"], [data-mspa-control=\"pick_${key}\"]`);\n      });\n    }\n\n    bind() {\n      this.els.scope.addEventListener(\"click\", (event) => {\n        const priceToggle = event.target.closest(\"[data-mspa-price-toggle]\");\n        if (priceToggle && this.els.scope.contains(priceToggle)) {\n          event.preventDefault();\n          this.state.priceMode = this.state.priceMode === \"each\" ? \"m2\" : \"each\";\n          this.render();\n          return;\n        }\n\n        // The shared motor owns stepper clicks and emits input/change once.\n\n        const choiceButton = event.target.closest(\"[data-mspa-choice]\");\n        if (!choiceButton || !this.els.scope.contains(choiceButton)) return;\n        const group = choiceButton.closest(\"[data-mspa-choice-group]\")?.getAttribute(\"data-mspa-choice-group\") || \"\";\n        const value = choiceButton.getAttribute(\"data-mspa-choice\") || \"\";\n        if (!group || !value) return;\n        event.preventDefault();\n        this.setChoice(group, value);\n      });\n\n      this.els.scope.addEventListener(\"keydown\", (event) => {\n        if (event.key !== \"Enter\" && event.key !== \" \") return;\n        const choiceButton = event.target.closest(\"[data-mspa-choice]\");\n        if (!choiceButton || !this.els.scope.contains(choiceButton)) return;\n        const group = choiceButton.closest(\"[data-mspa-choice-group]\")?.getAttribute(\"data-mspa-choice-group\") || \"\";\n        const value = choiceButton.getAttribute(\"data-mspa-choice\") || \"\";\n        if (!group || !value) return;\n        event.preventDefault();\n        this.setChoice(group, value);\n      });\n\n      this.els.length?.addEventListener(\"input\", () => {\n        this.state.lengthCm = intValue(this.els.length.value);\n        this.state.lengthCommitted = this.kantsteinAutoReadyLength();\n        this.state.typingField = \"lengthCm\";\n        this.resetAfter(\"length\");\n        this.render({ keepFocus: true });\n      });\n      this.els.length?.addEventListener(\"blur\", () => this.commitLength());\n      this.els.length?.addEventListener(\"keydown\", (event) => {\n        if (event.key !== \"Enter\") return;\n        event.preventDefault();\n        this.commitLength();\n        this.els.length.blur();\n      });\n\n      this.els.height?.addEventListener(\"change\", () => {\n        this.state.heightCm = intValue(this.els.height.value);\n        this.state.editingStep = \"\";\n        this.state.typingField = \"\";\n        this.resetAfter(\"height\");\n        this.render();\n      });\n\n      Object.entries(this.els.pickInputs).forEach(([key, input]) => {\n        if (!input) return;\n        input.addEventListener(\"input\", () => {\n          this.state.counts[key] = intValue(input.value);\n          this.state.typingField = `pick_${key}`;\n          this.state.editingStep = \"pick\";\n          this.render({ keepFocus: true });\n        });\n        input.addEventListener(\"change\", () => {\n          this.state.counts[key] = intValue(input.value);\n          this.state.typingField = \"\";\n          if (this.pickReady()) this.state.editingStep = \"\";\n          this.render();\n        });\n        input.addEventListener(\"blur\", () => {\n          this.state.typingField = \"\";\n          if (this.pickReady()) this.state.editingStep = \"\";\n          this.render();\n        });\n        input.addEventListener(\"keydown\", (event) => {\n          if (event.key !== \"Enter\") return;\n          event.preventDefault();\n          this.state.typingField = \"\";\n          if (this.pickReady()) this.state.editingStep = \"\";\n          input.blur();\n          this.render();\n        });\n      });\n\n      this.host.addEventListener(\"ms:mspa-step-history:edit\", (event) => {\n        const id = event.detail?.id || \"\";\n        if (!id) return;\n        event.preventDefault();\n        this.editStep(id);\n      });\n    }\n\n    commitLength() {\n      this.state.lengthCm = intValue(this.els.length?.value || this.state.lengthCm);\n      this.state.lengthCommitted = this.state.lengthCm > 0;\n      this.state.typingField = \"\";\n      this.state.editingStep = \"\";\n      this.render();\n    }\n\n    setChoice(group, value) {\n      if (group === \"mode\") {\n        this.setMode(value);\n        return;\n      }\n      if (group === \"wallKind\") {\n        this.setWallKind(value);\n        return;\n      }\n      if (!(group in this.state.choices)) return;\n      this.state.errorMessage = \"\";\n      this.state.choices[group] = value;\n      this.state.typingField = \"\";\n      this.state.editingStep = \"\";\n      if (group === \"end\") this.resetAfter(\"end\");\n      this.render();\n      this.focusCurrent();\n    }\n\n    setMode(mode) {\n      if (![\"calculate\", \"pick\"].includes(mode)) return;\n      this.state.errorMessage = \"\";\n      if (this.state.mode !== mode) {\n        this.resetState();\n        this.syncControlValues(true);\n      }\n      this.state.mode = mode;\n      this.state.typingField = \"\";\n      this.state.editingStep = \"\";\n      this.render();\n      this.focusCurrent();\n    }\n\n    setWallKind(kind) {\n      if (![\"kantstein\", \"wall\"].includes(kind)) return;\n      this.state.errorMessage = \"\";\n      if (this.state.wallKind !== kind) {\n        this.state.lengthCm = 0;\n        this.state.lengthCommitted = false;\n        this.state.heightCm = 0;\n        this.state.choices = { end: \"\", top: \"\" };\n        this.syncControlValues(true);\n      }\n      this.state.wallKind = kind;\n      this.state.typingField = \"\";\n      this.state.editingStep = \"\";\n      this.render();\n      this.focusCurrent();\n    }\n\n    resetState() {\n      this.state.wallKind = \"\";\n      this.state.lengthCm = 0;\n      this.state.lengthCommitted = false;\n      this.state.heightCm = 0;\n      this.state.choices = { end: \"\", top: \"\" };\n      Object.keys(this.state.counts).forEach((key) => {\n        this.state.counts[key] = 0;\n      });\n      this.state.errorMessage = \"\";\n    }\n\n    resetAfter(point) {\n      if (point === \"length\") {\n        if (this.state.wallKind === \"wall\") {\n          this.state.heightCm = 0;\n          if (this.els.height) this.els.height.value = \"\";\n        }\n        this.state.choices.end = \"\";\n        this.state.choices.top = \"\";\n      }\n      if (point === \"height\") {\n        this.state.choices.end = \"\";\n        this.state.choices.top = \"\";\n      }\n      if (point === \"end\") {\n        this.state.choices.top = \"\";\n      }\n    }\n\n    editStep(id) {\n      if (id === \"length\" || id === \"height\") id = \"measure\";\n      this.state.editingStep = id;\n      this.state.typingField = \"\";\n      this.render();\n      this.focusCurrent();\n    }\n\n    focusCurrent() {\n      const target = this.currentFocusTarget();\n      if (!target) return;\n      window.setTimeout(() => {\n        try {\n          target.focus({ preventScroll: true });\n        } catch (_) {\n          target.focus();\n        }\n      }, 80);\n    }\n\n    currentFocusTarget() {\n      const step = this.currentStep();\n      if (step === \"type\") return this.els.steps.type?.querySelector(\"[data-mspa-choice]\");\n      if (step === \"measure\") {\n        if (this.state.wallKind === \"kantstein\") return this.els.length;\n        return this.lengthComplete() ? this.els.height : this.els.length;\n      }\n      if (step === \"end\") return this.els.steps.end?.querySelector(\"[data-mspa-choice]\");\n      if (step === \"top\") return this.els.steps.top?.querySelector(\"[data-mspa-choice]\");\n      if (step === \"pick\") return this.els.pickInputs.normalBlock || this.els.steps.pick?.querySelector(\"input\");\n      return null;\n    }\n\n    syncControlValues(clearAll = false) {\n      if (this.els.length) this.els.length.value = clearAll ? \"\" : (this.state.lengthCm || \"\");\n      if (this.els.height) this.els.height.value = clearAll ? \"\" : (this.state.heightCm || \"\");\n      Object.entries(this.els.pickInputs).forEach(([key, input]) => {\n        if (input) input.value = clearAll ? \"\" : (this.state.counts[key] || \"\");\n      });\n    }\n\n    currentMainProduct() {\n      return this.products.normalBlock || normalizeProduct({}, \"normalBlock\");\n    }\n\n    productForKey(key) {\n      if (key === \"normalBlock\") return this.currentMainProduct();\n      return this.products[key];\n    }\n\n    productRole(key) {\n      const roles = {\n        normalBlock: \"Helblokk\",\n        halfBlock: \"Halv/kant\",\n        topBlock: \"Topp\",\n        betonglim: \"Lim\",\n        fiberduk: \"Fiberduk\"\n      };\n      return roles[key] || \"\";\n    }\n\n    pickItems() {\n      return PICK_KEYS\n        .map((key) => {\n          const product = this.productForKey(key);\n          if (!product) return null;\n          return {\n            key,\n            name: `pick_${key}`,\n            title: product.title || key,\n            role: this.productRole(key),\n            price: formatMoney(product.cents),\n            image: product.image,\n            fallbackImage: key === \"normalBlock\" ? this.config.image : \"\",\n            handle: product.handle,\n            quantity: this.state.counts[key] || 0,\n            primary: key === \"normalBlock\",\n            currentLabel: \"Valgt produkt\"\n          };\n        })\n        .filter(Boolean);\n    }\n\n    formatMeters(cm) {\n      const meters = Number(cm || 0) / 100;\n      if (!meters) return \"\";\n      const decimals = meters < 1 ? 2 : (Number.isInteger(meters) ? 0 : 2);\n      return formatNumber(meters, decimals);\n    }\n\n    lengthWarningText() {\n      const cm = intValue(this.state.lengthCm);\n      if (!cm || this.state.mode !== \"calculate\") return \"\";\n      if (cm < 100) return this.config.lengthWarningShort;\n      if (cm >= 10000) return `Lengden virker veldig lang. ${cm} cm er ${this.formatMeters(cm)} meter. Kontroller at tallet stemmer.`;\n      return \"\";\n    }\n\n    renderLengthAssist() {\n      if (this.els.lengthUnit) {\n        const meterText = this.state.lengthCm ? `cm (${this.formatMeters(this.state.lengthCm)} meter)` : \"cm\";\n        this.els.lengthUnit.textContent = meterText;\n      }\n      const warning = this.lengthWarningText();\n      if (this.els.lengthWarning) {\n        this.els.lengthWarning.textContent = warning;\n        this.els.lengthWarning.hidden = !warning;\n      }\n      const field = this.els.length?.closest(\"[data-mspa-field]\");\n      if (field) field.toggleAttribute(\"data-mspa-field-warning-active\", Boolean(warning));\n    }\n\n    renderFieldStates() {\n      const current = this.currentStep();\n      const setState = (node, state) => {\n        const field = node?.closest?.(\"[data-mspa-field]\");\n        if (!field) return;\n        if (state) field.setAttribute(\"data-mspa-field-state\", state);\n        else field.removeAttribute(\"data-mspa-field-state\");\n      };\n\n      setState(this.els.length, this.lengthWarningText() ? \"warning\" : (this.lengthComplete() ? \"complete\" : (current === \"measure\" ? \"active\" : \"\")));\n      setState(this.els.height, this.heightComplete() ? \"complete\" : (current === \"measure\" && this.state.wallKind === \"wall\" && this.lengthComplete() ? \"active\" : \"\"));\n    }\n\n    renderPickRows() {\n      PICK_KEYS.forEach((key) => {\n        const input = this.els.pickInputs[key];\n        const qty = Math.max(0, intValue(this.state.counts[key]));\n        if (input && input.value !== String(qty)) input.value = String(qty);\n        const row = this.els.scope.querySelector(`[data-mspa-pick-line=\"${key}\"]`);\n        if (row) {\n          row.classList.toggle(\"is-selected\", qty > 0);\n          row.setAttribute(\"data-mspa-pick-selected\", qty > 0 ? \"true\" : \"false\");\n        }\n      });\n    }\n\n    lengthComplete() {\n      if (this.state.wallKind === \"kantstein\") return this.kantsteinAutoReadyLength();\n      return this.state.lengthCommitted && this.state.lengthCm > 0;\n    }\n\n    kantsteinAutoReadyLength() {\n      return this.state.wallKind === \"kantstein\" && intValue(this.state.lengthCm) > 0;\n    }\n\n    heightComplete() {\n      return this.state.wallKind === \"kantstein\" || this.state.heightCm > 0;\n    }\n\n    measureComplete() {\n      if (!this.lengthComplete()) return false;\n      return this.state.wallKind === \"kantstein\" || this.heightComplete();\n    }\n\n    kindComplete() {\n      return this.state.wallKind === \"kantstein\" || this.state.wallKind === \"wall\";\n    }\n\n    endComplete() {\n      return this.state.wallKind !== \"wall\" || this.state.choices.end === \"yes\" || this.state.choices.end === \"no\";\n    }\n\n    topComplete() {\n      return this.state.wallKind !== \"wall\" || this.state.choices.top === \"yes\" || this.state.choices.top === \"no\";\n    }\n\n    pickReady() {\n      return PICK_KEYS.some((key) => this.state.counts[key] > 0);\n    }\n\n    currentStep() {\n      if (this.state.editingStep) return this.state.editingStep;\n      if (this.state.mode === \"pick\") return \"pick\";\n      if (!this.kindComplete()) return \"type\";\n      if (this.state.wallKind === \"kantstein\" && this.state.typingField === \"lengthCm\") return \"measure\";\n      if (!this.measureComplete()) return \"measure\";\n      if (this.state.wallKind === \"wall\" && !this.endComplete()) return \"end\";\n      if (this.state.wallKind === \"wall\" && !this.topComplete()) return \"top\";\n      return \"\";\n    }\n\n    stepComplete(step) {\n      if (step === \"type\") return this.kindComplete();\n      if (step === \"measure\") return this.measureComplete();\n      if (step === \"end\") return this.state.wallKind === \"wall\" && this.endComplete();\n      if (step === \"top\") return this.state.wallKind === \"wall\" && this.topComplete();\n      if (step === \"pick\") return this.pickReady();\n      return false;\n    }\n\n    ready() {\n      if (!this.config.available) return false;\n      if (this.state.mode === \"pick\") return this.pickReady() && !this.validationError();\n      if (this.state.mode !== \"calculate\") return false;\n      return this.kindComplete() &&\n        this.measureComplete() &&\n        this.endComplete() &&\n        this.topComplete() &&\n        !this.validationError();\n    }\n\n    shouldShowStep(step) {\n      if (this.state.mode === \"pick\") return step === \"pick\";\n      if (step === \"pick\") return false;\n      if (step === \"height\") return false;\n      if (step === \"end\" || step === \"top\") {\n        if (this.state.wallKind !== \"wall\") return false;\n      }\n      const current = this.currentStep();\n      if (!current) return false;\n      return step === current;\n    }\n\n    render(options = {}) {\n      if (!this.rendered) return;\n      const current = this.currentStep();\n      this.syncControlValues(false);\n      this.renderPrice();\n      this.renderChoices();\n      this.renderSteps(current);\n      this.renderConditionalControls();\n      this.renderLengthAssist();\n      this.renderFieldStates();\n      this.renderPickRows();\n\n      const ready = this.ready();\n      const errorText = this.state.errorMessage || \"\";\n      const label = this.ctaLabel(current, ready);\n      const validation = errorText || this.validationText(current, ready);\n      const target = current ? this.currentFocusTarget() : null;\n\n      this.api.update(this.host, {\n        family: FAMILY,\n        status: errorText ? \"error\" : (this.state.adding ? \"busy\" : (ready ? \"ready\" : \"not-ready\")),\n        ready: ready && !errorText,\n        busy: this.state.adding,\n        disabled: !ready || Boolean(errorText),\n        error: Boolean(errorText),\n        label: errorText ? \"Pr\u00F8v igjen\" : (this.state.adding ? this.config.busy : label),\n        step: errorText ? \"Kurvfeil\" : (ready ? \"Legg i kurven\" : label),\n        summary: errorText ? \"\" : (ready ? this.config.progressReady : \"\"),\n        validation: ready && !errorText ? \"\" : validation,\n        reason: errorText,\n        focusTarget: target,\n        steps: this.historySteps(current),\n        secondaryAction: this.secondaryAction(),\n        add: (ready || this.state.adding) ? (context) => this.add(context) : null\n      });\n      this.renderNavigationContinue();\n    }\n\n    renderPrice() {\n      if (!this.els.priceLabel || !this.els.priceValue) return;\n      const product = this.currentMainProduct();\n      const cents = product.cents || this.config.priceCents;\n      const compareCents = product.compareCents || (product.variantId === this.config.variantId || product.handle === this.config.handle ? this.config.compareCents : 0);\n      const priceCents = this.state.priceMode === \"m2\" ? Math.round(cents * this.config.priceM2Factor) : cents;\n      const activeCompareCents = this.state.priceMode === \"m2\" ? Math.round(compareCents * this.config.priceM2Factor) : compareCents;\n      const label = this.state.priceMode === \"m2\" ? this.config.priceM2 : this.config.priceEach;\n      const valueText = formatMoney(priceCents);\n      if (this.api.updatePriceCard) {\n        this.api.updatePriceCard(this.els.scope || this.host, {\n          name: \"price\",\n          label,\n          valueText,\n          priceCents,\n          compareCents: activeCompareCents\n        });\n      } else {\n        this.els.priceLabel.textContent = label;\n        this.els.priceValue.textContent = valueText;\n      }\n      if (this.els.priceToggle) this.els.priceToggle.textContent = this.state.priceMode === \"m2\" ? this.config.toggleEach : this.config.toggleM2;\n    }\n\n    renderChoices() {\n      this.setChoiceGroup(\"mode\", this.state.mode);\n      this.setChoiceGroup(\"wallKind\", this.state.wallKind);\n      Object.entries(this.state.choices).forEach(([group, value]) => {\n        this.setChoiceGroup(group, value);\n      });\n    }\n\n    setChoiceGroup(group, value) {\n      const groupNode = this.els.scope.querySelector(`[data-mspa-choice-group=\"${group}\"]`);\n      if (!groupNode) return;\n      groupNode.setAttribute(\"data-mspa-choice-value\", value || \"\");\n      groupNode.querySelectorAll(\"[data-mspa-choice]\").forEach((button) => {\n        const active = button.getAttribute(\"data-mspa-choice\") === value;\n        button.classList.toggle(\"is-active\", active);\n        button.setAttribute(\"aria-pressed\", active ? \"true\" : \"false\");\n      });\n    }\n\n    renderSteps(current) {\n      Object.entries(this.els.steps).forEach(([id, step]) => {\n        const visible = this.shouldShowStep(id);\n        const state = id === current ? \"active\" : this.stepComplete(id) ? \"complete\" : \"idle\";\n        step.hidden = !visible;\n        step.setAttribute(\"aria-hidden\", visible ? \"false\" : \"true\");\n        step.setAttribute(\"data-mspa-step-state\", state);\n        step.toggleAttribute(\"data-mspa-step-peek\", false);\n      });\n    }\n\n    renderConditionalControls() {\n      this.setComponentHidden(\"heightCm\", this.state.wallKind !== \"wall\");\n      if (this.els.status) this.els.status.hidden = true;\n    }\n\n    setComponentHidden(name, hidden) {\n      const node = this.els.scope.querySelector(`[data-mspa-field=\"${name}\"]`);\n      if (!node) return;\n      node.hidden = hidden;\n      node.setAttribute(\"aria-hidden\", hidden ? \"true\" : \"false\");\n    }\n\n    ctaLabel(current, ready) {\n      if (!this.config.available) return this.config.soldOut;\n      if (this.state.mode === \"pick\") return ready ? this.config.primary : \"Velg deler og antall\";\n      if (ready) return this.config.primary;\n      if (current === \"type\") return this.config.actionType;\n      if (current === \"measure\") {\n        if (!this.lengthComplete()) return this.config.actionLength;\n        if (this.state.wallKind === \"wall\" && !this.heightComplete()) return this.config.actionHeight;\n      }\n      if (current === \"end\") return \"Skal muren ha synlige ender?\";\n      if (current === \"top\") return \"Vil du ha toppheller p\u00E5 muren?\";\n      return this.config.actionIncomplete;\n    }\n\n    validationText(current, ready) {\n      if (ready) return \"\";\n      if (!this.config.available) return this.config.soldOut;\n      if (this.state.mode === \"pick\") return this.pickReady() ? \"\" : \"Velg minst \u00E9n vare.\";\n      if (current === \"type\") return this.config.initialMessage;\n      if (current === \"measure\" && this.state.wallKind === \"kantstein\" && !this.lengthComplete()) return this.config.progressLength;\n      if (current === \"measure\" && !this.lengthComplete() && !this.heightComplete()) return this.config.measureMessage;\n      if (current === \"measure\" && !this.lengthComplete()) return this.config.progressLength;\n      if (current === \"measure\" && !this.heightComplete()) return this.config.progressHeight;\n      if (current === \"end\") return \"Velg om muren har synlig ende.\";\n      if (current === \"top\") return \"Velg om du \u00F8nsker topphelle.\";\n      return \"Fullf\u00F8r valgene for \u00E5 legge i kurven.\";\n    }\n\n    stepOrder() {\n      const order = [\"type\", \"measure\"];\n      if (this.state.wallKind === \"wall\") order.push(\"end\", \"top\");\n      return order;\n    }\n\n    renderNavigationContinue() {\n      const current = this.currentStep();\n      const reviewing = this.state.mode === \"calculate\" && !this.state.adding && current &&\n        this.state.editingStep === current && this.stepComplete(current);\n      const step = reviewing && this.els.steps[current];\n      let button = this.host.querySelector(\"[data-mspa-navigation-continue]\");\n      if (!step) {\n        if (button) button.remove();\n        return;\n      }\n      if (!button) {\n        button = document.createElement(\"button\");\n        button.type = \"button\";\n        button.className = \"mspa-secondary-action\";\n        button.setAttribute(\"data-mspa-navigation-continue\", \"\");\n        button.textContent = \"Fortsett\";\n        button.addEventListener(\"click\", (event) => {\n          event.preventDefault();\n          this.continueNavigationReview();\n        });\n      }\n      button.disabled = Boolean(this.state.errorMessage);\n      button.setAttribute(\"aria-disabled\", button.disabled ? \"true\" : \"false\");\n      if (button.parentElement !== step) step.appendChild(button);\n    }\n\n    continueNavigationReview() {\n      if (this.state.mode !== \"calculate\" || this.state.adding) return false;\n      const current = this.currentStep();\n      if (!current || this.state.editingStep !== current || !this.stepComplete(current)) return false;\n      if (typeof this.clearAnswerReview === \"function\") this.clearAnswerReview();\n      this.state.editingStep = \"\";\n      this.state.typingField = \"\";\n      if (\"layoutEditingPart\" in this.state) this.state.layoutEditingPart = \"\";\n      this.render();\n      this.focusCurrent();\n      return true;\n    }\n\n    secondaryAction() {\n      if (this.state.mode !== \"calculate\" || this.state.adding) return null;\n      const current = this.currentStep();\n      const order = this.stepOrder();\n      const index = current ? order.indexOf(current) : order.length;\n      if (index <= 0) return null;\n      const previous = order[index - 1];\n      return {\n        label: previous === \"measure\" ? \"\u2190 Tilbake til m\u00E5l\" : \"\u2190 Tilbake\",\n        action: () => {\n          if (this.state.mode !== \"calculate\" || this.state.adding) return;\n          this.editStep(previous);\n        }\n      };\n    }\n\n    historySteps(current) {\n      const steps = [];\n      const add = (id, label, visible = true, disabled = false) => {\n        steps.push({\n          id,\n          label,\n          shortLabel: label,\n          visible,\n          state: current === id ? \"current\" : (this.stepComplete(id) ? \"complete\" : \"idle\"),\n          edit: () => this.editStep(id),\n          target: this.els.steps[id] || null,\n          disabled\n        });\n      };\n      if (this.state.mode === \"pick\") {\n        add(\"pick\", \"Varianter\", true, false);\n        return steps;\n      }\n      add(\"type\", \"Type\", true, false);\n      add(\"measure\", this.state.wallKind === \"kantstein\" ? \"Lengde\" : \"M\u00E5l\", true, !this.kindComplete());\n      if (this.state.wallKind === \"wall\") {\n        add(\"end\", \"Ende\", true, !this.measureComplete());\n        add(\"top\", \"Topp\", true, !this.stepComplete(\"end\"));\n      }\n      return steps;\n    }\n\n    validationError() {\n      const lines = this.currentLines();\n      if (!lines.length) return \"Ingen varer beregnet.\";\n      const missing = lines.find((line) => !line.product.variantId || !line.product.available);\n      return missing ? `${missing.product.title} mangler salgbar variant.` : \"\";\n    }\n\n    currentLines() {\n      const quantities = this.state.mode === \"pick\" ? this.pickQuantities() : this.calculateQuantities();\n      return LINE_ORDER\n        .map((key) => this.lineFor(key, quantities[key]))\n        .filter(Boolean);\n    }\n\n    pickQuantities() {\n      return PICK_KEYS.reduce((result, key) => {\n        result[key] = Math.max(0, intValue(this.state.counts[key]));\n        return result;\n      }, {});\n    }\n\n    calculateQuantities() {\n      const lengthCm = Math.max(0, intValue(this.state.lengthCm));\n      if (!lengthCm || !this.state.wallKind) return {};\n      const lengthM = lengthCm / 100;\n      const blocksPerShift = Math.ceil(lengthM * BLOCKS_PER_METER);\n      if (this.state.wallKind === \"kantstein\") {\n        return {\n          normalBlock: blocksPerShift,\n          halfBlock: 0,\n          topBlock: 0,\n          betonglim: 0,\n          fiberduk: 0\n        };\n      }\n\n      const heightCm = Math.max(0, intValue(this.state.heightCm));\n      if (!heightCm) return {};\n      const shifts = Math.max(1, Math.ceil(heightCm / BLOCK_HEIGHT_CM));\n      const normalBlock = blocksPerShift * shifts;\n      const halfBlock = this.state.choices.end === \"yes\" ? Math.floor(shifts / 2) * 2 : 0;\n      const topBlock = this.state.choices.top === \"yes\" ? Math.ceil(lengthM * TOP_BLOCKS_PER_METER) : 0;\n      const glueMeters = lengthM * shifts + (topBlock ? lengthM : 0);\n      return {\n        normalBlock,\n        halfBlock,\n        topBlock,\n        betonglim: glueMeters > 0 ? Math.max(1, Math.ceil(glueMeters / 7)) : 0,\n        fiberduk: Math.ceil(lengthM / 25)\n      };\n    }\n\n    lineFor(key, quantity) {\n      const qty = Math.max(0, intValue(quantity));\n      const product = this.productForKey(key);\n      if (!qty || !product) return null;\n      return {\n        key,\n        quantity: qty,\n        product,\n        totalCents: qty * (product.cents || 0)\n      };\n    }\n\n    stockIntent(selection) {\n      const selected = new Map(selection.map((row) => [row.variantId,row]));\n      const counts = {};\n      const seen = new Set();\n      this.pickItems().forEach((item) => {\n        const product = this.productForKey(item.key);\n        const row = product && selected.get(String(product.variantId));\n        if (row && row.sku === product.sku && !seen.has(row.variantId)) {\n          counts[item.key] = row.quantity;seen.add(row.variantId);\n        }\n      });\n      const view = Object.create(this);\n      view.state = {...this.state,mode:\"pick\",lengthCm:0,heightCm:0,\n        choices:{wallType:this.state.choices?.wallType || \"\"},counts,pickCounts:{...counts}};\n      return view.cartIntent();\n    }\n\n    cartIntent() {\n      const lines = this.currentLines();\n      const orderedLines = CART_INSERT_REVERSE ? [...lines].reverse() : lines;\n      const items = orderedLines.map((line, index) => this.cartItem(line, index));\n      const shippingItems = orderedLines.map((line) => this.shippingItem(line));\n      const totalCents = lines.reduce((sum, line) => sum + line.totalCents, 0);\n      const lengthM = this.state.lengthCm ? this.state.lengthCm / 100 : 0;\n\n      return {\n        root: this.host,\n        family: FAMILY,\n        vendor: this.config.vendor,\n        items,\n        shippingItems,\n        presentation: {\n          lines: lines.map((line) => ({\n            item: items[orderedLines.indexOf(line)],\n            title: line.product.title,\n            image: line.product.image || \"\"\n          }))\n        },\n        preview: {\n          title: this.state.mode === \"pick\" ? \"Kubbemur plukkliste\" : \"Kubbemur beregning\",\n          subtitle: this.intentSubtitle(lines),\n          estimatedTotal: formatMoney(totalCents),\n          status: \"Legger Kubbemur i handlekurven...\",\n          lines: lines.map((line) => ({\n            title: line.product.title,\n            quantity: `${line.quantity} ${line.product.unit || \"stk\"}`,\n            price: formatMoney(line.totalCents),\n            image: line.product.image,\n            locked: line.product.locked\n          }))\n        },\n        calculatorSummary: {\n          type: \"kubbemur\",\n          mode: this.state.mode,\n          wallKind: this.state.wallKind,\n          lengthCm: this.state.lengthCm,\n          lengthM,\n          heightCm: this.state.heightCm,\n          choices: Object.assign({}, this.state.choices),\n          counts: Object.assign({}, this.state.counts),\n          items: lines.map((line) => ({\n            key: line.key,\n            title: line.product.title,\n            quantity: line.quantity,\n            variantId: line.product.variantId\n          }))\n        },\n        calculatorSnapshot: {\n          contract: \"mspa-calculator-snapshot-v1\",\n          source: \"mspa-kubbemur\",\n          version: VERSION,\n          mode: this.state.mode,\n          wallKind: this.state.wallKind,\n          lengthCm: this.state.lengthCm,\n          heightCm: this.state.heightCm,\n          choices: Object.assign({}, this.state.choices),\n          counts: Object.assign({}, this.state.counts),\n          quantities: this.state.mode === \"pick\" ? this.pickQuantities() : this.calculateQuantities()\n        },\n        syncHints: {\n          cart: true,\n          freight: true,\n          pallets: true,\n          variants: true\n        }\n      };\n    }\n\n    cartItem(line, index) {\n      return {\n        id: line.product.variantId,\n        quantity: line.quantity,\n        properties: {\n          _ms_calculator_family: FAMILY,\n          _ms_source: \"mspa-kubbemur\",\n          _ms_port: PORT,\n          _ms_product_key: line.key,\n          _ms_product_title: line.product.title,\n          _ms_product_vendor: line.product.vendor || this.config.vendor,\n          _ms_preview_title: line.product.title,\n          _ms_locked: line.product.locked ? \"true\" : \"false\",\n          _ms_line_order: String(index + 1),\n          _ms_cart_display_order: String(this.cartDisplayOrder(line.key)),\n          _ms_primary_line: line.key === \"normalBlock\" ? \"true\" : \"false\",\n          _ms_pallet_owner: \"shipping_2\",\n          _ms_pallet_role: \"support_wall\",\n          _ms_length_cm: String(this.state.lengthCm || \"\"),\n          _ms_height_cm: String(this.state.heightCm || \"\"),\n          _ms_wall_type: this.kindLabel(),\n          _ms_mode: this.state.mode\n        }\n      };\n    }\n\n    cartDisplayOrder(key) {\n      return Object.prototype.hasOwnProperty.call(CART_DISPLAY_ORDER, key) ? CART_DISPLAY_ORDER[key] : 90;\n    }\n\n    shippingItem(line) {\n      return {\n        id: line.product.variantId,\n        variantId: line.product.variantId,\n        productId: line.product.productId,\n        handle: line.product.handle,\n        title: line.product.title,\n        vendor: line.product.vendor || this.config.vendor,\n        quantity: line.quantity,\n        grams: line.product.grams,\n        sku: line.product.sku,\n        role: \"support_wall\",\n        owner: \"shipping_2\",\n        source: \"mspa-kubbemur\"\n      };\n    }\n\n    kindLabel() {\n      if (this.state.wallKind === \"kantstein\") return this.config.kantsteinLabel;\n      if (this.state.wallKind === \"wall\") return this.config.wallLabel;\n      return \"\";\n    }\n\n    intentSubtitle(lines) {\n      if (this.state.mode === \"pick\") {\n        const quantity = lines.reduce((sum, line) => sum + line.quantity, 0);\n        return `${quantity} varer valgt.`;\n      }\n      const lengthM = this.state.lengthCm ? formatNumber(this.state.lengthCm / 100, 2) : \"0\";\n      if (this.state.wallKind === \"kantstein\") return `${this.config.kantsteinLabel}, ${lengthM} m.`;\n      return `${this.config.wallLabel}, ${lengthM} m mur, ${this.state.heightCm || 0} cm h\u00F8yde.`;\n    }\n\n    async add(context) {\n      if (this.state.adding || !this.ready()) return null;\n      this.state.adding = true;\n      this.render();\n      try {\n        const result = await this.api.add(this.host, this.cartIntent());\n        document.dispatchEvent(new CustomEvent(\"cartModal:done\", {\n          bubbles: true,\n          detail: { source: \"mspa-kubbemur\", context: context || {} }\n        }));\n        if (!this.isQuickShop()) {\n          document.dispatchEvent(new CustomEvent(\"ms:cart:open-request\", {\n            bubbles: true,\n            detail: { source: \"mspa-kubbemur\" }\n          }));\n        }\n        return result;\n      } catch (error) {\n        if (this.api?.isPurchaseLayerError?.(error) || window.MSPurchaseMotor?.isPurchaseLayerError?.(error)) {\n          this.state.errorMessage = \"\";\n        } else {\n          this.state.errorMessage = error?.message || \"Kunne ikke legge i kurven.\";\n        }\n        throw error;\n      } finally {\n        this.state.adding = false;\n        this.render();\n      }\n    }\n\n    isQuickShop() {\n      return this.host.getAttribute(\"data-calculator-context\") === \"quick-shop\" ||\n        this.host.closest(\"[data-ms-purchase-context='quick-shop']\");\n    }\n  }\n\n  function initAll(scope = document) {\n    scope.querySelectorAll(ROOT_SELECTOR).forEach((root) => {\n      if (root.dataset.mspaKubbemurBound === \"true\") return;\n      root.dataset.mspaKubbemurBound = \"true\";\n      new MspaKubbemur(root);\n    });\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", () => initAll(document), { once: true });\n  } else {\n    initAll(document);\n  }\n  document.addEventListener(\"shopify:section:load\", (event) => initAll(event.target));\n  document.addEventListener(\"ms:quick-shop:loaded\", (event) => initAll(event.detail?.content || document));\n})();\n"],
  "mappings": "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",
  "names": []
}
