{
  "version": 3,
  "sources": ["/cdn/shop/t/32/assets/lux-double-design-studio.js?lux_v=20260726_cart_quantity_polish_v36"],
  "sourcesContent": ["/**\r\n * LUXWORLD Design Studio\u2122 \u2014 Double Curtain Builder V5\r\n * Production journey and pricing engine for sections/lux-double-design-studio.liquid.\r\n * @version 5.0.0\r\n */\r\n(() => {\r\n  /* =====================================================================\r\n     01. FILE HEADER AND STRICT MODE\r\n     ===================================================================== */\r\n\r\n  \"use strict\";\r\n\r\n  /* =====================================================================\r\n     02. CONSTANTS AND ENUMS\r\n     ===================================================================== */\r\n\r\n  const VERSION = \"5.0.0\";\r\n  const ROOT_ID = \"luxDoubleDesignStudioV5\";\r\n  const DATA_ID = \"LuxDoubleDesignStudioV5Data\";\r\n  const STORAGE_KEY = \"luxworld_double_studio_v5_project\";\r\n  const PRICING_ERROR =\r\n    \"Pricing is temporarily unavailable for this selection. Please choose another option or contact LUXWORLD.\";\r\n\r\n  const STAGES = Object.freeze({\r\n    ENTRY: \"entry\",\r\n    WHOLE_HOME_PLANNER: \"whole-home-planner\",\r\n    FABRIC_SELECTION: \"fabric-selection\",\r\n    MEASUREMENTS: \"measurements\",\r\n    WINDOW_CONFIGURATION: \"window-configuration\",\r\n    WINDOW_REVIEW: \"window-review\",\r\n    PROJECT_REVIEW: \"project-review\"\r\n  });\r\n\r\n  const MODES = Object.freeze({ SINGLE: \"single\", WHOLE_HOME: \"whole-home\" });\r\n  const STATUS = Object.freeze({\r\n    PLANNED: \"planned\",\r\n    ACTIVE: \"active\",\r\n    COMPLETE: \"complete\",\r\n    ERROR: \"error\"\r\n  });\r\n\r\n  const OPTION_LABELS = Object.freeze({\r\n    heading: {\r\n      \"s-wave\": \"S-Wave Fold\",\r\n      \"double-pinch\": \"Double Pinch Pleat\",\r\n      \"triple-pinch\": \"Triple Pinch Pleat\"\r\n    },\r\n    supply: {\r\n      \"curtain-only\": \"Curtains Only\",\r\n      \"manual-double-track\": \"Manual Double Track\",\r\n      \"motorised-double-track\": \"Motorised Double Track\",\r\n      \"led-motorised-double-track\": \"Motorised Double Track with LED\"\r\n    },\r\n    trackColour: { white: \"White\", black: \"Black\", platinum: \"Platinum\" },\r\n    opening: {\r\n      centre: \"Centre Opening\",\r\n      left: \"Left Stack\",\r\n      right: \"Right Stack\",\r\n      free: \"Free Hanging\"\r\n    },\r\n    fixing: { ceiling: \"Ceiling Mounted\", wall: \"Wall Mounted\" },\r\n    finish: {\r\n      \"off-floor\": \"Slightly Off Floor\",\r\n      puddle: \"Puddle\"\r\n    },\r\n    trackBending: {\r\n      none: \"Straight Track\",\r\n      bay: \"Bay Window\",\r\n      corner: \"Corner Window\",\r\n      curved: \"Curved Window\"\r\n    }\r\n  });\r\n\r\n  const HOUSE_PRESETS = Object.freeze([\r\n    { name: \"Studio / Apartment\", rooms: { \"Living Room\": 1, \"Master Bedroom\": 1 } },\r\n    {\r\n      name: \"2 Bedroom Home\",\r\n      rooms: { \"Living Room\": 1, \"Dining Room\": 1, \"Master Bedroom\": 1, \"Bedroom 1\": 1 }\r\n    },\r\n    {\r\n      name: \"3 Bedroom Home\",\r\n      rooms: {\r\n        \"Living Room\": 1,\r\n        \"Dining Room\": 1,\r\n        \"Master Bedroom\": 1,\r\n        \"Bedroom 1\": 1,\r\n        \"Bedroom 2\": 1\r\n      }\r\n    },\r\n    {\r\n      name: \"4 Bedroom Home\",\r\n      rooms: {\r\n        \"Living Room\": 1,\r\n        \"Dining Room\": 1,\r\n        \"Master Bedroom\": 1,\r\n        \"Bedroom 1\": 1,\r\n        \"Bedroom 2\": 1,\r\n        \"Bedroom 3\": 1\r\n      }\r\n    }\r\n  ]);\r\n\r\n  const REQUIRED_DOM = Object.freeze([\r\n    \"luxV5Loading\",\r\n    \"luxV5FatalError\",\r\n    \"luxV5FatalErrorMessage\",\r\n    \"luxV5Application\",\r\n    \"luxV5Entry\",\r\n    \"luxV5Planner\",\r\n    \"luxV5JourneyHeader\",\r\n    \"luxV5Progress\",\r\n    \"luxV5Workspace\",\r\n    \"luxV5FabricLookStage\",\r\n    \"luxV5MeasurementStage\",\r\n    \"luxV5ConfigurationStage\",\r\n    \"luxV5WindowReviewStage\",\r\n    \"luxV5ProjectReviewStage\",\r\n    \"luxV5SheerCollections\",\r\n    \"luxV5SheerProduct\",\r\n    \"luxV5SheerVariants\",\r\n    \"luxV5BlackoutCollections\",\r\n    \"luxV5BlackoutProduct\",\r\n    \"luxV5BlackoutVariants\",\r\n    \"luxV5Width\",\r\n    \"luxV5Drop\",\r\n    \"luxV5Sidebar\",\r\n    \"luxV5CheckoutButton\"\r\n  ]);\r\n\r\n  /* =====================================================================\r\n     03. CONFIGURATION\r\n     ===================================================================== */\r\n\r\n  let config = null;\r\n  let catalog = null;\r\n  let dom = null;\r\n  let state = null;\r\n  let pricingProvider = null;\r\n  let initialised = false;\r\n  let lastFocusedElement = null;\r\n  let inputFrame = 0;\r\n\r\n  /* =====================================================================\r\n     04. UTILITIES\r\n     ===================================================================== */\r\n\r\n  const toNumber = (value, fallback = 0) => {\r\n    const parsed = Number(value);\r\n    return Number.isFinite(parsed) ? parsed : fallback;\r\n  };\r\n\r\n  const clamp = (value, minimum, maximum) =>\r\n    Math.min(maximum, Math.max(minimum, toNumber(value)));\r\n\r\n  const roundMoney = value => Math.round((toNumber(value) + Number.EPSILON) * 100) / 100;\r\n  const roundUpDollar = value => Math.ceil(Math.max(0, toNumber(value)));\r\n  const positive = value => Number.isFinite(Number(value)) && Number(value) > 0;\r\n  const deepCopy = value => JSON.parse(JSON.stringify(value));\r\n  const idString = value => (value === null || value === undefined ? \"\" : String(value));\r\n  const uid = prefix =>\r\n    `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n  const cleanText = (value, limit = 1000) =>\r\n    String(value ?? \"\")\r\n      .replace(/[\\u0000-\\u001f\\u007f]/g, \" \")\r\n      .replace(/\\s+/g, \" \")\r\n      .trim()\r\n      .slice(0, limit);\r\n\r\n  const money = value => {\r\n    if (!Number.isFinite(Number(value)) || Number(value) < 0) return \"Unavailable\";\r\n    try {\r\n      return new Intl.NumberFormat(config?.locale || \"en-AU\", {\r\n        style: \"currency\",\r\n        currency: config?.currencyCode || \"AUD\",\r\n        minimumFractionDigits: 0,\r\n        maximumFractionDigits: 0\r\n      }).format(roundUpDollar(value));\r\n    } catch (_) {\r\n      return `$${roundUpDollar(value)}`;\r\n    }\r\n  };\r\n\r\n  const savedTimeLabel = value => {\r\n    const date = value ? new Date(value) : new Date();\r\n    if (Number.isNaN(date.getTime())) return \"Saved\";\r\n    return `Saved ${date.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })}`;\r\n  };\r\n\r\n  const element = (tag, className, text) => {\r\n    const node = document.createElement(tag);\r\n    if (className) node.className = className;\r\n    if (text !== undefined) node.textContent = text;\r\n    return node;\r\n  };\r\n\r\n  const clear = node => {\r\n    if (node) node.replaceChildren();\r\n    return node;\r\n  };\r\n\r\n  const setHidden = (node, hidden) => {\r\n    if (!node) return;\r\n    node.hidden = Boolean(hidden);\r\n    node.setAttribute(\"aria-hidden\", hidden ? \"true\" : \"false\");\r\n  };\r\n\r\n  const setAction = (node, action, value) => {\r\n    node.dataset.v5Action = action;\r\n    if (value !== undefined) node.dataset.v5Value = String(value);\r\n    return node;\r\n  };\r\n\r\n  const debounceInputPricing = () => {\r\n    cancelAnimationFrame(inputFrame);\r\n    inputFrame = requestAnimationFrame(() => {\r\n      recalculate();\r\n      if (state.journey.stage === STAGES.MEASUREMENTS) {\r\n        updateMeasurementValidation();\r\n        renderMeasurementPricePanel();\r\n      }\r\n      renderSidebar();\r\n      updatePrimaryAction();\r\n    });\r\n  };\r\n\r\n  const announce = (message, kind = \"status\") => {\r\n    if (!dom?.announcement) return;\r\n    dom.announcement.textContent = message;\r\n    dom.announcement.classList.toggle(\"has-error\", kind === \"error\");\r\n  };\r\n\r\n  const themeHeaderOffset = () => {\r\n    const themeHeaderGroup = document.querySelector(\r\n      \".shopify-section-group-header-group, [data-header-group]\"\r\n    );\r\n    let headerOffset = 0;\r\n    if (themeHeaderGroup && !dom.root.contains(themeHeaderGroup)) {\r\n      const style = window.getComputedStyle(themeHeaderGroup);\r\n      const rect = themeHeaderGroup.getBoundingClientRect();\r\n      if (style.display !== \"none\" && style.visibility !== \"hidden\") {\r\n        headerOffset = Math.min(rect.height, 360);\r\n      }\r\n    }\r\n    if (headerOffset) return headerOffset;\r\n    return [\r\n      ...document.querySelectorAll(\r\n        \"header, [role='banner'], #shopify-section-header, .header-wrapper, .announcement-bar\"\r\n      )\r\n    ].reduce((maximum, node) => {\r\n      if (dom.root.contains(node)) return maximum;\r\n      const style = window.getComputedStyle(node);\r\n      const rect = node.getBoundingClientRect();\r\n      const visibleAtTop =\r\n        style.display !== \"none\" &&\r\n        style.visibility !== \"hidden\" &&\r\n        rect.top <= 4 &&\r\n        rect.bottom > 0 &&\r\n        rect.bottom <= 360;\r\n      return visibleAtTop ? Math.max(maximum, rect.bottom) : maximum;\r\n    }, 0);\r\n  };\r\n\r\n  const scrollStageIntoView = () => {\r\n    const active = dom.root.querySelector(\".lux-v5-stage:not([hidden]), .lux-v5-planner:not([hidden])\");\r\n    if (!active) return;\r\n    const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\r\n    const alignBuilderTop = behavior => {\r\n      const rootTop = dom.root.getBoundingClientRect().top + window.scrollY;\r\n      window.scrollTo({\r\n        top: Math.max(0, rootTop - themeHeaderOffset()),\r\n        behavior\r\n      });\r\n    };\r\n    alignBuilderTop(reducedMotion ? \"auto\" : \"smooth\");\r\n    // Recheck once the theme has completed any hide/show header animation.\r\n    window.setTimeout(() => alignBuilderTop(\"auto\"), reducedMotion ? 50 : 320);\r\n  };\r\n\r\n  /* =====================================================================\r\n     05. DOM REGISTRY\r\n     ===================================================================== */\r\n\r\n  const createDomRegistry = root => {\r\n    const get = id => root.querySelector(`#${id}`);\r\n    const registry = {\r\n      root,\r\n      data: root.querySelector(`#${DATA_ID}`),\r\n      loading: get(\"luxV5Loading\"),\r\n      fatal: get(\"luxV5FatalError\"),\r\n      fatalMessage: get(\"luxV5FatalErrorMessage\"),\r\n      application: get(\"luxV5Application\"),\r\n      announcement: get(\"luxV5Announcement\"),\r\n      entry: get(\"luxV5Entry\"),\r\n      planner: get(\"luxV5Planner\"),\r\n      journeyHeader: get(\"luxV5JourneyHeader\"),\r\n      journeyLabel: get(\"luxV5JourneyLabel\"),\r\n      journeySummary: get(\"luxV5JourneySummary\"),\r\n      progress: get(\"luxV5Progress\"),\r\n      windowNavigator: get(\"luxV5WindowNavigator\"),\r\n      workspace: get(\"luxV5Workspace\"),\r\n      stages: {\r\n        fabric: get(\"luxV5FabricLookStage\"),\r\n        measurements: get(\"luxV5MeasurementStage\"),\r\n        configuration: get(\"luxV5ConfigurationStage\"),\r\n        windowReview: get(\"luxV5WindowReviewStage\"),\r\n        projectReview: get(\"luxV5ProjectReviewStage\")\r\n      },\r\n      presets: get(\"luxV5HousePresets\"),\r\n      roomSelector: get(\"luxV5RoomSelector\"),\r\n      plannedWindows: get(\"luxV5PlannedWindows\"),\r\n      beginWholeHome: get(\"luxV5BeginWholeHome\"),\r\n      collections: {\r\n        sheer: get(\"luxV5SheerCollections\"),\r\n        blackout: get(\"luxV5BlackoutCollections\")\r\n      },\r\n      products: {\r\n        sheer: get(\"luxV5SheerProduct\"),\r\n        blackout: get(\"luxV5BlackoutProduct\")\r\n      },\r\n      variants: {\r\n        sheer: get(\"luxV5SheerVariants\"),\r\n        blackout: get(\"luxV5BlackoutVariants\")\r\n      },\r\n      roomPills: get(\"luxV5RoomPills\"),\r\n      customRoomField: get(\"luxV5CustomRoomField\"),\r\n      customRoom: get(\"luxV5CustomRoom\"),\r\n      width: get(\"luxV5Width\"),\r\n      drop: get(\"luxV5Drop\"),\r\n      measurementValidation: get(\"luxV5MeasurementValidation\"),\r\n      activeWindowTitle: get(\"luxV5ActiveWindowTitle\"),\r\n      configSections: {\r\n        heading: get(\"luxV5HeadingSection\"),\r\n        supply: get(\"luxV5SupplySection\"),\r\n        opening: get(\"luxV5OpeningSection\"),\r\n        fixing: get(\"luxV5FixingSection\"),\r\n        finish: get(\"luxV5FinishSection\"),\r\n        trackBending: get(\"luxV5TrackBendingSection\"),\r\n        pelmet: get(\"luxV5PelmetSection\"),\r\n        notes: get(\"luxV5NotesSection\")\r\n      },\r\n      configurationTitle: get(\"luxV5ConfigurationTitle\"),\r\n      windowReview: get(\"luxV5WindowReview\"),\r\n      projectReview: get(\"luxV5ProjectReview\"),\r\n      sidebar: get(\"luxV5Sidebar\"),\r\n      activePreview: get(\"luxV5ActiveWindowPreview\"),\r\n      sheerPreview: get(\"luxV5SheerPreview\"),\r\n      blackoutPreview: get(\"luxV5BlackoutPreview\"),\r\n      activeWindowPrice: get(\"luxV5ActiveWindowPrice\"),\r\n      currentSummary: get(\"luxV5CurrentSummary\"),\r\n      savedWindows: get(\"luxV5SavedWindows\"),\r\n      windowCount: get(\"luxV5ProjectWindowCount\"),\r\n      projectTotal: get(\"luxV5ProjectTotal\"),\r\n      projectTotals: get(\"luxV5ProjectTotals\"),\r\n      desktopSavings: get(\"luxV5DesktopSavings\"),\r\n      promotionProgress: get(\"luxV5PromotionProgress\"),\r\n      projectStatus: get(\"luxV5ProjectStatus\"),\r\n      addWindow: get(\"luxV5AddWindow\"),\r\n      checkoutConfirmation: get(\"luxV5CheckoutConfirmation\"),\r\n      checkoutButton: get(\"luxV5CheckoutButton\"),\r\n      clearProject: get(\"luxV5ClearProject\"),\r\n      saveStatus: get(\"luxV5SaveStatus\"),\r\n      mobileBar: get(\"luxV5MobileBar\"),\r\n      mobilePrimary: get(\"luxV5MobilePrimary\"),\r\n      mobileTotal: get(\"luxV5MobileTotal\"),\r\n      mobileProject: get(\"luxV5MobileProject\"),\r\n      drawer: get(\"luxV5ProjectDrawer\"),\r\n      drawerContent: get(\"luxV5DrawerContent\"),\r\n      modals: {\r\n        fabric: get(\"luxV5FabricModal\"),\r\n        bending: get(\"luxV5BendingModal\"),\r\n        confirm: get(\"luxV5ConfirmModal\")\r\n      },\r\n      modalContents: {\r\n        fabric: get(\"luxV5FabricModalContent\"),\r\n        bending: get(\"luxV5BendingModalContent\"),\r\n        confirm: get(\"luxV5ConfirmModalContent\")\r\n      }\r\n    };\r\n    const missing = REQUIRED_DOM.filter(id => !get(id));\r\n    if (missing.length) throw new Error(`Missing required V5 elements: ${missing.join(\", \")}`);\r\n    return registry;\r\n  };\r\n\r\n  /* =====================================================================\r\n     06. EVENT BUS\r\n     ===================================================================== */\r\n\r\n  const eventBus = (() => {\r\n    const listeners = new Map();\r\n    return Object.freeze({\r\n      on(name, listener) {\r\n        if (!listeners.has(name)) listeners.set(name, new Set());\r\n        listeners.get(name).add(listener);\r\n        return () => listeners.get(name)?.delete(listener);\r\n      },\r\n      emit(name, detail) {\r\n        listeners.get(name)?.forEach(listener => listener(detail));\r\n      }\r\n    });\r\n  })();\r\n\r\n  /* =====================================================================\r\n     07. STATE FACTORY\r\n     ===================================================================== */\r\n\r\n  const blankFabric = layer => ({\r\n    layer,\r\n    collectionId: \"\",\r\n    collectionHandle: \"\",\r\n    collectionTitle: \"\",\r\n    collectionImage: \"\",\r\n    collectionDiscountPercent: 0,\r\n    productId: \"\",\r\n    productHandle: \"\",\r\n    productTitle: \"\",\r\n    productImage: \"\",\r\n    variantId: \"\",\r\n    variantTitle: \"\",\r\n    variantSku: \"\",\r\n    variantImage: \"\",\r\n    pricingReference: null,\r\n    promotionPercent: 0,\r\n    maximumDropMm: 0,\r\n    fabricWidth: \"\",\r\n    fabricComposition: \"\",\r\n    description: \"\",\r\n    confirmed: false\r\n  });\r\n\r\n  const blankBending = () => ({\r\n    confirmed: true,\r\n    a: 0,\r\n    b: 0,\r\n    c: 0,\r\n    chord: 0,\r\n    depth: 0,\r\n    notes: \"\"\r\n  });\r\n\r\n  const blankWindow = (overrides = {}) => ({\r\n    id: uid(\"window\"),\r\n    plannedWindowId: null,\r\n    roomPreset: \"\",\r\n    customRoomName: \"\",\r\n    displayName: \"\",\r\n    roomName: \"\",\r\n    windowName: \"\",\r\n    widthMm: 0,\r\n    dropMm: 0,\r\n    sheer: blankFabric(\"sheer\"),\r\n    blackout: blankFabric(\"blackout\"),\r\n    heading: \"s-wave\",\r\n    // Tracks are optional. Start every fresh window as curtains-only so a\r\n    // track charge is added only after the customer explicitly selects one.\r\n    supply: \"curtain-only\",\r\n    supplyChoice: null,\r\n    trackColour: \"white\",\r\n    opening: \"centre\",\r\n    fixing: \"ceiling\",\r\n    finish: \"off-floor\",\r\n    trackBending: \"none\",\r\n    bendMeasurements: blankBending(),\r\n    pelmet: false,\r\n    pelmetChoice: null,\r\n    remote: false,\r\n    notes: \"\",\r\n    confirmation: false,\r\n    status: STATUS.PLANNED,\r\n    quote: null,\r\n    updatedAt: new Date().toISOString(),\r\n    ...deepCopy(overrides)\r\n  });\r\n\r\n  const createState = () => ({\r\n    version: VERSION,\r\n    runtime: { initialised: false, loading: true, fatalError: null },\r\n    journey: { mode: null, stage: STAGES.ENTRY, history: [] },\r\n    catalog: {\r\n      sheerCollections: [],\r\n      blackoutCollections: [],\r\n      collectionsById: {},\r\n      collectionsByHandle: {},\r\n      productsById: {},\r\n      productsByHandle: {},\r\n      variantsById: {}\r\n    },\r\n    planner: { selectedPreset: \"\", plannedWindows: [], activePlannedWindowId: null },\r\n    project: {\r\n      id: uid(\"project\"),\r\n      windows: [],\r\n      activeWindowId: null,\r\n      editingWindowId: null,\r\n      baseDesign: null,\r\n      confirmed: false\r\n    },\r\n    draft: { window: blankWindow() },\r\n    pricing: { draftQuote: null, projectQuote: null },\r\n    ui: {\r\n      mobileDrawerOpen: false,\r\n      activeModal: null,\r\n      busy: false,\r\n      configuringBase: false,\r\n      fabricReturnStage: null,\r\n      windowFlowStep: \"measurements\",\r\n      optionalRoomsExpanded: false,\r\n      completedWindowSteps: []\r\n    },\r\n    timestamps: { createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }\r\n  });\r\n\r\n  /* =====================================================================\r\n     08. STATE MANAGER\r\n     ===================================================================== */\r\n\r\n  /** Records a mutation, invalidates project confirmation and persists safely. */\r\n  const touchState = (persist = true) => {\r\n    state.timestamps.updatedAt = new Date().toISOString();\r\n    state.project.confirmed = false;\r\n    if (dom?.checkoutConfirmation) dom.checkoutConfirmation.checked = false;\r\n    if (persist) storage.save();\r\n    eventBus.emit(\"state:changed\", state);\r\n    if (dom?.mobilePrimary) updatePrimaryAction();\r\n  };\r\n\r\n  const replaceDraft = draft => {\r\n    const next = blankWindow(draft);\r\n    next.roomPreset = next.roomPreset || next.roomName;\r\n    next.displayName = next.displayName || next.windowName;\r\n    next.roomName = next.roomName || next.roomPreset;\r\n    next.windowName = next.windowName || next.displayName;\r\n    if (next.roomPreset === \"Custom Room\") {\r\n      next.customRoomName = next.customRoomName || next.windowName;\r\n    }\r\n    state.draft.window = next;\r\n    state.project.activeWindowId = state.draft.window.id;\r\n    state.ui.windowFlowStep = \"measurements\";\r\n    state.ui.completedWindowSteps = [];\r\n    syncInputs();\r\n    recalculate();\r\n  };\r\n\r\n  const invalidateDraftConfirmation = () => {\r\n    if (state?.draft?.window) state.draft.window.confirmation = false;\r\n  };\r\n\r\n  /* =====================================================================\r\n     09. SHOPIFY DATA ADAPTER\r\n     ===================================================================== */\r\n\r\n  const readShopifyData = () => {\r\n    const dataNode = document.getElementById(DATA_ID);\r\n    if (!dataNode) throw new Error(`Missing Shopify JSON block #${DATA_ID}.`);\r\n    let parsed;\r\n    try {\r\n      parsed = JSON.parse(dataNode.textContent);\r\n    } catch (error) {\r\n      throw new Error(`Invalid Shopify JSON configuration: ${error.message}`);\r\n    }\r\n    if (!parsed?.catalog || !parsed?.settings || !parsed?.routes) {\r\n      throw new Error(\"The V5 Shopify configuration is incomplete.\");\r\n    }\r\n    if (!parsed.currencyCode || !parsed.locale) {\r\n      throw new Error(\"Currency or locale is missing from the V5 configuration.\");\r\n    }\r\n    return parsed;\r\n  };\r\n\r\n  /* =====================================================================\r\n     10. CATALOG NORMALISER\r\n     ===================================================================== */\r\n\r\n  /**\r\n   * Filters and indexes the Shopify catalog without mutating the parsed\r\n   * Liquid payload.\r\n   */\r\n  const normaliseCatalog = data => {\r\n    const collectionsById = new Map();\r\n    const collectionsByHandle = new Map();\r\n    const productsById = new Map();\r\n    const productsByHandle = new Map();\r\n    const variantsById = new Map();\r\n\r\n    const normaliseLayer = (source, layer) =>\r\n      (Array.isArray(source) ? source : [])\r\n        .map(collection => {\r\n          const products = (Array.isArray(collection.products) ? collection.products : [])\r\n            .map(product => {\r\n              const variants = (Array.isArray(product.variants) ? product.variants : []).filter(\r\n                variant => variant.available && variant.id\r\n              );\r\n              if (!product.available || !variants.length) return null;\r\n              const canPrice = [\r\n                product.pricing?.baseSetPrice,\r\n                product.pricing?.shopifyPrice,\r\n                ...variants.map(variant => variant.price)\r\n              ].some(positive);\r\n              if (!canPrice) return null;\r\n              const copy = { ...product, variants, layer };\r\n              productsById.set(idString(copy.id), copy);\r\n              if (copy.handle) productsByHandle.set(String(copy.handle), copy);\r\n              variants.forEach(variant =>\r\n                variantsById.set(idString(variant.id), { ...variant, productId: copy.id, layer })\r\n              );\r\n              return copy;\r\n            })\r\n            .filter(Boolean);\r\n          if (!products.length) return null;\r\n          const copy = { ...collection, type: layer, products };\r\n          collectionsById.set(idString(copy.id), copy);\r\n          if (copy.handle) collectionsByHandle.set(String(copy.handle), copy);\r\n          return copy;\r\n        })\r\n        .filter(Boolean)\r\n        .sort(\r\n          (a, b) =>\r\n            toNumber(a.sortOrder, 999) - toNumber(b.sortOrder, 999) ||\r\n            String(a.title).localeCompare(String(b.title))\r\n        );\r\n\r\n    const sheer = normaliseLayer(data.catalog.sheerCollections, \"sheer\");\r\n    const blackout = normaliseLayer(data.catalog.blackoutCollections, \"blackout\");\r\n    if (!sheer.length) throw new Error(\"No available sheer collections were supplied by Shopify.\");\r\n    if (!blackout.length) throw new Error(\"No available blackout collections were supplied by Shopify.\");\r\n    return {\r\n      collections: { sheer, blackout },\r\n      collectionsById,\r\n      collectionsByHandle,\r\n      productsById,\r\n      productsByHandle,\r\n      variantsById\r\n    };\r\n  };\r\n\r\n  const attachCatalogState = target => {\r\n    target.catalog = {\r\n      sheerCollections: catalog.collections.sheer,\r\n      blackoutCollections: catalog.collections.blackout,\r\n      collectionsById: Object.fromEntries(catalog.collectionsById),\r\n      collectionsByHandle: Object.fromEntries(catalog.collectionsByHandle),\r\n      productsById: Object.fromEntries(catalog.productsById),\r\n      productsByHandle: Object.fromEntries(catalog.productsByHandle),\r\n      variantsById: Object.fromEntries(catalog.variantsById)\r\n    };\r\n  };\r\n\r\n  const collectionFor = (layer, id) =>\r\n    catalog.collections[layer].find(item => idString(item.id) === idString(id));\r\n\r\n  const productFor = id => catalog.productsById.get(idString(id));\r\n  const variantFor = id => catalog.variantsById.get(idString(id));\r\n\r\n  /* =====================================================================\r\n     11. STORAGE ADAPTER\r\n     ===================================================================== */\r\n\r\n  const storage = Object.freeze({\r\n    /**\r\n     * The current project intentionally remains page-session only. A browser\r\n     * refresh must always reopen a clean builder.\r\n     */\r\n    save() {\r\n      if (dom?.saveStatus) dom.saveStatus.textContent = \"In progress\";\r\n    },\r\n    /**\r\n     * Removes records created by earlier versions and starts clean.\r\n     */\r\n    load() {\r\n      try {\r\n        localStorage.removeItem(STORAGE_KEY);\r\n      } catch (_) {\r\n        /* Storage can be unavailable in private browsing. */\r\n      }\r\n      return null;\r\n    },\r\n    clear() {\r\n      try {\r\n        localStorage.removeItem(STORAGE_KEY);\r\n      } catch (_) {\r\n        /* Storage can be unavailable in private browsing. */\r\n      }\r\n    }\r\n  });\r\n\r\n  /* =====================================================================\r\n     12. JOURNEY ROUTER\r\n     ===================================================================== */\r\n\r\n  const stagesForMode = mode =>\r\n    mode === MODES.WHOLE_HOME\r\n      ? [\r\n          STAGES.WHOLE_HOME_PLANNER,\r\n          STAGES.FABRIC_SELECTION,\r\n          STAGES.MEASUREMENTS,\r\n          STAGES.WINDOW_CONFIGURATION,\r\n          STAGES.WINDOW_REVIEW,\r\n          STAGES.PROJECT_REVIEW\r\n        ]\r\n      : [\r\n          STAGES.FABRIC_SELECTION,\r\n          STAGES.MEASUREMENTS,\r\n          STAGES.WINDOW_CONFIGURATION,\r\n          STAGES.WINDOW_REVIEW,\r\n          STAGES.PROJECT_REVIEW\r\n        ];\r\n\r\n  /**\r\n   * Routes the single Liquid-owned application shell to one named V5 stage.\r\n   * @param {string} stage\r\n   * @param {{scroll?: boolean}} options\r\n   */\r\n  const routeTo = (stage, options = {}) => {\r\n    if (!Object.values(STAGES).includes(stage)) return;\r\n    if (state.journey.stage !== stage) state.journey.history.push(state.journey.stage);\r\n    state.journey.stage = stage;\r\n\r\n    setHidden(dom.entry, stage !== STAGES.ENTRY);\r\n    setHidden(dom.planner, stage !== STAGES.WHOLE_HOME_PLANNER);\r\n    const workspaceVisible = ![STAGES.ENTRY, STAGES.WHOLE_HOME_PLANNER].includes(stage);\r\n    setHidden(dom.workspace, !workspaceVisible);\r\n    setHidden(dom.journeyHeader, !workspaceVisible);\r\n    setHidden(dom.mobileBar, !workspaceVisible);\r\n    setHidden(dom.stages.fabric, stage !== STAGES.FABRIC_SELECTION);\r\n    setHidden(dom.stages.measurements, stage !== STAGES.MEASUREMENTS);\r\n    setHidden(dom.stages.configuration, stage !== STAGES.WINDOW_CONFIGURATION);\r\n    setHidden(dom.stages.windowReview, stage !== STAGES.WINDOW_REVIEW);\r\n    setHidden(dom.stages.projectReview, stage !== STAGES.PROJECT_REVIEW);\r\n\r\n    renderProgress();\r\n    renderStage();\r\n    updatePrimaryAction();\r\n    touchState();\r\n    if (options.scroll !== false) scrollStageIntoView();\r\n  };\r\n\r\n  const renderProgress = () => {\r\n    clear(dom.progress);\r\n    const stages =\r\n      state.journey.mode === MODES.WHOLE_HOME && state.ui.configuringBase\r\n        ? [\r\n            STAGES.WHOLE_HOME_PLANNER,\r\n            STAGES.FABRIC_SELECTION,\r\n            STAGES.WINDOW_CONFIGURATION,\r\n            STAGES.MEASUREMENTS,\r\n            STAGES.WINDOW_REVIEW,\r\n            STAGES.PROJECT_REVIEW\r\n          ]\r\n        : stagesForMode(state.journey.mode);\r\n    const currentIndex = stages.indexOf(state.journey.stage);\r\n    stages.forEach((stage, index) => {\r\n      const item = element(\"span\", \"lux-v5-progress__item\");\r\n      item.textContent = {\r\n        [STAGES.WHOLE_HOME_PLANNER]: \"Plan\",\r\n        [STAGES.FABRIC_SELECTION]: \"Fabrics\",\r\n        [STAGES.MEASUREMENTS]: \"Measure\",\r\n        [STAGES.WINDOW_CONFIGURATION]: state.ui.configuringBase ? \"Create Base Look\" : \"Configure\",\r\n        [STAGES.WINDOW_REVIEW]: \"Window Review\",\r\n        [STAGES.PROJECT_REVIEW]: \"Project Review\"\r\n      }[stage];\r\n      item.classList.toggle(\"is-active\", index === currentIndex);\r\n      item.classList.toggle(\"is-complete\", index < currentIndex);\r\n      if (index === currentIndex) item.setAttribute(\"aria-current\", \"step\");\r\n      dom.progress.append(item);\r\n    });\r\n  };\r\n\r\n  /* =====================================================================\r\n     13. ENTRY JOURNEY\r\n     ===================================================================== */\r\n\r\n  const selectJourney = mode => {\r\n    state = createState();\r\n    attachCatalogState(state);\r\n    state.runtime.initialised = true;\r\n    state.runtime.loading = false;\r\n    state.journey.mode = mode;\r\n    if (mode === MODES.SINGLE) {\r\n      const draft = blankWindow({ roomName: \"Living Room\", windowName: \"Living Room Window 1\" });\r\n      replaceDraft(draft);\r\n      routeTo(STAGES.FABRIC_SELECTION);\r\n    } else {\r\n      state.planner.plannedWindows = [];\r\n      routeTo(STAGES.WHOLE_HOME_PLANNER);\r\n      renderPlanner();\r\n    }\r\n    renderJourneyHeader();\r\n  };\r\n\r\n  const renderJourneyHeader = () => {\r\n    const whole = state.journey.mode === MODES.WHOLE_HOME;\r\n    if (dom.journeyLabel) dom.journeyLabel.textContent = whole ? \"WHOLE-HOME PROJECT\" : \"ONE WINDOW PROJECT\";\r\n    if (dom.journeySummary) {\r\n      const completed = state.planner.plannedWindows.filter(\r\n        item => item.status === STATUS.COMPLETE\r\n      ).length;\r\n      dom.journeySummary.textContent = whole\r\n        ? `${completed} of ${state.planner.plannedWindows.length} windows completed`\r\n        : \"Design your custom double curtains\";\r\n    }\r\n    renderWindowNavigator();\r\n  };\r\n\r\n  const renderWindowNavigator = () => {\r\n    if (!dom?.windowNavigator) return;\r\n    clear(dom.windowNavigator);\r\n    const plans = state.planner.plannedWindows || [];\r\n    const visible =\r\n      state.journey.mode === MODES.WHOLE_HOME &&\r\n      plans.length > 0 &&\r\n      !state.ui.configuringBase &&\r\n      ![STAGES.ENTRY, STAGES.WHOLE_HOME_PLANNER, STAGES.FABRIC_SELECTION].includes(\r\n        state.journey.stage\r\n      );\r\n    setHidden(dom.windowNavigator, !visible);\r\n    if (!visible) return;\r\n    plans.forEach((plan, index) => {\r\n      const button = setAction(\r\n        element(\"button\", `lux-v5-window-nav__item is-${plan.status}`),\r\n        \"jump-window\",\r\n        plan.id\r\n      );\r\n      button.type = \"button\";\r\n      button.classList.toggle(\"is-current\", plan.id === state.draft.window.plannedWindowId);\r\n      button.setAttribute(\r\n        \"aria-current\",\r\n        plan.id === state.draft.window.plannedWindowId ? \"step\" : \"false\"\r\n      );\r\n      const status =\r\n        plan.status === STATUS.COMPLETE\r\n          ? \"Complete\"\r\n          : plan.id === state.draft.window.plannedWindowId\r\n            ? \"In progress\"\r\n            : \"Not started\";\r\n      button.append(\r\n        element(\"span\", \"\", String(index + 1).padStart(2, \"0\")),\r\n        element(\"strong\", \"\", plan.windowName),\r\n        element(\"small\", \"\", status)\r\n      );\r\n      dom.windowNavigator.append(button);\r\n    });\r\n  };\r\n\r\n  /* =====================================================================\r\n     14. WHOLE-HOME PLANNER\r\n     ===================================================================== */\r\n\r\n  const roomNames = () =>\r\n    Array.isArray(config?.labels?.rooms) && config.labels.rooms.length\r\n      ? config.labels.rooms\r\n      : [\"Living Room\", \"Dining Room\", \"Kitchen\", \"Master Bedroom\", \"Custom Room\"];\r\n\r\n  const roomWindows = room => state.planner.plannedWindows.filter(item => item.roomName === room);\r\n\r\n  const addPlannedWindow = (room, count = 1) => {\r\n    for (let index = 0; index < count; index += 1) {\r\n      const sequence = roomWindows(room).length + 1;\r\n      state.planner.plannedWindows.push({\r\n        id: uid(\"planned\"),\r\n        roomName: room,\r\n        customRoomName: room === \"Custom Room\" ? \"\" : null,\r\n        windowName: `${room} Window ${sequence}`,\r\n        sequence,\r\n        status: STATUS.PLANNED,\r\n        savedWindowId: null,\r\n        widthMm: 0,\r\n        dropMm: 0\r\n      });\r\n    }\r\n    normalisePlan();\r\n  };\r\n\r\n  const normalisePlan = () => {\r\n    const counts = new Map();\r\n    state.planner.plannedWindows.forEach(item => {\r\n      const next = (counts.get(item.roomName) || 0) + 1;\r\n      counts.set(item.roomName, next);\r\n      item.sequence = next;\r\n      if (!cleanText(item.windowName)) item.windowName = `${item.roomName} Window ${next}`;\r\n    });\r\n  };\r\n\r\n  const applyPreset = presetName => {\r\n    const preset = HOUSE_PRESETS.find(item => item.name === presetName);\r\n    if (!preset) return;\r\n    state.planner.selectedPreset = presetName;\r\n    state.ui.optionalRoomsExpanded = false;\r\n    state.planner.plannedWindows = [];\r\n    Object.entries(preset.rooms).forEach(([room, count]) => addPlannedWindow(room, count));\r\n    renderPlanner();\r\n    touchState();\r\n  };\r\n\r\n  const renderPlanner = () => {\r\n    clear(dom.presets);\r\n    HOUSE_PRESETS.forEach(preset => {\r\n      const button = setAction(element(\"button\", \"lux-v5-preset-card\"), \"preset\", preset.name);\r\n      button.type = \"button\";\r\n      button.textContent = preset.name;\r\n      button.classList.toggle(\"is-selected\", state.planner.selectedPreset === preset.name);\r\n      button.setAttribute(\"aria-pressed\", String(state.planner.selectedPreset === preset.name));\r\n      dom.presets.append(button);\r\n    });\r\n\r\n    const createRoomCard = room => {\r\n      const card = element(\"div\", \"lux-v5-room-card\");\r\n      const windowCount = roomWindows(room).length;\r\n      card.classList.toggle(\"is-active\", windowCount > 0);\r\n      const title = element(\"strong\", \"\", room);\r\n      const controls = element(\"div\", \"lux-v5-room-card__controls\");\r\n      const minus = setAction(element(\"button\", \"\", \"\u2212\"), \"room-minus\", room);\r\n      minus.type = \"button\";\r\n      minus.disabled = windowCount === 0;\r\n      minus.setAttribute(\"aria-label\", `Remove one ${room} window`);\r\n      const count = element(\"span\", \"\", String(windowCount));\r\n      count.setAttribute(\"aria-live\", \"polite\");\r\n      const plus = setAction(element(\"button\", \"\", \"+\"), \"room-plus\", room);\r\n      plus.type = \"button\";\r\n      plus.setAttribute(\"aria-label\", `Add one ${room} window`);\r\n      controls.append(minus, count, plus);\r\n      card.append(title, controls);\r\n      return card;\r\n    };\r\n\r\n    clear(dom.roomSelector);\r\n    const selectedPreset = HOUSE_PRESETS.find(item => item.name === state.planner.selectedPreset);\r\n    const presetRooms = selectedPreset ? Object.keys(selectedPreset.rooms) : roomNames();\r\n    const primaryRooms = roomNames().filter(room => presetRooms.includes(room));\r\n    const optionalRooms = roomNames().filter(room => !presetRooms.includes(room));\r\n    const primaryGroup = element(\"div\", \"lux-v5-room-grid__group\");\r\n    primaryRooms.forEach(room => primaryGroup.append(createRoomCard(room)));\r\n    dom.roomSelector.append(primaryGroup);\r\n\r\n    if (optionalRooms.length) {\r\n      const toggle = setAction(\r\n        element(\"button\", \"lux-v5-room-grid__toggle\"),\r\n        \"toggle-optional-rooms\"\r\n      );\r\n      toggle.type = \"button\";\r\n      toggle.classList.toggle(\"is-open\", state.ui.optionalRoomsExpanded);\r\n      toggle.setAttribute(\"aria-expanded\", String(state.ui.optionalRoomsExpanded));\r\n      toggle.setAttribute(\"aria-controls\", \"luxV5OptionalRooms\");\r\n      toggle.append(\r\n        element(\"span\", \"\", state.ui.optionalRoomsExpanded ? \"Hide additional rooms\" : \"Add more rooms\"),\r\n        element(\"span\", \"lux-v5-room-grid__toggle-icon\")\r\n      );\r\n      toggle.lastElementChild.setAttribute(\"aria-hidden\", \"true\");\r\n      dom.roomSelector.append(toggle);\r\n\r\n      const optionalGroup = element(\"div\", \"lux-v5-room-grid__group lux-v5-room-grid__group--optional\");\r\n      optionalGroup.id = \"luxV5OptionalRooms\";\r\n      optionalGroup.hidden = !state.ui.optionalRoomsExpanded;\r\n      optionalRooms.forEach(room => optionalGroup.append(createRoomCard(room)));\r\n      dom.roomSelector.append(optionalGroup);\r\n    }\r\n\r\n    clear(dom.plannedWindows);\r\n    if (!state.planner.plannedWindows.length) {\r\n      dom.plannedWindows.append(\r\n        element(\"p\", \"lux-v5-empty-state\", \"Add at least one room window to continue.\")\r\n      );\r\n    }\r\n    state.planner.plannedWindows.forEach(item => {\r\n      const row = element(\"div\", \"lux-v5-planned-window\");\r\n      row.dataset.plannedId = item.id;\r\n      if (item.roomName === \"Custom Room\") {\r\n        const roomLabel = element(\"label\", \"lux-v5-field\");\r\n        roomLabel.append(element(\"span\", \"\", \"Custom room name\"));\r\n        const roomInput = element(\"input\");\r\n        roomInput.type = \"text\";\r\n        roomInput.value = item.customRoomName || \"\";\r\n        roomInput.placeholder = \"Nursery, Alfresco, Guest Suite\u2026\";\r\n        roomInput.maxLength = 60;\r\n        roomInput.dataset.v5PlanRoom = item.id;\r\n        roomLabel.append(roomInput);\r\n        row.append(roomLabel);\r\n      }\r\n      const label = element(\"label\", \"lux-v5-field\");\r\n      label.append(element(\"span\", \"\", `${item.roomName} \u00B7 Window ${item.sequence}`));\r\n      const input = element(\"input\");\r\n      input.type = \"text\";\r\n      input.value = item.windowName;\r\n      input.dataset.v5PlanName = item.id;\r\n      input.maxLength = 80;\r\n      label.append(input);\r\n      const remove = setAction(element(\"button\", \"lux-v5-text-button\", \"Delete\"), \"plan-delete\", item.id);\r\n      remove.type = \"button\";\r\n      remove.setAttribute(\"aria-label\", `Delete ${item.windowName}`);\r\n      row.append(label, remove);\r\n      dom.plannedWindows.append(row);\r\n    });\r\n    dom.beginWholeHome.disabled = !state.planner.plannedWindows.length;\r\n    renderJourneyHeader();\r\n  };\r\n\r\n  const beginWholeHome = () => {\r\n    if (!state.planner.plannedWindows.length) return announce(\"Add at least one window.\", \"error\");\r\n    const unnamedCustom = state.planner.plannedWindows.find(\r\n      item => item.roomName === \"Custom Room\" && !cleanText(item.customRoomName)\r\n    );\r\n    if (unnamedCustom) {\r\n      dom.plannedWindows.querySelector(`[data-v5-plan-room=\"${unnamedCustom.id}\"]`)?.focus();\r\n      return announce(\"Enter a name for each custom room.\", \"error\");\r\n    }\r\n    state.planner.plannedWindows.forEach(item => {\r\n      if (item.roomName !== \"Custom Room\") return;\r\n      const originalName = item.windowName;\r\n      item.roomName = cleanText(item.customRoomName, 60);\r\n      if (originalName.startsWith(\"Custom Room Window\")) {\r\n        item.windowName = `${item.roomName} Window 1`;\r\n      }\r\n    });\r\n    state.planner.plannedWindows.forEach(item => {\r\n      item.status = STATUS.PLANNED;\r\n      item.savedWindowId = null;\r\n    });\r\n    state.planner.activePlannedWindowId = null;\r\n    state.project.baseDesign = null;\r\n    state.ui.configuringBase = false;\r\n    replaceDraft(blankWindow({ roomName: \"\", windowName: \"Whole-Home Base Look\" }));\r\n    routeTo(STAGES.FABRIC_SELECTION);\r\n  };\r\n\r\n  /* =====================================================================\r\n     15. ROOM ENGINE\r\n     ===================================================================== */\r\n\r\n  const renderRooms = () => {\r\n    clear(dom.roomPills);\r\n    const names =\r\n      state.journey.mode === MODES.WHOLE_HOME\r\n        ? [...new Set(state.planner.plannedWindows.map(item => item.roomName))]\r\n        : roomNames();\r\n    const roomField = element(\"label\", \"lux-v5-field lux-v5-room-select-field\");\r\n    const roomLabel = element(\"span\", \"\", \"Room name\");\r\n    roomField.append(roomLabel);\r\n    const roomIsLocked =\r\n      state.journey.mode === MODES.WHOLE_HOME && Boolean(state.draft.window.plannedWindowId);\r\n    if (roomIsLocked) {\r\n      const lockedRoom = element(\"input\", \"lux-v5-room-locked\");\r\n      lockedRoom.type = \"text\";\r\n      lockedRoom.value = state.draft.window.roomName;\r\n      lockedRoom.readOnly = true;\r\n      lockedRoom.setAttribute(\"aria-readonly\", \"true\");\r\n      roomField.classList.add(\"is-locked\");\r\n      roomLabel.textContent = \"Room name \u00B7 Locked from plan\";\r\n      roomField.append(lockedRoom);\r\n    } else {\r\n      const select = element(\"select\");\r\n      select.dataset.v5RoomSelect = \"\";\r\n      names.forEach(room => {\r\n        const option = element(\"option\", \"\", room);\r\n        option.value = room;\r\n        option.selected = state.draft.window.roomName === room;\r\n        select.append(option);\r\n      });\r\n      roomField.append(select);\r\n    }\r\n    dom.roomPills.append(roomField);\r\n\r\n    setHidden(dom.customRoomField, false);\r\n    const windowNameLabel = dom.customRoomField.querySelector(\":scope > span\");\r\n    if (windowNameLabel) windowNameLabel.textContent = \"Window name\";\r\n    dom.customRoom.placeholder = \"Example: Living Room Window 1\";\r\n    dom.customRoom.value = state.draft.window.windowName;\r\n  };\r\n\r\n  /* =====================================================================\r\n     16. WINDOW ENGINE\r\n     ===================================================================== */\r\n\r\n  const plannedForDraft = () =>\r\n    state.planner.plannedWindows.find(item => item.id === state.draft.window.plannedWindowId);\r\n\r\n  const persistActiveDraft = () => {\r\n    const planned = plannedForDraft();\r\n    if (!planned || planned.savedWindowId) return;\r\n    planned.draftWindow = deepCopy(state.draft.window);\r\n    planned.widthMm = state.draft.window.widthMm;\r\n    planned.dropMm = state.draft.window.dropMm;\r\n  };\r\n\r\n  const adjacentPlannedWindow = direction => {\r\n    const currentId = state.draft.window.plannedWindowId;\r\n    const currentIndex = state.planner.plannedWindows.findIndex(item => item.id === currentId);\r\n    if (currentIndex < 0) return null;\r\n    return state.planner.plannedWindows[currentIndex + direction] || null;\r\n  };\r\n\r\n  const openPlannedWindow = (item, { startFresh = false } = {}) => {\r\n    persistActiveDraft();\r\n    const saved = state.project.windows.find(windowData => windowData.id === item.savedWindowId);\r\n    state.planner.plannedWindows.forEach(plan => {\r\n      if (plan.status === STATUS.ACTIVE) plan.status = plan.savedWindowId ? STATUS.COMPLETE : STATUS.PLANNED;\r\n    });\r\n    item.status = STATUS.ACTIVE;\r\n    state.planner.activePlannedWindowId = item.id;\r\n    state.project.editingWindowId = saved?.id || null;\r\n    if (startFresh) {\r\n      item.draftWindow = null;\r\n      item.widthMm = 0;\r\n      item.dropMm = 0;\r\n    }\r\n    const baseFabrics = state.project.baseDesign\r\n      ? {\r\n          sheer: deepCopy(state.project.baseDesign.sheer),\r\n          blackout: deepCopy(state.project.baseDesign.blackout)\r\n        }\r\n      : {};\r\n    const seed =\r\n      saved ||\r\n      (!startFresh && item.draftWindow) ||\r\n      blankWindow({\r\n        plannedWindowId: item.id,\r\n        roomName: item.roomName,\r\n        windowName: item.windowName,\r\n        ...baseFabrics\r\n      });\r\n    replaceDraft(seed);\r\n    state.draft.window.plannedWindowId = item.id;\r\n    if (saved) state.draft.window.confirmation = false;\r\n    if (saved) {\r\n      state.ui.completedWindowSteps = [\r\n        \"measurements\",\r\n        \"heading\",\r\n        \"supply\",\r\n        \"opening\",\r\n        \"fixing\",\r\n        \"finish\",\r\n        \"track-bending\",\r\n        \"pelmet\",\r\n        \"notes\"\r\n      ];\r\n    }\r\n    routeTo(STAGES.MEASUREMENTS);\r\n  };\r\n\r\n  const startAdditionalWindow = () => {\r\n    if (state.journey.mode === MODES.WHOLE_HOME) {\r\n      addPlannedWindow(\"Custom Room\");\r\n      const item = state.planner.plannedWindows[state.planner.plannedWindows.length - 1];\r\n      openPlannedWindow(item);\r\n      return;\r\n    }\r\n    replaceDraft(\r\n      blankWindow({\r\n        roomName: \"Living Room\",\r\n        windowName: `Window ${state.project.windows.length + 1}`,\r\n        sheer: deepCopy(state.draft.window.sheer),\r\n        blackout: deepCopy(state.draft.window.blackout)\r\n      })\r\n    );\r\n    state.project.editingWindowId = null;\r\n    routeTo(STAGES.MEASUREMENTS);\r\n  };\r\n\r\n  /* =====================================================================\r\n     17. FABRIC ENGINE\r\n     ===================================================================== */\r\n\r\n  const fabricSelection = (layer, collection, product, variant) => ({\r\n    layer,\r\n    collectionId: idString(collection.id),\r\n    collectionHandle: collection.handle || \"\",\r\n    collectionTitle: collection.title || \"\",\r\n    collectionImage: collection.icon || collection.featuredImage || \"\",\r\n    collectionDiscountPercent: clamp(collection.discountPercent, 0, 95),\r\n    productId: idString(product.id),\r\n    productHandle: product.handle || \"\",\r\n    productTitle: product.title || \"\",\r\n    productImage: product.featuredImage || \"\",\r\n    variantId: idString(variant.id),\r\n    variantTitle: variant.title || \"Default\",\r\n    variantSku: variant.sku || \"\",\r\n    variantImage: variant.image || product.featuredImage || collection.featuredImage || \"\",\r\n    pricingReference: {\r\n      baseSetPrice: toNumber(product.pricing?.baseSetPrice),\r\n      shopifyPrice: toNumber(product.pricing?.shopifyPrice || variant.price),\r\n      variantPrice: toNumber(variant.price)\r\n    },\r\n    promotionPercent: clamp(product.pricing?.promotionPercent, 0, 95),\r\n    maximumDropMm: toNumber(\r\n      product.specifications?.maximumDropMm,\r\n      config.settings.defaultMaximumDropMm\r\n    ),\r\n    fabricWidth: product.specifications?.fabricWidth || \"\",\r\n    fabricComposition: product.specifications?.fabricComposition || \"\",\r\n    description: product.specifications?.description || \"\",\r\n    confirmed: false\r\n  });\r\n\r\n  const selectedCollection = layer =>\r\n    collectionFor(layer, state.draft.window[layer].collectionId);\r\n\r\n  const renderFabrics = () => {\r\n    [\"sheer\", \"blackout\"].forEach(layer => {\r\n      const selection = state.draft.window[layer];\r\n      clear(dom.collections[layer]);\r\n      catalog.collections[layer].forEach(collection => {\r\n        const button = setAction(\r\n          element(\"button\", \"lux-v5-collection-card\"),\r\n          \"fabric-collection\",\r\n          `${layer}:${collection.id}`\r\n        );\r\n        button.type = \"button\";\r\n        button.classList.toggle(\"is-selected\", idString(collection.id) === selection.collectionId);\r\n        button.setAttribute(\r\n          \"aria-pressed\",\r\n          String(idString(collection.id) === selection.collectionId)\r\n        );\r\n        const imageUrl = collection.icon || collection.featuredImage;\r\n        if (imageUrl) {\r\n          const image = element(\"img\");\r\n          image.src = imageUrl;\r\n          image.alt = \"\";\r\n          image.loading = \"lazy\";\r\n          button.append(image);\r\n        }\r\n        button.append(element(\"strong\", \"\", collection.title));\r\n        if (collection.badge) button.append(element(\"small\", \"lux-v5-badge\", collection.badge));\r\n        dom.collections[layer].append(button);\r\n      });\r\n      renderFabricProducts(layer);\r\n    });\r\n  };\r\n\r\n  const renderConfirmedFabricSummary = layer => {\r\n    const selection = state.draft.window[layer];\r\n    const summary = element(\"article\", \"lux-v5-confirmed-fabric\");\r\n    if (selection.variantImage) {\r\n      const image = element(\"img\");\r\n      image.src = selection.variantImage;\r\n      image.alt = `${selection.variantTitle} from ${selection.collectionTitle}`;\r\n      image.loading = \"lazy\";\r\n      summary.append(image);\r\n    }\r\n    const details = element(\"div\", \"lux-v5-confirmed-fabric__details\");\r\n    details.append(\r\n      element(\"small\", \"\", `${layer === \"sheer\" ? \"Sheer\" : \"Blackout\"} confirmed`),\r\n      element(\"strong\", \"\", selection.variantTitle),\r\n      element(\"span\", \"\", `${selection.collectionTitle} \u00B7 ${selection.productTitle}`)\r\n    );\r\n    if (selection.promotionPercent) {\r\n      details.append(\r\n        element(\"em\", \"lux-v5-badge\", `${selection.promotionPercent}% promotion`)\r\n      );\r\n    }\r\n    const change = setAction(\r\n      element(\r\n        \"button\",\r\n        \"lux-v5-button lux-v5-button--secondary\",\r\n        `Change ${layer === \"sheer\" ? \"Sheer\" : \"Blackout\"} Fabric`\r\n      ),\r\n      \"change-fabric\",\r\n      layer\r\n    );\r\n    change.type = \"button\";\r\n    summary.append(details, change);\r\n    return summary;\r\n  };\r\n\r\n  const renderFabricProducts = layer => {\r\n    clear(dom.products[layer]);\r\n    clear(dom.variants[layer]);\r\n    const selection = state.draft.window[layer];\r\n    const section = dom.collections[layer].closest(\".lux-v5-config-card\");\r\n    section?.classList.toggle(\"is-fabric-confirmed\", selection.confirmed);\r\n    setHidden(dom.collections[layer], selection.confirmed);\r\n    setHidden(dom.variants[layer], selection.confirmed);\r\n    if (selection.confirmed) {\r\n      dom.products[layer].append(renderConfirmedFabricSummary(layer));\r\n      return;\r\n    }\r\n    const collection = selectedCollection(layer);\r\n    if (!collection) return;\r\n\r\n    if (collection.description) {\r\n      const details = setAction(\r\n        element(\"button\", \"lux-v5-text-button\", \"View collection details\"),\r\n        \"fabric-details\",\r\n        `${layer}:collection`\r\n      );\r\n      details.type = \"button\";\r\n      dom.products[layer].append(details);\r\n    }\r\n\r\n    const productWrap = element(\"div\", \"lux-v5-product-grid\");\r\n    collection.products.forEach(product => {\r\n      const button = setAction(\r\n        element(\"button\", \"lux-v5-product-card\"),\r\n        \"fabric-product\",\r\n        `${layer}:${product.id}`\r\n      );\r\n      button.type = \"button\";\r\n      button.classList.toggle(\"is-selected\", idString(product.id) === selection.productId);\r\n      button.setAttribute(\"aria-pressed\", String(idString(product.id) === selection.productId));\r\n      button.append(element(\"strong\", \"\", product.title));\r\n      const discount = clamp(product.pricing?.promotionPercent, 0, 95);\r\n      if (discount) button.append(element(\"small\", \"lux-v5-badge\", `${discount}% promotion`));\r\n      productWrap.append(button);\r\n    });\r\n    dom.products[layer].append(productWrap);\r\n\r\n    const product = productFor(selection.productId);\r\n    if (!product || idString(product.collectionId) !== idString(collection.id)) return;\r\n    if (product.specifications?.description) {\r\n      const details = setAction(\r\n        element(\"button\", \"lux-v5-text-button\", \"View fabric details\"),\r\n        \"fabric-details\",\r\n        `${layer}:product`\r\n      );\r\n      details.type = \"button\";\r\n      dom.products[layer].append(details);\r\n    }\r\n    product.variants.forEach(variant => {\r\n      const button = setAction(\r\n        element(\"button\", \"lux-v5-swatch\"),\r\n        \"fabric-variant\",\r\n        `${layer}:${variant.id}`\r\n      );\r\n      button.type = \"button\";\r\n      button.classList.toggle(\"is-selected\", idString(variant.id) === selection.variantId);\r\n      button.setAttribute(\"aria-pressed\", String(idString(variant.id) === selection.variantId));\r\n      if (variant.image) {\r\n        const image = element(\"img\");\r\n        image.src = variant.image;\r\n        image.alt = \"\";\r\n        image.loading = \"lazy\";\r\n        button.append(image);\r\n      }\r\n      button.append(element(\"span\", \"\", variant.title || \"Default\"));\r\n      dom.variants[layer].append(button);\r\n    });\r\n\r\n    if (selection.variantId) {\r\n      const confirm = setAction(\r\n        element(\r\n          \"button\",\r\n          `lux-v5-button ${selection.confirmed ? \"lux-v5-button--secondary\" : \"lux-v5-button--primary\"}`,\r\n          selection.confirmed ? `Change ${layer} fabric` : `Review and confirm ${layer}`\r\n        ),\r\n        selection.confirmed ? \"change-fabric\" : \"review-fabric\",\r\n        layer\r\n      );\r\n      confirm.type = \"button\";\r\n      dom.variants[layer].append(confirm);\r\n    }\r\n  };\r\n\r\n  const chooseCollection = (layer, collectionId) => {\r\n    const collection = collectionFor(layer, collectionId);\r\n    if (!collection) return;\r\n    invalidateDraftConfirmation();\r\n    state.draft.window[layer] = blankFabric(layer);\r\n    state.draft.window[layer].collectionId = idString(collection.id);\r\n    state.draft.window[layer].collectionHandle = collection.handle || \"\";\r\n    state.draft.window[layer].collectionTitle = collection.title || \"\";\r\n    state.draft.window[layer].collectionImage =\r\n      collection.icon || collection.featuredImage || \"\";\r\n    state.draft.window[layer].collectionDiscountPercent = clamp(\r\n      collection.discountPercent,\r\n      0,\r\n      95\r\n    );\r\n    const product = collection.products[0];\r\n    if (product) chooseProduct(layer, product.id, false);\r\n    renderFabricProducts(layer);\r\n    touchState();\r\n  };\r\n\r\n  const chooseProduct = (layer, productId, shouldRender = true) => {\r\n    const collection = selectedCollection(layer);\r\n    const product = collection?.products.find(item => idString(item.id) === idString(productId));\r\n    if (!product) return;\r\n    invalidateDraftConfirmation();\r\n    const previous = state.draft.window[layer];\r\n    state.draft.window[layer] = {\r\n      ...blankFabric(layer),\r\n      collectionId: previous.collectionId,\r\n      collectionHandle: previous.collectionHandle,\r\n      collectionTitle: previous.collectionTitle,\r\n      collectionImage: previous.collectionImage,\r\n      collectionDiscountPercent: previous.collectionDiscountPercent,\r\n      productId: idString(product.id),\r\n      productHandle: product.handle || \"\",\r\n      productTitle: product.title || \"\",\r\n      productImage: product.featuredImage || \"\"\r\n    };\r\n    if (product.variants.length) chooseVariant(layer, product.variants[0].id, false);\r\n    if (shouldRender) renderFabricProducts(layer);\r\n    touchState();\r\n  };\r\n\r\n  const chooseVariant = (layer, variantId, shouldRender = true) => {\r\n    const collection = selectedCollection(layer);\r\n    const product = productFor(state.draft.window[layer].productId);\r\n    const variant = product?.variants.find(item => idString(item.id) === idString(variantId));\r\n    if (!collection || !product || !variant) return;\r\n    invalidateDraftConfirmation();\r\n    state.draft.window[layer] = fabricSelection(layer, collection, product, variant);\r\n    if (shouldRender) renderFabricProducts(layer);\r\n    recalculate();\r\n    renderSidebar();\r\n    touchState();\r\n    if (shouldRender) openFabricDetails(layer, \"product\", true);\r\n  };\r\n\r\n  /* =====================================================================\r\n     18. MEASUREMENT ENGINE\r\n     ===================================================================== */\r\n\r\n  const combinedMaximumDrop = windowData => {\r\n    const configured = toNumber(config.settings.defaultMaximumDropMm);\r\n    const values = [windowData.sheer.maximumDropMm, windowData.blackout.maximumDropMm]\r\n      .map(value => toNumber(value))\r\n      .filter(positive);\r\n    return values.length ? Math.min(...values) : configured;\r\n  };\r\n\r\n  const validateMeasurements = windowData => {\r\n    const errors = [];\r\n    const minimumWidth = toNumber(config.settings.minimumWidthMm);\r\n    const minimumDrop = toNumber(config.settings.minimumDropMm);\r\n    const maximumDrop = combinedMaximumDrop(windowData);\r\n    if (!positive(windowData.widthMm) || windowData.widthMm < minimumWidth) {\r\n      errors.push(`Track width must be at least ${minimumWidth} mm.`);\r\n    }\r\n    if (!positive(windowData.dropMm) || windowData.dropMm < minimumDrop) {\r\n      errors.push(`Finished drop must be at least ${minimumDrop} mm.`);\r\n    } else if (positive(maximumDrop) && windowData.dropMm > maximumDrop) {\r\n      errors.push(\r\n        `Drops above ${maximumDrop} mm require a custom quotation and cannot use standard checkout.`\r\n      );\r\n    }\r\n    return errors;\r\n  };\r\n\r\n  const syncInputs = () => {\r\n    if (!dom) return;\r\n    dom.width.value = state.draft.window.widthMm || \"\";\r\n    dom.drop.value = state.draft.window.dropMm || \"\";\r\n    renderRooms();\r\n  };\r\n\r\n  const updateMeasurementValidation = () => {\r\n    const errors = validateMeasurements(state.draft.window);\r\n    const untouched = !positive(state.draft.window.widthMm) && !positive(state.draft.window.dropMm);\r\n    if (untouched) {\r\n      dom.measurementValidation.textContent = \"\";\r\n      dom.measurementValidation.classList.remove(\"has-error\");\r\n      setHidden(dom.measurementValidation, true);\r\n      return errors;\r\n    }\r\n    setHidden(dom.measurementValidation, !errors.length);\r\n    dom.measurementValidation.textContent = errors.length ? errors[0] : \"\";\r\n    dom.measurementValidation.classList.toggle(\"has-error\", Boolean(errors.length));\r\n    return errors;\r\n  };\r\n\r\n  const renderMeasurementPricePanel = () => {\r\n    if (!dom?.measurementValidation || !state) return;\r\n    let panel = dom.root.querySelector(\"#luxV5MeasurementPricePanel\");\r\n    if (!panel) {\r\n      panel = element(\"div\", \"lux-v5-measurement-price\");\r\n      panel.id = \"luxV5MeasurementPricePanel\";\r\n      dom.measurementValidation.insertAdjacentElement(\"beforebegin\", panel);\r\n    }\r\n    clear(panel);\r\n    const draft = state.draft.window;\r\n    const quote = PricingProvider.quoteWindow(draft);\r\n    if (!positive(draft.widthMm) || !positive(draft.dropMm)) {\r\n      panel.append(\r\n        element(\"strong\", \"\", \"Live window estimate\"),\r\n        element(\"span\", \"\", \"Enter the finished width and drop to see pricing.\")\r\n      );\r\n      return;\r\n    }\r\n    const trackAmount = toNumber(quote.breakdown?.tracks?.base);\r\n    const trackDescription =\r\n      !draft.supplyChoice\r\n        ? \"No track option selected \u00B7 no track charge\"\r\n        : draft.supply === \"curtain-only\"\r\n        ? \"Curtains only \u00B7 no track charge\"\r\n        : trackAmount\r\n          ? `${OPTION_LABELS.supply[draft.supply]} \u00B7 ${money(trackAmount)} track component`\r\n          : OPTION_LABELS.supply[draft.supply];\r\n    panel.append(\r\n      (() => {\r\n        const copy = element(\"div\");\r\n        copy.append(\r\n          element(\"small\", \"\", \"Current configuration\"),\r\n          element(\"strong\", \"\", trackDescription)\r\n        );\r\n        return copy;\r\n      })(),\r\n      (() => {\r\n        const total = element(\"div\", \"lux-v5-measurement-price__total\");\r\n        total.append(\r\n          element(\"small\", \"\", \"Live window estimate\"),\r\n          element(\"strong\", \"\", quote.valid ? money(quote.finalTotal) : \"Complete selections\")\r\n        );\r\n        return total;\r\n      })()\r\n    );\r\n  };\r\n\r\n  const renderMeasurements = () => {\r\n    renderRooms();\r\n    syncInputs();\r\n    const planned = plannedForDraft();\r\n    if (dom.activeWindowTitle) {\r\n      dom.activeWindowTitle.textContent = `Measure ${planned?.windowName || state.draft.window.windowName || \"your window\"}`;\r\n    }\r\n    updateMeasurementValidation();\r\n    renderMeasurementPricePanel();\r\n  };\r\n\r\n  /* =====================================================================\r\n     19. CONFIGURATION ENGINE\r\n     ===================================================================== */\r\n\r\n  const CONFIG_SECTION_NUMBERS = {\r\n    supply: \"01\",\r\n    heading: \"02\",\r\n    opening: \"03\",\r\n    fixing: \"04\",\r\n    finish: \"05\",\r\n    trackBending: \"06\",\r\n    pelmetChoice: \"07\"\r\n  };\r\n\r\n  const sectionHeading = (title, description, number = \"\") => {\r\n    const header = element(\"div\", \"lux-v5-section-heading\");\r\n    const text = element(\"div\");\r\n    text.append(element(\"h3\", \"\", title), element(\"p\", \"\", description));\r\n    if (number) header.append(element(\"span\", \"\", number));\r\n    header.append(text);\r\n    return header;\r\n  };\r\n\r\n  const optionPriceDelta = (group, value) => {\r\n    if (!PricingProvider || state.draft.window[group] === value) return \"\";\r\n    const current = PricingProvider.quoteWindow(state.draft.window);\r\n    const candidateWindow = deepCopy(state.draft.window);\r\n    candidateWindow[group] = value;\r\n    if (group === \"supply\" && value === \"curtain-only\") {\r\n      candidateWindow.remote = false;\r\n      candidateWindow.trackBending = \"none\";\r\n      candidateWindow.bendMeasurements = blankBending();\r\n    }\r\n    const candidate = PricingProvider.quoteWindow(candidateWindow);\r\n    if (!current.valid || !candidate.valid) return \"\";\r\n    const difference = roundMoney(candidate.finalTotal - current.finalTotal);\r\n    if (!difference) return \"No price change\";\r\n    return `${difference > 0 ? \"+\" : \"\u2212\"}${money(Math.abs(difference))}`;\r\n  };\r\n\r\n  const optionCard = (group, value, label, selected, imageUrl, description) => {\r\n    const button = setAction(element(\"button\", \"lux-v5-option-card\"), \"option\", `${group}:${value}`);\r\n    button.type = \"button\";\r\n    button.classList.toggle(\"is-selected\", selected);\r\n    button.setAttribute(\"aria-pressed\", String(selected));\r\n    if (imageUrl) {\r\n      const image = element(\"img\");\r\n      image.src = imageUrl;\r\n      image.alt = \"\";\r\n      image.loading = \"lazy\";\r\n      button.append(image);\r\n    }\r\n    if (group === \"trackColour\") {\r\n      const swatch = element(\"span\", `lux-v5-track-swatch lux-v5-track-swatch--${value}`);\r\n      swatch.setAttribute(\"aria-hidden\", \"true\");\r\n      button.append(swatch);\r\n    }\r\n    button.append(element(\"strong\", \"\", label));\r\n    const supportingText =\r\n      group === \"pelmetChoice\" ? \"\" : description || optionPriceDelta(group, value);\r\n    if (supportingText) button.append(element(\"small\", \"\", supportingText));\r\n    return button;\r\n  };\r\n\r\n  const renderOptionSection = (node, title, description, group, options) => {\r\n    clear(node);\r\n    node.append(sectionHeading(title, description, CONFIG_SECTION_NUMBERS[group]));\r\n    const grid = element(\"div\", \"lux-v5-option-grid\");\r\n    options.forEach(option =>\r\n      grid.append(\r\n        optionCard(\r\n          group,\r\n          option.value,\r\n          option.label,\r\n          (group === \"supply\"\r\n            ? state.draft.window.supplyChoice\r\n            : state.draft.window[group]) === option.value,\r\n          option.image,\r\n          option.description\r\n        )\r\n      )\r\n    );\r\n    node.append(grid);\r\n  };\r\n\r\n  const renderCurrentWindowFabrics = () => {\r\n    dom.root.querySelector(\"#luxV5CurrentWindowFabrics\")?.remove();\r\n    if (state.ui.configuringBase) return;\r\n    const section = element(\"section\", \"lux-v5-current-fabrics\");\r\n    section.id = \"luxV5CurrentWindowFabrics\";\r\n    section.append(\r\n      sectionHeading(\r\n        \"Current Fabrics\",\r\n        \"These fabrics apply only to this window. Change either layer without affecting saved windows.\"\r\n      )\r\n    );\r\n    const grid = element(\"div\", \"lux-v5-current-fabrics__grid\");\r\n    [\"sheer\", \"blackout\"].forEach(layer => {\r\n      const selection = state.draft.window[layer];\r\n      const card = element(\"article\", \"lux-v5-current-fabric\");\r\n      if (selection.variantImage) {\r\n        const image = element(\"img\");\r\n        image.src = selection.variantImage;\r\n        image.alt = `${selection.productTitle} ${selection.variantTitle}`;\r\n        image.loading = \"lazy\";\r\n        card.append(image);\r\n      }\r\n      const details = element(\"div\", \"lux-v5-current-fabric__details\");\r\n      details.append(\r\n        element(\"small\", \"\", layer === \"sheer\" ? \"Sheer\" : \"Blackout\"),\r\n        element(\"strong\", \"\", selection.productTitle || \"Not selected\"),\r\n        element(\"span\", \"\", selection.variantTitle || \"Choose a colour\")\r\n      );\r\n      const change = setAction(\r\n        element(\"button\", \"lux-v5-button lux-v5-button--secondary\", \"Change\"),\r\n        \"change-window-fabric\",\r\n        layer\r\n      );\r\n      change.type = \"button\";\r\n      card.append(details, change);\r\n      grid.append(card);\r\n    });\r\n    section.append(grid);\r\n    const targetStage = dom.windowAccordion ? dom.stages.measurements : dom.stages.configuration;\r\n    const header = targetStage.querySelector(\".lux-v5-stage-header\");\r\n    if (header) header.insertAdjacentElement(\"afterend\", section);\r\n    else targetStage.prepend(section);\r\n  };\r\n\r\n  const renderConfiguration = () => {\r\n    const visuals = config.visuals || {};\r\n    if (dom.configurationTitle) {\r\n      dom.configurationTitle.textContent = \"Design your double curtains\";\r\n    }\r\n    renderCurrentWindowFabrics();\r\n    renderOptionSection(\r\n      dom.configSections.heading,\r\n      \"Heading Style\",\r\n      \"Choose the fullness and finished appearance.\",\r\n      \"heading\",\r\n      [\r\n        { value: \"s-wave\", label: OPTION_LABELS.heading[\"s-wave\"], image: visuals.headingSWave },\r\n        {\r\n          value: \"double-pinch\",\r\n          label: OPTION_LABELS.heading[\"double-pinch\"],\r\n          image: visuals.headingDoublePinch\r\n        },\r\n        {\r\n          value: \"triple-pinch\",\r\n          label: OPTION_LABELS.heading[\"triple-pinch\"],\r\n          image: visuals.headingTriplePinch\r\n        }\r\n      ]\r\n    );\r\n    renderOptionSection(\r\n      dom.configSections.supply,\r\n      \"Curtain & Track Option\",\r\n      \"Choose curtains only, or add a Luxworld double curtain track.\",\r\n      \"supply\",\r\n      [\r\n        {\r\n          value: \"curtain-only\",\r\n          label: OPTION_LABELS.supply[\"curtain-only\"],\r\n          image:\r\n            state.draft.window.sheer.variantImage ||\r\n            state.draft.window.blackout.variantImage ||\r\n            visuals.fabricEffectsImage\r\n        },\r\n        {\r\n          value: \"manual-double-track\",\r\n          label: OPTION_LABELS.supply[\"manual-double-track\"],\r\n          image: visuals.manualTracks\r\n        },\r\n        {\r\n          value: \"motorised-double-track\",\r\n          label: OPTION_LABELS.supply[\"motorised-double-track\"],\r\n          image: visuals.motorisedTracks\r\n        },\r\n        {\r\n          value: \"led-motorised-double-track\",\r\n          label: OPTION_LABELS.supply[\"led-motorised-double-track\"],\r\n          image: visuals.ledMotorisedTracks\r\n        }\r\n      ]\r\n    );\r\n\r\n    const trackSupplied = state.draft.window.supply !== \"curtain-only\";\r\n    const motorised = [\"motorised-double-track\", \"led-motorised-double-track\"].includes(\r\n      state.draft.window.supply\r\n    );\r\n    let trackOptions = null;\r\n    if (trackSupplied) {\r\n      trackOptions = element(\"div\", \"lux-v5-suboptions\");\r\n      trackOptions.append(element(\"strong\", \"\", \"Track Colour\"));\r\n      const colourGrid = element(\"div\", \"lux-v5-option-grid\");\r\n      Object.entries(OPTION_LABELS.trackColour).forEach(([value, label]) => {\r\n        const button = optionCard(\r\n          \"trackColour\",\r\n          value,\r\n          label,\r\n          state.draft.window.trackColour === value,\r\n          \"\",\r\n          motorised && value !== \"white\" ? \"Unavailable for motorised tracks\" : \"\"\r\n        );\r\n        if (motorised && value !== \"white\") button.disabled = true;\r\n        colourGrid.append(button);\r\n      });\r\n      trackOptions.append(colourGrid);\r\n      if (motorised) {\r\n        const remoteLabel = element(\"label\", \"lux-v5-toggle\");\r\n        const remote = element(\"input\");\r\n        remote.type = \"checkbox\";\r\n        remote.checked = state.draft.window.remote;\r\n        remote.dataset.v5Field = \"remote\";\r\n        remoteLabel.append(remote, element(\"span\", \"\", \"Add Remote Control\"));\r\n        trackOptions.append(remoteLabel);\r\n      }\r\n    }\r\n\r\n    renderOptionSection(\r\n      dom.configSections.opening,\r\n      \"Curtain Opening\",\r\n      \"Choose how the curtain panels stack.\",\r\n      \"opening\",\r\n      [\r\n        { value: \"centre\", label: OPTION_LABELS.opening.centre, image: visuals.openingCentre },\r\n        { value: \"left\", label: OPTION_LABELS.opening.left, image: visuals.openingLeft },\r\n        { value: \"right\", label: OPTION_LABELS.opening.right, image: visuals.openingRight },\r\n        { value: \"free\", label: OPTION_LABELS.opening.free, image: visuals.openingFree }\r\n      ]\r\n    );\r\n    renderOptionSection(\r\n      dom.configSections.fixing,\r\n      \"Track Fixing\",\r\n      \"Choose how supplied tracks will be mounted.\",\r\n      \"fixing\",\r\n      [\r\n        { value: \"ceiling\", label: OPTION_LABELS.fixing.ceiling, image: visuals.fixingCeiling },\r\n        { value: \"wall\", label: OPTION_LABELS.fixing.wall, image: visuals.fixingWall }\r\n      ]\r\n    );\r\n    if (trackOptions) dom.configSections.fixing.append(trackOptions);\r\n    renderOptionSection(\r\n      dom.configSections.finish,\r\n      \"Bottom Finish\",\r\n      \"Choose how the curtains finish at floor level.\",\r\n      \"finish\",\r\n      [\r\n        { value: \"off-floor\", label: OPTION_LABELS.finish[\"off-floor\"], image: visuals.finishOffFloor },\r\n        { value: \"puddle\", label: OPTION_LABELS.finish.puddle, image: visuals.finishPuddle }\r\n      ]\r\n    );\r\n\r\n    setHidden(dom.configSections.trackBending, !trackSupplied);\r\n    if (trackSupplied) {\r\n      renderOptionSection(\r\n        dom.configSections.trackBending,\r\n        \"Track Bending\",\r\n        \"Select the window shape and confirm factory bending measurements.\",\r\n        \"trackBending\",\r\n        [\r\n          { value: \"none\", label: OPTION_LABELS.trackBending.none, image: visuals.bendStraight },\r\n          { value: \"bay\", label: OPTION_LABELS.trackBending.bay, image: visuals.bendBay },\r\n          { value: \"corner\", label: OPTION_LABELS.trackBending.corner, image: visuals.bendCorner },\r\n          { value: \"curved\", label: OPTION_LABELS.trackBending.curved, image: visuals.bendCurved }\r\n        ]\r\n      );\r\n      if (\r\n        state.draft.window.trackBending !== \"none\" &&\r\n        state.draft.window.bendMeasurements.confirmed\r\n      ) {\r\n        const edit = setAction(\r\n          element(\r\n            \"button\",\r\n            \"lux-v5-button lux-v5-button--secondary\",\r\n            \"Edit Confirmed Measurements\"\r\n          ),\r\n          \"open-bending\"\r\n        );\r\n        edit.type = \"button\";\r\n        dom.configSections.trackBending.append(edit);\r\n      }\r\n    }\r\n\r\n    renderOptionSection(\r\n      dom.configSections.pelmet,\r\n      \"Designer Pelmet\",\r\n      \"Please choose Yes or No before continuing.\",\r\n      \"pelmetChoice\",\r\n      [\r\n        {\r\n          value: \"no\",\r\n          label: \"No Pelmet\"\r\n        },\r\n        {\r\n          value: \"yes\",\r\n          label: \"Yes, Add Designer Pelmet\"\r\n        }\r\n      ]\r\n    );\r\n\r\n    clear(dom.configSections.notes);\r\n    dom.configSections.notes.append(\r\n      sectionHeading(\r\n        \"Project Notes\",\r\n        \"Add installation, access or manufacturing notes for this window.\",\r\n        \"08\"\r\n      )\r\n    );\r\n    const notes = element(\"textarea\", \"lux-v5-textarea\");\r\n    notes.rows = 4;\r\n    notes.maxLength = 500;\r\n    notes.value = state.draft.window.notes;\r\n    notes.dataset.v5Field = \"notes\";\r\n    dom.configSections.notes.append(notes);\r\n    if (dom.windowAccordion) renderWindowAccordion();\r\n  };\r\n\r\n  /* =====================================================================\r\n     19A. ONE-PAGE WINDOW ACCORDION\r\n     ===================================================================== */\r\n\r\n  const WINDOW_FLOW_STEPS = Object.freeze([\r\n    {\r\n      key: \"measurements\",\r\n      title: \"Room & Measurements\",\r\n      description: \"Name this window and enter the finished width and drop.\"\r\n    },\r\n    {\r\n      key: \"supply\",\r\n      title: \"Curtain & Track Option\",\r\n      description: \"Choose curtains only, or add a manual or motorised double track.\"\r\n    },\r\n    {\r\n      key: \"heading\",\r\n      title: \"Heading Style\",\r\n      description: \"Choose the curtain heading and fullness.\"\r\n    },\r\n    {\r\n      key: \"opening\",\r\n      title: \"Curtain Opening\",\r\n      description: \"Choose how the curtain panels stack.\"\r\n    },\r\n    {\r\n      key: \"fixing\",\r\n      title: \"Fixing & Track Colour\",\r\n      description: \"Choose the fixing method and track finish.\"\r\n    },\r\n    {\r\n      key: \"finish\",\r\n      title: \"Bottom Finish\",\r\n      description: \"Choose the finished curtain position.\"\r\n    },\r\n    {\r\n      key: \"track-bending\",\r\n      title: \"Track Shape\",\r\n      description: \"Choose straight, bay, corner or curved tracks.\"\r\n    },\r\n    {\r\n      key: \"pelmet\",\r\n      title: \"Designer Pelmet\",\r\n      description: \"Add a made-to-measure designer pelmet.\"\r\n    },\r\n    {\r\n      key: \"notes\",\r\n      title: \"Customer Notes\",\r\n      description: \"Add any access, installation or manufacturing notes.\"\r\n    }\r\n  ]);\r\n\r\n  const accordionStepVisible = key =>\r\n    key !== \"track-bending\" || state.draft.window.supply !== \"curtain-only\";\r\n\r\n  const initialiseWindowAccordion = () => {\r\n    if (dom.windowAccordion) return;\r\n    const measurementStage = dom.stages.measurements;\r\n    const measurementCards = [\r\n      ...measurementStage.querySelectorAll(\":scope > .lux-v5-config-card\")\r\n    ];\r\n    const stageHeader = measurementStage.querySelector(\":scope > .lux-v5-stage-header\");\r\n    if (stageHeader) {\r\n      stageHeader.classList.add(\"lux-v5-window-flow__intro\");\r\n      const eyebrow = stageHeader.querySelector(\".lux-v5-eyebrow\");\r\n      const description = stageHeader.querySelector(\"p:last-child\");\r\n      if (eyebrow) eyebrow.textContent = \"Design This Window\";\r\n      if (description) {\r\n        description.textContent =\r\n          \"Complete each section in order. You can reopen any section to make changes.\";\r\n      }\r\n    }\r\n\r\n    const flow = element(\"div\", \"lux-v5-window-accordion\");\r\n    flow.setAttribute(\"aria-label\", \"Window design steps\");\r\n    const nodeMap = {\r\n      measurements: measurementCards,\r\n      heading: [dom.configSections.heading],\r\n      supply: [dom.configSections.supply],\r\n      opening: [dom.configSections.opening],\r\n      fixing: [dom.configSections.fixing],\r\n      finish: [dom.configSections.finish],\r\n      \"track-bending\": [dom.configSections.trackBending],\r\n      pelmet: [dom.configSections.pelmet],\r\n      notes: [dom.configSections.notes]\r\n    };\r\n\r\n    WINDOW_FLOW_STEPS.forEach((step, index) => {\r\n      const item = element(\"section\", \"lux-v5-accordion-step\");\r\n      item.dataset.v5AccordionStep = step.key;\r\n      const trigger = setAction(\r\n        element(\"button\", \"lux-v5-accordion-step__trigger\"),\r\n        \"accordion-open\",\r\n        step.key\r\n      );\r\n      trigger.type = \"button\";\r\n      trigger.setAttribute(\"aria-expanded\", \"false\");\r\n      const marker = element(\"span\", \"lux-v5-accordion-step__marker\", \"\u25C7\");\r\n      marker.setAttribute(\"aria-hidden\", \"true\");\r\n      const copy = element(\"span\", \"lux-v5-accordion-step__copy\");\r\n      copy.append(\r\n        element(\"strong\", \"\", step.title),\r\n        element(\"small\", \"\", step.description)\r\n      );\r\n      trigger.append(\r\n        marker,\r\n        copy,\r\n        element(\"span\", \"lux-v5-accordion-step__status\", index === 0 ? \"Open\" : \"Select\")\r\n      );\r\n\r\n      const body = element(\"div\", \"lux-v5-accordion-step__body\");\r\n      body.hidden = true;\r\n      (nodeMap[step.key] || []).filter(Boolean).forEach(node => body.append(node));\r\n      if (step.key === \"notes\") {\r\n        const confirmationLabel = element(\r\n          \"label\",\r\n          \"lux-v5-confirmation lux-v5-window-save-confirmation\"\r\n        );\r\n        const confirmationInput = element(\"input\");\r\n        confirmationInput.type = \"checkbox\";\r\n        confirmationInput.checked = state.draft.window.confirmation === true;\r\n        confirmationInput.dataset.v5Field = \"window-confirmation\";\r\n        confirmationLabel.append(\r\n          confirmationInput,\r\n          element(\"span\", \"\", \"I confirm my measurements and selections are correct.\")\r\n        );\r\n        body.append(confirmationLabel);\r\n      }\r\n      const footer = element(\"footer\", \"lux-v5-accordion-step__footer\");\r\n      const isFinalStep = step.key === \"notes\";\r\n      const save = setAction(\r\n        element(\r\n          \"button\",\r\n          \"lux-v5-button lux-v5-button--step\",\r\n          isFinalStep\r\n            ? state.project.editingWindowId\r\n              ? \"Save Window Changes\"\r\n              : \"Confirm & Save Window\"\r\n            : \"Save & Continue\"\r\n        ),\r\n        isFinalStep ? \"save-window-direct\" : \"accordion-next\",\r\n        step.key\r\n      );\r\n      save.type = \"button\";\r\n      if (isFinalStep) save.disabled = true;\r\n      footer.append(save);\r\n      body.append(footer);\r\n      item.append(trigger, body);\r\n      flow.append(item);\r\n    });\r\n\r\n    measurementStage.append(flow);\r\n    dom.windowAccordion = flow;\r\n    dom.stages.configuration.hidden = true;\r\n    dom.stages.windowReview.hidden = true;\r\n  };\r\n\r\n  const windowStepSummary = key => {\r\n    const draft = state.draft.window;\r\n    if (key === \"measurements\") {\r\n      return draft.widthMm && draft.dropMm\r\n        ? `${draft.windowName || draft.roomName} \u00B7 ${draft.widthMm} \u00D7 ${draft.dropMm} mm`\r\n        : \"Name this window and enter its finished size\";\r\n    }\r\n    if (key === \"heading\") return OPTION_LABELS.heading[draft.heading];\r\n    if (key === \"supply\") {\r\n      return draft.supplyChoice\r\n        ? OPTION_LABELS.supply[draft.supply]\r\n        : \"Choose curtains only or add tracks\";\r\n    }\r\n    if (key === \"opening\") return OPTION_LABELS.opening[draft.opening];\r\n    if (key === \"fixing\") {\r\n      const colour =\r\n        draft.supply === \"curtain-only\" ? \"\" : ` \u00B7 ${OPTION_LABELS.trackColour[draft.trackColour]}`;\r\n      return `${OPTION_LABELS.fixing[draft.fixing]}${colour}`;\r\n    }\r\n    if (key === \"finish\") return OPTION_LABELS.finish[draft.finish];\r\n    if (key === \"track-bending\") return OPTION_LABELS.trackBending[draft.trackBending];\r\n    if (key === \"pelmet\") {\r\n      if (draft.pelmetChoice === \"yes\") return \"Designer pelmet included\";\r\n      if (draft.pelmetChoice === \"no\") return \"No pelmet\";\r\n      return \"Choose Yes or No\";\r\n    }\r\n    if (key === \"notes\") return draft.notes ? \"Notes added\" : \"No notes added\";\r\n    return \"\";\r\n  };\r\n\r\n  const renderWindowAccordion = () => {\r\n    if (!dom.windowAccordion || !state) return;\r\n    const activeKey = state.ui.windowFlowStep || \"measurements\";\r\n    dom.windowAccordion.querySelectorAll(\"[data-v5-accordion-step]\").forEach(item => {\r\n      const key = item.dataset.v5AccordionStep;\r\n      const visible = accordionStepVisible(key);\r\n      const active = visible && key === activeKey;\r\n      const complete = state.ui.completedWindowSteps.includes(key);\r\n      setHidden(item, !visible);\r\n      item.classList.toggle(\"is-open\", active);\r\n      item.classList.toggle(\"is-complete\", complete);\r\n      const trigger = item.querySelector(\".lux-v5-accordion-step__trigger\");\r\n      const body = item.querySelector(\".lux-v5-accordion-step__body\");\r\n      const marker = item.querySelector(\".lux-v5-accordion-step__marker\");\r\n      const status = item.querySelector(\".lux-v5-accordion-step__status\");\r\n      const description = item.querySelector(\".lux-v5-accordion-step__copy small\");\r\n      trigger?.setAttribute(\"aria-expanded\", String(active));\r\n      if (body) body.hidden = !active;\r\n      if (marker) marker.textContent = complete ? \"\u2713\" : active ? \"\u25BE\" : \"\u25C7\";\r\n      if (status) status.textContent = complete ? \"Complete\" : active ? \"Open\" : \"Select\";\r\n      if (description && complete) description.textContent = windowStepSummary(key);\r\n    });\r\n    const finalConfirmation = dom.windowAccordion.querySelector(\r\n      '[data-v5-field=\"window-confirmation\"]'\r\n    );\r\n    if (finalConfirmation) {\r\n      finalConfirmation.checked = state.draft.window.confirmation === true;\r\n    }\r\n    const finalSave = dom.windowAccordion.querySelector(\r\n      '[data-v5-action=\"save-window-direct\"]'\r\n    );\r\n    if (finalSave) {\r\n      finalSave.textContent = state.project.editingWindowId\r\n        ? \"Save Window Changes\"\r\n        : \"Confirm & Save Window\";\r\n      finalSave.disabled =\r\n        validateWindow(state.draft.window).length > 0 ||\r\n        state.draft.window.confirmation !== true;\r\n    }\r\n  };\r\n\r\n  const openWindowAccordionStep = (key, shouldScroll = true) => {\r\n    if (!WINDOW_FLOW_STEPS.some(step => step.key === key) || !accordionStepVisible(key)) return;\r\n    state.ui.windowFlowStep = key;\r\n    renderWindowAccordion();\r\n    if (shouldScroll) {\r\n      const item = dom.windowAccordion?.querySelector(`[data-v5-accordion-step=\"${key}\"]`);\r\n      window.setTimeout(() => {\r\n        if (!item) return;\r\n        const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\r\n        const isMobile = window.matchMedia(\"(max-width: 980px)\").matches;\r\n        if (!isMobile) {\r\n          item.scrollIntoView({ behavior: reducedMotion ? \"auto\" : \"smooth\", block: \"start\" });\r\n          return;\r\n        }\r\n        const alignHeading = behavior => {\r\n          const trigger = item.querySelector(\".lux-v5-accordion-step__trigger\") || item;\r\n          const top = trigger.getBoundingClientRect().top + window.scrollY;\r\n          window.scrollTo({\r\n            top: Math.max(0, top - themeHeaderOffset() - 12),\r\n            behavior\r\n          });\r\n        };\r\n        alignHeading(reducedMotion ? \"auto\" : \"smooth\");\r\n        window.setTimeout(() => alignHeading(\"auto\"), reducedMotion ? 50 : 280);\r\n      }, 30);\r\n    }\r\n  };\r\n\r\n  const completeWindowAccordionStep = key => {\r\n    if (key === \"measurements\") {\r\n      const errors = validateMeasurements(state.draft.window);\r\n      if (errors.length) {\r\n        announce(errors[0], \"error\");\r\n        setHidden(dom.measurementValidation, false);\r\n        dom.measurementValidation.textContent = errors[0];\r\n        dom.measurementValidation.classList.add(\"has-error\");\r\n        (errors[0].startsWith(\"Track\") ? dom.width : dom.drop).focus();\r\n        return;\r\n      }\r\n    }\r\n    if (key === \"supply\" && !state.draft.window.supplyChoice) {\r\n      announce(\"Choose Curtains Only or select a double-track option.\", \"error\");\r\n      return;\r\n    }\r\n    if (key === \"track-bending\") {\r\n      const errors = validateBending(state.draft.window);\r\n      if (errors.length) {\r\n        announce(errors[0], \"error\");\r\n        if (state.draft.window.trackBending !== \"none\") openBendingModal();\r\n        return;\r\n      }\r\n    }\r\n    if (key === \"pelmet\" && ![\"yes\", \"no\"].includes(state.draft.window.pelmetChoice)) {\r\n      announce(\"Please choose Yes or No for the Designer Pelmet.\", \"error\");\r\n      return;\r\n    }\r\n    if (!state.ui.completedWindowSteps.includes(key)) {\r\n      state.ui.completedWindowSteps.push(key);\r\n    }\r\n    const currentIndex = WINDOW_FLOW_STEPS.findIndex(step => step.key === key);\r\n    const next = WINDOW_FLOW_STEPS.slice(currentIndex + 1).find(step =>\r\n      accordionStepVisible(step.key)\r\n    );\r\n    touchState();\r\n    if (next) openWindowAccordionStep(next.key);\r\n  };\r\n\r\n  /* =====================================================================\r\n     20. TRACK ENGINE\r\n     ===================================================================== */\r\n\r\n  const trackTierPrice = widthMm => {\r\n    const table = (Array.isArray(config.settings.trackPricing)\r\n      ? config.settings.trackPricing\r\n      : []\r\n    )\r\n      .map(item => ({\r\n        maximumWidthMm: toNumber(item.maximumWidthMm),\r\n        price: toNumber(item.price)\r\n      }))\r\n      .filter(item => positive(item.maximumWidthMm) && positive(item.price))\r\n      .sort((a, b) => a.maximumWidthMm - b.maximumWidthMm);\r\n    if (!table.length || !positive(widthMm)) return { valid: false, total: 0, pieces: [] };\r\n    const preferredSplitWidthMm = toNumber(config.settings.preferredSplitWidthMm, 3000);\r\n    if (!positive(preferredSplitWidthMm)) return { valid: false, total: 0, pieces: [] };\r\n    const pieceCount = Math.max(1, Math.ceil(widthMm / preferredSplitWidthMm));\r\n    const pieceWidth = Math.ceil(widthMm / pieceCount);\r\n    const maximumSellingWidthMm = table[table.length - 1].maximumWidthMm;\r\n    const sellingTier =\r\n      widthMm <= maximumSellingWidthMm\r\n        ? table.find(item => widthMm <= item.maximumWidthMm)\r\n        : table.find(item => pieceWidth <= item.maximumWidthMm);\r\n    if (!sellingTier) return { valid: false, total: 0, pieces: [] };\r\n    const sellingPrice =\r\n      widthMm <= maximumSellingWidthMm\r\n        ? sellingTier.price\r\n        : sellingTier.price * pieceCount;\r\n    return {\r\n      valid: true,\r\n      total: roundMoney(sellingPrice),\r\n      sellingWidthMm: widthMm,\r\n      sellingTierMaximumMm: sellingTier.maximumWidthMm,\r\n      pieces: Array(pieceCount).fill({\r\n        widthMm: pieceWidth,\r\n        tierMaximumMm: sellingTier.maximumWidthMm\r\n      })\r\n    };\r\n  };\r\n\r\n  const calculateTracks = windowData => {\r\n    if (windowData.supply === \"curtain-only\") {\r\n      return {\r\n        valid: true,\r\n        basePerTrack: 0,\r\n        trackBase: 0,\r\n        motorisation: 0,\r\n        ledUpgrade: 0,\r\n        remote: 0,\r\n        pieces: [],\r\n        total: 0\r\n      };\r\n    }\r\n    const tier = trackTierPrice(windowData.widthMm);\r\n    const multiplier = toNumber(config.settings.doubleTrackMultiplier);\r\n    if (!tier.valid || !positive(multiplier)) return { valid: false, total: 0 };\r\n    const trackBase = tier.total * multiplier;\r\n    const motorised = [\"motorised-double-track\", \"led-motorised-double-track\"].includes(\r\n      windowData.supply\r\n    );\r\n    const motorisation = motorised\r\n      ? toNumber(config.settings.motorisedTrackAdditionPerTrack) * multiplier\r\n      : 0;\r\n    const ledSystem = windowData.supply === \"led-motorised-double-track\";\r\n    const ledTarget = ledSystem\r\n      ? toNumber(config.settings.ledMotorisedTrackAdditionPerTrack) * multiplier\r\n      : 0;\r\n    const ledUpgrade = Math.max(0, ledTarget - motorisation);\r\n    const remote = motorised && windowData.remote ? toNumber(config.settings.remoteAddition) : 0;\r\n    return {\r\n      valid: true,\r\n      basePerTrack: tier.total,\r\n      trackBase,\r\n      motorisation,\r\n      ledUpgrade,\r\n      remote,\r\n      pieces: tier.pieces,\r\n      total: roundMoney(trackBase + motorisation + ledUpgrade + remote)\r\n    };\r\n  };\r\n\r\n  /* =====================================================================\r\n     21. BENDING ENGINE\r\n     ===================================================================== */\r\n\r\n  const validateBending = windowData => {\r\n    if (windowData.supply === \"curtain-only\" || windowData.trackBending === \"none\") return [];\r\n    const measurements = windowData.bendMeasurements || {};\r\n    const errors = [];\r\n    const tolerance = Math.max(1, toNumber(config.settings.bendingToleranceMm, 5));\r\n    if (windowData.trackBending === \"bay\") {\r\n      if (![measurements.a, measurements.b, measurements.c].every(positive)) {\r\n        errors.push(\"Enter the bay window A, B and C measurements.\");\r\n      } else if (\r\n        Math.abs(\r\n          toNumber(measurements.a) +\r\n            toNumber(measurements.b) +\r\n            toNumber(measurements.c) -\r\n            windowData.widthMm\r\n        ) > tolerance\r\n      ) {\r\n        errors.push(`Bay measurements must equal the track width within ${tolerance} mm.`);\r\n      }\r\n    }\r\n    if (windowData.trackBending === \"corner\") {\r\n      if (![measurements.a, measurements.b].every(positive)) {\r\n        errors.push(\"Enter the corner window A and B measurements.\");\r\n      } else if (\r\n        Math.abs(\r\n          toNumber(measurements.a) + toNumber(measurements.b) - windowData.widthMm\r\n        ) > tolerance\r\n      ) {\r\n        errors.push(`Corner measurements must equal the track width within ${tolerance} mm.`);\r\n      }\r\n    }\r\n    if (\r\n      windowData.trackBending === \"curved\" &&\r\n      ![measurements.chord, measurements.depth].every(positive)\r\n    ) {\r\n      errors.push(\"Enter the curved window chord and depth measurements.\");\r\n    }\r\n    if (!measurements.confirmed) errors.push(\"Confirm the bending measurements.\");\r\n    return errors;\r\n  };\r\n\r\n  const calculateBending = windowData => {\r\n    if (windowData.supply === \"curtain-only\" || windowData.trackBending === \"none\") {\r\n      return { type: \"none\", total: 0 };\r\n    }\r\n    const additions = {\r\n      bay: toNumber(config.settings.bayWindowAddition),\r\n      corner: toNumber(config.settings.cornerCurveAddition),\r\n      curved: toNumber(config.settings.curvedWindowAddition)\r\n    };\r\n    return { type: windowData.trackBending, total: roundMoney(additions[windowData.trackBending]) };\r\n  };\r\n\r\n  const openBendingModal = () => {\r\n    const type = state.draft.window.trackBending;\r\n    if (type === \"none\") return;\r\n    const content = clear(dom.modalContents.bending);\r\n    const title = element(\"h2\", \"\", `${OPTION_LABELS.trackBending[type]} Measurements`);\r\n    title.id = \"luxV5BendingModalTitle\";\r\n    content.append(title);\r\n    if (type === \"curved\") {\r\n      content.append(\r\n        element(\r\n          \"p\",\r\n          \"lux-v5-inline-message\",\r\n          \"Series 74 track is required. Wall mounting is preferred for curved tracks.\"\r\n        )\r\n      );\r\n    } else {\r\n      content.append(\r\n        element(\"p\", \"\", `Entered track width: ${state.draft.window.widthMm || \"not entered\"} mm`)\r\n      );\r\n    }\r\n    const form = element(\"div\", \"lux-v5-form-grid\");\r\n    const fields =\r\n      type === \"bay\"\r\n        ? [\r\n            [\"a\", \"Left return A\"],\r\n            [\"b\", \"Centre B\"],\r\n            [\"c\", \"Right return C\"]\r\n          ]\r\n        : type === \"corner\"\r\n          ? [\r\n              [\"a\", \"First wall A\"],\r\n              [\"b\", \"Second wall B\"]\r\n            ]\r\n          : [\r\n              [\"chord\", \"Curve chord\"],\r\n              [\"depth\", \"Curve depth\"]\r\n            ];\r\n    fields.forEach(([name, labelText]) => {\r\n      const label = element(\"label\", \"lux-v5-field\");\r\n      label.append(element(\"span\", \"\", labelText));\r\n      const input = element(\"input\");\r\n      input.type = \"number\";\r\n      input.min = \"1\";\r\n      input.step = \"1\";\r\n      input.inputMode = \"numeric\";\r\n      input.value = state.draft.window.bendMeasurements[name] || \"\";\r\n      input.dataset.v5BendingField = name;\r\n      label.append(input);\r\n      form.append(label);\r\n    });\r\n    const message = element(\"div\", \"lux-v5-inline-message\");\r\n    message.dataset.v5BendingMessage = \"\";\r\n    const confirm = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--primary\", \"Confirm Measurements\"),\r\n      \"confirm-bending\"\r\n    );\r\n    confirm.type = \"button\";\r\n    content.append(form, message, confirm);\r\n    openModal(\"bending\");\r\n  };\r\n\r\n  /* =====================================================================\r\n     22. PRICING PROVIDER\r\n     ===================================================================== */\r\n\r\n  const PricingProvider = Object.freeze({\r\n    quoteWindow(windowData) {\r\n      return pricingProvider.quoteWindow(windowData);\r\n    },\r\n    quoteProject(projectData) {\r\n      return pricingProvider.quoteProject(projectData);\r\n    }\r\n  });\r\n\r\n  /* =====================================================================\r\n     23. LOCAL SHOPIFY PRICING\r\n     ===================================================================== */\r\n\r\n  const fabricPrice = (selection, widthMm, heading) => {\r\n    const snapshot = selection?.pricingReference || {};\r\n    const base =\r\n      [snapshot.baseSetPrice, snapshot.shopifyPrice, snapshot.variantPrice]\r\n        .map(value => toNumber(value))\r\n        .find(positive) || 0;\r\n    const minimumWidth = toNumber(config.settings.minimumChargedWidthMm);\r\n    const fullness = config.settings.fullness || {};\r\n    const factors = {\r\n      \"s-wave\": toNumber(fullness.sWave),\r\n      \"double-pinch\": toNumber(fullness.doublePinch),\r\n      \"triple-pinch\": toNumber(fullness.triplePinch)\r\n    };\r\n    if (!positive(base) || !positive(minimumWidth) || !positive(factors[\"s-wave\"]) || !positive(factors[heading])) {\r\n      return { valid: false, errors: [PRICING_ERROR] };\r\n    }\r\n    const chargedWidthMm = Math.max(widthMm, minimumWidth);\r\n    const headingFactor = factors[heading] / factors[\"s-wave\"];\r\n    const original = base * (chargedWidthMm / minimumWidth) * headingFactor;\r\n    const promotionPercentage = clamp(selection.promotionPercent, 0, 95);\r\n    const savings = original * (promotionPercentage / 100);\r\n    return {\r\n      valid: true,\r\n      chargedWidthMm,\r\n      baseSetPrice: base,\r\n      headingFactor,\r\n      promotionPercentage,\r\n      original: roundMoney(original),\r\n      savings: roundMoney(savings),\r\n      final: roundMoney(original - savings),\r\n      errors: []\r\n    };\r\n  };\r\n\r\n  const LocalShopifyPricingProvider = Object.freeze({\r\n    /**\r\n     * Calculates one window from the immutable Shopify pricing snapshot.\r\n     * @param {object} windowData\r\n     * @returns {object} Normalised quote result.\r\n     */\r\n    quoteWindow(windowData) {\r\n      const errors = [];\r\n      if (!windowData?.sheer?.confirmed || !windowData?.blackout?.confirmed) {\r\n        errors.push(\"Confirm both fabric selections.\");\r\n      }\r\n      errors.push(...validateMeasurements(windowData), ...validateBending(windowData));\r\n      const sheer = fabricPrice(windowData.sheer, windowData.widthMm, windowData.heading);\r\n      const blackout = fabricPrice(windowData.blackout, windowData.widthMm, windowData.heading);\r\n      if (!sheer.valid || !blackout.valid) errors.push(PRICING_ERROR);\r\n      const tracks = calculateTracks(windowData);\r\n      if (!tracks.valid) errors.push(PRICING_ERROR);\r\n      const bending = calculateBending(windowData);\r\n      const pelmetWidthMm = windowData.pelmet\r\n        ? windowData.widthMm + toNumber(config.settings.pelmetReturnsMm)\r\n        : 0;\r\n      const pelmet = {\r\n        chargedWidthMm: pelmetWidthMm,\r\n        total: windowData.pelmet\r\n          ? roundMoney((pelmetWidthMm / 1000) * toNumber(config.settings.pelmetPricePerMetre))\r\n          : 0\r\n      };\r\n      if (windowData.pelmet && (!positive(pelmetWidthMm) || !positive(config.settings.pelmetPricePerMetre))) {\r\n        errors.push(PRICING_ERROR);\r\n      }\r\n      const rawOriginalTotal = roundMoney(\r\n        toNumber(sheer.original) +\r\n          toNumber(blackout.original) +\r\n          toNumber(tracks.total) +\r\n          pelmet.total +\r\n          bending.total\r\n      );\r\n      const rawSavings = roundMoney(toNumber(sheer.savings) + toNumber(blackout.savings));\r\n      const originalTotal = roundUpDollar(rawOriginalTotal);\r\n      const finalTotal = roundUpDollar(rawOriginalTotal - rawSavings);\r\n      const savings = Math.max(0, originalTotal - finalTotal);\r\n      const uniqueErrors = [...new Set(errors)];\r\n      return {\r\n        valid: uniqueErrors.length === 0 && positive(finalTotal),\r\n        source: \"shopify-local\",\r\n        currency: config.currencyCode,\r\n        originalTotal,\r\n        savings,\r\n        finalTotal,\r\n        breakdown: {\r\n          sheer,\r\n          blackout,\r\n          tracks: { base: tracks.trackBase || 0, pieces: tracks.pieces || [] },\r\n          motorisation: { total: tracks.motorisation || 0, ledUpgrade: tracks.ledUpgrade || 0 },\r\n          remote: { total: tracks.remote || 0 },\r\n          pelmet,\r\n          bending,\r\n          promotions: { sheer: sheer.savings || 0, blackout: blackout.savings || 0 },\r\n          orderDiscount: { total: 0 }\r\n        },\r\n        errors: uniqueErrors,\r\n        warnings: []\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Requotes all saved windows and applies the highest matching order discount.\r\n     * @param {object} projectData\r\n     * @returns {object} Normalised project quote.\r\n     */\r\n    quoteProject(projectData) {\r\n      const windows = (projectData?.windows || []).map(windowData => ({\r\n        id: windowData.id,\r\n        quote: LocalShopifyPricingProvider.quoteWindow(windowData)\r\n      }));\r\n      const errors = windows.flatMap(item => item.quote.errors);\r\n      const originalTotal = roundUpDollar(\r\n        windows.reduce((sum, item) => sum + item.quote.originalTotal, 0)\r\n      );\r\n      const beforeOrderDiscount = roundUpDollar(\r\n        windows.reduce((sum, item) => sum + item.quote.finalTotal, 0)\r\n      );\r\n      const fabricPromotions = roundUpDollar(\r\n        windows.reduce((sum, item) => sum + item.quote.savings, 0)\r\n      );\r\n      const rules = (Array.isArray(config.settings.orderDiscounts)\r\n        ? config.settings.orderDiscounts\r\n        : []\r\n      )\r\n        .map(rule => ({ minimum: toNumber(rule.minimum), discount: toNumber(rule.discount) }))\r\n        .filter(rule => positive(rule.minimum) && positive(rule.discount))\r\n        .sort((a, b) => b.minimum - a.minimum);\r\n      const match = rules.find(rule => beforeOrderDiscount >= rule.minimum);\r\n      const orderDiscount = Math.min(beforeOrderDiscount, roundUpDollar(match?.discount || 0));\r\n      const finalTotal = roundUpDollar(beforeOrderDiscount - orderDiscount);\r\n      return {\r\n        valid:\r\n          windows.length > 0 &&\r\n          windows.every(item => item.quote.valid) &&\r\n          positive(finalTotal) &&\r\n          errors.length === 0,\r\n        source: \"shopify-local\",\r\n        currency: config.currencyCode,\r\n        originalTotal,\r\n        fabricPromotions,\r\n        orderDiscount,\r\n        savings: fabricPromotions + orderDiscount,\r\n        finalTotal,\r\n        windows,\r\n        errors: [...new Set(errors)],\r\n        warnings: []\r\n      };\r\n    }\r\n  });\r\n\r\n  const SecureApiPricingProvider = Object.freeze({\r\n    quoteWindow() {\r\n      return {\r\n        valid: false,\r\n        source: \"secure-api-not-configured\",\r\n        currency: config.currencyCode,\r\n        originalTotal: 0,\r\n        savings: 0,\r\n        finalTotal: 0,\r\n        breakdown: {},\r\n        errors: [\r\n          \"Secure pricing is enabled, but no verified quote contract is configured for this storefront.\"\r\n        ],\r\n        warnings: []\r\n      };\r\n    },\r\n    quoteProject() {\r\n      return {\r\n        valid: false,\r\n        source: \"secure-api-not-configured\",\r\n        currency: config.currencyCode,\r\n        originalTotal: 0,\r\n        fabricPromotions: 0,\r\n        orderDiscount: 0,\r\n        savings: 0,\r\n        finalTotal: 0,\r\n        windows: [],\r\n        errors: [\r\n          \"Secure pricing is enabled, but no verified quote contract is configured for this storefront.\"\r\n        ],\r\n        warnings: []\r\n      };\r\n    }\r\n  });\r\n\r\n  /* =====================================================================\r\n     24. PROJECT TOTAL ENGINE\r\n     ===================================================================== */\r\n\r\n  const recalculate = () => {\r\n    state.pricing.draftQuote = PricingProvider.quoteWindow(state.draft.window);\r\n    state.pricing.projectQuote = PricingProvider.quoteProject(state.project);\r\n    return state.pricing;\r\n  };\r\n\r\n  const allPlannedComplete = () =>\r\n    state.journey.mode !== MODES.WHOLE_HOME ||\r\n    (state.planner.plannedWindows.length > 0 &&\r\n      state.planner.plannedWindows.every(item => item.status === STATUS.COMPLETE));\r\n\r\n  /* =====================================================================\r\n     25. SIDEBAR ENGINE\r\n     ===================================================================== */\r\n\r\n  const summaryRow = (label, value) => {\r\n    const row = element(\"div\", \"lux-v5-summary-row\");\r\n    row.append(element(\"span\", \"\", label), element(\"strong\", \"\", value));\r\n    return row;\r\n  };\r\n\r\n  const renderFabricPreview = (node, label, selection) => {\r\n    clear(node);\r\n    if (selection.variantImage) {\r\n      const image = element(\"img\");\r\n      image.src = selection.variantImage;\r\n      image.alt = `${selection.productTitle} ${selection.variantTitle}`;\r\n      node.append(image);\r\n    }\r\n    node.append(element(\"span\", \"\", label), element(\"strong\", \"\", selection.variantTitle || \"Not selected\"));\r\n  };\r\n\r\n  const renderSavedWindowCards = target => {\r\n    clear(target);\r\n    if (!state.project.windows.length) {\r\n      target.append(element(\"p\", \"lux-v5-empty-state\", \"No saved windows yet.\"));\r\n      return;\r\n    }\r\n    state.project.windows.forEach(windowData => {\r\n      const quote = PricingProvider.quoteWindow(windowData);\r\n      const card = element(\"article\", \"lux-v5-saved-window\");\r\n      card.setAttribute(\"aria-expanded\", \"false\");\r\n      const text = element(\"div\", \"lux-v5-saved-window__heading\");\r\n      text.append(\r\n        element(\"strong\", \"\", windowData.windowName || windowData.roomName),\r\n        element(\"small\", \"\", quote.valid ? money(quote.finalTotal) : \"Pricing unavailable\")\r\n      );\r\n      const meta = element(\"div\", \"lux-v5-saved-window__meta\");\r\n      meta.append(\r\n        element(\"span\", \"\", `Sheer: ${windowData.sheer.variantTitle || \"Not selected\"}`),\r\n        element(\"span\", \"\", `Blackout: ${windowData.blackout.variantTitle || \"Not selected\"}`),\r\n        element(\"span\", \"\", `System: ${OPTION_LABELS.supply[windowData.supply]}`),\r\n        element(\"span\", \"\", `Heading: ${OPTION_LABELS.heading[windowData.heading]}`)\r\n      );\r\n      const edit = setAction(element(\"button\", \"lux-v5-text-button\", \"Edit\"), \"edit-window\", windowData.id);\r\n      edit.type = \"button\";\r\n      const duplicate = setAction(\r\n        element(\"button\", \"lux-v5-text-button\", \"Duplicate\"),\r\n        \"duplicate-window\",\r\n        windowData.id\r\n      );\r\n      duplicate.type = \"button\";\r\n      const remove = setAction(\r\n        element(\"button\", \"lux-v5-text-button\", \"Remove\"),\r\n        \"remove-window\",\r\n        windowData.id\r\n      );\r\n      remove.type = \"button\";\r\n      const actions = element(\"div\", \"lux-v5-saved-window__actions\");\r\n      actions.append(edit, duplicate, remove);\r\n      card.append(text, meta, actions);\r\n      target.append(card);\r\n    });\r\n  };\r\n\r\n  const renderTotals = target => {\r\n    clear(target);\r\n    const quote = state.pricing.projectQuote;\r\n    const original = toNumber(quote.originalTotal);\r\n    const fabricPromotion = toNumber(quote.fabricPromotions);\r\n    const orderPromotion = toNumber(quote.orderDiscount);\r\n    const subtotal = Math.max(0, original - fabricPromotion);\r\n    target.append(\r\n      summaryRow(\"Original Value\", quote.valid || original ? money(original) : \"\u2014\"),\r\n      summaryRow(\"Fabric Promotion\", fabricPromotion ? `\u2212${money(fabricPromotion)}` : \"\u2014\"),\r\n      summaryRow(\"Subtotal\", quote.valid || subtotal ? money(subtotal) : \"\u2014\")\r\n    );\r\n    if (orderPromotion) {\r\n      target.append(summaryRow(\"Order Promotion\", `\u2212${money(orderPromotion)}`));\r\n    }\r\n    target.append(summaryRow(\"Project Total\", quote.valid ? money(quote.finalTotal) : \"\u2014\"));\r\n  };\r\n\r\n  const renderPromotionProgress = target => {\r\n    if (!target) return;\r\n    clear(target);\r\n    const quote = state.pricing.projectQuote;\r\n    const spend = Math.max(0, toNumber(quote.originalTotal) - toNumber(quote.fabricPromotions));\r\n    const rules = (Array.isArray(config.settings.orderDiscounts)\r\n      ? config.settings.orderDiscounts\r\n      : []\r\n    )\r\n      .map(rule => ({ minimum: toNumber(rule.minimum), discount: toNumber(rule.discount) }))\r\n      .filter(rule => positive(rule.minimum) && positive(rule.discount))\r\n      .sort((a, b) => a.minimum - b.minimum);\r\n    const next = rules.find(rule => spend < rule.minimum);\r\n    const current = [...rules].reverse().find(rule => spend >= rule.minimum);\r\n    const message = next\r\n      ? `Add ${money(next.minimum - spend)} more to unlock ${money(next.discount)} off your project`\r\n      : current\r\n        ? `${money(current.discount)} project promotion unlocked`\r\n        : \"Your project promotions will appear here\";\r\n    const progress = next ? clamp((spend / next.minimum) * 100, 0, 100) : current ? 100 : 0;\r\n    target.append(\r\n      element(\"strong\", \"\", message),\r\n      (() => {\r\n        const track = element(\"span\", \"lux-v5-promotion-progress__track\");\r\n        const fill = element(\"span\", \"lux-v5-promotion-progress__fill\");\r\n        fill.style.width = `${progress}%`;\r\n        track.append(fill);\r\n        return track;\r\n      })()\r\n    );\r\n  };\r\n\r\n  const renderProjectStatus = target => {\r\n    if (!target) return;\r\n    clear(target);\r\n    const planned = state.planner.plannedWindows.length;\r\n    const completed =\r\n      state.journey.mode === MODES.WHOLE_HOME\r\n        ? state.planner.plannedWindows.filter(item => item.status === STATUS.COMPLETE).length\r\n        : state.project.windows.length;\r\n    target.append(\r\n      summaryRow(\"Windows completed\", planned ? `${completed} of ${planned}` : String(completed)),\r\n      summaryRow(\"Manufacturing\", \"4\u20136 Weeks\")\r\n    );\r\n  };\r\n\r\n  const renderSidebar = () => {\r\n    if (!dom || !state) return;\r\n    recalculate();\r\n    const draft = state.draft.window;\r\n    const draftQuote = state.pricing.draftQuote;\r\n    const projectQuote = state.pricing.projectQuote;\r\n    renderFabricPreview(dom.sheerPreview, \"Sheer\", draft.sheer);\r\n    renderFabricPreview(dom.blackoutPreview, \"Blackout\", draft.blackout);\r\n    dom.activeWindowPrice.textContent = draftQuote.valid ? money(draftQuote.finalTotal) : \"\u2014\";\r\n    clear(dom.currentSummary);\r\n    dom.currentSummary.append(\r\n      summaryRow(\"Window\", draft.windowName || \"Draft window\"),\r\n      summaryRow(\"Sheer\", draft.sheer.variantTitle || \"Not selected\"),\r\n      summaryRow(\"Blackout\", draft.blackout.variantTitle || \"Not selected\"),\r\n      summaryRow(\r\n        \"System\",\r\n        draft.supplyChoice ? OPTION_LABELS.supply[draft.supply] : \"Not selected\"\r\n      )\r\n    );\r\n    renderSavedWindowCards(dom.savedWindows);\r\n    renderTotals(dom.projectTotals);\r\n    if (dom.desktopSavings) {\r\n      const savings = toNumber(projectQuote.savings);\r\n      dom.desktopSavings.textContent = savings\r\n        ? `\uD83C\uDF89 You saved ${money(savings)} today`\r\n        : \"\";\r\n      setHidden(dom.desktopSavings, !savings);\r\n    }\r\n    renderPromotionProgress(dom.promotionProgress);\r\n    renderProjectStatus(dom.projectStatus);\r\n    dom.windowCount.textContent = `${state.project.windows.length} Window${\r\n      state.project.windows.length === 1 ? \"\" : \"s\"\r\n    }`;\r\n    dom.projectTotal.textContent = projectQuote.valid ? money(projectQuote.finalTotal) : \"\u2014\";\r\n    const showDraftPrice = [\r\n      STAGES.MEASUREMENTS,\r\n      STAGES.WINDOW_CONFIGURATION,\r\n      STAGES.WINDOW_REVIEW\r\n    ].includes(state.journey.stage);\r\n    dom.mobileTotal.textContent = projectQuote.valid\r\n      ? money(projectQuote.finalTotal)\r\n      : showDraftPrice && draftQuote.valid\r\n        ? money(draftQuote.finalTotal)\r\n        : \"\u2014\";\r\n    renderDrawer();\r\n    refreshCheckoutState();\r\n  };\r\n\r\n  /* =====================================================================\r\n     26. MOBILE BAR\r\n     ===================================================================== */\r\n\r\n  const primaryStageReady = () => {\r\n    if (state.journey.stage === STAGES.FABRIC_SELECTION) {\r\n      return state.draft.window.sheer.confirmed && state.draft.window.blackout.confirmed;\r\n    }\r\n    if (state.journey.stage === STAGES.MEASUREMENTS) {\r\n      return validateMeasurements(state.draft.window).length === 0;\r\n    }\r\n    if (state.journey.stage === STAGES.WINDOW_CONFIGURATION) {\r\n      return state.ui.configuringBase\r\n        ? state.draft.window.sheer.confirmed && state.draft.window.blackout.confirmed\r\n        : validateWindow(state.draft.window).length === 0;\r\n    }\r\n    if (state.journey.stage === STAGES.WINDOW_REVIEW) {\r\n      return (\r\n        validateWindow(state.draft.window).length === 0 &&\r\n        state.draft.window.confirmation === true\r\n      );\r\n    }\r\n    if (state.journey.stage === STAGES.PROJECT_REVIEW) {\r\n      return (\r\n        state.project.windows.length > 0 &&\r\n        allPlannedComplete() &&\r\n        state.pricing.projectQuote?.valid === true\r\n      );\r\n    }\r\n    return true;\r\n  };\r\n\r\n  const updatePrimaryAction = () => {\r\n    if (!dom?.mobilePrimary) return;\r\n    const labels = {\r\n      [STAGES.FABRIC_SELECTION]:\r\n        state.journey.mode === MODES.WHOLE_HOME && !state.project.baseDesign\r\n          ? \"Continue to Design Curtains\"\r\n          : \"Continue to Measurements\",\r\n      [STAGES.MEASUREMENTS]: \"Continue Window Design\",\r\n      [STAGES.WINDOW_CONFIGURATION]: state.ui.configuringBase\r\n        ? \"Start Measuring Windows\"\r\n        : \"Review This Window\",\r\n      [STAGES.WINDOW_REVIEW]: \"Save This Window\",\r\n      [STAGES.PROJECT_REVIEW]: \"Confirm Project\"\r\n    };\r\n    dom.mobilePrimary.textContent = labels[state.journey.stage] || \"Continue\";\r\n    const disabled = state.ui.busy || !primaryStageReady();\r\n    dom.mobilePrimary.disabled = disabled;\r\n    dom.root\r\n      .querySelectorAll(\".lux-v5-generated-actions [data-v5-action='primary-next']\")\r\n      .forEach(button => {\r\n        button.disabled = disabled;\r\n      });\r\n  };\r\n\r\n  /* =====================================================================\r\n     27. PROJECT DRAWER\r\n     ===================================================================== */\r\n\r\n  const projectCheckoutReady = () =>\r\n    !state.ui.busy &&\r\n    positive(config.checkout?.priceUnitVariantId) &&\r\n    state.project.confirmed === true &&\r\n    state.project.windows.length > 0 &&\r\n    allPlannedComplete() &&\r\n    state.pricing.projectQuote?.valid === true;\r\n\r\n  const projectCheckoutMessage = () => {\r\n    if (!state.project.windows.length) return \"Save at least one window before checkout.\";\r\n    if (!allPlannedComplete()) return \"Complete every planned window before checkout.\";\r\n    if (!state.pricing.projectQuote?.valid) return PRICING_ERROR;\r\n    if (!positive(config.checkout?.priceUnitVariantId)) {\r\n      return \"Checkout is unavailable until the Shopify price-unit variant is configured.\";\r\n    }\r\n    return state.project.confirmed\r\n      ? \"Your complete project is ready for secure checkout.\"\r\n      : \"Confirm your complete project to enable checkout.\";\r\n  };\r\n\r\n  const renderDrawer = () => {\r\n    clear(dom.drawerContent);\r\n    const overview = element(\"section\", \"lux-v5-drawer-overview\");\r\n    const overviewHeading = element(\"div\", \"lux-v5-drawer-overview__heading\");\r\n    const overviewCopy = element(\"div\");\r\n    overviewCopy.append(\r\n      element(\"small\", \"\", \"Your Project\"),\r\n      element(\r\n        \"strong\",\r\n        \"\",\r\n        `${state.project.windows.length} Window${state.project.windows.length === 1 ? \"\" : \"s\"}`\r\n      )\r\n    );\r\n    const overviewTotal = state.pricing.projectQuote?.valid\r\n      ? money(state.pricing.projectQuote.finalTotal)\r\n      : state.pricing.draftQuote?.valid\r\n        ? money(state.pricing.draftQuote.finalTotal)\r\n        : \"\u2014\";\r\n    overviewHeading.append(overviewCopy, element(\"b\", \"\", overviewTotal));\r\n    const overviewFabrics = element(\"div\", \"lux-v5-drawer-overview__fabrics\");\r\n    const overviewSheer = element(\"div\", \"lux-v5-fabric-preview\");\r\n    const overviewBlackout = element(\"div\", \"lux-v5-fabric-preview\");\r\n    renderFabricPreview(overviewSheer, \"Sheer\", state.draft.window.sheer);\r\n    renderFabricPreview(overviewBlackout, \"Blackout\", state.draft.window.blackout);\r\n    overviewFabrics.append(overviewSheer, overviewBlackout);\r\n    overview.append(overviewHeading, overviewFabrics);\r\n    const draft = element(\"section\", \"lux-v5-drawer-card\");\r\n    draft.append(\r\n      element(\"h3\", \"\", state.draft.window.windowName || \"Active Window\"),\r\n      summaryRow(\r\n        \"Live estimate\",\r\n        state.pricing.draftQuote?.valid ? money(state.pricing.draftQuote.finalTotal) : \"\u2014\"\r\n      )\r\n    );\r\n    const windows = element(\"section\", \"lux-v5-drawer-card\");\r\n    windows.append(element(\"h3\", \"\", \"Saved Windows\"));\r\n    const list = element(\"div\", \"lux-v5-saved-windows\");\r\n    renderSavedWindowCards(list);\r\n    windows.append(list);\r\n    const promotion = element(\"section\", \"lux-v5-promotion-progress\");\r\n    renderPromotionProgress(promotion);\r\n    const status = element(\"section\", \"lux-v5-project-status\");\r\n    renderProjectStatus(status);\r\n    const totals = element(\"section\", \"lux-v5-project-totals\");\r\n    renderTotals(totals);\r\n    const savings = element(\r\n      \"strong\",\r\n      \"lux-v5-savings-banner\",\r\n      state.pricing.projectQuote?.savings\r\n        ? `\uD83C\uDF89 You saved ${money(state.pricing.projectQuote.savings)} today`\r\n        : \"Your savings will appear here\"\r\n    );\r\n    const confidence = element(\"div\", \"lux-v5-checkout-confidence\");\r\n    confidence.append(\r\n      element(\"strong\", \"\", \"Secure Shopify Checkout\"),\r\n      element(\"span\", \"\", \"Custom-made in approximately 4\u20136 weeks\"),\r\n      element(\"span\", \"\", \"Refreshing this page starts a new project\")\r\n    );\r\n    const confirmation = element(\"label\", \"lux-v5-confirmation\");\r\n    const confirmationInput = element(\"input\");\r\n    confirmationInput.type = \"checkbox\";\r\n    confirmationInput.checked = state.project.confirmed === true;\r\n    confirmationInput.dataset.v5ProjectConfirmation = \"\";\r\n    confirmation.append(\r\n      confirmationInput,\r\n      element(\r\n        \"span\",\r\n        \"\",\r\n        \"I confirm all measurements, fabric colours and selected options are correct.\"\r\n      )\r\n    );\r\n    const warning = element(\"p\", \"lux-v5-inline-message\");\r\n    warning.dataset.v5CheckoutWarning = \"\";\r\n    warning.textContent = projectCheckoutMessage();\r\n    warning.classList.toggle(\"has-error\", !projectCheckoutReady());\r\n    const checkoutButton = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--checkout\", \"Proceed to Secure Checkout\"),\r\n      \"drawer-checkout\"\r\n    );\r\n    checkoutButton.type = \"button\";\r\n    checkoutButton.disabled = !projectCheckoutReady();\r\n    const startOver = setAction(element(\"button\", \"lux-v5-clear-project\", \"Start Over\"), \"request-reset\");\r\n    startOver.type = \"button\";\r\n    dom.drawerContent.append(\r\n      overview,\r\n      ...(![STAGES.PROJECT_REVIEW, STAGES.ENTRY].includes(state.journey.stage) ? [draft] : []),\r\n      status,\r\n      windows,\r\n      totals,\r\n      savings,\r\n      promotion,\r\n      confidence,\r\n      warning,\r\n      confirmation,\r\n      checkoutButton,\r\n      startOver\r\n    );\r\n  };\r\n\r\n  const openDrawer = () => {\r\n    lastFocusedElement = document.activeElement;\r\n    state.ui.mobileDrawerOpen = true;\r\n    dom.drawer.classList.add(\"is-open\");\r\n    dom.drawer.setAttribute(\"aria-hidden\", \"false\");\r\n    document.body.classList.add(\"lux-v5-scroll-locked\");\r\n    dom.drawerContent.scrollTop = 0;\r\n    window.requestAnimationFrame(() => {\r\n      dom.drawerContent.scrollTop = 0;\r\n    });\r\n    dom.drawer.querySelector(\"[data-v5-close-drawer]\")?.focus();\r\n  };\r\n\r\n  const closeDrawer = () => {\r\n    state.ui.mobileDrawerOpen = false;\r\n    dom.drawer.classList.remove(\"is-open\");\r\n    dom.drawer.setAttribute(\"aria-hidden\", \"true\");\r\n    if (!state.ui.activeModal) document.body.classList.remove(\"lux-v5-scroll-locked\");\r\n    lastFocusedElement?.focus?.();\r\n  };\r\n\r\n  /* =====================================================================\r\n     28. WINDOW REVIEW\r\n     ===================================================================== */\r\n\r\n  /**\r\n   * Validates all customer, measurement, bending and pricing requirements.\r\n   * @param {object} windowData\r\n   * @returns {string[]}\r\n   */\r\n  const validateWindow = windowData => {\r\n    const errors = [];\r\n    if (!cleanText(windowData.roomName)) errors.push(\"Select a room.\");\r\n    if (!cleanText(windowData.windowName)) errors.push(\"Enter a window name.\");\r\n    if (!windowData.sheer.confirmed) errors.push(\"Confirm the sheer fabric.\");\r\n    if (!windowData.blackout.confirmed) errors.push(\"Confirm the blackout fabric.\");\r\n    if (!windowData.supplyChoice) {\r\n      errors.push(\"Choose Curtains Only or select a double-track option.\");\r\n    }\r\n    if (![\"yes\", \"no\"].includes(windowData.pelmetChoice)) {\r\n      errors.push(\"Choose Yes or No for the Designer Pelmet.\");\r\n    }\r\n    errors.push(...validateMeasurements(windowData), ...validateBending(windowData));\r\n    const quote = PricingProvider.quoteWindow(windowData);\r\n    if (!quote.valid && !errors.includes(PRICING_ERROR)) errors.push(...quote.errors);\r\n    return [...new Set(errors)];\r\n  };\r\n\r\n  const renderWindowReview = () => {\r\n    clear(dom.windowReview);\r\n    const windowData = state.draft.window;\r\n    const quote = PricingProvider.quoteWindow(windowData);\r\n    const errors = validateWindow(windowData);\r\n    const card = element(\"article\", \"lux-v5-review-card\");\r\n    card.append(element(\"h3\", \"\", windowData.windowName || \"Window Review\"));\r\n    [\r\n      [\"Room\", windowData.roomName],\r\n      [\"Size\", `${windowData.widthMm} \u00D7 ${windowData.dropMm} mm`],\r\n      [\r\n        \"Sheer\",\r\n        `${windowData.sheer.collectionTitle} \u00B7 ${windowData.sheer.productTitle} \u00B7 ${windowData.sheer.variantTitle}`\r\n      ],\r\n      [\r\n        \"Blackout\",\r\n        `${windowData.blackout.collectionTitle} \u00B7 ${windowData.blackout.productTitle} \u00B7 ${windowData.blackout.variantTitle}`\r\n      ],\r\n      [\"Heading\", OPTION_LABELS.heading[windowData.heading]],\r\n      [\"System\", OPTION_LABELS.supply[windowData.supply]],\r\n      [\"Track colour\", windowData.supply === \"curtain-only\" ? \"Not applicable\" : OPTION_LABELS.trackColour[windowData.trackColour]],\r\n      [\"Opening\", OPTION_LABELS.opening[windowData.opening]],\r\n      [\"Fixing\", OPTION_LABELS.fixing[windowData.fixing]],\r\n      [\"Finish\", OPTION_LABELS.finish[windowData.finish]],\r\n      [\"Bending\", OPTION_LABELS.trackBending[windowData.trackBending]],\r\n      [\"Pelmet\", windowData.pelmet ? \"Included\" : \"Not included\"],\r\n      [\"Remote\", windowData.remote ? \"Included\" : \"Not included\"],\r\n      [\"Notes\", windowData.notes || \"None\"]\r\n    ].forEach(([label, value]) => card.append(summaryRow(label, value)));\r\n    const pricing = element(\"div\", \"lux-v5-review-pricing\");\r\n    pricing.append(\r\n      summaryRow(\"Original value\", quote.valid ? money(quote.originalTotal) : \"\u2014\"),\r\n      summaryRow(\"Savings\", quote.valid ? money(quote.savings) : \"\u2014\"),\r\n      summaryRow(\"Final window price\", quote.valid ? money(quote.finalTotal) : \"\u2014\")\r\n    );\r\n    const actions = element(\"div\", \"lux-v5-screen-actions\");\r\n    const confirmationLabel = element(\"label\", \"lux-v5-confirmation\");\r\n    const confirmationInput = element(\"input\");\r\n    confirmationInput.type = \"checkbox\";\r\n    confirmationInput.checked = state.draft.window.confirmation === true;\r\n    confirmationInput.dataset.v5Field = \"window-confirmation\";\r\n    confirmationLabel.append(\r\n      confirmationInput,\r\n      element(\r\n        \"span\",\r\n        \"\",\r\n        \"I confirm that this window\u2019s measurements, fabric colours and selected options are correct.\"\r\n      )\r\n    );\r\n    const back = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--secondary\", \"Back to Configuration\"),\r\n      \"review-back\"\r\n    );\r\n    back.type = \"button\";\r\n    const save = setAction(\r\n      element(\r\n        \"button\",\r\n        \"lux-v5-button lux-v5-button--primary\",\r\n        state.project.editingWindowId ? \"Save Window Changes\" : \"Confirm and Save Window\"\r\n      ),\r\n      \"save-window\"\r\n    );\r\n    save.type = \"button\";\r\n    save.disabled = Boolean(errors.length) || state.draft.window.confirmation !== true;\r\n    if (errors.length) {\r\n      const message = element(\"div\", \"lux-v5-inline-message has-error\");\r\n      message.setAttribute(\"role\", \"alert\");\r\n      message.textContent = errors[0];\r\n      card.append(message);\r\n    }\r\n    actions.append(back, save);\r\n    dom.windowReview.append(card, pricing, confirmationLabel, actions);\r\n  };\r\n\r\n  const showWindowCompletion = saved => {\r\n    const content = clear(dom.modalContents.confirm);\r\n    content.className = \"lux-v5-completion\";\r\n    const plans = state.planner.plannedWindows;\r\n    const completed =\r\n      state.journey.mode === MODES.WHOLE_HOME\r\n        ? plans.filter(item => item.status === STATUS.COMPLETE).length\r\n        : state.project.windows.length;\r\n    const total = state.journey.mode === MODES.WHOLE_HOME ? plans.length : state.project.windows.length;\r\n    const next =\r\n      state.journey.mode === MODES.WHOLE_HOME\r\n        ? plans.find(item => item.status !== STATUS.COMPLETE)\r\n        : null;\r\n    const icon = element(\"span\", \"lux-v5-completion__icon\", \"\u2713\");\r\n    icon.setAttribute(\"aria-hidden\", \"true\");\r\n    const heading = element(\"h2\", \"\", `${saved.windowName} completed`);\r\n    heading.id = \"luxV5ConfirmModalTitle\";\r\n    const progress = element(\r\n      \"p\",\r\n      \"lux-v5-completion__progress\",\r\n      `${completed} of ${Math.max(total, completed)} windows completed`\r\n    );\r\n    const summary = element(\"div\", \"lux-v5-completion__summary\");\r\n    summary.append(\r\n      summaryRow(\"Sheer\", saved.sheer.variantTitle),\r\n      summaryRow(\"Blackout\", saved.blackout.variantTitle),\r\n      summaryRow(\"System\", OPTION_LABELS.supply[saved.supply]),\r\n      summaryRow(\"Window price\", saved.quote?.valid ? money(saved.quote.finalTotal) : \"\u2014\")\r\n    );\r\n    const actions = element(\"div\", \"lux-v5-completion__actions\");\r\n    const edit = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--secondary\", \"Review Completed Window\"),\r\n      \"completion-edit\",\r\n      saved.id\r\n    );\r\n    edit.type = \"button\";\r\n    if (next) {\r\n      const nextButton = setAction(\r\n        element(\"button\", \"lux-v5-button lux-v5-button--primary\", `Start ${next.windowName} Fresh`),\r\n        \"completion-next\",\r\n        next.id\r\n      );\r\n      nextButton.type = \"button\";\r\n      actions.append(edit, nextButton);\r\n    } else {\r\n      const review = setAction(\r\n        element(\"button\", \"lux-v5-button lux-v5-button--primary\", \"Review Your Project\"),\r\n        \"completion-review\"\r\n      );\r\n      review.type = \"button\";\r\n      actions.append(edit, review);\r\n    }\r\n    content.append(\r\n      icon,\r\n      heading,\r\n      progress,\r\n      element(\r\n        \"p\",\r\n        \"\",\r\n        next\r\n          ? `Saved successfully. Your next window is ${next.windowName}.`\r\n          : \"Every planned window is complete and ready for project review.\"\r\n      ),\r\n      summary,\r\n      actions\r\n    );\r\n    openModal(\"confirm\");\r\n  };\r\n\r\n  const commitWindow = () => {\r\n    const errors = validateWindow(state.draft.window);\r\n    if (errors.length) return announce(errors[0], \"error\");\r\n    if (state.draft.window.confirmation !== true) {\r\n      return announce(\"Confirm this window before saving it.\", \"error\");\r\n    }\r\n    const saved = deepCopy(state.draft.window);\r\n    saved.quote = PricingProvider.quoteWindow(saved);\r\n    saved.status = STATUS.COMPLETE;\r\n    saved.updatedAt = new Date().toISOString();\r\n    const existingIndex = state.project.windows.findIndex(\r\n      item => item.id === (state.project.editingWindowId || saved.id)\r\n    );\r\n    if (existingIndex >= 0) {\r\n      saved.id = state.project.windows[existingIndex].id;\r\n      state.project.windows.splice(existingIndex, 1, saved);\r\n    } else {\r\n      state.project.windows.push(saved);\r\n    }\r\n    const planned = plannedForDraft();\r\n    if (planned) {\r\n      planned.savedWindowId = saved.id;\r\n      planned.widthMm = saved.widthMm;\r\n      planned.dropMm = saved.dropMm;\r\n      planned.status = STATUS.COMPLETE;\r\n      planned.draftWindow = null;\r\n    }\r\n    if (state.journey.mode === MODES.WHOLE_HOME && !state.project.baseDesign) {\r\n      state.project.baseDesign = {\r\n        sheer: deepCopy(saved.sheer),\r\n        blackout: deepCopy(saved.blackout),\r\n        heading: saved.heading,\r\n        supply: saved.supply,\r\n        supplyChoice: saved.supplyChoice,\r\n        trackColour: saved.trackColour,\r\n        opening: saved.opening,\r\n        fixing: saved.fixing,\r\n        finish: saved.finish,\r\n        trackBending: \"none\",\r\n        bendMeasurements: blankBending(),\r\n        pelmet: saved.pelmet,\r\n        pelmetChoice: saved.pelmetChoice,\r\n        remote: saved.remote\r\n      };\r\n    }\r\n    state.project.editingWindowId = null;\r\n    recalculate();\r\n    touchState();\r\n    announce(`${saved.windowName} was saved.`);\r\n    showWindowCompletion(saved);\r\n  };\r\n\r\n  /* =====================================================================\r\n     29. PROJECT REVIEW\r\n     ===================================================================== */\r\n\r\n  const renderProjectReview = () => {\r\n    clear(dom.projectReview);\r\n    const heading = element(\"section\", \"lux-v5-review-card\");\r\n    const rooms = new Set(state.project.windows.map(item => item.roomName));\r\n    heading.append(\r\n      summaryRow(\"Project type\", state.journey.mode === MODES.WHOLE_HOME ? \"Whole-Home Project\" : \"Single Window\"),\r\n      summaryRow(\"Rooms\", String(rooms.size)),\r\n      summaryRow(\"Saved windows\", String(state.project.windows.length))\r\n    );\r\n    const windowList = element(\"div\", \"lux-v5-project-review__windows\");\r\n    renderSavedWindowCards(windowList);\r\n    const totals = element(\"section\", \"lux-v5-project-totals\");\r\n    renderTotals(totals);\r\n    const notice = element(\r\n      \"p\",\r\n      \"lux-v5-inline-message\",\r\n      \"Custom-made products will be manufactured from the measurements and selections you confirm.\"\r\n    );\r\n    const actions = element(\"div\", \"lux-v5-screen-actions lux-v5-project-review__actions\");\r\n    const add = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--secondary\", \"Add Another Window\"),\r\n      \"add-window\"\r\n    );\r\n    add.type = \"button\";\r\n    const checkoutButton = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--primary\", \"Proceed to Checkout\"),\r\n      \"review-checkout\"\r\n    );\r\n    checkoutButton.type = \"button\";\r\n    actions.append(add, checkoutButton);\r\n    dom.projectReview.append(heading, windowList, totals, notice, actions);\r\n    renderSidebar();\r\n  };\r\n\r\n  /* =====================================================================\r\n     30. CHECKOUT ENGINE\r\n     ===================================================================== */\r\n\r\n  const refreshCheckoutState = () => {\r\n    const enabled = projectCheckoutReady();\r\n    dom.checkoutConfirmation.checked = state.project.confirmed === true;\r\n    dom.root.querySelectorAll(\"[data-v5-project-confirmation]\").forEach(input => {\r\n      input.checked = state.project.confirmed === true;\r\n    });\r\n    dom.checkoutButton.disabled = !enabled;\r\n    dom.checkoutButton.textContent = state.ui.busy\r\n      ? \"Preparing Your Custom Order\u2026\"\r\n      : enabled\r\n        ? \"Proceed to Secure Checkout\"\r\n        : \"Confirm Project to Checkout\";\r\n    dom.root.querySelectorAll(\"[data-v5-action='drawer-checkout']\").forEach(button => {\r\n      button.disabled = !enabled;\r\n      button.textContent = state.ui.busy\r\n        ? \"Preparing Your Custom Order\u2026\"\r\n        : \"Proceed to Secure Checkout\";\r\n    });\r\n    dom.root.querySelectorAll(\"[data-v5-checkout-warning]\").forEach(warning => {\r\n      warning.textContent = projectCheckoutMessage();\r\n      warning.classList.toggle(\"has-error\", !enabled);\r\n    });\r\n  };\r\n\r\n  const productionCode = (windowData, index) =>\r\n    cleanText(\r\n      `V5-W${String(index + 1).padStart(2, \"0\")}-${cleanText(\r\n        windowData.roomName || windowData.windowName,\r\n        60\r\n      )\r\n        .toUpperCase()\r\n        .replace(/[^A-Z0-9]+/g, \"-\")\r\n        .replace(/^-|-$/g, \"\")}`,\r\n      180\r\n    );\r\n\r\n  const compactWindowSummary = (windowData, index) => {\r\n    const quote = PricingProvider.quoteWindow(windowData);\r\n    return cleanText(\r\n      [\r\n        `${index + 1}. ${windowData.roomName} / ${windowData.windowName}`,\r\n        `${windowData.widthMm}x${windowData.dropMm}mm`,\r\n        `Sheer: ${windowData.sheer.productTitle} / ${windowData.sheer.variantTitle} (${windowData.sheer.variantSku || windowData.sheer.variantId})`,\r\n        `Blackout: ${windowData.blackout.productTitle} / ${windowData.blackout.variantTitle} (${windowData.blackout.variantSku || windowData.blackout.variantId})`,\r\n        `${OPTION_LABELS.heading[windowData.heading]}; ${OPTION_LABELS.supply[windowData.supply]}`,\r\n        `${OPTION_LABELS.opening[windowData.opening]}; ${OPTION_LABELS.fixing[windowData.fixing]}; ${OPTION_LABELS.finish[windowData.finish]}`,\r\n        `Bending: ${OPTION_LABELS.trackBending[windowData.trackBending]}; Pelmet: ${windowData.pelmet ? \"Yes\" : \"No\"}; Remote: ${windowData.remote ? \"Yes\" : \"No\"}`,\r\n        windowData.trackBending !== \"none\"\r\n          ? `Bend measurements: ${Object.entries(windowData.bendMeasurements || {})\r\n              .filter(([key, value]) => key !== \"confirmed\" && value)\r\n              .map(([key, value]) => `${key.toUpperCase()}=${cleanText(value, 40)}`)\r\n              .join(\", \")}`\r\n          : \"\",\r\n        `Final: ${money(quote.finalTotal)}; Code: ${productionCode(windowData, index)}`,\r\n        windowData.notes ? `Notes: ${windowData.notes}` : \"\"\r\n      ]\r\n        .filter(Boolean)\r\n        .join(\" | \"),\r\n      1000\r\n    );\r\n  };\r\n\r\n  const appendManufacturingProperties = (properties, windowData, index) => {\r\n    const number = String(index + 1).padStart(2, \"0\");\r\n    const checkoutPrefix = `W${number}`;\r\n    const prefix = `_Manufacturing W${number}`;\r\n    const bendMeasurements = Object.entries(windowData.bendMeasurements || {})\r\n      .filter(([key, value]) => key !== \"confirmed\" && value)\r\n      .map(([key, value]) => `${key.toUpperCase()}=${cleanText(value, 40)}`)\r\n      .join(\", \");\r\n    const quote = PricingProvider.quoteWindow(windowData);\r\n    properties[`Window ${number}`] = cleanText(\r\n      `${windowData.windowName} | ${windowData.widthMm} \u00D7 ${windowData.dropMm} mm | ${productionCode(windowData, index)}`,\r\n      240\r\n    );\r\n    properties[`${checkoutPrefix} Sheer`] = cleanText(\r\n      `${windowData.sheer.productTitle} | ${windowData.sheer.variantTitle} | SKU ${windowData.sheer.variantSku || windowData.sheer.variantId}`,\r\n      240\r\n    );\r\n    properties[`${checkoutPrefix} Blackout`] = cleanText(\r\n      `${windowData.blackout.productTitle} | ${windowData.blackout.variantTitle} | SKU ${windowData.blackout.variantSku || windowData.blackout.variantId}`,\r\n      240\r\n    );\r\n    properties[`${checkoutPrefix} Curtain Setup`] = cleanText(\r\n      `${OPTION_LABELS.heading[windowData.heading]} | ${OPTION_LABELS.opening[windowData.opening]} | ${OPTION_LABELS.fixing[windowData.fixing]} | ${OPTION_LABELS.finish[windowData.finish]}`,\r\n      240\r\n    );\r\n    properties[`${checkoutPrefix} Track Setup`] = cleanText(\r\n      `${OPTION_LABELS.supply[windowData.supply]} | ${\r\n        windowData.supply === \"curtain-only\"\r\n          ? \"Track colour not applicable\"\r\n          : OPTION_LABELS.trackColour[windowData.trackColour]\r\n      } | ${OPTION_LABELS.trackBending[windowData.trackBending]}${\r\n        bendMeasurements ? ` | ${bendMeasurements}` : \"\"\r\n      }`,\r\n      240\r\n    );\r\n    properties[`${checkoutPrefix} Extras`] =\r\n      `Pelmet: ${windowData.pelmet ? \"Included\" : \"Not included\"} | Remote: ${\r\n        windowData.remote ? \"Included\" : \"Not included\"\r\n      }`;\r\n    if (windowData.notes) {\r\n      properties[`${checkoutPrefix} Notes`] = cleanText(windowData.notes, 240);\r\n    }\r\n    properties[`${prefix} Production Code`] = productionCode(windowData, index);\r\n    properties[`${prefix} Room`] = cleanText(windowData.roomName, 120);\r\n    properties[`${prefix} Window`] = cleanText(windowData.windowName, 160);\r\n    properties[`${prefix} Size`] = `${windowData.widthMm} \u00D7 ${windowData.dropMm} mm`;\r\n    properties[`${prefix} Sheer`] = cleanText(\r\n      `${windowData.sheer.collectionTitle} | ${windowData.sheer.productTitle} | ${windowData.sheer.variantTitle}`,\r\n      240\r\n    );\r\n    properties[`${prefix} Sheer SKU`] = cleanText(\r\n      windowData.sheer.variantSku || windowData.sheer.variantId,\r\n      120\r\n    );\r\n    properties[`${prefix} Blackout`] = cleanText(\r\n      `${windowData.blackout.collectionTitle} | ${windowData.blackout.productTitle} | ${windowData.blackout.variantTitle}`,\r\n      240\r\n    );\r\n    properties[`${prefix} Blackout SKU`] = cleanText(\r\n      windowData.blackout.variantSku || windowData.blackout.variantId,\r\n      120\r\n    );\r\n    properties[`${prefix} Heading`] = OPTION_LABELS.heading[windowData.heading];\r\n    properties[`${prefix} System`] = OPTION_LABELS.supply[windowData.supply];\r\n    properties[`${prefix} Track Colour`] =\r\n      windowData.supply === \"curtain-only\"\r\n        ? \"Not applicable\"\r\n        : OPTION_LABELS.trackColour[windowData.trackColour];\r\n    properties[`${prefix} Opening`] = OPTION_LABELS.opening[windowData.opening];\r\n    properties[`${prefix} Fixing`] = OPTION_LABELS.fixing[windowData.fixing];\r\n    properties[`${prefix} Finish`] = OPTION_LABELS.finish[windowData.finish];\r\n    properties[`${prefix} Track Shape`] = OPTION_LABELS.trackBending[windowData.trackBending];\r\n    properties[`${prefix} Bend Measurements`] = bendMeasurements || \"Not applicable\";\r\n    properties[`${prefix} Pelmet`] = windowData.pelmet ? \"Included\" : \"Not included\";\r\n    properties[`${prefix} Remote`] = windowData.remote ? \"Included\" : \"Not included\";\r\n    properties[`${prefix} Notes`] = cleanText(windowData.notes || \"None\", 240);\r\n    properties[`${prefix} Window Price`] = quote.valid ? money(quote.finalTotal) : \"Unavailable\";\r\n  };\r\n\r\n  const existingV5Lines = (cart, variantId) =>\r\n    (cart?.items || []).filter(\r\n      item =>\r\n        idString(item.variant_id) === idString(variantId) &&\r\n        item.properties?.[\"_Luxworld Design Studio\"] === \"Double Curtain Builder V5\"\r\n    );\r\n\r\n  /**\r\n   * Requotes the project, replaces only the prior marked V5 cart line and\r\n   * redirects to Shopify checkout.\r\n   */\r\n  const checkout = async () => {\r\n    recalculate();\r\n    const quote = state.pricing.projectQuote;\r\n    const variantId = toNumber(config.checkout?.priceUnitVariantId);\r\n    if (!state.project.windows.length) return announce(\"Save at least one window before checkout.\", \"error\");\r\n    if (!allPlannedComplete()) return announce(\"Complete every planned window before checkout.\", \"error\");\r\n    if (!state.project.confirmed) {\r\n      return announce(\"Confirm the complete project before checkout.\", \"error\");\r\n    }\r\n    if (!quote.valid || !positive(quote.finalTotal)) return announce(PRICING_ERROR, \"error\");\r\n    if (!positive(variantId)) return announce(\"The Shopify checkout product is not configured.\", \"error\");\r\n\r\n    state.ui.busy = true;\r\n    refreshCheckoutState();\r\n    storage.save();\r\n    const rooms = new Set(state.project.windows.map(item => item.roomName));\r\n    const properties = {\r\n      \"_Luxworld Design Studio\": \"Double Curtain Builder V5\",\r\n      \"Design Studio Version\": VERSION,\r\n      \"Order Type\": \"LUXWORLD Custom-Made Double Curtains\",\r\n      \"Journey Type\": state.journey.mode === MODES.WHOLE_HOME ? \"Whole-Home Project\" : \"One Window\",\r\n      \"Project ID\": cleanText(state.project.id, 100),\r\n      \"Number of Windows\": String(state.project.windows.length),\r\n      \"Number of Rooms\": String(rooms.size),\r\n      \"Original Project Value\": money(quote.originalTotal),\r\n      \"Fabric Promotions\": quote.fabricPromotions ? money(quote.fabricPromotions) : \"None\",\r\n      \"Order Promotion\": quote.orderDiscount ? money(quote.orderDiscount) : \"None\",\r\n      \"Total Savings\": quote.savings ? money(quote.savings) : \"None\",\r\n      \"Final Project Value\": money(quote.finalTotal),\r\n      \"Manufacturing Lead Time\": cleanText(config.settings.leadTime || \"Approximately 4\u20136 weeks\", 120)\r\n    };\r\n    state.project.windows.forEach((windowData, index) => {\r\n      appendManufacturingProperties(properties, windowData, index);\r\n    });\r\n\r\n    try {\r\n      const cartResponse = await fetch(config.routes.cartJson || \"/cart.js\", {\r\n        headers: { Accept: \"application/json\" }\r\n      });\r\n      if (!cartResponse.ok) throw new Error(`Cart fetch failed (${cartResponse.status}).`);\r\n      const cart = await cartResponse.json();\r\n      for (const line of existingV5Lines(cart, variantId)) {\r\n        const removeResponse = await fetch(config.routes.cartChange || \"/cart/change.js\", {\r\n          method: \"POST\",\r\n          headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\r\n          body: JSON.stringify({ id: line.key, quantity: 0 })\r\n        });\r\n        if (!removeResponse.ok) throw new Error(\"Could not replace the previous V5 cart line.\");\r\n      }\r\n      const addResponse = await fetch(config.routes.cartAdd || \"/cart/add.js\", {\r\n        method: \"POST\",\r\n        headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\r\n        body: JSON.stringify({\r\n          items: [\r\n            {\r\n              id: variantId,\r\n              quantity: Math.max(1, Math.ceil(quote.finalTotal)),\r\n              properties\r\n            }\r\n          ]\r\n        })\r\n      });\r\n      if (!addResponse.ok) throw new Error(`Cart add failed (${addResponse.status}).`);\r\n      window.location.assign(config.routes.checkout || \"/checkout\");\r\n    } catch (error) {\r\n      console.error(\"[LUXWORLD V5] Checkout failed:\", error);\r\n      state.ui.busy = false;\r\n      refreshCheckoutState();\r\n      announce(\"Unable to prepare the secure checkout. Please try again or contact LUXWORLD.\", \"error\");\r\n    }\r\n  };\r\n\r\n  /* =====================================================================\r\n     31. VALIDATION\r\n     ===================================================================== */\r\n\r\n  const nextStage = () => {\r\n    const current = state.journey.stage;\r\n    if (current === STAGES.FABRIC_SELECTION) {\r\n      if (!state.draft.window.sheer.confirmed || !state.draft.window.blackout.confirmed) {\r\n        return announce(\"Confirm one sheer and one blackout fabric before continuing.\", \"error\");\r\n      }\r\n      if (state.ui.fabricReturnStage) {\r\n        const returnStage = state.ui.fabricReturnStage;\r\n        state.ui.fabricReturnStage = null;\r\n        routeTo(returnStage);\r\n        return;\r\n      }\r\n      if (state.journey.mode === MODES.WHOLE_HOME && !state.project.baseDesign) {\r\n        state.project.baseDesign = {\r\n          sheer: deepCopy(state.draft.window.sheer),\r\n          blackout: deepCopy(state.draft.window.blackout)\r\n        };\r\n        state.ui.configuringBase = false;\r\n        const first = state.planner.plannedWindows.find(item => item.status !== STATUS.COMPLETE);\r\n        if (!first) return announce(\"No incomplete planned window is available.\", \"error\");\r\n        openPlannedWindow(first);\r\n      } else {\r\n        routeTo(STAGES.MEASUREMENTS);\r\n      }\r\n      return;\r\n    }\r\n    if (current === STAGES.MEASUREMENTS) {\r\n      const errors = validateMeasurements(state.draft.window);\r\n      if (errors.length) {\r\n        announce(errors[0], \"error\");\r\n        dom.measurementValidation.textContent = errors[0];\r\n        dom.measurementValidation.classList.add(\"has-error\");\r\n        (errors[0].startsWith(\"Track\") ? dom.width : dom.drop).focus();\r\n        return;\r\n      }\r\n      completeWindowAccordionStep(\"measurements\");\r\n      return;\r\n    }\r\n    if (current === STAGES.WINDOW_CONFIGURATION) {\r\n      if (state.ui.configuringBase) {\r\n        const draft = state.draft.window;\r\n        state.project.baseDesign = {\r\n          sheer: deepCopy(draft.sheer),\r\n          blackout: deepCopy(draft.blackout),\r\n          heading: draft.heading,\r\n          supply: draft.supply,\r\n          supplyChoice: draft.supplyChoice,\r\n          trackColour: draft.trackColour,\r\n          opening: draft.opening,\r\n          fixing: draft.fixing,\r\n          finish: draft.finish,\r\n          trackBending: \"none\",\r\n          bendMeasurements: blankBending(),\r\n          pelmet: draft.pelmet,\r\n          pelmetChoice: draft.pelmetChoice,\r\n          remote: draft.remote\r\n        };\r\n        state.ui.configuringBase = false;\r\n        const first = state.planner.plannedWindows.find(item => item.status !== STATUS.COMPLETE);\r\n        if (!first) return announce(\"No incomplete planned window is available.\", \"error\");\r\n        touchState();\r\n        openPlannedWindow(first);\r\n        return;\r\n      }\r\n      const bendingErrors = validateBending(state.draft.window);\r\n      if (bendingErrors.length) return announce(bendingErrors[0], \"error\");\r\n      routeTo(STAGES.WINDOW_REVIEW);\r\n      return;\r\n    }\r\n    if (current === STAGES.WINDOW_REVIEW) commitWindow();\r\n    if (current === STAGES.PROJECT_REVIEW) {\r\n      if (window.matchMedia(\"(max-width: 980px)\").matches) {\r\n        openDrawer();\r\n        requestAnimationFrame(() => {\r\n          dom.drawerContent\r\n            .querySelector(\"[data-v5-project-confirmation]\")\r\n            ?.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n        });\r\n      } else {\r\n        dom.sidebar?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n        dom.checkoutConfirmation?.focus();\r\n      }\r\n    }\r\n  };\r\n\r\n  const renderDesktopPrimaryAction = () => {\r\n    dom.root.querySelectorAll(\".lux-v5-generated-actions\").forEach(node => node.remove());\r\n    const stageNode = {\r\n      [STAGES.FABRIC_SELECTION]: dom.stages.fabric,\r\n      [STAGES.WINDOW_CONFIGURATION]: dom.stages.configuration\r\n    }[state.journey.stage];\r\n    if (!stageNode) return;\r\n    const labels = {\r\n      [STAGES.FABRIC_SELECTION]:\r\n        state.journey.mode === MODES.WHOLE_HOME && !state.project.baseDesign\r\n          ? \"Continue to Design Curtains\"\r\n          : \"Continue to Measurements\",\r\n      [STAGES.WINDOW_CONFIGURATION]: state.ui.configuringBase\r\n        ? \"Start Measuring Windows\"\r\n        : \"Review This Window\"\r\n    };\r\n    const footer = element(\"footer\", \"lux-v5-screen-actions lux-v5-generated-actions\");\r\n    const backLabels = {\r\n      [STAGES.FABRIC_SELECTION]:\r\n        state.journey.mode === MODES.WHOLE_HOME ? \"Back to Project Plan\" : \"Back to Journey\",\r\n      [STAGES.WINDOW_CONFIGURATION]: state.ui.configuringBase\r\n        ? \"Back to Fabrics\"\r\n        : \"Back to Measurements\"\r\n    };\r\n    const back = setAction(\r\n      element(\r\n        \"button\",\r\n        \"lux-v5-button lux-v5-button--secondary lux-v5-stage-back\",\r\n        backLabels[state.journey.stage]\r\n      ),\r\n      \"stage-back\"\r\n    );\r\n    back.type = \"button\";\r\n    const button = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--primary\", labels[state.journey.stage]),\r\n      \"primary-next\"\r\n    );\r\n    button.type = \"button\";\r\n    button.disabled = state.ui.busy || !primaryStageReady();\r\n    footer.append(back, button);\r\n    stageNode.append(footer);\r\n  };\r\n\r\n  /* =====================================================================\r\n     32. ACCESSIBILITY\r\n     ===================================================================== */\r\n\r\n  const focusableSelector =\r\n    'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\r\n\r\n  const openModal = name => {\r\n    const modal = dom.modals[name];\r\n    if (!modal) return;\r\n    lastFocusedElement = document.activeElement;\r\n    state.ui.activeModal = name;\r\n    modal.classList.add(\"is-open\");\r\n    modal.setAttribute(\"aria-hidden\", \"false\");\r\n    document.body.classList.add(\"lux-v5-scroll-locked\");\r\n    const isCompletion = name === \"confirm\" && modal.querySelector(\".lux-v5-completion\");\r\n    document.body.classList.toggle(\"lux-v5-completion-open\", Boolean(isCompletion));\r\n    if (isCompletion) {\r\n      document.querySelectorAll(\"a\").forEach(link => {\r\n        const identity = `${link.textContent || \"\"} ${link.getAttribute(\"href\") || \"\"}`.toLowerCase();\r\n        if (identity.includes(\"orders@luxworld.net.au\") || identity.includes(\"orders%40luxworld.net.au\")) {\r\n          link.classList.add(\"lux-v5-hidden-completion-email\");\r\n        }\r\n      });\r\n    }\r\n    modal.querySelector(focusableSelector)?.focus();\r\n  };\r\n\r\n  const closeModal = name => {\r\n    const modal = dom.modals[name];\r\n    if (!modal) return;\r\n    modal.classList.remove(\"is-open\");\r\n    modal.setAttribute(\"aria-hidden\", \"true\");\r\n    state.ui.activeModal = null;\r\n    document.body.classList.remove(\"lux-v5-completion-open\");\r\n    document.querySelectorAll(\".lux-v5-hidden-completion-email\").forEach(link => {\r\n      link.classList.remove(\"lux-v5-hidden-completion-email\");\r\n    });\r\n    if (!state.ui.mobileDrawerOpen) document.body.classList.remove(\"lux-v5-scroll-locked\");\r\n    lastFocusedElement?.focus?.();\r\n  };\r\n\r\n  const trapModalFocus = event => {\r\n    if (event.key !== \"Tab\") return;\r\n    const trapRoot = state.ui.activeModal\r\n      ? dom.modals[state.ui.activeModal]\r\n      : state.ui.mobileDrawerOpen\r\n        ? dom.drawer.querySelector(\".lux-v5-drawer__panel\")\r\n        : null;\r\n    if (!trapRoot) return;\r\n    const items = [...trapRoot.querySelectorAll(focusableSelector)];\r\n    if (!items.length) return;\r\n    const first = items[0];\r\n    const last = items[items.length - 1];\r\n    if (event.shiftKey && document.activeElement === first) {\r\n      event.preventDefault();\r\n      last.focus();\r\n    } else if (!event.shiftKey && document.activeElement === last) {\r\n      event.preventDefault();\r\n      first.focus();\r\n    }\r\n  };\r\n\r\n  /* =====================================================================\r\n     33. ERROR HANDLING\r\n     ===================================================================== */\r\n\r\n  const fatal = error => {\r\n    console.error(\"[LUXWORLD V5] Initialisation failed:\", error);\r\n    if (!dom || !state?.runtime) {\r\n      const root = document.getElementById(ROOT_ID);\r\n      const message = root?.querySelector(\"#luxV5FatalErrorMessage\");\r\n      const fatalNode = root?.querySelector(\"#luxV5FatalError\");\r\n      const loading = root?.querySelector(\"#luxV5Loading\");\r\n      if (message) message.textContent = cleanText(error.message);\r\n      if (fatalNode) fatalNode.hidden = false;\r\n      if (loading) loading.hidden = true;\r\n      return;\r\n    }\r\n    state.runtime.fatalError = error.message;\r\n    dom.fatalMessage.textContent = cleanText(error.message);\r\n    setHidden(dom.loading, true);\r\n    setHidden(dom.application, true);\r\n    setHidden(dom.fatal, false);\r\n  };\r\n\r\n  /* =====================================================================\r\n     34. APPLICATION INITIALISATION\r\n     ===================================================================== */\r\n\r\n  const renderStage = () => {\r\n    if (!state || !dom) return;\r\n    renderJourneyHeader();\r\n    if (state.journey.stage === STAGES.WHOLE_HOME_PLANNER) renderPlanner();\r\n    if (state.journey.stage === STAGES.FABRIC_SELECTION) renderFabrics();\r\n    if (state.journey.stage === STAGES.MEASUREMENTS) {\r\n      renderMeasurements();\r\n      renderConfiguration();\r\n      renderWindowReview();\r\n      renderWindowAccordion();\r\n    }\r\n    if (state.journey.stage === STAGES.WINDOW_CONFIGURATION) renderConfiguration();\r\n    if (state.journey.stage === STAGES.WINDOW_REVIEW) renderWindowReview();\r\n    if (state.journey.stage === STAGES.PROJECT_REVIEW) renderProjectReview();\r\n    renderDesktopPrimaryAction();\r\n    renderSidebar();\r\n  };\r\n\r\n  const confirmAction = (title, message, action, value) => {\r\n    const content = clear(dom.modalContents.confirm);\r\n    const heading = element(\"h2\", \"\", title);\r\n    heading.id = \"luxV5ConfirmModalTitle\";\r\n    const actions = element(\"div\", \"lux-v5-screen-actions\");\r\n    const cancel = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--secondary\", \"Cancel\"),\r\n      \"close-confirm\"\r\n    );\r\n    cancel.type = \"button\";\r\n    const confirm = setAction(\r\n      element(\"button\", \"lux-v5-button lux-v5-button--primary\", \"Confirm\"),\r\n      action,\r\n      value\r\n    );\r\n    confirm.type = \"button\";\r\n    actions.append(cancel, confirm);\r\n    content.append(heading, element(\"p\", \"\", message), actions);\r\n    openModal(\"confirm\");\r\n  };\r\n\r\n  const openFabricDetails = (layer, kind, allowConfirmation = false) => {\r\n    const selection = state.draft.window[layer];\r\n    const collection = selectedCollection(layer);\r\n    const product = productFor(selection.productId);\r\n    const content = clear(dom.modalContents.fabric);\r\n    const source = kind === \"collection\" ? collection : product;\r\n    content.className = allowConfirmation ? \"lux-v5-fabric-confirmation\" : \"lux-v5-fabric-details\";\r\n    const title = element(\r\n      \"h2\",\r\n      \"\",\r\n      allowConfirmation\r\n        ? selection.variantTitle || source?.title || `${layer} fabric`\r\n        : source?.title || `${layer} fabric`\r\n    );\r\n    title.id = \"luxV5FabricModalTitle\";\r\n    const imageUrl =\r\n      kind === \"product\" && selection.variantImage\r\n        ? selection.variantImage\r\n        : source?.featuredImage || selection.collectionImage;\r\n    if (imageUrl) {\r\n      const image = element(\"img\");\r\n      image.src = imageUrl;\r\n      image.alt = allowConfirmation\r\n        ? `${selection.variantTitle} from ${selection.collectionTitle}`\r\n        : source?.title || \"\";\r\n      image.className = allowConfirmation\r\n        ? \"lux-v5-fabric-confirmation__image\"\r\n        : \"lux-v5-fabric-details__image\";\r\n      content.append(image);\r\n    }\r\n    content.append(title);\r\n    if (allowConfirmation) {\r\n      content.append(\r\n        element(\r\n          \"p\",\r\n          \"lux-v5-fabric-confirmation__subtitle\",\r\n          `${selection.collectionTitle}${selection.variantSku ? ` \u00B7 ${selection.variantSku}` : \"\"}`\r\n        )\r\n      );\r\n    } else {\r\n      content.append(\r\n        element(\r\n          \"p\",\r\n          \"\",\r\n          kind === \"collection\"\r\n            ? collection?.description || \"Collection details are not available.\"\r\n            : product?.specifications?.description || \"Fabric details are not available.\"\r\n        )\r\n      );\r\n    }\r\n    if (kind === \"product\" && product && !allowConfirmation) {\r\n      const selectionDetails = element(\"dl\", \"lux-v5-specifications\");\r\n      [\r\n        [\"Collection\", selection.collectionTitle],\r\n        [\"Fabric\", selection.productTitle],\r\n        [\"Colour\", selection.variantTitle],\r\n        [\"SKU\", selection.variantSku || \"Not supplied\"],\r\n        [\r\n          \"Promotion\",\r\n          selection.promotionPercent ? `${selection.promotionPercent}%` : \"No current promotion\"\r\n        ],\r\n        [\"Maximum drop\", `${selection.maximumDropMm || \"\u2014\"} mm`]\r\n      ].forEach(([term, description]) => {\r\n        selectionDetails.append(element(\"dt\", \"\", term), element(\"dd\", \"\", description));\r\n      });\r\n      content.append(selectionDetails);\r\n      const specs = element(\"dl\", \"lux-v5-specifications\");\r\n      [\r\n        [\"Composition\", product.specifications?.fabricComposition],\r\n        [\"Fabric width\", product.specifications?.fabricWidth],\r\n        [\"Maximum drop\", `${product.specifications?.maximumDropMm || \"\u2014\"} mm`]\r\n      ].forEach(([term, description]) => {\r\n        specs.append(element(\"dt\", \"\", term), element(\"dd\", \"\", description || \"\u2014\"));\r\n      });\r\n      content.append(specs);\r\n    }\r\n    if (allowConfirmation && selection.variantId) {\r\n      const confirmation = setAction(\r\n        element(\r\n          \"button\",\r\n          \"lux-v5-button lux-v5-button--primary\",\r\n          `Confirm ${layer === \"sheer\" ? \"Sheer\" : \"Blackout\"} \u2014 ${selection.variantTitle}`\r\n        ),\r\n        \"confirm-fabric\",\r\n        layer\r\n      );\r\n      confirmation.type = \"button\";\r\n      confirmation.textContent = \"Confirm Colour\";\r\n      const chooseDifferent = setAction(\r\n        element(\"button\", \"lux-v5-button lux-v5-button--secondary\", \"Choose Different Colour\"),\r\n        \"close-fabric\"\r\n      );\r\n      chooseDifferent.type = \"button\";\r\n      const actions = element(\"div\", \"lux-v5-fabric-confirmation__actions\");\r\n      actions.append(confirmation, chooseDifferent);\r\n      content.append(actions);\r\n    }\r\n    openModal(\"fabric\");\r\n  };\r\n\r\n  const handleAction = target => {\r\n    const action = target.dataset.v5Action;\r\n    const value = target.dataset.v5Value;\r\n    if (!action) return;\r\n    const [first, second] = String(value || \"\").split(\":\");\r\n\r\n    if (action === \"preset\") applyPreset(value);\r\n    if (action === \"toggle-optional-rooms\") {\r\n      state.ui.optionalRoomsExpanded = !state.ui.optionalRoomsExpanded;\r\n      renderPlanner();\r\n    }\r\n    if (action === \"close-fabric\") closeModal(\"fabric\");\r\n    if (action === \"stage-back\") {\r\n      if (state.journey.stage === STAGES.FABRIC_SELECTION) {\r\n        if (state.ui.fabricReturnStage) {\r\n          const returnStage = state.ui.fabricReturnStage;\r\n          state.ui.fabricReturnStage = null;\r\n          routeTo(returnStage);\r\n        } else {\r\n          routeTo(\r\n            state.journey.mode === MODES.WHOLE_HOME ? STAGES.WHOLE_HOME_PLANNER : STAGES.ENTRY\r\n          );\r\n        }\r\n      } else if (state.journey.stage === STAGES.MEASUREMENTS) {\r\n        const previous = adjacentPlannedWindow(-1);\r\n        if (state.journey.mode === MODES.WHOLE_HOME && previous) {\r\n          openPlannedWindow(previous);\r\n        } else {\r\n          routeTo(STAGES.FABRIC_SELECTION);\r\n        }\r\n      } else if (state.journey.stage === STAGES.WINDOW_CONFIGURATION) {\r\n        routeTo(state.ui.configuringBase ? STAGES.FABRIC_SELECTION : STAGES.MEASUREMENTS);\r\n      }\r\n    }\r\n    if (action === \"jump-window\") {\r\n      const planned = state.planner.plannedWindows.find(item => item.id === value);\r\n      if (planned && planned.id !== state.draft.window.plannedWindowId) openPlannedWindow(planned);\r\n    }\r\n    if (action === \"completion-next\") {\r\n      const planned = state.planner.plannedWindows.find(item => item.id === value);\r\n      closeModal(\"confirm\");\r\n      if (planned) openPlannedWindow(planned, { startFresh: true });\r\n    }\r\n    if (action === \"completion-edit\") {\r\n      const saved = state.project.windows.find(item => item.id === value);\r\n      closeModal(\"confirm\");\r\n      if (saved) {\r\n        const planned = state.planner.plannedWindows.find(item => item.savedWindowId === saved.id);\r\n        state.project.editingWindowId = saved.id;\r\n        if (planned) openPlannedWindow(planned);\r\n        else {\r\n          replaceDraft(saved);\r\n          routeTo(STAGES.MEASUREMENTS);\r\n        }\r\n      }\r\n    }\r\n    if (action === \"completion-review\") {\r\n      closeModal(\"confirm\");\r\n      routeTo(STAGES.PROJECT_REVIEW);\r\n    }\r\n    if (action === \"request-reset\") {\r\n      closeDrawer();\r\n      confirmAction(\r\n        \"Start over?\",\r\n        \"This will clear all your current selections and start a new design.\",\r\n        \"confirm-reset\"\r\n      );\r\n    }\r\n    if (action === \"room-plus\") {\r\n      addPlannedWindow(value);\r\n      renderPlanner();\r\n      touchState();\r\n    }\r\n    if (action === \"room-minus\") {\r\n      const candidates = roomWindows(value);\r\n      const item = candidates[candidates.length - 1];\r\n      if (item && !item.savedWindowId) {\r\n        state.planner.plannedWindows = state.planner.plannedWindows.filter(plan => plan.id !== item.id);\r\n        normalisePlan();\r\n        renderPlanner();\r\n        touchState();\r\n      } else if (item) {\r\n        announce(\"Remove the saved window from the project before reducing this room.\", \"error\");\r\n      }\r\n    }\r\n    if (action === \"plan-delete\") {\r\n      state.planner.plannedWindows = state.planner.plannedWindows.filter(item => item.id !== value);\r\n      normalisePlan();\r\n      renderPlanner();\r\n      touchState();\r\n    }\r\n    if (action === \"fabric-collection\") chooseCollection(first, second);\r\n    if (action === \"fabric-product\") chooseProduct(first, second);\r\n    if (action === \"fabric-variant\") chooseVariant(first, second);\r\n    if (action === \"review-fabric\") openFabricDetails(value, \"product\", true);\r\n    if (action === \"change-fabric\") {\r\n      invalidateDraftConfirmation();\r\n      state.draft.window[value].confirmed = false;\r\n      renderFabricProducts(value);\r\n      recalculate();\r\n      renderSidebar();\r\n      touchState();\r\n      announce(`${value === \"sheer\" ? \"Sheer\" : \"Blackout\"} fabric unlocked for changes.`);\r\n    }\r\n    if (action === \"confirm-fabric\") {\r\n      invalidateDraftConfirmation();\r\n      state.draft.window[value].confirmed = true;\r\n      closeModal(\"fabric\");\r\n      renderFabricProducts(value);\r\n      recalculate();\r\n      renderSidebar();\r\n      touchState();\r\n      window.setTimeout(() => {\r\n        const nextSection =\r\n          value === \"sheer\" && !state.draft.window.blackout.confirmed\r\n            ? dom.collections.blackout.closest(\".lux-v5-config-card\")\r\n            : dom.generatedActions;\r\n        if (!nextSection) return;\r\n        const headerHeight =\r\n          dom.journeyHeader && !dom.journeyHeader.hidden\r\n            ? dom.journeyHeader.getBoundingClientRect().height\r\n            : 0;\r\n        const top = Math.max(\r\n          0,\r\n          nextSection.getBoundingClientRect().top + window.scrollY - headerHeight - 18\r\n        );\r\n        window.scrollTo({\r\n          top,\r\n          behavior: window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\r\n            ? \"auto\"\r\n            : \"smooth\"\r\n        });\r\n      }, 60);\r\n    }\r\n    if (action === \"fabric-details\") openFabricDetails(first, second);\r\n    if (action === \"change-window-fabric\") {\r\n      invalidateDraftConfirmation();\r\n      state.draft.window[value].confirmed = false;\r\n      state.ui.fabricReturnStage = STAGES.MEASUREMENTS;\r\n      routeTo(STAGES.FABRIC_SELECTION);\r\n      announce(\r\n        `Choose and confirm a new ${value === \"sheer\" ? \"sheer\" : \"blackout\"} fabric for this window.`\r\n      );\r\n    }\r\n    if (action === \"primary-next\") nextStage();\r\n    if (action === \"accordion-open\") openWindowAccordionStep(value);\r\n    if (action === \"accordion-next\") completeWindowAccordionStep(value);\r\n    if (action === \"select-room\") {\r\n      invalidateDraftConfirmation();\r\n      state.draft.window.roomName = value;\r\n      state.draft.window.roomPreset = value;\r\n      if (value !== \"Custom Room\") {\r\n        state.draft.window.windowName =\r\n          state.journey.mode === MODES.SINGLE\r\n            ? `${value} Window ${state.project.windows.filter(item => item.roomName === value).length + 1}`\r\n            : state.draft.window.windowName;\r\n        state.draft.window.displayName = state.draft.window.windowName;\r\n        state.draft.window.customRoomName = \"\";\r\n      }\r\n      renderRooms();\r\n      touchState();\r\n    }\r\n    if (action === \"option\") {\r\n      invalidateDraftConfirmation();\r\n      const group = first;\r\n      state.draft.window[group] = second;\r\n      if (group === \"supply\") {\r\n        state.draft.window.supplyChoice = second;\r\n        if (second === \"curtain-only\") {\r\n          state.draft.window.remote = false;\r\n          state.draft.window.trackBending = \"none\";\r\n          state.draft.window.bendMeasurements = blankBending();\r\n        }\r\n        if (second === \"manual-double-track\") state.draft.window.remote = false;\r\n        if ([\"motorised-double-track\", \"led-motorised-double-track\"].includes(second)) {\r\n          state.draft.window.trackColour = \"white\";\r\n        }\r\n      }\r\n      if (group === \"trackBending\") {\r\n        state.draft.window.bendMeasurements = blankBending();\r\n        state.draft.window.bendMeasurements.confirmed = second === \"none\";\r\n      }\r\n      if (group === \"pelmetChoice\") {\r\n        state.draft.window.pelmet = second === \"yes\";\r\n      }\r\n      renderConfiguration();\r\n      recalculate();\r\n      renderSidebar();\r\n      touchState();\r\n      if (group === \"trackBending\" && second !== \"none\") {\r\n        openBendingModal();\r\n      }\r\n    }\r\n    if (action === \"open-bending\") openBendingModal();\r\n    if (action === \"confirm-bending\") {\r\n      invalidateDraftConfirmation();\r\n      const fields = dom.modalContents.bending.querySelectorAll(\"[data-v5-bending-field]\");\r\n      fields.forEach(input => {\r\n        state.draft.window.bendMeasurements[input.dataset.v5BendingField] = toNumber(input.value);\r\n      });\r\n      state.draft.window.bendMeasurements.confirmed = true;\r\n      const errors = validateBending(state.draft.window);\r\n      if (errors.length) {\r\n        state.draft.window.bendMeasurements.confirmed = false;\r\n        const message = dom.modalContents.bending.querySelector(\"[data-v5-bending-message]\");\r\n        message.textContent = errors[0];\r\n        message.classList.add(\"has-error\");\r\n      } else {\r\n        closeModal(\"bending\");\r\n        renderConfiguration();\r\n        recalculate();\r\n        renderSidebar();\r\n        touchState();\r\n        announce(\"Track bending measurements confirmed.\");\r\n      }\r\n    }\r\n    if (action === \"review-back\") openWindowAccordionStep(\"notes\");\r\n    if (action === \"save-window\") commitWindow();\r\n    if (action === \"save-window-direct\") commitWindow();\r\n    if (action === \"edit-window\") {\r\n      const saved = state.project.windows.find(item => item.id === value);\r\n      if (!saved) return;\r\n      state.project.editingWindowId = saved.id;\r\n      const planned = state.planner.plannedWindows.find(item => item.savedWindowId === saved.id);\r\n      if (planned) {\r\n        openPlannedWindow(planned);\r\n      } else {\r\n        replaceDraft(saved);\r\n        state.draft.window.confirmation = false;\r\n        routeTo(STAGES.MEASUREMENTS);\r\n      }\r\n      closeDrawer();\r\n    }\r\n    if (action === \"duplicate-window\") {\r\n      const source = state.project.windows.find(item => item.id === value);\r\n      if (source) {\r\n        const duplicate = deepCopy(source);\r\n        duplicate.id = uid(\"window\");\r\n        duplicate.windowName = `${source.windowName} Copy`;\r\n        duplicate.displayName = duplicate.windowName;\r\n        duplicate.confirmation = true;\r\n        duplicate.updatedAt = new Date().toISOString();\r\n        state.project.windows.push(duplicate);\r\n        if (state.journey.mode === MODES.WHOLE_HOME) {\r\n          state.planner.plannedWindows.push({\r\n            id: uid(\"planned\"),\r\n            roomName: duplicate.roomName,\r\n            customRoomName: null,\r\n            windowName: duplicate.windowName,\r\n            sequence: roomWindows(duplicate.roomName).length + 1,\r\n            status: STATUS.COMPLETE,\r\n            savedWindowId: duplicate.id,\r\n            widthMm: duplicate.widthMm,\r\n            dropMm: duplicate.dropMm,\r\n            draftWindow: null\r\n          });\r\n          normalisePlan();\r\n        }\r\n        recalculate();\r\n        renderStage();\r\n        touchState();\r\n        announce(`${duplicate.windowName} added to your project.`);\r\n      }\r\n    }\r\n    if (action === \"remove-window\") {\r\n      closeDrawer();\r\n      confirmAction(\r\n        \"Remove this window?\",\r\n        \"This removes the saved window and its price from your project.\",\r\n        \"confirm-remove-window\",\r\n        value\r\n      );\r\n    }\r\n    if (action === \"confirm-remove-window\") {\r\n      state.project.windows = state.project.windows.filter(item => item.id !== value);\r\n      state.project.confirmed = false;\r\n      if (state.project.editingWindowId === value) state.project.editingWindowId = null;\r\n      const planned = state.planner.plannedWindows.find(item => item.savedWindowId === value);\r\n      if (planned) {\r\n        planned.savedWindowId = null;\r\n        planned.status = STATUS.PLANNED;\r\n        planned.widthMm = 0;\r\n        planned.dropMm = 0;\r\n      }\r\n      closeModal(\"confirm\");\r\n      recalculate();\r\n      renderStage();\r\n      touchState();\r\n      announce(\"Window removed.\");\r\n    }\r\n    if (action === \"add-window\") startAdditionalWindow();\r\n    if (action === \"review-checkout\") nextStage();\r\n    if (action === \"drawer-checkout\") checkout();\r\n    if (action === \"close-confirm\") closeModal(\"confirm\");\r\n    if (action === \"confirm-reset\") {\r\n      closeModal(\"confirm\");\r\n      resetProject();\r\n    }\r\n  };\r\n\r\n  const bindEvents = () => {\r\n    dom.root.addEventListener(\"click\", event => {\r\n      const journey = event.target.closest(\"[data-v5-select-journey]\");\r\n      if (journey) return selectJourney(journey.dataset.v5SelectJourney);\r\n      if (event.target.closest(\"[data-v5-back-entry], [data-v5-change-journey]\")) {\r\n        return confirmAction(\r\n          \"Change your design journey?\",\r\n          \"This will clear all your current selections and start a new design journey.\",\r\n          \"confirm-reset\"\r\n        );\r\n      }\r\n      if (event.target.closest(\"[data-v5-close-drawer]\")) return closeDrawer();\r\n      const close = event.target.closest(\"[data-v5-close-modal]\");\r\n      if (close) return closeModal(close.dataset.v5CloseModal);\r\n      const actionTarget = event.target.closest(\"[data-v5-action]\");\r\n      if (actionTarget) {\r\n        event.preventDefault();\r\n        handleAction(actionTarget);\r\n      }\r\n    });\r\n\r\n    dom.root.addEventListener(\"input\", event => {\r\n      if (event.target.matches(\"[data-v5-plan-name]\")) {\r\n        const item = state.planner.plannedWindows.find(\r\n          plan => plan.id === event.target.dataset.v5PlanName\r\n        );\r\n        if (item) item.windowName = cleanText(event.target.value, 80);\r\n        touchState();\r\n      }\r\n      if (event.target.matches(\"[data-v5-plan-room]\")) {\r\n        const item = state.planner.plannedWindows.find(\r\n          plan => plan.id === event.target.dataset.v5PlanRoom\r\n        );\r\n        if (item) item.customRoomName = cleanText(event.target.value, 60);\r\n        touchState();\r\n      }\r\n      if (event.target === dom.width || event.target === dom.drop) {\r\n        invalidateDraftConfirmation();\r\n        const field = event.target === dom.width ? \"widthMm\" : \"dropMm\";\r\n        state.draft.window[field] = Math.max(0, toNumber(event.target.value));\r\n        if (field === \"widthMm\" && state.draft.window.trackBending !== \"none\") {\r\n          state.draft.window.bendMeasurements.confirmed = false;\r\n        }\r\n        debounceInputPricing();\r\n        touchState();\r\n      }\r\n      if (event.target === dom.customRoom) {\r\n        invalidateDraftConfirmation();\r\n        state.draft.window.windowName = cleanText(event.target.value, 80);\r\n        state.draft.window.displayName = state.draft.window.windowName;\r\n        state.draft.window.customRoomName = state.draft.window.windowName;\r\n        touchState();\r\n      }\r\n      if (event.target.dataset.v5Field === \"notes\") {\r\n        invalidateDraftConfirmation();\r\n        state.draft.window.notes = cleanText(event.target.value, 500);\r\n        touchState();\r\n      }\r\n    });\r\n\r\n    dom.root.addEventListener(\"change\", event => {\r\n      if (event.target.hasAttribute(\"data-v5-room-select\")) {\r\n        const room = cleanText(event.target.value, 60);\r\n        invalidateDraftConfirmation();\r\n        state.draft.window.roomName = room;\r\n        state.draft.window.roomPreset = room;\r\n        if (room !== \"Custom Room\" && state.journey.mode === MODES.SINGLE) {\r\n          state.draft.window.windowName = `${room} Window ${\r\n            state.project.windows.filter(item => item.roomName === room).length + 1\r\n          }`;\r\n          state.draft.window.displayName = state.draft.window.windowName;\r\n          dom.customRoom.value = state.draft.window.windowName;\r\n        }\r\n        renderWindowAccordion();\r\n        renderSidebar();\r\n        touchState();\r\n      }\r\n      if (event.target.dataset.v5Field === \"window-confirmation\") {\r\n        state.draft.window.confirmation = event.target.checked;\r\n        dom.root\r\n          .querySelectorAll(\r\n            \"[data-v5-action='save-window'], [data-v5-action='save-window-direct']\"\r\n          )\r\n          .forEach(save => {\r\n            save.disabled =\r\n            validateWindow(state.draft.window).length > 0 ||\r\n            state.draft.window.confirmation !== true;\r\n          });\r\n        touchState();\r\n      }\r\n      if (event.target.dataset.v5Field === \"remote\") {\r\n        invalidateDraftConfirmation();\r\n        state.draft.window.remote = event.target.checked;\r\n        recalculate();\r\n        renderSidebar();\r\n        touchState();\r\n      }\r\n      if (event.target.dataset.v5Field === \"pelmet\") {\r\n        invalidateDraftConfirmation();\r\n        state.draft.window.pelmet = event.target.checked;\r\n        recalculate();\r\n        renderSidebar();\r\n        touchState();\r\n      }\r\n      if (\r\n        event.target === dom.checkoutConfirmation ||\r\n        event.target.hasAttribute(\"data-v5-project-confirmation\")\r\n      ) {\r\n        state.project.confirmed = event.target.checked;\r\n        refreshCheckoutState();\r\n        state.timestamps.updatedAt = new Date().toISOString();\r\n        storage.save();\r\n      }\r\n    });\r\n\r\n    dom.beginWholeHome.addEventListener(\"click\", beginWholeHome);\r\n    dom.mobilePrimary.addEventListener(\"click\", nextStage);\r\n    dom.mobileProject.addEventListener(\"click\", openDrawer);\r\n    dom.root.querySelector(\"#luxV5OpenProject\")?.addEventListener(\"click\", openDrawer);\r\n    dom.addWindow?.addEventListener(\"click\", startAdditionalWindow);\r\n    dom.checkoutButton.addEventListener(\"click\", checkout);\r\n    dom.clearProject.addEventListener(\"click\", () =>\r\n      confirmAction(\r\n        \"Start over?\",\r\n        \"This will clear all your current selections and start a new design.\",\r\n        \"confirm-reset\"\r\n      )\r\n    );\r\n\r\n    document.addEventListener(\"keydown\", event => {\r\n      if (event.key === \"Escape\") {\r\n        if (state.ui.activeModal) closeModal(state.ui.activeModal);\r\n        else if (state.ui.mobileDrawerOpen) closeDrawer();\r\n      }\r\n      trapModalFocus(event);\r\n    });\r\n  };\r\n\r\n  /**\r\n   * Starts the V5 application when its Liquid root and Shopify data are present.\r\n   * Repeated calls are safe.\r\n   */\r\n  const initialise = () => {\r\n    if (initialised) return;\r\n    const root = document.getElementById(ROOT_ID);\r\n    if (!root || !root.hasAttribute(\"data-lux-double-v5\")) return;\r\n    initialised = true;\r\n    try {\r\n      dom = createDomRegistry(root);\r\n      config = readShopifyData();\r\n      catalog = normaliseCatalog(config);\r\n      if (config.settings.legacyFallbackActive === true) {\r\n        console.warn(\"[LUXWORLD V5] Shopify catalog is using the temporary legacy fallback.\");\r\n      }\r\n      pricingProvider =\r\n        config.checkout?.securePricingMode === true\r\n          ? SecureApiPricingProvider\r\n          : LocalShopifyPricingProvider;\r\n      state = createState();\r\n      attachCatalogState(state);\r\n      const restored = storage.load();\r\n      if (restored) {\r\n        state = restored;\r\n        state.runtime = { initialised: true, loading: false, fatalError: null };\r\n      }\r\n      initialiseWindowAccordion();\r\n      bindEvents();\r\n      recalculate();\r\n      setHidden(dom.loading, true);\r\n      setHidden(dom.fatal, true);\r\n      setHidden(dom.application, false);\r\n      state.runtime.initialised = true;\r\n      state.runtime.loading = false;\r\n      routeTo(state.journey.stage || STAGES.ENTRY, { scroll: false });\r\n      if (state.journey.stage === STAGES.ENTRY) {\r\n        setHidden(dom.journeyHeader, true);\r\n        setHidden(dom.workspace, true);\r\n        setHidden(dom.mobileBar, true);\r\n      }\r\n      renderStage();\r\n      if (!positive(config.checkout?.priceUnitVariantId)) {\r\n        announce(\r\n          \"Design Studio is ready, but checkout is unavailable until the Shopify price-unit variant is configured.\",\r\n          \"error\"\r\n        );\r\n      } else if (config.checkout?.securePricingMode === true) {\r\n        announce(\r\n          \"Secure pricing is enabled but its verified quote integration is not configured.\",\r\n          \"error\"\r\n        );\r\n      }\r\n    } catch (error) {\r\n      fatal(error);\r\n    }\r\n  };\r\n\r\n  const resetProject = () => {\r\n    storage.clear();\r\n    state = createState();\r\n    attachCatalogState(state);\r\n    state.runtime = { initialised: true, loading: false, fatalError: null };\r\n    recalculate();\r\n    setHidden(dom.entry, false);\r\n    setHidden(dom.planner, true);\r\n    setHidden(dom.workspace, true);\r\n    setHidden(dom.journeyHeader, true);\r\n    setHidden(dom.mobileBar, true);\r\n    closeDrawer();\r\n    Object.keys(dom.modals).forEach(name => closeModal(name));\r\n    document.body.classList.remove(\"lux-v5-scroll-locked\");\r\n    announce(\"Your V5 project was cleared.\");\r\n  };\r\n\r\n  /* =====================================================================\r\n     35. PUBLIC API\r\n     ===================================================================== */\r\n\r\n  window.LuxDoubleStudioV5 = Object.freeze({\r\n    version: VERSION,\r\n    initialise,\r\n    getState: () => deepCopy(state),\r\n    calculateDraft: () =>\r\n      state && pricingProvider ? deepCopy(PricingProvider.quoteWindow(state.draft.window)) : null,\r\n    calculateProject: () =>\r\n      state && pricingProvider ? deepCopy(PricingProvider.quoteProject(state.project)) : null,\r\n    resetProject\r\n  });\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\"DOMContentLoaded\", initialise, { once: true });\r\n  } else {\r\n    initialise();\r\n  }\r\n})();\r\n"],
  "mappings": "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",
  "names": ["copy", "product"]
}
