{
  "version": 3,
  "sources": ["/cdn/shop/t/688/assets/mspa-boston.js?ms_mspa_family=20260629-supportwall-audit7"],
  "sourcesContent": ["(() => {\n  \"use strict\";\n\n  const ROOT_SELECTOR = \"[data-mspa-boston-calc]\";\n  const FAMILY = \"boston\";\n  const PORT = \"boston-v1\";\n  const VERSION = \"2026-09-30-boston-guide-r1\";\n  const HEIGHTS = [15, 30, 45, 60, 75, 90, 105, 120, 135, 150];\n  const BLOCK_LENGTH_CM = 35;\n  const BLOCK_HEIGHT_CM = 15;\n  const PRICE_M2_FACTOR = 10000 / (BLOCK_LENGTH_CM * BLOCK_HEIGHT_CM);\n  const BLOCKS_PER_METER = 100 / BLOCK_LENGTH_CM;\n  const GEONETT = {\n    small: { widthM: 1.25, lengthM: 25, fallbackCents: 295000 },\n    large: { widthM: 2.6, lengthM: 50, fallbackCents: 995000 }\n  };\n  const GEONETT_RULES = {\n    loddrett: { thresholdCm: 50, maxRecommendedCm: 80, layers: 2, embedM: 1, placements: [1, 4], scenario: \"Boston loddrett mur\" },\n    hellende: { thresholdCm: 80, maxRecommendedCm: 150, layers: 3, embedM: 1.4, placements: [1, 4, 7], scenario: \"Boston hellende st\u00F8ttemur\" }\n  };\n  const LINE_ORDER = [\n    \"normalBlock\",\n    \"solebjelke\",\n    \"toppBlock\",\n    \"connector\",\n    \"cornerBlock\",\n    \"halfEndBlock\",\n    \"betonglim\",\n    \"fiberduk\",\n    \"geonettSmall\",\n    \"geonettLarge\"\n  ];\n  const PICK_KEYS = LINE_ORDER;\n  const CART_INSERT_REVERSE = true;\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  const formatNumber = (value, decimals = 0) =>\n    Number(value || 0).toLocaleString(\"nb-NO\", {\n      minimumFractionDigits: decimals,\n      maximumFractionDigits: decimals\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. Boston 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, defaultValue) {\n    try {\n      return JSON.parse(root.querySelector(selector)?.textContent || \"\");\n    } catch (error) {\n      console.warn(\"Kunne ikke lese MSPA Boston produktkontrakt:\", error);\n      return defaultValue;\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  function visibleHeightCm(heightCm) {\n    return Math.round(Number(heightCm || 0) * 0.9);\n  }\n\n  function geonettRule(heightCm, wallType) {\n    const kind = wallType === \"hellende\" ? \"hellende\" : \"loddrett\";\n    const rule = GEONETT_RULES[kind] || GEONETT_RULES.loddrett;\n    if (kind === \"loddrett\" && visibleHeightCm(heightCm) > rule.maxRecommendedCm) return null;\n    return Object.assign({}, rule, {\n      required: visibleHeightCm(heightCm) > rule.thresholdCm\n    });\n  }\n\n  function rollCuts(key, embedCm) {\n    const roll = GEONETT[key === \"geonettSmall\" ? \"small\" : \"large\"];\n    return roll && embedCm > 0 ? Math.floor(Math.round(roll.lengthM * 100) / embedCm) : 0;\n  }\n\n  function greatestCommonDivisor(a, b) {\n    while (b) [a, b] = [b, a % b];\n    return a;\n  }\n\n  let lastRollCalculation = null;\n\n  function optimizeRolls(lengthCm, layers, embedCm, products) {\n    if (!(lengthCm > 0) || !(layers > 0) || !(embedCm > 0)) return { geonettSmall: 0, geonettLarge: 0 };\n    const smallCuts = rollCuts(\"geonettSmall\", embedCm);\n    const largeCuts = rollCuts(\"geonettLarge\", embedCm);\n    if (!smallCuts || !largeCuts) return { geonettSmall: 0, geonettLarge: 0 };\n    const smallWidth = Math.round(GEONETT.small.widthM * 100);\n    const largeWidth = Math.round(GEONETT.large.widthM * 100);\n    const smallPrice = products.geonettSmall?.cents || GEONETT.small.fallbackCents;\n    const largePrice = products.geonettLarge?.cents || GEONETT.large.fallbackCents;\n    const cacheKey = [lengthCm, layers, embedCm, smallPrice, largePrice].join(\":\");\n    if (lastRollCalculation?.key === cacheKey) return lastRollCalculation.result;\n\n    // 25 large cuts and 52 small cuts cover the same 6500 cm. A layer\n    // with b = 25q + r large cuts needs C(r) - 52q whole small cuts.\n    // Keep the all-large layer separate, where that expression can be <= 0.\n    const widthDivisor = greatestCommonDivisor(smallWidth, largeWidth);\n    const largeBlock = smallWidth / widthDivisor;\n    const smallBlock = largeWidth / widthDivisor;\n    const allLarge = Math.ceil(lengthCm / largeWidth);\n    const residues = [];\n    for (let remainder = 0; remainder < Math.min(largeBlock, allLarge); remainder += 1) {\n      residues.push({\n        remainder,\n        small: Math.ceil((lengthCm - largeWidth * remainder) / smallWidth),\n        blocks: Math.floor((allLarge - 1 - remainder) / largeBlock)\n      });\n    }\n\n    // Buying whole rolls makes cost periodic in q. Within each residue\n    // class, price and then roll count change by a fixed amount per period;\n    // purchased cut coverage is unchanged. Only the better endpoint is needed.\n    const smallPeriod = smallCuts / greatestCommonDivisor(smallBlock, smallCuts);\n    const largePeriod = largeCuts / greatestCommonDivisor(largeBlock, largeCuts);\n    const period = smallPeriod * largePeriod / greatestCommonDivisor(smallPeriod, largePeriod);\n    const smallRollStep = -smallBlock * period / smallCuts;\n    const largeRollStep = largeBlock * period / largeCuts;\n    const priceStep = smallRollStep * smallPrice + largeRollStep * largePrice;\n    const preferLast = priceStep < 0 || (priceStep === 0 && smallRollStep + largeRollStep < 0);\n    let best = null;\n    let states = new Map([[\"0:0\", { remainder: 0, small: 0, blocks: 0 }]]);\n\n    for (let mixedLayers = 0; mixedLayers <= layers; mixedLayers += 1) {\n      for (const state of states.values()) {\n        const baseLarge = (layers - mixedLayers) * allLarge + state.remainder;\n        for (let residue = 0; residue < Math.min(period, state.blocks + 1); residue += 1) {\n          const blocks = preferLast\n            ? residue + Math.floor((state.blocks - residue) / period) * period\n            : residue;\n          const small = Math.ceil((state.small - smallBlock * blocks) / smallCuts);\n          const large = Math.ceil((baseLarge + largeBlock * blocks) / largeCuts);\n          const price = small * smallPrice + large * largePrice;\n          const rolls = small + large;\n          const coverage = small * smallCuts * smallWidth + large * largeCuts * largeWidth;\n          if (!best || price < best.price ||\n              (price === best.price && rolls < best.rolls) ||\n              (price === best.price && rolls === best.rolls && coverage < best.coverage)) {\n            best = { geonettSmall: small, geonettLarge: large, price, rolls, coverage };\n          }\n        }\n      }\n      if (mixedLayers === layers) break;\n      const next = new Map();\n      for (const state of states.values()) {\n        for (const residue of residues) {\n          const remainder = state.remainder + residue.remainder;\n          const blocks = state.blocks + residue.blocks;\n          const small = state.small + residue.small;\n          const key = `${remainder}:${blocks}`;\n          const previous = next.get(key);\n          // Every integer q in 0..blocks can be distributed across these\n          // layers. For equal remainder/capacity, fewer small cuts dominates.\n          if (!previous || small < previous.small) next.set(key, { remainder, small, blocks });\n        }\n      }\n      states = next;\n    }\n    const result = best || { geonettSmall: 0, geonettLarge: 0 };\n    lastRollCalculation = { key: cacheKey, result };\n    return result;\n  }\n\n  // Guide help is presentation-only; sources and products use existing bindings.\n  const GUIDE_PRODUCT = \"benders-boston-antikk-gra\";\n  const GUIDE_HANDLE = \"montering-boston\";\n  const GUIDE_CHOICES = [\n    { choice: \"corner\", product: \"cornerBlock\", label: \"Hj\u00F8rne / hel ende\", section: \"boston-guide-avslutning\" },\n    { choice: \"end\", product: \"halfEndBlock\", label: \"Sluttblokk / halv ende\", section: \"boston-guide-avslutning\" },\n    { choice: \"geonett\", product: \"geonettSmall\", label: \"Geonett\", section: \"boston-guide-geonett\" }\n  ];\n  let guideDialogId = 0;\n\n  function guideExcerpt(source, entry) {\n    const section = source?.content?.querySelector(`#${entry.section}`);\n    if (!section) return null;\n    const heading = Array.from(section.children).find((node) => entry.heading\n      ? node.tagName === \"H3\" && node.textContent.trim() === entry.heading\n      : node.tagName === \"H2\");\n    if (!heading) return null;\n    const content = document.createElement(\"div\");\n    for (let node = heading.nextElementSibling; node; node = node.nextElementSibling) {\n      if (node.tagName === \"H2\" || (entry.heading && node.tagName === \"H3\")) break;\n      content.append(node.cloneNode(true));\n    }\n    if (!content.textContent.trim()) return null;\n    content.querySelectorAll(\"[id]\").forEach((node) => node.removeAttribute(\"id\"));\n    content.querySelectorAll(\"figure a\").forEach((link) => link.replaceWith(...link.childNodes));\n    return { title: heading.textContent.trim().replace(/^\\d+\\.\\s*/, \"\"), content };\n  }\n\n  function openGuideDialog(opener, excerpt, source, full = false) {\n    const typeLabel = \"Boston\";\n    const dialog = document.createElement(\"dialog\");\n    const titleId = `mspa-boston-guide-title-${++guideDialogId}`;\n    dialog.className = \"mspa-wall-guide-dialog\";\n    dialog.setAttribute(\"aria-labelledby\", titleId);\n    const header = document.createElement(\"div\");\n    header.className = \"mspa-wall-guide-dialog__header\";\n    const title = document.createElement(\"h2\");\n    title.id = titleId;\n    title.textContent = `${typeLabel}: ${excerpt?.title || \"Monteringsveiledning\"}`;\n    const close = document.createElement(\"button\");\n    close.type = \"button\";\n    close.className = \"mspa-wall-guide-dialog__close\";\n    close.textContent = \"Lukk \u00D7\";\n    close.setAttribute(\"aria-label\", \"Lukk veiledning\");\n    close.autofocus = true;\n    close.addEventListener(\"click\", () => dialog.close());\n    header.append(title, close);\n    const content = document.createElement(\"div\");\n    content.className = \"mspa-wall-guide-dialog__content\";\n    function showFullGuide() {\n      const guide = source.content.cloneNode(true);\n      window.MSWallGuideProducts?.init(guide);\n      const ids = new Map();\n      guide.querySelectorAll(\"[id]\").forEach((node) => {\n        const oldId = node.id; node.id = `${titleId}-${oldId}`; ids.set(oldId, node.id);\n      });\n      guide.querySelectorAll('a[href^=\"#\"]').forEach((link) => {\n        const target = ids.get(link.getAttribute(\"href\").slice(1));\n        if (target) { link.setAttribute(\"href\", `#${target}`); link.setAttribute(\"data-mspa-wall-guide-anchor\", target); }\n      });\n      guide.querySelectorAll(\"figure a\").forEach((link) => link.replaceWith(...link.childNodes));\n      title.textContent = `Monteringsveiledning \u2013 ${typeLabel}`;\n      content.replaceChildren(guide); content.scrollTop = 0;\n      if (dialog.open) { title.tabIndex = -1; title.focus({ preventScroll: true }); }\n    }\n    if (full) showFullGuide();\n    else {\n      content.append(excerpt.content.cloneNode(true));\n      const button = document.createElement(\"button\");\n      button.type = \"button\";\n      button.className = \"mspa-wall-guide-dialog__full-guide\";\n      button.textContent = \"\u00C5pne hele veiledningen\";\n      button.addEventListener(\"click\", showFullGuide);\n      content.append(button);\n    }\n    content.addEventListener(\"click\", (event) => {\n      const link = event.target.closest(\"[data-mspa-wall-guide-anchor]\");\n      if (!link || !content.contains(link)) return;\n      event.preventDefault(); event.stopPropagation();\n      const id = link.getAttribute(\"data-mspa-wall-guide-anchor\");\n      const target = Array.from(content.querySelectorAll(\"[id]\")).find((node) => node.id === id);\n      if (!target) return;\n      content.scrollTop += target.getBoundingClientRect().top - content.getBoundingClientRect().top;\n      target.tabIndex = -1; target.focus({ preventScroll: true });\n    });\n    dialog.append(header, content);\n    dialog.addEventListener(\"keydown\", (event) => {\n      event.stopPropagation();\n      if (event.key !== \"Tab\" || event.altKey || event.ctrlKey || event.metaKey) return;\n      const focusable = Array.from(dialog.querySelectorAll('button:not([disabled]), a[href], [tabindex]'))\n        .filter((node) => node.tabIndex >= 0 && !node.disabled && node.getClientRects().length);\n      const first = focusable[0]; const last = focusable[focusable.length - 1];\n      const active = document.activeElement;\n      if (!first || !focusable.includes(active) || (event.shiftKey ? active === first : active === last)) {\n        event.preventDefault(); (event.shiftKey ? last || dialog : first || dialog).focus();\n      }\n    });\n    dialog.addEventListener(\"click\", (event) => {\n      if (event.target !== dialog) return;\n      const box = dialog.getBoundingClientRect();\n      if (event.clientX < box.left || event.clientX > box.right || event.clientY < box.top || event.clientY > box.bottom) dialog.close();\n    });\n    dialog.addEventListener(\"close\", () => {\n      document.body.classList.remove(\"mspa-wall-guide-open\");\n      dialog.remove();\n      if (opener.isConnected) opener.focus({ preventScroll: true });\n    }, { once: true });\n    document.body.append(dialog);\n    try { dialog.showModal(); } catch (_) { dialog.remove(); return; }\n    document.body.classList.add(\"mspa-wall-guide-open\");\n  }\n\n  // Preserve the real guide URL as fallback until the exact local source is ready.\n  if (!window.MSPABostonFullGuideBound) {\n    window.MSPABostonFullGuideBound = true;\n    document.addEventListener(\"click\", (event) => {\n      if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n      const link = event.target.closest?.(\"[data-ms-wall-open-full-guide]\");\n      const scope = link?.closest(\"[data-ms-wall-full-scope]\");\n      if (scope?.dataset.productHandle !== GUIDE_PRODUCT || link?.dataset.guideHandle !== GUIDE_HANDLE || typeof HTMLDialogElement === \"undefined\" || !HTMLDialogElement.prototype.showModal) return;\n      const roots = document.querySelectorAll(`[data-mspa-boston-calc][data-mspa-context=\"product\"][data-mspa-product-handle=\"${GUIDE_PRODUCT}\"]`);\n      if (roots.length !== 1) return;\n      const host = roots[0].closest(\"[data-ms-calculator-host]\");\n      const sources = host?.querySelectorAll(\"template[data-mspa-boston-guide-source]\");\n      const source = sources?.length === 1 ? sources[0] : null;\n      if (!source?.content || source.dataset.guideHandle !== GUIDE_HANDLE || source.dataset.productHandle !== GUIDE_PRODUCT) return;\n      try { if (new URL(source.dataset.guideUrl, document.baseURI).pathname !== new URL(link.href, document.baseURI).pathname) return; } catch (_) { return; }\n      event.preventDefault(); event.stopPropagation();\n      openGuideDialog(link, null, source, true);\n    });\n  }\n\n  class MspaBoston {\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(this.host, \"[data-mspa-boston-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 || \"Boston\",\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 stykk\",\n        priceM2: dataset.mspaPriceLabelM2 || \"Pris per m\u00B2\",\n        toggleM2: dataset.mspaPriceToggleM2 || \"Vis m\u00B2-pris\",\n        toggleEach: dataset.mspaPriceToggleEach || \"Vis stykkpris\",\n        actionLength: dataset.mspaActionLength || \"Skriv inn lengde\",\n        actionHeight: dataset.mspaActionHeight || \"Velg h\u00F8yde\",\n        actionType: \"Hvordan skal muren bygges?\",\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        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 Boston deler selv\",\n        initialMessage: dataset.mspaInitialMessage || \"Skriv inn lengde i cm og velg h\u00F8yde.\",\n        walltypeMessage: \"Velg hvordan muren skal bygges.\",\n        optionsMessage: dataset.mspaOptionsMessage || \"Velg eventuelle tilvalg, eller legg beregningen i kurven.\",\n        loddrettLabel: dataset.mspaLoddrettLabel || \"Loddrett mur\",\n        loddrettText: \"Opp til 50 cm synlig mur uten geonett, eller 80 cm med geonett.\",\n        hellendeLabel: \"Hellende mur, 4\u00B0\",\n        hellendeText: \"Opp til 80 cm synlig mur uten geonett, eller 150 cm med geonett.\",\n        cornerTitle: dataset.mspaCornerTitle || \"Utvendig hj\u00F8rne\",\n        cornerText: dataset.mspaCornerText || \"Legger inn hj\u00F8rne-/hel endeblokk per skift.\",\n        endTitle: dataset.mspaEndTitle || \"Synlig ende\",\n        endText: dataset.mspaEndText || \"Legger inn halv og hel endeblokk for ryddig avslutning.\",\n        geonettTitle: dataset.mspaGeonettTitle || \"Legg til geonett\",\n        geonettText: dataset.mspaGeonettText || \"Beregnes etter Benders sin Boston-veiledning.\",\n        actionCorner: dataset.mspaActionCorner || \"Velg hj\u00F8rne\",\n        actionEnd: dataset.mspaActionEnd || \"Velg ende\",\n        actionGeonett: dataset.mspaActionGeonett || \"Velg geonett\"\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        lengthCm: 0,\n        lengthCommitted: false,\n        heightCm: 0,\n        loddrettHeightConfirmedCm: 0,\n        choices: {\n          wallType: \"\",\n          end: \"\",\n          corner: \"\",\n          geonett: \"\"\n        },\n        counts: {\n          cornerCount: 0,\n          normalBlock: 0,\n          solebjelke: 0,\n          toppBlock: 0,\n          connector: 0,\n          cornerBlock: 0,\n          halfEndBlock: 0,\n          betonglim: 0,\n          fiberduk: 0,\n          geonettSmall: 0,\n          geonettLarge: 0\n        },\n        committed: {\n          cornerCount: false\n        },\n        answerReview: \"\",\n        answerEdit: \"\",\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.installGuideHelp();\n      this.bind();\n      this.render();\n    }\n\n    installGuideHelp() {\n      if (this.config.handle !== GUIDE_PRODUCT || typeof HTMLDialogElement === \"undefined\" || !HTMLDialogElement.prototype.showModal) return;\n      const sources = this.host.querySelectorAll(\"template[data-mspa-boston-guide-source]\");\n      const source = sources.length === 1 ? sources[0] : null;\n      if (!source?.content || source.dataset.productHandle !== GUIDE_PRODUCT || source.dataset.guideHandle !== GUIDE_HANDLE || !source.dataset.guideUrl) return;\n      GUIDE_CHOICES.forEach((entry) => {\n        const group = this.els.scope.querySelector(`[data-mspa-choice-group=\"${entry.choice}\"]`);\n        const product = this.products[entry.product];\n        const excerpt = guideExcerpt(source, entry);\n        if (!group || !product?.variantId || !product.image || !excerpt) return;\n        const button = document.createElement(\"button\");\n        button.type = \"button\";\n        button.className = \"mspa-wall-guide-trigger\";\n        button.setAttribute(\"data-mspa-boston-guide\", entry.choice);\n        button.setAttribute(\"aria-haspopup\", \"dialog\");\n        button.setAttribute(\"aria-label\", `${entry.label}: se montering for Boston`);\n        const image = document.createElement(\"img\");\n        image.alt = \"\"; image.width = 72; image.height = 72; image.loading = \"lazy\";\n        image.addEventListener(\"error\", () => button.remove(), { once: true });\n        image.src = product.image;\n        const caption = document.createElement(\"span\");\n        const label = document.createElement(\"strong\"); label.textContent = entry.label;\n        const action = document.createElement(\"span\"); action.textContent = \"Se montering \u2013 Boston\";\n        caption.append(label, action); button.append(image, caption);\n        button.addEventListener(\"click\", (event) => {\n          event.preventDefault(); event.stopPropagation();\n          openGuideDialog(button, excerpt, source);\n        });\n        group.append(button);\n      });\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-boston.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: \"measure\",\n          label: \"M\u00E5l p\u00E5 muren\",\n          components: [\n            {\n              type: \"field\",\n              id: \"mspa-boston-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-boston-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` }))\n              ]\n            }\n          ]\n        },\n        {\n          id: \"wallType\",\n          label: \"Hvordan skal muren bygges?\",\n          components: [\n            {\n              type: \"choicegroup\",\n              name: \"wallType\",\n              options: [\n                { value: \"loddrett\", label: this.config.loddrettLabel, hint: this.config.loddrettText },\n                { value: \"hellende\", label: this.config.hellendeLabel, hint: this.config.hellendeText }\n              ],\n              info: \"Samme blokker og l\u00E5seknotter brukes. Knottenes plassering bestemmer murens helling.\",\n              choiceStatus: {\n                text: \"Velg hvordan muren skal bygges.\",\n                values: {\n                  loddrett: `Valgt: ${this.config.loddrettLabel}.`,\n                  hellende: `Valgt: ${this.config.hellendeLabel}.`\n                }\n              }\n            },\n            { type: \"notice\", name: \"loddrett-height-warning\", text: \"\" }\n          ]\n        },\n        {\n          id: \"corner\",\n          label: this.config.cornerTitle,\n          components: [\n            {\n              type: \"choicegroup\",\n              name: \"corner\",\n              options: [\n                { value: \"yes\", label: this.config.yes },\n                { value: \"no\", label: this.config.no }\n              ],\n              choiceStatus: {\n                text: \"Skal muren ha utvendige hj\u00F8rner?\",\n                values: {\n                  yes: \"Valgt: legg til utvendig hj\u00F8rne.\",\n                  no: \"Valgt: uten utvendig hj\u00F8rne.\"\n                }\n              },\n              info: \"Et utvendig hj\u00F8rne er et hj\u00F8rne som vender utover. Velg ja og oppgi antallet. Vi legger til hj\u00F8rneblokker etter murens h\u00F8yde.\"\n            },\n            {\n              type: \"select\",\n              id: \"mspa-boston-corner-count\",\n              name: \"cornerCount\",\n              label: \"Antall utvendige hj\u00F8rner\",\n              substepParent: \"corner\",\n              substepLabel: \"Velg antall hj\u00F8rner\",\n              options: [\n                { value: \"\", label: \"Velg antall\" },\n                ...[1, 2, 3, 4, 5].map((count) => ({ value: String(count), label: `${count}` }))\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: \"Endeblokker gir en ferdig avslutning der enden av muren blir synlig. Vi legger til hele og halve endeblokker i mengdeforslaget.\"\n            }\n          ]\n        },\n        {\n          id: \"geonett\",\n          label: \"Vil du ha med Geonett?\",\n          components: [\n            {\n              type: \"choicegroup\",\n              name: \"geonett\",\n              label: \"Vil du ha med Geonett?\",\n              options: [\n                { value: \"yes\", label: this.config.yes },\n                { value: \"no\", label: this.config.no }\n              ]\n            },\n            { type: \"notice\", name: \"geonett-calculation\", text: \"\" },\n            { type: \"notice\", name: \"loddrett-geonett-unavailable\", text: \"\" }\n          ]\n        },\n        {\n          id: \"pick\",\n          label: \"Velg deler og antall\",\n          components: [\n            {\n              type: \"pickMix\",\n              id: \"boston-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.geonettCalculation = scope.querySelector('[data-mspa-notice=\"geonett-calculation\"]');\n      this.els.geonettCalculation?.setAttribute(\"aria-live\", \"polite\");\n      this.els.loddrettChoice = scope.querySelector('[data-mspa-choice-group=\"wallType\"] [data-mspa-choice=\"loddrett\"]');\n      this.els.hellendeChoice = scope.querySelector('[data-mspa-choice-group=\"wallType\"] [data-mspa-choice=\"hellende\"]');\n      this.els.heightWarning = scope.querySelector('[data-mspa-notice=\"loddrett-height-warning\"]');\n      this.els.geonettUnavailable = scope.querySelector('[data-mspa-notice=\"loddrett-geonett-unavailable\"]');\n      this.els.heightWarning?.setAttribute(\"aria-live\", \"polite\");\n      if (this.els.geonettUnavailable) {\n        const message = document.createElement(\"span\");\n        message.textContent = \"Vi kan ikke beregne geonett for loddrett mur over 80 cm synlig h\u00F8yde. Vi anbefaler hellende mur.\";\n        const button = document.createElement(\"button\");\n        button.type = \"button\";\n        button.className = \"mspa-boston-switch\";\n        button.textContent = \"Endre til hellende mur\";\n        button.setAttribute(\"data-mspa-boston-switch\", \"\");\n        button.addEventListener(\"click\", () => this.switchToHellende());\n        this.els.geonettUnavailable.replaceChildren(message, button);\n        this.els.hellendeSwitch = button;\n      }\n\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.cornerCount = scope.querySelector('[data-mspa-select=\"cornerCount\"]');\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        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 = false;\n        this.state.typingField = \"lengthCm\";\n        this.resetAfter(\"length\");\n        this.render({ keepFocus: true });\n      });\n      this.els.length?.addEventListener(\"blur\", () => {\n        this.commitLength();\n      });\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      this.bindCommittedSelect(this.els.cornerCount, \"cornerCount\", \"corner\");\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    bindCommittedSelect(input, key, stepId) {\n      if (!input) return;\n      input.addEventListener(\"change\", () => {\n        this.state.counts[key] = intValue(input.value);\n        this.state.committed[key] = this.state.counts[key] > 0;\n        this.state.typingField = \"\";\n        this.state.editingStep = this.state.committed[key] ? \"\" : stepId;\n        this.clearAnswerReview();\n        this.render();\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    answerBackControls() {\n      const current = this.state.mode === \"calculate\" ? this.currentStep() : \"\";\n      return [\n        { group: \"corner\", active: current === \"corner\", details: [{ type: \"field\", name: \"cornerCount\" }], reviewing: this.state.answerReview === \"corner\", question: \"Skal muren ha utvendige hj\u00F8rner?\", onBack: () => this.reviewAnswer(\"corner\"), canContinue: !this.state.answerReview && this.state.answerEdit === \"corner\" && this.cornerComplete(), onContinue: () => this.continueReviewedAnswer(\"corner\") }\n      ];\n    }\n\n    clearAnswerReview() {\n      this.state.answerReview = \"\";\n      this.state.answerEdit = \"\";\n    }\n\n    reviewAnswer(group) {\n      const control = this.answerBackControls().find((item) => item.group === group);\n      if (!control?.active || this.state.choices[group] !== \"yes\") return;\n      const step = group;\n      this.state.answerReview = group;\n      this.state.answerEdit = group;\n      this.state.editingStep = step;\n      this.state.typingField = \"\";\n      this.state.errorMessage = \"\";\n      this.render();\n      this.focusCurrent();\n    }\n\n    continueReviewedAnswer(group) {\n      const control = this.answerBackControls().find((item) => item.group === group);\n      if (!control?.active || !control.canContinue) return;\n      this.clearAnswerReview();\n      this.state.editingStep = \"\";\n      this.state.typingField = \"\";\n      this.render();\n      this.focusCurrent();\n    }\n\n    applyReviewedAnswer(group, value) {\n      if (this.state.answerReview !== group || ![\"yes\", \"no\"].includes(value)) return false;\n      const step = group;\n      this.state.answerReview = \"\";\n      this.state.typingField = \"\";\n      this.state.errorMessage = \"\";\n      if (value === \"yes\") {\n        // Reopen the saved details; choosing Yes again is not a reset.\n        this.state.editingStep = step;\n        this.render();\n        this.focusCurrent();\n        return true;\n      }\n      this.state.choices[group] = \"no\";\n      if (group === \"corner\") {\n        this.state.counts.cornerCount = 0;\n        this.state.committed.cornerCount = false;\n        if (this.els.cornerCount) this.els.cornerCount.value = \"\";\n      }\n      this.clearAnswerReview();\n      this.state.editingStep = \"\";\n      this.render();\n      this.focusCurrent();\n      return true;\n    }\n\n    setChoice(group, value) {\n      if (group === \"wallType\" && this.loddrettHeightExceeded()) {\n        if (value === \"loddrett\") {\n          this.state.loddrettHeightConfirmedCm = this.state.heightCm;\n          this.state.editingStep = \"\";\n          this.state.typingField = \"\";\n          this.state.errorMessage = \"\";\n          this.render();\n          this.focusCurrent();\n          return;\n        }\n        if (value === \"hellende\") {\n          this.switchToHellende();\n          return;\n        }\n      }\n      if (group === \"geonett\" && this.loddrettHeightExceeded()) return;\n      if (this.applyReviewedAnswer(group, value)) return;\n      this.clearAnswerReview();\n      if (group === \"mode\") {\n        this.setMode(value);\n        return;\n      }\n      if (!(group in this.state.choices)) return;\n      if (value === \"__mspa_reset__\") {\n        this.resetChoice(group);\n        return;\n      }\n      this.state.errorMessage = \"\";\n      this.state.choices[group] = value;\n      this.state.typingField = \"\";\n      this.state.editingStep = \"\";\n\n      if (group === \"wallType\") this.resetAfter(\"wallType\");\n      if (group === \"end\") this.resetAfter(\"end\");\n      if (group === \"corner\") {\n        this.resetAfter(\"corner\");\n        this.state.counts.cornerCount = 0;\n        this.state.committed.cornerCount = false;\n        if (this.els.cornerCount) this.els.cornerCount.value = \"\";\n      }\n      this.render();\n      this.focusCurrent();\n    }\n\n    switchToHellende() {\n      this.clearAnswerReview();\n      this.state.choices.wallType = \"hellende\";\n      this.state.choices.geonett = \"\";\n      this.state.loddrettHeightConfirmedCm = 0;\n      this.state.editingStep = \"\";\n      this.state.typingField = \"\";\n      this.state.errorMessage = \"\";\n      this.render();\n      this.focusCurrent();\n    }\n\n    resetChoice(group) {\n      if (!(group in this.state.choices)) return;\n      this.state.errorMessage = \"\";\n      this.state.choices[group] = \"\";\n      this.state.typingField = \"\";\n      this.state.editingStep = group;\n      if (group === \"corner\") {\n        this.state.counts.cornerCount = 0;\n        this.state.committed.cornerCount = false;\n        if (this.els.cornerCount) this.els.cornerCount.value = \"\";\n        this.resetAfter(\"corner\");\n      }\n      this.render();\n      this.focusCurrent();\n    }\n\n    setMode(mode) {\n      this.clearAnswerReview();\n      if (![\"calculate\", \"pick\"].includes(mode)) return;\n      this.state.errorMessage = \"\";\n      if (this.state.mode !== mode) {\n        this.state.lengthCm = 0;\n        this.state.lengthCommitted = false;\n        this.state.heightCm = 0;\n        this.state.loddrettHeightConfirmedCm = 0;\n        this.state.choices = {\n          wallType: \"\",\n          end: \"\",\n          corner: \"\",\n          geonett: \"\"\n        };\n        Object.keys(this.state.counts).forEach((key) => {\n          this.state.counts[key] = 0;\n        });\n        this.state.committed.cornerCount = false;\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    resetAfter(point) {\n      this.clearAnswerReview();\n      if (point === \"length\") {\n        this.state.heightCm = 0;\n        if (this.els.height) this.els.height.value = \"\";\n      }\n      if (point === \"length\" || point === \"height\") {\n        this.state.loddrettHeightConfirmedCm = 0;\n        this.state.choices.wallType = \"\";\n        this.resetAfter(\"wallType\");\n      }\n      if (point === \"wallType\") {\n        this.state.loddrettHeightConfirmedCm = 0;\n        this.state.choices.corner = \"\";\n        this.state.counts.cornerCount = 0;\n        this.state.committed.cornerCount = false;\n        this.resetAfter(\"corner\");\n      }\n      if (point === \"corner\") {\n        this.state.choices.end = \"\";\n        this.resetAfter(\"end\");\n      }\n      if (point === \"end\") {\n        this.state.choices.geonett = \"\";\n      }\n    }\n\n    editStep(id) {\n      this.clearAnswerReview();\n      if (id === \"length\" || id === \"height\") id = \"measure\";\n      if (this.loddrettConfirmationRequired() && ![\"measure\", \"wallType\"].includes(id)) id = \"wallType\";\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      if (this.state.answerReview) return this.els.scope.querySelector(`[data-mspa-choice-group=\"${this.state.answerReview}\"] [data-mspa-choice]`);\n      const step = this.currentStep();\n      if (step === \"measure\") return this.lengthComplete() ? this.els.height : this.els.length;\n      if (step === \"wallType\") return this.els.steps.wallType?.querySelector(\"[data-mspa-choice]\");\n      if (step === \"corner\") return this.state.choices.corner === \"yes\" ? this.els.cornerCount : this.els.steps.corner?.querySelector(\"[data-mspa-choice]\");\n      if (step === \"end\") return this.els.steps.end?.querySelector(\"[data-mspa-choice]\");\n      if (step === \"geonett\") return this.loddrettHeightExceeded() ? this.els.hellendeSwitch : this.els.steps.geonett?.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      if (this.els.cornerCount) this.els.cornerCount.value = clearAll ? \"\" : (this.state.counts.cornerCount || \"\");\n      Object.entries(this.els.pickInputs).forEach(([key, input]) => {\n        if (input) input.value = clearAll ? \"\" : (this.state.counts[key] || \"\");\n      });\n    }\n\n    wallType() {\n      return this.state.choices.wallType || \"\";\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        solebjelke: \"S\u00E5le\",\n        toppBlock: \"Topp\",\n        connector: \"Knott\",\n        cornerBlock: \"Hj\u00F8rne/ende\",\n        halfEndBlock: \"Halv ende\",\n        betonglim: \"Lim\",\n        fiberduk: \"Fiberduk\",\n        geonettSmall: \"Geonett\",\n        geonettLarge: \"Geonett\"\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 \"Lengden virker veldig kort. Har du skrevet meter i stedet for cm? 10 meter skrives som 1000.\";\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.lengthComplete() ? \"active\" : \"\"));\n      setState(this.els.cornerCount, this.state.committed.cornerCount ? \"complete\" : (current === \"corner\" && this.state.choices.corner === \"yes\" ? \"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      return this.state.lengthCommitted && this.state.lengthCm > 0;\n    }\n\n    heightComplete() {\n      return this.state.heightCm > 0;\n    }\n\n    measureComplete() {\n      return this.lengthComplete() && this.heightComplete();\n    }\n\n    wallTypeComplete() {\n      return (this.state.choices.wallType === \"loddrett\" || this.state.choices.wallType === \"hellende\") && !this.loddrettConfirmationRequired();\n    }\n\n    cornerComplete() {\n      return this.state.choices.corner === \"no\" || (\n        this.state.choices.corner === \"yes\" &&\n        this.state.counts.cornerCount > 0 &&\n        this.state.committed.cornerCount\n      );\n    }\n\n    geonettRelevant() {\n      if (!this.measureComplete() || !this.wallTypeComplete()) return false;\n      const rule = geonettRule(this.state.heightCm, this.wallType());\n      return Boolean(rule?.required && rule.layers && rule.embedM);\n    }\n\n    geonettComplete() {\n      if (!this.geonettRelevant()) return true;\n      return this.state.choices.geonett === \"yes\" || this.state.choices.geonett === \"no\";\n    }\n\n    loddrettHeightExceeded() {\n      return this.state.mode === \"calculate\" && this.wallType() === \"loddrett\" && visibleHeightCm(this.state.heightCm) > GEONETT_RULES.loddrett.maxRecommendedCm;\n    }\n\n    loddrettConfirmationRequired() {\n      return this.loddrettHeightExceeded() && this.state.loddrettHeightConfirmedCm !== this.state.heightCm;\n    }\n\n    heightLimitError() {\n      return this.loddrettHeightExceeded() ? \"Loddrett mur er anbefalt for maks 80 cm synlig h\u00F8yde.\" : \"\";\n    }\n\n    pickReady() {\n      return PICK_KEYS.some((key) => this.state.counts[key] > 0);\n    }\n\n    currentStep() {\n      if (this.loddrettConfirmationRequired() && this.state.editingStep !== \"measure\") return \"wallType\";\n      if (this.state.editingStep) return this.state.editingStep;\n      if (this.state.mode === \"pick\") return \"pick\";\n      if (!this.measureComplete()) return \"measure\";\n      if (!this.wallTypeComplete()) return \"wallType\";\n      if (!this.state.choices.corner || !this.cornerComplete()) return \"corner\";\n      if (!this.state.choices.end) return \"end\";\n      if (this.loddrettHeightExceeded() || (this.geonettRelevant() && (!this.state.choices.geonett || !this.geonettComplete()))) return \"geonett\";\n      return \"\";\n    }\n\n    stepComplete(step) {\n      if (step === \"measure\") return this.measureComplete();\n      if (step === \"wallType\") return this.wallTypeComplete();\n      if (step === \"corner\") return Boolean(this.state.choices.corner) && this.cornerComplete();\n      if (step === \"end\") return Boolean(this.state.choices.end);\n      if (step === \"geonett\") return this.geonettRelevant() && Boolean(this.state.choices.geonett) && this.geonettComplete();\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.measureComplete() &&\n        this.wallTypeComplete() &&\n        Boolean(this.state.choices.corner) &&\n        this.cornerComplete() &&\n        Boolean(this.state.choices.end) &&\n        this.geonettComplete() &&\n        !this.validationError();\n    }\n\n    shouldShowStep(step) {\n      if (this.state.mode === \"pick\") return step === \"pick\";\n      if (step === \"pick\") return false;\n      const current = this.currentStep();\n      if (!current) return false;\n      return step === current;\n    }\n\n    stepOrder() {\n      const order = [\"measure\", \"wallType\", \"corner\", \"end\"];\n      if (this.geonettRelevant() || this.loddrettHeightExceeded()) order.push(\"geonett\");\n      return order;\n    }\n\n    stepState(step) {\n      if (this.currentStep() === step) return \"active\";\n      return this.stepComplete(step) ? \"complete\" : \"idle\";\n    }\n\n    render(options = {}) {\n      if (!this.rendered) return;\n      if (this.loddrettHeightExceeded()) this.state.choices.geonett = \"\";\n      const current = this.currentStep();\n      this.syncControlValues(false);\n      this.renderPrice();\n      this.renderModeControl();\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 ? \"Utvalget er klart. Legg i kurven.\" : \"\"),\n        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      this.renderHeightWarning();\n      this.renderGeonettCalculation();\n      this.renderConditionalControls();\n    }\n\n    renderHeightWarning() {\n      const blocked = this.loddrettHeightExceeded();\n      const button = this.els.loddrettChoice;\n      if (button) {\n        button.toggleAttribute(\"data-mspa-loddrett-height-warning\", blocked);\n        const label = button.querySelector(\"strong\");\n        if (label) label.textContent = blocked ? \"\u26A0 Fortsett med loddrett mur\" : this.config.loddrettLabel;\n      }\n      const label = this.els.hellendeChoice?.querySelector(\"strong\");\n      if (label) label.textContent = blocked ? \"Endre til hellende mur\" : this.config.hellendeLabel;\n      if (this.els.heightWarning) this.els.heightWarning.textContent = this.heightLimitError();\n      for (const node of [this.els.heightWarning, this.els.geonettUnavailable]) {\n        if (!node) continue;\n        node.hidden = !blocked;\n        node.setAttribute(\"aria-hidden\", blocked ? \"false\" : \"true\");\n      }\n      this.els.steps.geonett?.querySelectorAll(\"[data-mspa-choice]\").forEach(choice => { choice.disabled = blocked; });\n    }\n\n    geonettCalculationText() {\n      if (this.state.mode !== \"calculate\" || !this.geonettRelevant()) return null;\n      const quantities = this.calculateQuantities({ includeGeonett: true });\n      const info = quantities.geonettInfo;\n      if (!info) return null;\n      const lines = [];\n      const dimension = value => formatNumber(value, 2).replace(/,00$/, \"\").replace(/(,\\d)0$/, \"$1\");\n      for (const [key, roll] of [[\"geonettSmall\", GEONETT.small], [\"geonettLarge\", GEONETT.large]]) {\n        const count = quantities[key];\n        if (count) lines.push(`${formatNumber(count)} ${count === 1 ? \"rull\" : \"ruller\"} geonett \u00E0 ${dimension(roll.lengthM)} \u00D7 ${dimension(roll.widthM)} m`);\n      }\n      return {\n        title: \"Beregnet mengde iht. Benders sine anbefalinger:\",\n        lines,\n        basis: `Beregnet for ${formatNumber(info.layers)} lag geonett, med ${formatNumber(info.embedM * 100)} cm lengde per lag, fra muren og bakover i terrenget.`\n      };\n    }\n\n    renderGeonettCalculation() {\n      const node = this.els.geonettCalculation;\n      if (!node) return;\n      const result = this.currentStep() === \"geonett\" ? this.geonettCalculationText() : null;\n      const text = result ? [result.title, ...result.lines, result.basis].join(\"\\n\") : \"\";\n      if (node.getAttribute(\"data-calculation-text\") !== text) {\n        node.replaceChildren();\n        if (result) {\n          const title = document.createElement(\"strong\");\n          title.textContent = result.title;\n          const quantities = document.createElement(\"span\");\n          result.lines.forEach((line, index) => {\n            if (index) quantities.append(document.createElement(\"br\"));\n            quantities.append(document.createTextNode(line));\n          });\n          const basis = document.createElement(\"span\");\n          basis.textContent = result.basis;\n          node.append(title, quantities, basis);\n        }\n        node.setAttribute(\"data-calculation-text\", text);\n      }\n      node.hidden = !result;\n      node.setAttribute(\"aria-hidden\", result ? \"false\" : \"true\");\n    }\n\n    renderModeControl() {\n      if (!this.els.modeSwitch) return;\n      this.els.modeSwitch.hidden = false;\n      this.els.modeSwitch.setAttribute(\"aria-hidden\", \"false\");\n      this.setChoiceGroup(\"mode\", this.state.mode);\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 * PRICE_M2_FACTOR) : cents;\n      const activeCompareCents = this.state.priceMode === \"m2\" ? Math.round(compareCents * PRICE_M2_FACTOR) : 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      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.stepState(id);\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(\"cornerCount\", this.state.choices.corner !== \"yes\");\n      if (this.els.status) this.els.status.hidden = true;\n      this.api.syncAnswerBackControls?.(this.els.scope, this.answerBackControls());\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 === \"measure\") return this.lengthComplete() ? this.config.actionHeight : this.config.actionLength;\n      if (current === \"wallType\") return this.config.actionType;\n      if (current === \"corner\" && this.state.choices.corner === \"yes\" && !this.state.committed.cornerCount) return \"Velg antall hj\u00F8rner\";\n      if (current === \"corner\") return \"Skal muren ha utvendige hj\u00F8rner?\";\n      if (current === \"end\") return \"Skal muren ha synlige ender?\";\n      if (current === \"geonett\") return \"Vil du ha med Geonett?\";\n      return this.config.actionIncomplete;\n    }\n\n    validationText(current, ready) {\n      const withHeightAdvisory = (message) => {\n        const advisory = this.heightLimitError();\n        return advisory ? `${message ? `${message} ` : \"\"}${advisory}` : message;\n      };\n      if (ready) return withHeightAdvisory(\"\");\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 === \"measure\" && !this.lengthComplete() && !this.heightComplete()) return \"Skriv inn lengde og velg h\u00F8yde.\";\n      if (current === \"measure\" && !this.lengthComplete()) return this.config.progressLength;\n      if (current === \"measure\" && !this.heightComplete()) return this.config.progressHeight;\n      if (current === \"wallType\") return withHeightAdvisory(this.config.walltypeMessage);\n      if (current === \"corner\" && this.state.choices.corner === \"yes\") return withHeightAdvisory(\"Velg antall hj\u00F8rner.\");\n      if (current === \"geonett\") return withHeightAdvisory(\"Velg om geonett skal beregnes.\");\n      return withHeightAdvisory(\"Fullf\u00F8r valgene for \u00E5 legge i kurven.\");\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: disabled || (this.loddrettConfirmationRequired() && ![\"measure\", \"wallType\"].includes(id))\n        });\n      };\n      if (this.state.mode === \"pick\") {\n        add(\"pick\", \"Varianter\", true, false);\n        return steps;\n      }\n      add(\"measure\", \"M\u00E5l\", true, false);\n      add(\"wallType\", \"Type\", true, !this.measureComplete());\n      add(\"corner\", \"Hj\u00F8rne\", true, !this.wallTypeComplete());\n      add(\"end\", \"Ende\", true, !this.stepComplete(\"corner\"));\n      add(\"geonett\", \"Geonett\", this.geonettRelevant() || this.loddrettHeightExceeded(), !this.stepComplete(\"end\"));\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(options = {}) {\n      const lengthCm = Math.max(0, intValue(this.state.lengthCm));\n      const heightCm = Math.max(0, intValue(this.state.heightCm));\n      const wallType = this.wallType();\n      if (!lengthCm || !heightCm || !wallType) return {};\n      const lengthM = lengthCm / 100;\n      const shifts = Math.max(1, Math.floor(heightCm / BLOCK_HEIGHT_CM));\n      const blocksPerShift = Math.ceil(lengthM * BLOCKS_PER_METER);\n      const normalBlock = blocksPerShift * shifts;\n      const toppBlock = shifts > 0 ? blocksPerShift : 0;\n      const connector = 2 * (normalBlock + toppBlock);\n      const solebjelke = Math.ceil(lengthM);\n      let halfEndBlock = 0;\n      let cornerBlock = 0;\n      let cornerCount = 0;\n      if (this.state.choices.end === \"yes\") {\n        halfEndBlock = Math.ceil(Math.max(shifts - 1, 0) / 2) * 2;\n        cornerBlock += Math.max(shifts - 1, 0);\n      }\n      if (this.state.choices.corner === \"yes\") {\n        cornerCount = Math.max(1, intValue(this.state.counts.cornerCount));\n        cornerBlock += shifts * cornerCount;\n      }\n\n      const quantities = {\n        normalBlock,\n        solebjelke,\n        toppBlock,\n        connector,\n        cornerBlock,\n        halfEndBlock,\n        betonglim: heightCm >= 30 ? Math.ceil(lengthM / 8) : 0,\n        fiberduk: heightCm >= 30 ? Math.ceil(lengthM / 25) : 0,\n        geonettSmall: 0,\n        geonettLarge: 0\n      };\n\n      if (this.state.choices.geonett === \"yes\" || options.includeGeonett) {\n        const rule = geonettRule(heightCm, wallType);\n        if (rule?.required && rule.layers && rule.embedM) {\n          const totalLengthM = rule.layers * lengthM;\n          const mix = optimizeRolls(lengthCm, rule.layers, Math.round(rule.embedM * 100), this.products);\n          quantities.geonettSmall = mix.geonettSmall || 0;\n          quantities.geonettLarge = mix.geonettLarge || 0;\n          quantities.geonettInfo = { layers: rule.layers, embedM: rule.embedM, totalLengthM, scenario: rule.scenario };\n        }\n      }\n\n      return quantities;\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\" ? \"Boston plukkliste\" : \"Boston beregning\",\n          subtitle: this.intentSubtitle(lines),\n          estimatedTotal: formatMoney(totalCents),\n          status: \"Legger Boston 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: \"boston\",\n          mode: this.state.mode,\n          lengthCm: this.state.lengthCm,\n          lengthM,\n          heightCm: this.state.heightCm,\n          wallType: this.wallType(),\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-boston\",\n          version: VERSION,\n          mode: this.state.mode,\n          lengthCm: this.state.lengthCm,\n          heightCm: this.state.heightCm,\n          wallType: this.wallType(),\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-boston\",\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_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.wallType(),\n          _ms_mode: this.state.mode\n        }\n      };\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-boston\"\n      };\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      const type = this.wallType() === \"hellende\" ? this.config.hellendeLabel : this.config.loddrettLabel;\n      return `${type}, ${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-boston\", context: context || {} }\n        }));\n        if (!this.isQuickShop()) {\n          document.dispatchEvent(new CustomEvent(\"ms:cart:open-request\", {\n            bubbles: true,\n            detail: { source: \"mspa-boston\" }\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.mspaBostonBound === \"true\") return;\n      root.dataset.mspaBostonBound = \"true\";\n      new MspaBoston(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": ["label"]
}
