{
  "version": 3,
  "sources": ["/cdn/shop/t/7/assets/crystaura-diy.js?maison=builder-v11"],
  "sourcesContent": ["(() => {\r\n  const SELECTOR = '[data-crystaura-diy]';\r\n  const TWO_PI = Math.PI * 2;\r\n  const START_ANGLE = -Math.PI / 2;\r\n  const FIT_TOLERANCE_UNDER = 4;\n  const FIT_TOLERANCE_OVER = 7;\n  const MAX_BEADS = 80;\n  const MIN_BRACELET_MM = 120;\r\n  const ITEM_GAP_MM = 0;\r\n  const TRASH_HIT_SLOP = 28;\r\n  const ZOOM_MIN = 0.58;\r\n  const ZOOM_MAX = 1.95;\r\n  const DEFAULT_WRIST_CM = 16;\r\n  const WRIST_MIN_CM = 12;\r\n  const WRIST_MAX_CM = 24;\r\n  const ACCESSORY_KINDS = new Set(['spacer', 'charm', 'freeform']);\r\n\r\n  const money = (currency, cents) => {\r\n    const amount = cents / 100;\r\n    const options = Number.isInteger(amount)\r\n      ? { minimumFractionDigits: 0, maximumFractionDigits: 0 }\r\n      : { minimumFractionDigits: 2, maximumFractionDigits: 2 };\r\n\r\n    return `${currency}${amount.toLocaleString('en-US', options)}`;\r\n  };\r\n\r\n  const clamp = (value, min, max) => Math.min(max, Math.max(min, value));\r\n\r\n  const parseJson = (root, selector, fallback) => {\r\n    const node = root.querySelector(selector);\r\n    if (!node) return fallback;\r\n\r\n    try {\r\n      return JSON.parse(node.textContent);\r\n    } catch (error) {\r\n      console.warn('CRYSTAURA DIY JSON could not be parsed.', error);\r\n      return fallback;\r\n    }\r\n  };\r\n\r\n  const normalizeAngle = (angle) => ((angle % TWO_PI) + TWO_PI) % TWO_PI;\r\n\r\n  const unwrapAngleFrom = (angle, reference) => reference + normalizeAngle(angle - reference);\r\n\r\n  const insertAt = (items, index, item) => {\r\n    const list = [...items];\r\n    list.splice(clamp(index, 0, list.length), 0, item);\r\n    return list;\r\n  };\r\n\r\n  const initDebugPanel = (root) => {\r\n    const params = new URLSearchParams(window.location.search);\r\n    if (!params.has('debug') && !params.has('crystaura_debug')) return;\r\n    if (document.querySelector('[data-crystaura-debug-panel]')) return;\r\n\r\n    const panel = document.createElement('aside');\r\n    panel.setAttribute('data-crystaura-debug-panel', '');\r\n    panel.setAttribute('aria-label', 'CRYSTAURA debug metrics');\r\n    panel.style.cssText = [\r\n      'position:fixed',\r\n      'left:8px',\r\n      'top:8px',\r\n      'z-index:2147483647',\r\n      'max-width:min(92vw,420px)',\r\n      'max-height:72vh',\r\n      'overflow:auto',\r\n      'padding:10px',\r\n      'border:1px solid rgba(255,255,255,.28)',\r\n      'border-radius:8px',\r\n      'background:rgba(0,0,0,.86)',\r\n      'color:#fff',\r\n      'font:11px/1.35 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace',\r\n      'white-space:pre-wrap',\r\n      'box-shadow:0 12px 32px rgba(0,0,0,.35)',\r\n      '-webkit-user-select:text',\r\n      'user-select:text'\r\n    ].join(';');\r\n\r\n    document.body?.appendChild(panel);\r\n\r\n    const readVar = (name) => (\r\n      window.getComputedStyle(root).getPropertyValue(name).trim()\r\n      || window.getComputedStyle(document.documentElement).getPropertyValue(name).trim()\r\n      || 'n/a'\r\n    );\r\n\r\n    const render = () => {\r\n      const viewport = window.visualViewport;\r\n      const doc = document.documentElement;\r\n      const stage = root.querySelector('[data-diy-stage]');\r\n      const library = root.querySelector('.crystaura-diy__library');\r\n      const rectStage = stage?.getBoundingClientRect();\r\n      const rectLibrary = library?.getBoundingClientRect();\r\n      const lines = [\r\n        'CRYSTAURA DEBUG',\r\n        `version: ${root.dataset.mobileVersion || 'n/a'}`,\r\n        `url: ${window.location.pathname}${window.location.search}`,\r\n        `inner: ${window.innerWidth} x ${window.innerHeight}`,\r\n        `visual: ${Math.round(viewport?.width || 0)} x ${Math.round(viewport?.height || 0)}`,\r\n        `visual offset: ${Math.round(viewport?.offsetLeft || 0)}, ${Math.round(viewport?.offsetTop || 0)}`,\r\n        `client: ${doc.clientWidth} x ${doc.clientHeight}`,\r\n        `screen: ${window.screen?.width || 0} x ${window.screen?.height || 0}`,\r\n        `outer: ${window.outerWidth || 0} x ${window.outerHeight || 0}`,\r\n        `dpr: ${window.devicePixelRatio || 1}`,\r\n        `scroll: ${Math.round(window.scrollX || 0)}, ${Math.round(window.scrollY || 0)}`,\r\n        `css --vh: ${readVar('--crystaura-mobile-vh')}`,\r\n        `css --head: ${readVar('--crystaura-mobile-head-px')}`,\r\n        `css --library: ${readVar('--crystaura-mobile-library-px')}`,\r\n        `css --orbit: ${readVar('--crystaura-mobile-orbit-px')}`,\r\n        `css --bottom: ${readVar('--crystaura-mobile-bottom-px')}`,\r\n        `stage rect: ${rectStage ? `${Math.round(rectStage.width)} x ${Math.round(rectStage.height)} @ ${Math.round(rectStage.top)}` : 'n/a'}`,\r\n        `library rect: ${rectLibrary ? `${Math.round(rectLibrary.width)} x ${Math.round(rectLibrary.height)} @ ${Math.round(rectLibrary.top)}` : 'n/a'}`,\r\n        `classes: ${root.className}`,\r\n        `ua: ${navigator.userAgent}`\r\n      ];\r\n\r\n      panel.textContent = lines.join('\\n');\r\n    };\r\n\r\n    render();\r\n    window.setInterval(render, 500);\r\n    window.visualViewport?.addEventListener('resize', render);\r\n    window.addEventListener('resize', render);\r\n    window.addEventListener('orientationchange', () => window.setTimeout(render, 250));\r\n  };\r\n\r\n  const initRoot = (root) => {\r\n    if (!root || root.dataset.crystauraDiyReady === 'true') return;\n    root.dataset.crystauraDiyReady = 'true';\n    document.body?.classList.add('crystaura-diy-page');\n    document.documentElement?.classList.add('crystaura-diy-page-root');\n\r\n    const setMobileViewportHeight = () => {\r\n      const viewport = window.visualViewport;\r\n      const doc = document.documentElement;\r\n      const height = Math.round(viewport?.height || window.innerHeight || doc.clientHeight || 0);\r\n      const width = Math.round(viewport?.width || window.innerWidth || doc.clientWidth || 0);\r\n      if (!height || !width) return;\r\n\r\n      const isTiny = width <= 374 || height <= 640;\r\n      const isShort = height <= 700;\r\n      const isMedium = !isTiny && !isShort && height <= 780;\r\n      const headHeight = isTiny ? 50 : isShort ? 52 : isMedium ? 60 : 64;\r\n      const actionHeight = isTiny ? 40 : isShort ? 42 : isMedium ? 44 : 48;\r\n      const topReserve = isTiny ? 30 : isShort ? 34 : isMedium ? 38 : 46;\r\n      const libraryMin = isTiny ? 286 : isShort ? 312 : isMedium ? 336 : 360;\r\n      const libraryMax = isTiny ? 316 : isShort ? 350 : isMedium ? 374 : 410;\r\n      const libraryRatio = isTiny ? 0.44 : isShort ? 0.43 : isMedium ? 0.42 : 0.42;\r\n      const libraryHeight = Math.round(clamp(height * libraryRatio, libraryMin, libraryMax));\r\n      const orbitHeightCap = Math.max(168, height - headHeight - libraryHeight - actionHeight - topReserve - 20);\r\n      const orbitWidthRatio = isTiny ? 0.6 : isShort ? 0.6 : isMedium ? 0.62 : width < 410 ? 0.68 : 0.72;\r\n      const orbitWidthCap = width * orbitWidthRatio;\r\n      const orbitMax = isTiny ? 286 : isMedium ? 304 : 348;\r\n      const orbitHeight = Math.round(clamp(Math.min(orbitWidthCap, orbitHeightCap), 168, orbitMax));\r\n      const filterWidth = isTiny ? 96 : width < 390 ? 112 : 124;\r\n      const searchHeight = isTiny ? 46 : 50;\r\n      const bottomSafe = isTiny ? 44 : isShort ? 42 : 30;\r\n\r\n      root.classList.toggle('is-mobile-tiny', isTiny);\r\n      root.classList.toggle('is-mobile-short', isShort);\r\n      root.classList.toggle('is-mobile-medium', isMedium);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-vh', `${height}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-head-px', `${headHeight}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-library-px', `${libraryHeight}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-action-px', `${actionHeight}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-top-reserve-px', `${topReserve}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-orbit-px', `${orbitHeight}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-filter-px', `${filterWidth}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-search-px', `${searchHeight}px`);\r\n      document.documentElement.style.setProperty('--crystaura-mobile-bottom-px', `${bottomSafe}px`);\r\n      root.style.setProperty('--crystaura-mobile-vh', `${height}px`);\r\n      root.style.setProperty('--crystaura-mobile-head-px', `${headHeight}px`);\r\n      root.style.setProperty('--crystaura-mobile-library-px', `${libraryHeight}px`);\r\n      root.style.setProperty('--crystaura-mobile-action-px', `${actionHeight}px`);\r\n      root.style.setProperty('--crystaura-mobile-top-reserve-px', `${topReserve}px`);\r\n      root.style.setProperty('--crystaura-mobile-orbit-px', `${orbitHeight}px`);\r\n      root.style.setProperty('--crystaura-mobile-filter-px', `${filterWidth}px`);\r\n      root.style.setProperty('--crystaura-mobile-search-px', `${searchHeight}px`);\r\n      root.style.setProperty('--crystaura-mobile-bottom-px', `${bottomSafe}px`);\r\n    };\r\n\r\n    setMobileViewportHeight();\r\n    window.visualViewport?.addEventListener('resize', setMobileViewportHeight);\r\n    window.addEventListener('resize', setMobileViewportHeight);\r\n    initDebugPanel(root);\r\n\r\n    const beads = parseJson(root, '[data-crystaura-diy-beads]', []);\n    const componentData = parseJson(root, '[data-crystaura-diy-components]', {});\n    const beadById = new Map(beads.map((bead) => [bead.id, bead]));\n    const beadIndexById = new Map(beads.map((bead, index) => [bead.id, index]));\n    const componentBySku = new Map(Object.entries(componentData || {}).filter(([sku]) => sku !== '__ready'));\n    const currency = root.dataset.currencySymbol || '$';\n\r\n    const state = {\r\n      size: { key: 'CUSTOM', label: '16.0 cm / Single wrap', cm: 16, wristCm: 16, wrapMode: 'single', targetMm: 160 },\n      note: '',\n      material: 'bead',\r\n      filter: 'All',\r\n      search: '',\r\n      zoom: 1,\r\n      rotation: 0,\r\n      beads: []\r\n    };\r\n\r\n    let layoutSlots = [];\n    let instanceCounter = 0;\n    let paletteLimit = 48;\n\r\n    const makeBeadInstance = (item) => {\r\n      if (!item) return null;\r\n      if (item._instanceKey) return item;\r\n      instanceCounter += 1;\r\n      return { ...item, _instanceKey: `${item.id || 'material'}-${instanceCounter}` };\r\n    };\r\n\r\n    const getPreviewKey = (slot) => slot?.bead?._instanceKey || `${slot?.bead?.id || 'material'}-${slot?.index || 0}`;\r\n\r\n    const getPreviewPositions = () => {\r\n      const positions = new Map();\r\n      if (!preview) return positions;\r\n\r\n      const hostRect = preview.getBoundingClientRect();\r\n      preview.querySelectorAll('[data-diy-preview-bead][data-diy-preview-key]').forEach((node) => {\r\n        const rect = node.getBoundingClientRect();\r\n        const fallbackX = Number(node.dataset.diyX);\r\n        const fallbackY = Number(node.dataset.diyY);\r\n        const x = rect.width ? rect.left - hostRect.left + rect.width / 2 : fallbackX;\r\n        const y = rect.height ? rect.top - hostRect.top + rect.height / 2 : fallbackY;\r\n        const size = Math.max(rect.width, rect.height) || Number(node.dataset.diySize);\n        if (Number.isFinite(x) && Number.isFinite(y)) {\r\n          positions.set(node.dataset.diyPreviewKey, { x, y, size });\r\n        }\r\n      });\r\n\r\n      return positions;\r\n    };\r\n\r\n    const getPreviewTargetTransform = (item) => {\r\n      if (item.classList.contains('is-placeholder')) return 'translate(-50%, -50%) scale(0.72)';\r\n      if (item.classList.contains('is-near-placeholder')) return 'translate(-50%, -50%) scale(0.9)';\r\n      return 'translate(-50%, -50%) scale(0.98)';\r\n    };\r\n\r\n    const animatePreviewItem = (item, previous, slot) => {\r\n      if (!previous || !Number.isFinite(previous.x) || !Number.isFinite(previous.y)) return;\r\n\r\n      const dx = previous.x - slot.x;\r\n      const dy = previous.y - slot.y;\r\n      const previousSize = Number(previous.size || slot.visualDiameter || 1);\r\n      const nextSize = Number(slot.visualDiameter || previousSize || 1);\r\n      const sizeRatio = clamp(previousSize / nextSize, 0.66, 1.18);\r\n\r\n      if (Math.abs(dx) + Math.abs(dy) < 0.6 && Math.abs(sizeRatio - 1) < 0.02 && !previous.roll) return;\r\n\r\n      const target = getPreviewTargetTransform(item);\r\n      const travel = Math.hypot(dx, dy);\r\n      const rollDeg = previous.roll && slot.kind === 'bead'\r\n        ? clamp(travel * 1.75, 160, 420) * (dx >= 0 ? -1 : 1)\r\n        : 0;\r\n      const from = `translate(calc(-50% + ${dx}px), calc(-50% + ${dy}px)) scale(${sizeRatio})${rollDeg ? ` rotate(${rollDeg}deg)` : ''}`;\r\n      const targetTransform = rollDeg ? `${target} rotate(0deg)` : target;\r\n      const duration = root.classList.contains('is-dragging-bead') ? 360 : previous.roll ? 820 : 680;\r\n      const easing = root.classList.contains('is-dragging-bead')\r\n        ? 'cubic-bezier(.2, .95, .18, 1)'\r\n        : 'cubic-bezier(.18, .88, .16, 1)';\r\n\r\n      item.getAnimations?.().forEach((animation) => animation.cancel());\r\n      window.clearTimeout(Number(item.dataset.diyFlipTimer || 0));\r\n      item.style.setProperty('transition', 'none', 'important');\r\n      item.style.setProperty('transform', from, 'important');\r\n      item.getBoundingClientRect();\r\n\r\n      window.requestAnimationFrame(() => {\r\n        item.style.setProperty('transition', `transform ${duration}ms ${easing}, opacity 220ms ease`, 'important');\r\n        item.style.setProperty('transform', targetTransform, 'important');\r\n        const timer = window.setTimeout(() => {\r\n          item.style.removeProperty('transition');\r\n          item.style.removeProperty('transform');\r\n          delete item.dataset.diyFlipTimer;\r\n        }, duration + 80);\r\n        item.dataset.diyFlipTimer = String(timer);\r\n      });\r\n    };\r\n\r\n    let dragState = null;\r\n    let paletteDragId = '';\r\n    let lastAdded = null;\r\n    let lastAddedTimer = null;\r\n    const isCompactLayout = () => window.matchMedia?.('(max-width: 989px)').matches;\r\n\r\n    const getItemKind = (item) => item?.kind || item?.type || 'bead';\n\n    const makeDesignItemSnapshot = (bead) => ({\n      id: bead.id,\n      name: bead.name || '',\n      image: bead.image || bead.thumb || '',\n      thumb: bead.thumb || bead.image || '',\n      kind: getItemKind(bead),\n      mm: Number(bead.mm || 10),\n      fitMm: Number(bead.fitMm || bead.footprintMm || bead.mm || 10),\n      footprintMm: Number(bead.footprintMm || bead.mm || 10),\n      layoutMm: Number(bead.layoutMm || bead.footprintMm || bead.mm || 10),\n      visualMm: Number(bead.visualMm || bead.mm || 10),\n      visualWidthMm: Number(bead.visualWidthMm || bead.visualMm || bead.mm || 10),\n      visualHeightMm: Number(bead.visualHeightMm || bead.visualMm || bead.mm || 10),\n      imageAspect: Number(bead.imageAspect || 1),\n      attachMode: bead.attachMode || '',\n      subtype: bead.subtype || '',\n      side: bead.side || ''\n    });\r\n    const isAccessoryKind = (kind) => ACCESSORY_KINDS.has(kind);\n\n    const normalizeWristCm = (value) => {\n      const number = Number.parseFloat(String(value || '').replace(',', '.'));\n      return clamp(Number.isFinite(number) ? number : DEFAULT_WRIST_CM, WRIST_MIN_CM, WRIST_MAX_CM);\n    };\n\n    const makeWristSize = (wristCm = DEFAULT_WRIST_CM, wrapMode = 'single', key = 'CUSTOM') => {\n      const baseCm = normalizeWristCm(wristCm);\n      const normalizedWrap = wrapMode === 'double' ? 'double' : 'single';\n      const wrapCount = normalizedWrap === 'double' ? 2 : 1;\n      const targetCm = Number((baseCm * wrapCount).toFixed(1));\n      const wrapLabel = normalizedWrap === 'double' ? 'Double wrap' : 'Single wrap';\n\n      return {\n        key,\n        label: `${baseCm.toFixed(1)} cm / ${wrapLabel}`,\n        cm: targetCm,\n        wristCm: baseCm,\n        wrapMode: normalizedWrap,\n        targetMm: Math.round(targetCm * 10)\n      };\n    };\n\n    const getItemFootprintMm = (item) => {\n      if (!item) return 0;\n      return Math.max(0.6, Number(item.layoutMm || item.footprintMm || item.mm || 10) + ITEM_GAP_MM);\n    };\n\n    const getItemFitMm = (item) => {\n      if (!item) return 0;\n      return Math.max(0, Number(item.fitMm || item.footprintMm || item.mm || 10));\n    };\n\r\n    const getItemVisualDimensions = (item) => {\n      if (!item) return { widthMm: 10, heightMm: 10, maxMm: 10, minMm: 10 };\n      const kind = getItemKind(item);\n      const fallback = kind === 'charm' ? 20 : kind === 'freeform' ? 22 : Number(item.mm || 10);\n      const visualMm = Math.max(4, Number(item.visualMm || fallback));\n      const aspect = clamp(Number(item.imageAspect || 1), 0.18, 5.5);\n      let widthMm = Number(item.visualWidthMm);\n      let heightMm = Number(item.visualHeightMm);\n      if (!Number.isFinite(widthMm) || !Number.isFinite(heightMm)) {\n        if (aspect >= 1) {\n          widthMm = visualMm;\n          heightMm = visualMm / aspect;\n        } else {\n          widthMm = visualMm * aspect;\n          heightMm = visualMm;\n        }\n      }\n      widthMm = Math.max(2.5, widthMm);\n      heightMm = Math.max(2.5, heightMm);\n      return { widthMm, heightMm, maxMm: Math.max(widthMm, heightMm), minMm: Math.min(widthMm, heightMm) };\n    };\n\n    const getItemVisualMm = (item) => getItemVisualDimensions(item).maxMm;\n\r\n    const getItemTypeLabel = (item) => {\n      if (item?.typeLabel) return item.typeLabel;\n      if (item?.subtype === 'flower-cap') return `${item.side === 'left' ? 'Left' : 'Right'} Flower Cup`;\n      const kind = getItemKind(item);\n      if (kind === 'charm') return 'Charm';\r\n      if (kind === 'freeform') return 'Carving';\r\n      if (kind === 'spacer') return 'Spacer';\r\n      return 'Bead';\r\n    };\r\n\r\n    const formatMaterialMeta = (item, available = true) => {\n      const size = Number(item?.mm || item?.footprintMm || 0);\n      const type = getItemTypeLabel(item);\n      const sizeText = size ? `${size}mm` : type;\n      return available\n        ? `${sizeText} / ${money(currency, Number(item?.priceCents ?? Math.round(Number(item?.price || 0) * 100)))}`\n        : `${sizeText} / no room`;\n    };\r\n\r\n    const palette = root.querySelector('[data-diy-palette]');\n    const filterBar = root.querySelector('[data-diy-filters]');\n    const materialTabs = Array.from(root.querySelectorAll('[data-diy-material]'));\r\n    const filterButtons = Array.from(root.querySelectorAll('[data-diy-filter]'));\r\n    const stage = root.querySelector('[data-diy-stage]');\r\n    const preview = root.querySelector('[data-diy-preview]');\r\n    const empty = root.querySelector('[data-diy-empty]');\r\n    const sequences = Array.from(root.querySelectorAll('[data-diy-sequence]'));\n    const sequenceStatuses = Array.from(root.querySelectorAll('[data-diy-sequence-status]'));\n    const fitCard = root.querySelector('[data-diy-fit-card]');\r\n    const fitLabel = root.querySelector('[data-diy-fit-label]');\r\n    const fitCm = root.querySelector('[data-diy-fit-cm]');\r\n    const fitInch = root.querySelector('[data-diy-fit-inch]');\r\n    const progress = root.querySelector('[data-diy-progress]');\r\n    const beadPrice = root.querySelector('[data-diy-bead-price]');\r\n    const total = root.querySelector('[data-diy-total]');\r\n    const floatingTotal = root.querySelector('[data-diy-floating-total]');\r\n    const floatingSubtotal = root.querySelector('[data-diy-floating-subtotal]');\r\n    const floatingFit = root.querySelector('[data-diy-floating-fit]');\r\n    const floatingPrice = root.querySelector('.crystaura-diy__floating-price');\r\n    const itemCounts = Array.from(root.querySelectorAll('[data-diy-item-count]'));\n    const statusFits = Array.from(root.querySelectorAll('[data-diy-status-fit]'));\n    const statusTotals = Array.from(root.querySelectorAll('[data-diy-status-total]'));\n    const mobileFitText = root.querySelector('[data-diy-mobile-fit-text]');\r\n    const trash = root.querySelector('[data-diy-trash]');\r\n    const addButtons = Array.from(root.querySelectorAll('[data-diy-action=\"add\"]'));\n    const reviewButtons = Array.from(root.querySelectorAll('[data-diy-action=\"review\"]'));\n    const cartNote = root.querySelector('[data-diy-cart-note]');\r\n    const zoomLabel = root.querySelector('[data-diy-zoom-label]');\r\n    const wristSetup = root.querySelector('[data-diy-wrist-setup]');\r\n    const wristInput = root.querySelector('[data-diy-wrist-input]');\r\n    const wristWrapButtons = Array.from(root.querySelectorAll('[data-diy-wrist-wrap]'));\r\n    const wristTotal = root.querySelector('[data-diy-wrist-total]');\n    const noteFields = Array.from(root.querySelectorAll('[data-diy-note]'));\n    const mobileSelection = root.querySelector('[data-diy-mobile-selection]');\n    const assemblyPanel = root.querySelector('[data-diy-assembly]');\n    const assemblyImage = root.querySelector('[data-diy-assembly-image]');\n    const assemblySequence = root.querySelector('[data-diy-assembly-sequence]');\n    const assemblyMeta = root.querySelector('[data-diy-assembly-meta]');\n    const assemblyDownload = root.querySelector('[data-diy-assembly-download]');\n    const receiptPanel = root.querySelector('[data-diy-receipt]');\n    const receiptImage = root.querySelector('[data-diy-receipt-image]');\n    const receiptList = root.querySelector('[data-diy-receipt-list]');\n    const receiptSequence = root.querySelector('[data-diy-receipt-sequence]');\n    const receiptTotal = root.querySelector('[data-diy-receipt-total]');\n    const receiptFit = root.querySelector('[data-diy-receipt-fit]');\n    const receiptCount = root.querySelector('[data-diy-receipt-count]');\n    const receiptCode = root.querySelector('[data-diy-receipt-code]');\n    const materialPreviewPanel = root.querySelector('[data-diy-material-preview]');\n    const materialPreviewImage = root.querySelector('[data-diy-material-preview-image]');\n    const materialPreviewName = root.querySelector('[data-diy-material-preview-name]');\n    const materialPreviewMeta = root.querySelector('[data-diy-material-preview-meta]');\n    const materialPreviewPrice = root.querySelector('[data-diy-material-preview-price]');\n    const materialPreviewAdd = root.querySelector('[data-diy-material-preview-add]');\n    let selectedWristWrap = state.size.wrapMode || 'single';\n    let lastTotalCents = null;\n    let materialPreviewTimer = 0;\n    let suppressNextPaletteClick = false;\n    let materialPreviewPointer = null;\n    let pendingDesignCode = '';\n\r\n    const getBeadMm = (list = state.beads) => (\r\n      list.reduce((sum, bead) => sum + Number(bead.mm || 10), 0)\r\n    );\r\n\r\n    const getOccupiedMm = (list = state.beads) => (\n      list.reduce((sum, bead) => sum + getItemFitMm(bead), 0)\n    );\n\r\n    const getAllowedOverMm = (list = state.beads) => {\n      const largestHalfStep = list.length ? Math.max(...list.map((item) => getItemFitMm(item) / 2)) : 0;\n      return Math.max(FIT_TOLERANCE_OVER, Math.min(12, largestHalfStep));\n    };\n\n    const getMaxMm = (list = state.beads) => state.size.targetMm + getAllowedOverMm(list);\n\r\n    const getBraceletMm = (list = state.beads) => {\r\n      const max = getMaxMm(list);\n      const targetMm = Math.max(MIN_BRACELET_MM, Number(state.size.targetMm || MIN_BRACELET_MM));\r\n      return clamp(Math.max(targetMm, getOccupiedMm(list)), MIN_BRACELET_MM, max);\r\n    };\r\n\r\n    const getFit = (list = state.beads) => {\r\n      const occupiedMm = getOccupiedMm(list);\r\n      const totalMm = occupiedMm;\n      const min = Math.max(MIN_BRACELET_MM, Number(state.size.targetMm || MIN_BRACELET_MM)) - FIT_TOLERANCE_UNDER;\n      const max = getMaxMm(list);\n\n      if (occupiedMm >= min && occupiedMm <= max) {\n        return { status: 'fit', totalMm, occupiedMm, message: `Ready at ${(totalMm / 10).toFixed(1)} cm` };\n      }\n\n      if (occupiedMm < min) {\n        return { status: 'short', totalMm, occupiedMm, message: `${((min - occupiedMm) / 10).toFixed(1)} cm to target` };\n      }\n\n      return { status: 'long', totalMm, occupiedMm, message: `${((occupiedMm - max) / 10).toFixed(1)} cm over the flexible fit limit` };\n    };\n\n    const canAddBead = (bead, list = state.beads, index = list.length) => {\n      if (!bead || list.length >= MAX_BEADS) return false;\n      const nextList = insertAt(list, index, bead);\n      return getOccupiedMm(nextList) <= getMaxMm(nextList);\n    };\n\n    const findCompatibleInsertIndex = (bead, list = state.beads, preferredIndex = list.length) => {\n      if (canAddBead(bead, list, preferredIndex)) return preferredIndex;\n      return -1;\n    };\n\r\n    const bumpLimit = () => {\r\n      root.classList.remove('is-limit-shake');\r\n      window.requestAnimationFrame(() => {\r\n        root.classList.add('is-limit-shake');\r\n        window.setTimeout(() => root.classList.remove('is-limit-shake'), 420);\r\n      });\r\n    };\r\n\r\n    const setNotice = (message) => {\n      sequenceStatuses.forEach((status) => { status.textContent = message; });\n      if (cartNote) cartNote.textContent = message;\n    };\r\n\r\n    const flashPrice = () => {\r\n      if (!floatingPrice) return;\r\n      floatingPrice.classList.remove('is-updated');\r\n      window.requestAnimationFrame(() => {\r\n        floatingPrice.classList.add('is-updated');\r\n        window.setTimeout(() => floatingPrice.classList.remove('is-updated'), 520);\r\n      });\r\n    };\r\n\r\n    const getTotalCents = () => {\n      const materialsCents = state.beads.reduce((sum, bead) => (\n        sum + Number(bead.priceCents ?? Math.round(Number(bead.price || 0) * 100))\n      ), 0);\n      return materialsCents;\n    };\n\n    const getBeadSummary = () => {\n      const counts = new Map();\n      state.beads.forEach((bead) => {\n        const key = bead.sku || bead.id;\n        const existing = counts.get(key) || { bead, amount: 0 };\n        existing.amount += 1;\n        counts.set(key, existing);\n      });\n      return Array.from(counts.values()).map(({ bead, amount }) => (\n        `${amount} x ${bead.name} / ${Number(bead.mm || 0)}mm / ${getItemTypeLabel(bead)}`\n      )).join(', ');\n    };\n\n    const getMaterialSummaryLines = () => {\n      const counts = new Map();\n      state.beads.forEach((item) => {\n        const key = item.sku || item.id;\n        const entry = counts.get(key) || { item, quantity: 0 };\n        entry.quantity += 1;\n        counts.set(key, entry);\n      });\n      return Array.from(counts.values()).map(({ item, quantity }) => (\n        `${quantity} \u00D7 ${item.name}, ${Number(item.mm || 0)}mm ${getItemTypeLabel(item)} (${item.sku || item.id})`\n      ));\n    };\n\n    const getAssemblyRuns = () => {\n      const runs = [];\n      state.beads.forEach((item, index) => {\n        const key = item.sku || item.id;\n        const previous = runs[runs.length - 1];\n        if (previous?.key === key) {\n          previous.end = index + 1;\n          previous.quantity += 1;\n          return;\n        }\n        runs.push({ key, item, start: index + 1, end: index + 1, quantity: 1 });\n      });\n      return runs.map((run) => {\n        const position = run.start === run.end\n          ? String(run.start).padStart(2, '0')\n          : `${String(run.start).padStart(2, '0')}\u2013${String(run.end).padStart(2, '0')}`;\n        return `${position}: ${run.item.name}, ${Number(run.item.mm || 0)}mm (${run.key})`;\n      });\n    };\n\n    const getExactAssemblyLines = () => state.beads.map((item, index) => (\n      `${String(index + 1).padStart(2, '0')}. ${item.name}, ${Number(item.mm || 0)}mm ${getItemTypeLabel(item)} (${item.sku || item.id})`\n    ));\n\n    const splitPropertyText = (lines, maxLength = 210) => {\n      const chunks = [];\n      let current = '';\n      lines.forEach((line) => {\n        const next = current ? `${current} | ${line}` : line;\n        if (current && next.length > maxLength) {\n          chunks.push(current);\n          current = line;\n        } else {\n          current = next;\n        }\n      });\n      if (current) chunks.push(current);\n      return chunks;\n    };\n\r\n    const getDesignCode = () => {\n      const randomPart = window.crypto?.randomUUID\n        ? window.crypto.randomUUID().replace(/-/g, '').slice(0, 10)\n        : Math.random().toString(36).slice(2, 12);\n      return `diy-${Date.now().toString(36)}-${randomPart}`;\n    };\n\n    const getDesignPayload = () => {\n      const wristTenths = Math.round(Number(state.size.wristCm || state.size.cm || DEFAULT_WRIST_CM) * 10);\n      const materialIndexes = state.beads\n        .map((bead) => beadIndexById.get(bead.id))\n        .filter(Number.isInteger)\n        .map((index) => index.toString(36).padStart(2, '0'))\n        .join('');\n\n      return [\n        'ml2',\n        wristTenths.toString(36),\n        state.size.wrapMode === 'double' ? 'd' : 's',\n        materialIndexes\n      ].join('~');\n    };\n\n    const restoreDesignPayload = (payload) => {\n      const parts = String(payload || '').split('~');\n      const isCurrent = parts[0] === 'ml2' && parts.length >= 4;\n      const isLegacy = parts[0] === 'ml1' && parts.length >= 7;\n      if (!isCurrent && !isLegacy) return false;\n\n      const wristCm = parseInt(parts[1], 36) / 10;\n      if (!Number.isFinite(wristCm)) return false;\n\n      const wrapMode = parts[2] === 'd' ? 'double' : 'single';\n      const materialPart = isCurrent ? parts[3] : parts[6];\n      const encodedIndexes = isCurrent ? (materialPart.match(/.{2}/g) || []) : materialPart.split('.');\n      const materialIndexes = encodedIndexes\n        .filter(Boolean)\n        .map((value) => parseInt(value, 36))\n        .filter((index) => Number.isInteger(index) && beads[index]);\n\n      state.size = makeWristSize(wristCm, wrapMode);\n      selectedWristWrap = state.size.wrapMode;\n      state.beads = materialIndexes.map((index) => makeBeadInstance(beads[index])).filter(Boolean);\n      state.zoom = 1;\n      return state.beads.length > 0;\n    };\n\n    const getDesignSnapshot = () => ({\n      v: 7,\n      size: state.size,\n      note: state.note,\n      zoom: state.zoom,\n      totalMm: getBraceletMm(),\n      occupiedMm: getOccupiedMm(),\n      payload: getDesignPayload(),\n      beadIds: state.beads.map((bead) => bead.id),\n      items: state.beads.map(makeDesignItemSnapshot)\n    });\n\r\n    const saveDesignSnapshot = (designCode) => {\r\n      try {\r\n        window.localStorage?.setItem(`crystaura-design:${designCode}`, JSON.stringify(getDesignSnapshot()));\r\n      } catch (error) {\r\n        console.warn('CRYSTAURA DIY design snapshot could not be stored.', error);\r\n      }\r\n    };\r\n\r\n    const restoreDesignSnapshot = () => {\n      const params = new URLSearchParams(window.location.search);\n      const sharedPayload = params.get('design_payload');\n      if (sharedPayload && restoreDesignPayload(sharedPayload)) return true;\n\n      const designCode = params.get('design');\n      if (!designCode) return false;\n\r\n      try {\r\n        const saved = JSON.parse(window.localStorage?.getItem(`crystaura-design:${designCode}`) || 'null');\r\n        if (!saved || !Array.isArray(saved.beadIds)) return false;\r\n\r\n        if (saved.size && Number(saved.size.targetMm)) state.size = saved.size;\r\n        if (saved.note) state.note = String(saved.note).slice(0, 240);\n        state.zoom = clamp(Number(saved.zoom) || 1, ZOOM_MIN, ZOOM_MAX);\r\n        state.beads = saved.beadIds.map((id) => makeBeadInstance(beadById.get(id))).filter(Boolean);\n        return state.beads.length > 0;\n      } catch (error) {\r\n        console.warn('CRYSTAURA DIY design snapshot could not be restored.', error);\r\n        return false;\r\n      }\n    };\n\n    const syncRestoredDesignControls = () => {\n      noteFields.forEach((field) => { field.value = state.note; });\n      if (wristInput) wristInput.value = Number(state.size.wristCm || DEFAULT_WRIST_CM).toFixed(1);\n      setWristSetupWrap(state.size.wrapMode || 'single');\n    };\n\r\n    const updateWristSetupPreview = () => {\n      if (!wristTotal) return;\n      const wristCm = normalizeWristCm(wristInput?.value || state.size.wristCm || DEFAULT_WRIST_CM);\n      const wrapCount = selectedWristWrap === 'double' ? 2 : 1;\n      wristTotal.textContent = `${(wristCm * wrapCount).toFixed(1)}cm`;\n    };\n\n    const setWristSetupWrap = (wrapMode) => {\n      selectedWristWrap = wrapMode === 'double' ? 'double' : 'single';\n      wristWrapButtons.forEach((wrapButton) => {\n        const isActive = wrapButton.dataset.diyWristWrap === selectedWristWrap;\n        wrapButton.classList.toggle('is-active', isActive);\n        wrapButton.setAttribute('aria-pressed', String(isActive));\n      });\n      updateWristSetupPreview();\n    };\n\n    const syncSizeControls = () => {\n      root.querySelectorAll('[data-diy-size]').forEach((sizeButton) => {\n        const isActive = state.size.wrapMode === 'single' && Number(sizeButton.dataset.cm) === Number(state.size.wristCm);\n        sizeButton.classList.toggle('is-active', isActive);\n        sizeButton.setAttribute('aria-pressed', String(isActive));\n      });\n    };\n\n    const applyWristSize = (wristCm, wrapMode = selectedWristWrap, options = {}) => {\n      state.size = makeWristSize(wristCm, wrapMode);\n      selectedWristWrap = state.size.wrapMode;\n      syncSizeControls();\n      if (wristInput) wristInput.value = state.size.wristCm.toFixed(1);\n      setWristSetupWrap(selectedWristWrap);\n      if (options.render !== false) render();\n      return state.size;\n    };\n\n    const openWristSetup = () => {\n      if (!wristSetup) return;\n      if (wristInput) wristInput.value = (state.size.wristCm || DEFAULT_WRIST_CM).toFixed(1);\n      setWristSetupWrap(state.size.wrapMode || selectedWristWrap);\n      wristSetup.hidden = false;\n      root.classList.add('is-wrist-setup-open');\n      window.setTimeout(() => wristInput?.focus(), 80);\n    };\n\n    const closeWristSetup = () => {\n      if (!wristSetup) return;\n      wristSetup.hidden = true;\n      root.classList.remove('is-wrist-setup-open');\n    };\n\n    const updateMaterialControls = () => {\n      materialTabs.forEach((tab) => {\r\n        const isActive = tab.dataset.diyMaterial === state.material;\r\n        tab.classList.toggle('is-active', isActive);\r\n        tab.setAttribute('aria-pressed', String(isActive));\r\n      });\r\n\r\n      let hasActiveFilter = false;\r\n      filterButtons.forEach((button) => {\r\n        const filterKind = button.dataset.diyFilterKind;\r\n        const isVisible = !filterKind || filterKind === state.material;\r\n        button.hidden = !isVisible;\r\n        button.classList.toggle('is-hidden', !isVisible);\r\n\r\n        if (isVisible && button.dataset.diyFilter === state.filter) {\r\n          button.classList.add('is-active');\r\n          hasActiveFilter = true;\r\n        } else if (button.dataset.diyFilter !== state.filter) {\r\n          button.classList.remove('is-active');\r\n        }\r\n      });\r\n\r\n      if (!hasActiveFilter) {\r\n        state.filter = 'All';\r\n        filterButtons.forEach((button) => {\r\n          button.classList.toggle('is-active', button.dataset.diyFilter === 'All' && !button.hidden);\r\n        });\r\n      }\r\n    };\r\n\r\n    const filteredBeads = () => {\r\n      const query = state.search.trim().toLowerCase();\r\n      return beads.filter((bead) => {\r\n        const kind = getItemKind(bead);\r\n        const materialMatches = state.material === 'accessory' ? isAccessoryKind(kind) : kind === state.material;\r\n        const categoryMatches = state.filter === 'All' || bead.category === state.filter;\r\n        const text = `${bead.name} ${bead.stone} ${bead.intention} ${bead.category} ${getItemKind(bead)} ${getItemTypeLabel(bead)}`.toLowerCase();\r\n        return materialMatches && categoryMatches && (!query || text.includes(query));\r\n      });\r\n    };\r\n\r\n    const getPreviewBeads = () => {\r\n      if (dragState?.active && dragState.type === 'palette' && dragState.bead) {\r\n        return insertAt(state.beads, dragState.insertIndex, dragState.bead);\r\n      }\r\n\r\n      return state.beads;\r\n    };\r\n\r\n    const angleFromPoint = (clientX, clientY) => {\r\n      if (!preview) return 0;\r\n      const rect = preview.getBoundingClientRect();\r\n      const cx = rect.left + rect.width / 2;\r\n      const cy = rect.top + rect.height / 2;\r\n      return Math.atan2(clientY - cy, clientX - cx);\r\n    };\r\n\r\n    const renderPalette = () => {\r\n      if (!palette) return;\r\n\r\n      updateMaterialControls();\r\n      palette.innerHTML = '';\r\n\r\n      const filtered = filteredBeads();\n      filtered.slice(0, paletteLimit).forEach((bead) => {\n        const available = findCompatibleInsertIndex(bead) >= 0;\n        const kind = getItemKind(bead);\r\n        const button = document.createElement('button');\r\n        button.className = `crystaura-diy-bead-card crystaura-diy-bead-card--${kind}`;\r\n        const isRoundBeadCard = kind === 'bead';\r\n        const isAccessoryCard = kind === 'spacer' || kind === 'charm' || kind === 'freeform';\r\n        if (isRoundBeadCard) {\r\n          button.classList.add('crystaura-diy-bead-card--clean-bead');\r\n          button.style.setProperty('border-color', '#B9B6AE', 'important');\r\n          button.style.setProperty('background', '#ffffff', 'important');\r\n          button.style.setProperty('box-shadow', '0 5px 14px rgba(72, 61, 52, 0.07)', 'important');\r\n        }\r\n        button.type = 'button';\r\n        button.draggable = available;\r\n        button.disabled = !available;\r\n        button.dataset.diyAddBead = bead.id;\r\n        button.setAttribute('aria-label', `Add ${bead.name}, ${formatMaterialMeta(bead, true)}`);\r\n\r\n        const imageWrap = document.createElement('span');\r\n        imageWrap.className = 'crystaura-diy-bead-card__image';\r\n\r\n        const image = document.createElement('img');\r\n        image.src = bead.thumb || bead.image;\r\n        image.alt = bead.name;\r\n        image.loading = 'lazy';\r\n        if (isRoundBeadCard) {\r\n          imageWrap.style.setProperty('border-radius', '999px', 'important');\r\n          imageWrap.style.setProperty('background', '#ffffff', 'important');\r\n          imageWrap.style.setProperty('box-shadow', 'none', 'important');\r\n          imageWrap.style.setProperty('overflow', 'hidden', 'important');\r\n          image.style.setProperty('border-radius', '999px', 'important');\r\n          image.style.setProperty('clip-path', 'circle(44% at 50% 50%)', 'important');\r\n          image.style.setProperty('background', '#ffffff', 'important');\r\n          image.style.setProperty('box-shadow', 'none', 'important');\r\n        } else if (isAccessoryCard) {\n          imageWrap.style.setProperty('border-radius', '10px', 'important');\r\n          imageWrap.style.setProperty('background', '#ffffff', 'important');\r\n          imageWrap.style.setProperty('box-shadow', 'none', 'important');\r\n          imageWrap.style.setProperty('overflow', 'hidden', 'important');\r\n          image.style.setProperty('object-fit', 'contain', 'important');\n          image.style.setProperty('object-position', 'center', 'important');\n          image.style.setProperty('position', 'static', 'important');\n          image.style.setProperty('transform', 'none', 'important');\n          image.style.setProperty('border-radius', '0', 'important');\r\n          image.style.setProperty('clip-path', 'none', 'important');\r\n          image.style.setProperty('background', 'transparent', 'important');\r\n          image.style.setProperty('box-shadow', 'none', 'important');\r\n        }\r\n        imageWrap.append(image);\r\n\r\n        const copy = document.createElement('span');\r\n        copy.className = 'crystaura-diy-bead-card__copy';\r\n\r\n        const name = document.createElement('strong');\r\n        name.textContent = bead.name;\r\n\r\n        const meta = document.createElement('small');\r\n        meta.textContent = formatMaterialMeta(bead, available);\r\n\r\n        copy.append(name, meta);\r\n        button.append(imageWrap, copy);\n        palette.append(button);\n      });\n\n      if (filtered.length > paletteLimit) {\n        const more = document.createElement('button');\n        more.type = 'button';\n        more.className = 'crystaura-diy__show-more';\n        more.dataset.diyAction = 'show-more';\n        more.textContent = `Show ${Math.min(48, filtered.length - paletteLimit)} more`;\n        palette.append(more);\n      }\n    };\r\n\r\n    const calculateLayout = (list = state.beads) => {\n      if (!preview) return [];\n\n      const size = Math.min(preview.clientWidth || 560, preview.clientHeight || 560);\n      const compact = isCompactLayout();\n      const targetMm = Math.max(MIN_BRACELET_MM, Number(state.size.targetMm || MIN_BRACELET_MM));\n      const targetRange = Math.max(1, WRIST_MAX_CM * 10 - MIN_BRACELET_MM);\n      const targetRatio = clamp((targetMm - MIN_BRACELET_MM) / targetRange, 0, 1);\n      const occupiedMm = getOccupiedMm(list);\n      const allowedOverMm = Math.max(1, getAllowedOverMm(list));\n      const expansionRatio = clamp((occupiedMm - targetMm) / allowedOverMm, 0, 1);\n      const desiredRadius = size * (\n        compact\n          ? 0.30 + targetRatio * 0.09 + expansionRatio * 0.035\n          : 0.30 + targetRatio * 0.11 + expansionRatio * 0.05\n      );\n\n      if (!list.length) {\n        const radius = clamp(desiredRadius * clamp(state.zoom, ZOOM_MIN, ZOOM_MAX), size * 0.12, size * (compact ? 0.46 : 0.52));\n        preview.style.setProperty('--thread-size', `${Math.max(80, radius * 2)}px`);\n        return [];\n      }\n\n      const center = size / 2;\n      const braceletMm = getBraceletMm(list);\n      const maxMm = Math.max(...list.map((bead) => getItemVisualMm(bead)));\n      const zoomedRadius = desiredRadius * clamp(state.zoom, ZOOM_MIN, ZOOM_MAX);\n      const maxRadius = size * (compact ? 0.46 : 0.52);\r\n      let radius = clamp(zoomedRadius, size * 0.12, maxRadius);\r\n      let pxPerMm = (radius * Math.PI * 2) / braceletMm;\r\n      pxPerMm = compact\r\n        ? clamp(pxPerMm, 2.2, 10.8)\r\n        : clamp(pxPerMm, 2.9, 16.5);\r\n\r\n      let visualWidths = list.map((bead) => getItemVisualDimensions(bead).widthMm * pxPerMm);\n      let visualHeights = list.map((bead) => getItemVisualDimensions(bead).heightMm * pxPerMm);\n      const getLayoutWidth = (bead, index) => {\n        const base = getItemFootprintMm(bead) * pxPerMm;\n        const visualWidth = visualWidths[index];\n        const kind = getItemKind(bead);\n        if (kind === 'charm') return Math.max(base, visualWidth * 0.38);\n        if (kind === 'freeform') return Math.max(base, visualWidth * 0.94);\n        if (bead?.subtype === 'flower-cap') return Math.max(base, visualWidth * 0.7);\n        if (kind === 'spacer') return Math.max(base, visualWidth * 0.8);\n        return Math.max(base, visualWidth * 0.88);\n      };\n      let footprints = list.map(getLayoutWidth);\n      let maxDiameter = Math.max(...visualWidths.map((width, index) => Math.max(width, visualHeights[index])));\n      const maxAllowed = size * (\r\n        compact\r\n          ? (state.zoom > 1 ? 0.66 : 0.48)\r\n          : (state.zoom > 1 ? 0.78 : 0.56)\r\n      );\r\n\r\n      if (radius + maxDiameter / 2 > maxAllowed) {\n        const ratio = maxAllowed / (radius + maxDiameter / 2);\n        radius *= ratio;\n        pxPerMm *= ratio;\n        visualWidths = list.map((bead) => getItemVisualDimensions(bead).widthMm * pxPerMm);\n        visualHeights = list.map((bead) => getItemVisualDimensions(bead).heightMm * pxPerMm);\n        footprints = list.map(getLayoutWidth);\n        maxDiameter = Math.max(...visualWidths.map((width, index) => Math.max(width, visualHeights[index])));\n      }\n\n      const packingCircumference = Math.max(1, radius * Math.PI * 2);\n      const packedWidth = footprints.reduce((sum, footprint) => sum + footprint, 0);\n      if (packedWidth > packingCircumference * 0.985) {\n        const packingRatio = (packingCircumference * 0.985) / packedWidth;\n        pxPerMm *= packingRatio;\n        visualWidths = visualWidths.map((width) => width * packingRatio);\n        visualHeights = visualHeights.map((height) => height * packingRatio);\n        footprints = footprints.map((footprint) => footprint * packingRatio);\n      }\n\n      preview.style.setProperty('--thread-size', `${Math.max(80, radius * 2)}px`);\n\n      const totalAngleWeight = Math.max(1, footprints.reduce((sum, footprint) => sum + footprint, 0));\n      let angle = START_ANGLE + state.rotation;\n      return list.map((bead, index) => {\n        const diameter = footprints[index];\n        const visualWidth = visualWidths[index];\n        const visualHeight = visualHeights[index];\n        const visualDiameter = Math.max(visualWidth, visualHeight);\n        if (index > 0) {\n          angle += ((footprints[index - 1] / 2 + diameter / 2) / totalAngleWeight) * TWO_PI;\n        }\n        const kind = getItemKind(bead);\n        const attachMode = bead.attachMode || bead.anchor || '';\r\n        const angleDeg = (angle * 180) / Math.PI;\r\n        const isSideCharm = kind === 'charm' && attachMode === 'side';\r\n        const charmOffset = kind === 'charm' ? visualDiameter * (isSideCharm ? 0.06 : 0.31) : 0;\r\n        const freeformOffset = kind === 'freeform' ? visualDiameter * 0.01 : 0;\r\n        const itemRadius = radius + charmOffset + freeformOffset;\r\n        const x = center + Math.cos(angle) * itemRadius;\r\n        const y = center + Math.sin(angle) * itemRadius;\r\n        let rotationDeg = angleDeg + 90;\r\n        if (kind === 'charm') {\r\n          rotationDeg = isSideCharm ? angleDeg + 90 : angleDeg - 90;\r\n        } else if (kind === 'freeform') {\r\n          rotationDeg = angleDeg + 90;\r\n        }\r\n\r\n        return { bead, index, angle, start: angle, end: angle, x, y, diameter, visualDiameter, visualWidth, visualHeight, radius, kind, rotationDeg };\n      });\n    };\r\n\r\n    const getInsertionTargetSlots = () => {\r\n      if (!dragState?.active) return layoutSlots;\r\n      if (dragState.type === 'reorder') return layoutSlots.filter((slot) => slot.index !== dragState.sourceIndex);\r\n      if (dragState.type === 'palette' && dragState.bead) return layoutSlots.filter((slot) => slot.bead !== dragState.bead);\r\n      return layoutSlots;\r\n    };\r\n\r\n    const getInsertionCandidateFromPoint = (clientX, clientY) => {\r\n      if (!preview || !layoutSlots.length) return { index: state.beads.length };\r\n\r\n      const rect = preview.getBoundingClientRect();\r\n      const cx = rect.left + rect.width / 2;\r\n      const cy = rect.top + rect.height / 2;\r\n      const pointerAngleRaw = Math.atan2(clientY - cy, clientX - cx);\r\n      const pointerRadius = Math.hypot(clientX - cx, clientY - cy);\r\n      const targetSlots = getInsertionTargetSlots();\r\n\r\n      if (!targetSlots.length) {\r\n        return { index: 0, x: rect.width / 2, y: rect.height / 2, angle: START_ANGLE, radius: 0 };\r\n      }\r\n\r\n      if (targetSlots.length === 1) {\r\n        const slot = targetSlots[0];\r\n        const clockwise = normalizeAngle(pointerAngleRaw - slot.angle);\r\n        const shouldInsertAfter = clockwise < Math.PI;\r\n        const gapAngle = slot.angle + (shouldInsertAfter ? 1 : -1) * Math.max(0.18, (slot.diameter / Math.max(1, slot.radius)) * 0.72);\r\n        const gapRadius = slot.radius;\r\n        return {\r\n          index: clamp(slot.index + (shouldInsertAfter ? 1 : 0), 0, state.beads.length),\r\n          x: cx + Math.cos(gapAngle) * gapRadius - rect.left,\r\n          y: cy + Math.sin(gapAngle) * gapRadius - rect.top,\r\n          angle: gapAngle,\r\n          radius: gapRadius\r\n        };\r\n      }\r\n\r\n      const firstAngle = targetSlots[0].angle;\r\n      const pointerAngle = unwrapAngleFrom(pointerAngleRaw, firstAngle);\r\n      const gapCandidates = [];\r\n\r\n      for (let i = 0; i < targetSlots.length; i += 1) {\r\n        const previous = targetSlots[i];\r\n        const next = targetSlots[(i + 1) % targetSlots.length];\r\n        const previousAngle = previous.angle;\r\n        let nextAngle = next.angle;\r\n        if (i === targetSlots.length - 1 || nextAngle <= previousAngle) nextAngle += TWO_PI;\r\n\r\n        const gapAngle = (previousAngle + nextAngle) / 2;\r\n        const gapRadius = (previous.radius + next.radius) / 2;\r\n        const gapX = cx + Math.cos(gapAngle) * gapRadius;\r\n        const gapY = cy + Math.sin(gapAngle) * gapRadius;\r\n        const angleMiss = Math.min(\r\n          Math.abs(pointerAngle - gapAngle),\r\n          Math.abs(pointerAngle + TWO_PI - gapAngle),\r\n          Math.abs(pointerAngle - TWO_PI - gapAngle)\r\n        );\r\n        const radialMiss = Math.abs(pointerRadius - gapRadius);\r\n        const screenMiss = Math.hypot(clientX - gapX, clientY - gapY);\r\n        const score = angleMiss * Math.max(36, gapRadius * 0.92) + radialMiss * 0.3 + screenMiss * 0.28;\r\n        const rawIndex = i === targetSlots.length - 1 ? state.beads.length : next.index;\r\n\r\n        gapCandidates.push({\r\n          index: rawIndex,\r\n          x: gapX - rect.left,\r\n          y: gapY - rect.top,\r\n          angle: gapAngle,\r\n          radius: gapRadius,\r\n          distance: score\r\n        });\r\n      }\r\n\r\n      gapCandidates.sort((a, b) => a.distance - b.distance);\r\n      const best = gapCandidates[0];\r\n      if (!best) return { index: state.beads.length };\r\n      return { ...best, index: clamp(best.index, 0, state.beads.length) };\r\n    };\r\n\r\n    const insertionIndexFromPoint = (clientX, clientY) => getInsertionCandidateFromPoint(clientX, clientY).index;\r\n\r\n    const isPointInTrash = (clientX, clientY) => {\r\n      if (!trash) return false;\r\n      const rect = trash.getBoundingClientRect();\r\n      return (\r\n        clientX >= rect.left - TRASH_HIT_SLOP\r\n        && clientX <= rect.right + TRASH_HIT_SLOP\r\n        && clientY >= rect.top - TRASH_HIT_SLOP\r\n        && clientY <= rect.bottom + TRASH_HIT_SLOP\r\n      );\r\n    };\r\n\r\n    const setTrashState = (active) => {\r\n      trash?.classList.toggle('is-over-trash', active);\r\n      root.classList.toggle('is-over-trash', active);\r\n    };\r\n\r\n    const renderDragGhost = () => {\r\n      const ghostHost = stage || preview;\r\n      if (!ghostHost) return;\r\n\r\n      let ghost = root.querySelector('[data-diy-drag-ghost]');\r\n\r\n      if (!dragState?.active || !dragState.bead || dragState.x == null) {\r\n        ghost?.remove();\r\n        return;\r\n      }\r\n\r\n      if (!ghost) {\r\n        ghost = document.createElement('span');\r\n        ghost.className = 'crystaura-diy-drag-ghost';\r\n        ghost.dataset.diyDragGhost = '';\r\n        ghost.innerHTML = '<img alt=\"\">';\r\n        ghostHost.append(ghost);\r\n      }\r\n\r\n      if (ghost.parentElement !== ghostHost) ghostHost.append(ghost);\r\n\r\n      const rect = ghostHost.getBoundingClientRect();\r\n      const image = ghost.querySelector('img');\n      const kind = getItemKind(dragState.bead);\n      image.src = dragState.bead.image;\n      const ghostScale = kind === 'bead' ? 2.75 : 3.05;\n      const dimensions = getItemVisualDimensions(dragState.bead);\n      const maxSize = clamp(dimensions.maxMm * ghostScale, kind === 'bead' ? 32 : 38, kind === 'bead' ? 54 : 76);\n      ghost.style.width = `${maxSize * (dimensions.widthMm / dimensions.maxMm)}px`;\n      ghost.style.height = `${maxSize * (dimensions.heightMm / dimensions.maxMm)}px`;\n      ghost.style.left = `${dragState.x - rect.left}px`;\r\n      ghost.style.top = `${dragState.y - rect.top}px`;\r\n    };\r\n\r\n    const renderPreview = () => {\n      if (!preview) return;\r\n\r\n      const previousPositions = getPreviewPositions();\r\n      const displayBeads = getPreviewBeads();\r\n      const shouldFlip = previousPositions.size > 0;\r\n      const placeholderIndex = dragState?.active && dragState.bead\r\n        ? (dragState.type === 'reorder' ? dragState.sourceIndex : dragState.insertIndex)\r\n        : -1;\r\n\r\n      preview.querySelectorAll('[data-diy-preview-bead]').forEach((node) => node.remove());\r\n      if (empty) empty.hidden = displayBeads.length > 0;\r\n\r\n      layoutSlots = calculateLayout(displayBeads);\r\n\r\n      layoutSlots.forEach((slot) => {\r\n        const item = document.createElement('button');\r\n        const previewKey = getPreviewKey(slot);\r\n        item.type = 'button';\r\n        item.className = `crystaura-diy-orbit__bead crystaura-diy-orbit__bead--${slot.kind}`;\r\n        item.dataset.diyPreviewBead = '';\r\n        item.dataset.diyPreviewKey = previewKey;\r\n        item.dataset.diyX = String(slot.x);\r\n        item.dataset.diyY = String(slot.y);\r\n        item.dataset.diySize = String(slot.visualDiameter);\r\n        item.style.left = `${slot.x}px`;\r\n        item.style.top = `${slot.y}px`;\r\n        item.style.setProperty('width', `${slot.visualWidth}px`, 'important');\n        item.style.setProperty('height', `${slot.visualHeight}px`, 'important');\n        item.style.setProperty('max-width', 'none', 'important');\r\n        item.style.setProperty('--bead-rotate', `${slot.rotationDeg}deg`);\r\n        item.style.zIndex = String(1000 + Math.round(slot.y));\r\n\r\n        if (placeholderIndex >= 0 && Math.abs(slot.index - placeholderIndex) === 1) {\r\n          item.classList.add('is-near-placeholder');\r\n        }\r\n\r\n\r\n        const isReorderSource = dragState?.active\r\n          && dragState.type === 'reorder'\r\n          && slot.index === dragState.sourceIndex;\r\n        const isPalettePlaceholder = dragState?.active\r\n          && dragState.type === 'palette'\r\n          && dragState.bead\r\n          && previewKey === getPreviewKey({ bead: dragState.bead, index: slot.index });\r\n        const isPlaceholder = isReorderSource || isPalettePlaceholder;\r\n\r\n        if (isPlaceholder) {\r\n          item.classList.add('is-placeholder');\r\n          item.setAttribute('aria-hidden', 'true');\r\n        } else if (!dragState?.active) {\r\n          item.dataset.diyDragIndex = String(slot.index);\r\n          item.setAttribute('aria-label', `Drag ${slot.bead.name} to reorder`);\r\n        }\r\n\r\n        const image = document.createElement('img');\r\n        image.src = slot.bead.image;\r\n        image.alt = '';\r\n        image.draggable = false;\r\n        image.style.transform = `rotate(${slot.rotationDeg}deg)`;\r\n        item.append(image);\r\n        preview.append(item);\r\n\r\n        if (shouldFlip) {\r\n          let previous = previousPositions.get(previewKey);\r\n          if (!previous && lastAdded && !dragState?.active && lastAdded.index === slot.index && lastAdded.id === slot.bead.id) {\r\n            const rect = preview.getBoundingClientRect();\r\n            const sourceX = Number.isFinite(lastAdded.x) ? lastAdded.x : rect.left + rect.width / 2;\r\n            const sourceY = Number.isFinite(lastAdded.y) ? lastAdded.y : rect.bottom;\r\n            const tangentX = -Math.sin(slot.angle);\r\n            const tangentY = Math.cos(slot.angle);\r\n            const rollTravel = Math.max(34, slot.visualDiameter * 1.25);\r\n            let startX = sourceX - rect.left;\r\n            let startY = sourceY - rect.top;\r\n\r\n            if (Math.hypot(startX - slot.x, startY - slot.y) < rollTravel * 1.1) {\r\n              startX = slot.x - tangentX * rollTravel;\r\n              startY = slot.y - tangentY * rollTravel;\r\n            }\r\n\r\n            previous = {\r\n              x: startX,\r\n              y: startY,\r\n              size: Math.max(8, slot.visualDiameter * 0.22),\r\n              roll: true\r\n            };\r\n          }\r\n          animatePreviewItem(item, previous, slot);\r\n        }\r\n      });\r\n\r\n\r\n      renderDragGhost();\n    };\n\n    const loadAssemblyImage = (src) => new Promise((resolve) => {\n      const image = new Image();\n      image.crossOrigin = 'anonymous';\n      image.onload = () => resolve(image);\n      image.onerror = () => resolve(null);\n      image.src = src;\n    });\n\n    const buildAssemblyDiagram = async (designCode = 'PREVIEW') => {\n      if (!state.beads.length) return '';\n\n      const canvas = document.createElement('canvas');\n      canvas.width = 1800;\n      canvas.height = 1800;\n      const context = canvas.getContext('2d');\n      if (!context) return '';\n\n      const centerX = 900;\n      const centerY = 790;\n      const radius = 505;\n      const scale = 11.2;\n      const weights = state.beads.map((item) => Math.max(1, getItemFootprintMm(item)));\n      const totalWeight = weights.reduce((sum, value) => sum + value, 0);\n      const angles = [];\n      let angle = START_ANGLE;\n      weights.forEach((weight, index) => {\n        if (index === 0) {\n          angles.push(START_ANGLE);\n          return;\n        }\n        angle += ((weights[index - 1] / 2 + weight / 2) / totalWeight) * TWO_PI;\n        angles.push(angle);\n      });\n\n      context.fillStyle = '#fbf8f3';\n      context.fillRect(0, 0, canvas.width, canvas.height);\n      context.strokeStyle = '#d8cdc4';\n      context.lineWidth = 3;\n      context.strokeRect(38, 38, canvas.width - 76, canvas.height - 76);\n\n      context.fillStyle = '#6f594b';\n      context.font = '600 25px Arial, sans-serif';\n      context.letterSpacing = '5px';\n      context.fillText('MAISON LUNE \u00B7 ATELIER ASSEMBLY SHEET', 100, 112);\n      context.fillStyle = '#302925';\n      context.font = '600 72px Poppins, Arial, sans-serif';\n      context.fillText('Clockwise Bracelet Map', 100, 205);\n      context.fillStyle = '#766b64';\n      context.font = '28px Arial, sans-serif';\n      context.fillText(`Design ${designCode}  \u00B7  ${state.size.label}  \u00B7  ${state.beads.length} components`, 104, 258);\n\n      context.beginPath();\n      context.arc(centerX, centerY, radius, 0, TWO_PI);\n      context.strokeStyle = '#cfc4ba';\n      context.lineWidth = 5;\n      context.stroke();\n\n      context.textAlign = 'center';\n      context.fillStyle = '#c6b8ad';\n      context.font = '600 74px Poppins, Arial, sans-serif';\n      context.fillText('Maison Lune', centerX, centerY - 6);\n      context.fillStyle = '#8a7768';\n      context.font = '24px Arial, sans-serif';\n      context.fillText('START AT 12 O\u2019CLOCK \u00B7 FOLLOW CLOCKWISE', centerX, centerY + 42);\n\n      const images = await Promise.all(state.beads.map((item) => loadAssemblyImage(item.image || item.thumb)));\n      state.beads.forEach((item, index) => {\n        const itemAngle = angles[index];\n        const dimensions = getItemVisualDimensions(item);\n        const maxVisual = Math.max(dimensions.widthMm, dimensions.heightMm);\n        const maxPixels = getItemKind(item) === 'charm' ? 280 : 220;\n        const scaledMax = clamp(maxVisual * scale, 62, maxPixels);\n        const width = scaledMax * (dimensions.widthMm / maxVisual);\n        const height = scaledMax * (dimensions.heightMm / maxVisual);\n        const kind = getItemKind(item);\n        const outward = kind === 'charm' ? Math.max(18, height * 0.22) : 0;\n        const x = centerX + Math.cos(itemAngle) * (radius + outward);\n        const y = centerY + Math.sin(itemAngle) * (radius + outward);\n        const rotation = kind === 'charm' ? itemAngle - Math.PI / 2 : itemAngle + Math.PI / 2;\n        const image = images[index];\n\n        if (image) {\n          context.save();\n          context.translate(x, y);\n          context.rotate(rotation);\n          context.shadowColor = 'rgba(54, 39, 30, .2)';\n          context.shadowBlur = 16;\n          context.drawImage(image, -width / 2, -height / 2, width, height);\n          context.restore();\n        }\n\n        const markerRadius = radius + Math.max(width, height) / 2 + 38;\n        const markerX = centerX + Math.cos(itemAngle) * markerRadius;\n        const markerY = centerY + Math.sin(itemAngle) * markerRadius;\n        context.beginPath();\n        context.arc(markerX, markerY, 24, 0, TWO_PI);\n        context.fillStyle = index === 0 ? '#302925' : '#806653';\n        context.fill();\n        context.fillStyle = '#ffffff';\n        context.font = '700 20px Arial, sans-serif';\n        context.textAlign = 'center';\n        context.textBaseline = 'middle';\n        context.fillText(String(index + 1).padStart(2, '0'), markerX, markerY + 1);\n      });\n\n      context.textBaseline = 'alphabetic';\n      context.textAlign = 'left';\n      context.fillStyle = '#302925';\n      context.font = '600 46px Poppins, Arial, sans-serif';\n      context.fillText('Atelier notes', 104, 1485);\n      context.fillStyle = '#766b64';\n      context.font = '27px Arial, sans-serif';\n      context.fillText(`Finished fit: ${(getOccupiedMm() / 10).toFixed(2)} cm  \u00B7  Total: ${money(currency, getTotalCents())}`, 104, 1535);\n      context.fillText(`Customer note: ${state.note.trim() || 'None'}`, 104, 1580);\n      context.fillText('Position 01 is the top reference point. Assemble clockwise in ascending number order.', 104, 1640);\n\n      try {\n        return canvas.toDataURL('image/png', 1);\n      } catch (error) {\n        console.warn('Assembly diagram could not be exported.', error);\n        return '';\n      }\n    };\n\n    const revealMobileFilter = (button, behavior = 'smooth') => {\n      if (!filterBar || !button || !window.matchMedia('(max-width: 989px), (pointer: coarse)').matches) return;\n      const top = Math.max(0, button.offsetTop - ((filterBar.clientHeight - button.offsetHeight) / 2));\n      filterBar.scrollTo({ top, behavior });\n    };\n\n    const openAssembly = async (designCode = 'PREVIEW') => {\n      if (!assemblyPanel || !state.beads.length) {\n        setNotice('Add materials before opening the assembly guide.');\n        return;\n      }\n\n      assemblyPanel.hidden = false;\n      root.classList.add('is-assembly-open');\n      if (assemblyMeta) {\n        assemblyMeta.innerHTML = `<strong>${state.beads.length} components</strong><span>${state.size.label}</span><span>${(getOccupiedMm() / 10).toFixed(2)} cm finished fit</span>`;\n      }\n      if (assemblySequence) {\n        assemblySequence.innerHTML = '';\n        state.beads.forEach((item, index) => {\n          const row = document.createElement('li');\n          row.innerHTML = `<b>${String(index + 1).padStart(2, '0')}</b><img alt=\"\"><span><strong></strong><small></small></span>`;\n          row.querySelector('img').src = item.thumb || item.image;\n          row.querySelector('strong').textContent = item.name;\n          row.querySelector('small').textContent = `${Number(item.mm || 0)}mm \u00B7 ${getItemTypeLabel(item)} \u00B7 ${item.sku || item.id}`;\n          assemblySequence.append(row);\n        });\n      }\n\n      const dataUrl = await buildAssemblyDiagram(designCode);\n      if (dataUrl && assemblyImage) assemblyImage.src = dataUrl;\n      if (assemblyDownload) {\n        if (dataUrl) {\n          assemblyDownload.href = dataUrl;\n          assemblyDownload.removeAttribute('aria-disabled');\n        } else {\n          assemblyDownload.removeAttribute('href');\n          assemblyDownload.setAttribute('aria-disabled', 'true');\n        }\n      }\n    };\n\n    const closeAssembly = () => {\n      if (!assemblyPanel) return;\n      assemblyPanel.hidden = true;\n      root.classList.remove('is-assembly-open');\n    };\n\n    const buildReceiptImage = async () => {\n      if (!state.beads.length) return '';\n      const canvas = document.createElement('canvas');\n      canvas.width = 1400;\n      canvas.height = 1400;\n      const context = canvas.getContext('2d');\n      if (!context) return '';\n\n      const centerX = 700;\n      const centerY = 675;\n      const radius = 420;\n      const weights = state.beads.map((item) => Math.max(1, getItemFootprintMm(item)));\n      const totalWeight = weights.reduce((sum, value) => sum + value, 0);\n      const angles = [];\n      let angle = START_ANGLE;\n      weights.forEach((weight, index) => {\n        if (index === 0) {\n          angles.push(angle);\n          return;\n        }\n        angle += ((weights[index - 1] / 2 + weight / 2) / totalWeight) * TWO_PI;\n        angles.push(angle);\n      });\n\n      const gradient = context.createRadialGradient(centerX, centerY, 80, centerX, centerY, 680);\n      gradient.addColorStop(0, '#ffffff');\n      gradient.addColorStop(0.58, '#fbf8f3');\n      gradient.addColorStop(1, '#f1e9e1');\n      context.fillStyle = gradient;\n      context.fillRect(0, 0, canvas.width, canvas.height);\n\n      context.beginPath();\n      context.arc(centerX, centerY, radius, 0, TWO_PI);\n      context.strokeStyle = 'rgba(112, 91, 77, .18)';\n      context.lineWidth = 4;\n      context.stroke();\n\n      context.textAlign = 'center';\n      context.fillStyle = 'rgba(111, 89, 75, .2)';\n      context.font = '600 74px Poppins, Arial, sans-serif';\n      context.fillText('Maison Lune', centerX, centerY + 8);\n      context.fillStyle = 'rgba(111, 89, 75, .52)';\n      context.font = '22px Arial, sans-serif';\n      context.fillText('CRYSTAL ATELIER', centerX, centerY + 48);\n\n      const images = await Promise.all(state.beads.map((item) => loadAssemblyImage(item.image || item.thumb)));\n      state.beads.forEach((item, index) => {\n        const itemAngle = angles[index];\n        const dimensions = getItemVisualDimensions(item);\n        const maxVisual = Math.max(dimensions.widthMm, dimensions.heightMm);\n        const maxPixels = getItemKind(item) === 'charm' ? 240 : 190;\n        const scaledMax = clamp(maxVisual * 10.5, 56, maxPixels);\n        const width = scaledMax * (dimensions.widthMm / maxVisual);\n        const height = scaledMax * (dimensions.heightMm / maxVisual);\n        const kind = getItemKind(item);\n        const outward = kind === 'charm' ? Math.max(15, height * .2) : 0;\n        const x = centerX + Math.cos(itemAngle) * (radius + outward);\n        const y = centerY + Math.sin(itemAngle) * (radius + outward);\n        const rotation = kind === 'charm' ? itemAngle - Math.PI / 2 : itemAngle + Math.PI / 2;\n        const image = images[index];\n        if (!image) return;\n        context.save();\n        context.translate(x, y);\n        context.rotate(rotation);\n        context.shadowColor = 'rgba(50, 35, 27, .2)';\n        context.shadowBlur = 18;\n        context.drawImage(image, -width / 2, -height / 2, width, height);\n        context.restore();\n      });\n\n      context.textAlign = 'left';\n      context.fillStyle = '#74665d';\n      context.font = '24px Arial, sans-serif';\n      context.fillText(`${state.size.label}  \u00B7  ${(getOccupiedMm() / 10).toFixed(2)} cm finished fit`, 70, 1325);\n      context.textAlign = 'right';\n      context.fillStyle = '#302925';\n      context.font = '700 30px Arial, sans-serif';\n      context.fillText(money(currency, getTotalCents()), 1330, 1325);\n\n      try {\n        return canvas.toDataURL('image/png', 1);\n      } catch (error) {\n        console.warn('Receipt image could not be exported.', error);\n        return '';\n      }\n    };\n\n    const openReceipt = async () => {\n      if (!receiptPanel || !state.beads.length) return;\n      const fit = getFit();\n      if (fit.status !== 'fit') {\n        setNotice('Complete the selected wrist fit before previewing the bracelet.');\n        bumpLimit();\n        return;\n      }\n\n      mobileSelection?.classList.remove('is-open');\n      if (mobileSelection) mobileSelection.hidden = true;\n      receiptPanel.hidden = false;\n      root.classList.add('is-receipt-open');\n      receiptPanel.classList.add('is-loading');\n      pendingDesignCode ||= getDesignCode();\n      saveDesignSnapshot(pendingDesignCode);\n      if (receiptCode) receiptCode.textContent = pendingDesignCode.toUpperCase();\n      if (receiptTotal) receiptTotal.textContent = money(currency, getTotalCents());\n      if (receiptFit) receiptFit.textContent = `${(getOccupiedMm() / 10).toFixed(2)} cm`;\n      if (receiptCount) receiptCount.textContent = String(state.beads.length);\n\n      if (receiptList) {\n        receiptList.innerHTML = '';\n        const grouped = new Map();\n        state.beads.forEach((item) => {\n          const key = item.sku || item.id;\n          const entry = grouped.get(key) || { item, quantity: 0 };\n          entry.quantity += 1;\n          grouped.set(key, entry);\n        });\n        grouped.forEach(({ item, quantity }) => {\n          const row = document.createElement('li');\n          const unitCents = Number(item.priceCents ?? Math.round(Number(item.price || 0) * 100));\n          row.innerHTML = '<img alt=\"\"><span><strong></strong><small></small></span><b></b><em></em>';\n          row.querySelector('img').src = item.thumb || item.image;\n          row.querySelector('strong').textContent = item.name;\n          row.querySelector('small').textContent = `${Number(item.mm || 0)}mm \u00B7 ${getItemTypeLabel(item)}`;\n          row.querySelector('b').textContent = `\u00D7${quantity}`;\n          row.querySelector('em').textContent = money(currency, unitCents * quantity);\n          receiptList.append(row);\n        });\n      }\n\n      if (receiptSequence) {\n        receiptSequence.innerHTML = '';\n        state.beads.forEach((item, index) => {\n          const row = document.createElement('li');\n          const position = document.createElement('b');\n          const copy = document.createElement('span');\n          const name = document.createElement('strong');\n          position.textContent = String(index + 1).padStart(2, '0');\n          name.textContent = item.name;\n          copy.append(name, ` \u00B7 ${Number(item.mm || 0)}mm ${getItemTypeLabel(item)} \u00B7 ${item.sku || item.id}`);\n          row.append(position, copy);\n          receiptSequence.append(row);\n        });\n      }\n\n      const dataUrl = await buildReceiptImage();\n      if (dataUrl && receiptImage) receiptImage.src = dataUrl;\n      receiptPanel.classList.remove('is-loading');\n    };\n\n    const closeReceipt = () => {\n      if (!receiptPanel) return;\n      receiptPanel.hidden = true;\n      receiptPanel.classList.remove('is-loading');\n      root.classList.remove('is-receipt-open');\n    };\n\n    const openMaterialPreview = (id) => {\n      const item = beadById.get(id);\n      if (!item || !materialPreviewPanel) return;\n      if (materialPreviewImage) {\n        materialPreviewImage.src = item.image || item.thumb;\n        materialPreviewImage.alt = item.name;\n      }\n      if (materialPreviewName) materialPreviewName.textContent = item.name;\n      if (materialPreviewMeta) materialPreviewMeta.textContent = `${Number(item.mm || 0)}mm \u00B7 ${getItemTypeLabel(item)} \u00B7 ${(getItemFitMm(item) / 10).toFixed(2)}cm fit contribution`;\n      if (materialPreviewPrice) materialPreviewPrice.textContent = money(currency, Number(item.priceCents ?? Math.round(Number(item.price || 0) * 100)));\n      if (materialPreviewAdd) materialPreviewAdd.dataset.diyPreviewAdd = item.id;\n      materialPreviewPanel.hidden = false;\n      root.classList.add('is-material-preview-open');\n      suppressNextPaletteClick = true;\n    };\n\n    const closeMaterialPreview = () => {\n      if (!materialPreviewPanel) return;\n      materialPreviewPanel.hidden = true;\n      root.classList.remove('is-material-preview-open');\n    };\n\r\n    const renderSequence = () => {\n      if (!sequences.length) return;\n\n      const grouped = new Map();\n      state.beads.forEach((bead, index) => {\n        const key = bead.sku || bead.id;\n        const entry = grouped.get(key) || { bead, quantity: 0, positions: [] };\n        entry.quantity += 1;\n        entry.positions.push(index + 1);\n        grouped.set(key, entry);\n      });\n\n      sequences.forEach((sequence) => {\n        sequence.innerHTML = '';\n        grouped.forEach(({ bead, quantity, positions }) => {\n          const item = document.createElement('li');\n\n          const image = document.createElement('img');\n          image.src = bead.image;\n          image.alt = '';\n          image.loading = 'lazy';\n\n          const copy = document.createElement('span');\n          const name = document.createElement('b');\n          name.textContent = bead.name;\n          const meta = document.createElement('small');\n          const positionText = positions.map((position) => String(position).padStart(2, '0')).join(', ');\n          meta.textContent = `${getItemTypeLabel(bead)} / ${Number(bead.mm || 0)}mm / Qty ${quantity} / Positions ${positionText}`;\n          copy.append(name, meta);\n\n          const price = document.createElement('strong');\n          const unitCents = Number(bead.priceCents ?? Math.round(Number(bead.price || 0) * 100));\n          price.textContent = money(currency, unitCents * quantity);\n\n          const remove = document.createElement('button');\n          remove.type = 'button';\n          remove.dataset.diyRemoveMaterial = bead.sku || bead.id;\n          remove.textContent = '\u22121';\n          remove.setAttribute('aria-label', `Remove one ${bead.name}`);\n\n          item.append(image, copy, price, remove);\n          sequence.append(item);\n        });\n      });\n    };\n\n    const render = () => {\n      const beadsCents = state.beads.reduce((sum, bead) => (\n        sum + Number(bead.priceCents ?? Math.round(Number(bead.price || 0) * 100))\n      ), 0);\n      const totalCents = getTotalCents();\n      const fit = getFit();\n      const isComplete = state.beads.length > 0 && fit.status === 'fit';\n      const missingComponents = state.beads.filter((bead) => {\n        const component = componentBySku.get(bead.sku);\n        return !component || component.available === false || Number(component.price) !== Number(bead.priceCents);\n      });\n\n      if (progress) progress.style.width = `${Math.min(100, (fit.occupiedMm / state.size.targetMm) * 100)}%`;\n      if (beadPrice) beadPrice.textContent = money(currency, beadsCents);\r\n      if (total) total.textContent = money(currency, totalCents);\r\n      if (floatingTotal) floatingTotal.textContent = money(currency, totalCents);\r\n      if (floatingSubtotal) floatingSubtotal.textContent = money(currency, beadsCents);\r\n      if (floatingFit) floatingFit.textContent = fit.message;\r\n      itemCounts.forEach((node) => { node.textContent = String(state.beads.length); });\n      statusFits.forEach((node) => { node.textContent = `${(fit.occupiedMm / 10).toFixed(2)} / ${(state.size.targetMm / 10).toFixed(1)} cm`; });\n      statusTotals.forEach((node) => { node.textContent = money(currency, totalCents); });\n      if (mobileFitText) mobileFitText.textContent = `${(fit.occupiedMm / 10).toFixed(1)}/${(state.size.targetMm / 10).toFixed(1)}cm`;\n      if (fitLabel) fitLabel.textContent = fit.message;\n      if (fitCm) fitCm.textContent = (fit.occupiedMm / 10).toFixed(1);\n      if (fitInch) fitInch.textContent = (fit.occupiedMm / 25.4).toFixed(2);\n      if (zoomLabel) zoomLabel.textContent = `${Math.round(state.zoom * 100)}%`;\r\n      if (fitCard) fitCard.dataset.fitStatus = fit.status;\r\n\r\n      if (lastTotalCents !== null && lastTotalCents !== totalCents) flashPrice();\r\n      lastTotalCents = totalCents;\r\n\r\n      renderPreview();\r\n      renderSequence();\r\n      renderPalette();\r\n\r\n      if (!addButtons.length || !cartNote) return;\r\n\r\n      const setAddButtonState = (enabled, message) => {\n        [...addButtons, ...reviewButtons].forEach((button) => {\n          button.disabled = !enabled;\n          button.title = message;\n          button.setAttribute('aria-label', message);\n        });\n        setNotice(message);\n      };\n\n      if (!isComplete) {\n        const message = fit.status === 'long'\n          ? fit.message\n          : 'Add materials until the bracelet reaches the selected wrist length.';\n        setAddButtonState(false, message);\n        return;\n      }\n\n      if (missingComponents.length) {\n        setAddButtonState(false, `Import or update ${missingComponents.length} DIY material price variant${missingComponents.length === 1 ? '' : 's'}.`);\n        return;\n      }\n\n      setAddButtonState(true, 'Save and preview bracelet in cart.');\r\n    };\n\r\n    const addBead = (id, index = state.beads.length, sourcePoint = null) => {\n      const source = beadById.get(id);\n      if (!source) return false;\n      const resolvedIndex = findCompatibleInsertIndex(source, state.beads, index);\n\n      if (resolvedIndex < 0) {\n        const message = `Cannot add ${source.name}: the flexible bracelet length is full.`;\n        setNotice(message);\n        bumpLimit();\r\n        renderPalette();\r\n        return false;\r\n      }\n\n      const bead = makeBeadInstance(source);\n      const insertIndex = clamp(resolvedIndex, 0, state.beads.length);\n      state.beads.splice(insertIndex, 0, bead);\r\n      lastAdded = {\r\n        id: bead.id,\r\n        index: insertIndex,\r\n        x: sourcePoint?.x,\r\n        y: sourcePoint?.y\r\n      };\r\n      window.clearTimeout(lastAddedTimer);\r\n      lastAddedTimer = window.setTimeout(() => {\r\n        lastAdded = null;\r\n      }, 980);\r\n      render();\r\n      return true;\r\n    };\r\n\r\n    const seedSignature = () => {\n      const preferredNames = ['Himalayan Clear Quartz', 'White Moonstone', 'Grey Moonstone', 'Uruguay Amethyst'];\n      const pattern = beads.filter((bead) => (\n        getItemKind(bead) === 'bead'\n        && preferredNames.includes(bead.name)\n        && Number(bead.mm) >= 7\n        && Number(bead.mm) <= 9\n        && Number(bead.priceCents) <= 3000\n      ));\n      state.beads = [];\n      let index = 0;\n\n      while (pattern.length && index < MAX_BEADS) {\n        const bead = pattern[index % pattern.length];\n        if (!canAddBead(bead)) break;\n        state.beads.push(makeBeadInstance(bead));\r\n        index += 1;\r\n      }\r\n\r\n      render();\r\n    };\r\n\r\n    const cleanupDrag = () => {\r\n      dragState = null;\r\n      root.querySelector('[data-diy-drag-ghost]')?.remove();\r\n      root.classList.remove('is-dragging-bead');\r\n      setTrashState(false);\r\n    };\r\n\r\n    const setAddButtonsLoading = (isLoading) => {\n      addButtons.forEach((button) => {\r\n        const label = button.querySelector('[data-diy-add-label]');\r\n        const idleText = button.dataset.idleText || (label ? label.textContent : button.textContent).trim() || 'Save & Preview Bracelet';\r\n        button.dataset.idleText = idleText;\r\n        button.classList.toggle('is-loading', isLoading);\r\n        if (label) {\r\n          label.textContent = isLoading ? 'Adding...' : idleText;\r\n        } else {\r\n          button.textContent = isLoading ? 'Adding design...' : idleText;\r\n        }\r\n      });\n    };\n\n    const getShareUrl = (view = '') => {\n      const routeRoot = window.Shopify?.routes?.root || '/';\n      const url = new URL(`${window.location.origin}${routeRoot}pages/diy`);\n      url.searchParams.set('design_payload', getDesignPayload());\n      if (view) url.searchParams.set('view', view);\n      return url.toString();\n    };\n\n    const shareDesign = async () => {\n      if (!state.beads.length) {\n        setNotice('Add materials before sharing your design.');\n        return;\n      }\n      const url = getShareUrl();\n      try {\n        if (navigator.share) {\n          await navigator.share({ title: 'My Maison Lune Bracelet', text: 'View my exact Maison Lune bracelet design.', url });\n          setNotice('Design shared.');\n        } else {\n          await navigator.clipboard.writeText(url);\n          setNotice('Exact design link copied.');\n        }\n      } catch (error) {\n        if (error?.name !== 'AbortError') setNotice('Copy this design link from the address bar to share it.');\n      }\n    };\n\n    const addToCart = async (triggerButton) => {\n      const totalCents = getTotalCents();\n      const routeRoot = window.Shopify?.routes?.root || '/';\n      const designCode = pendingDesignCode || getDesignCode();\n      const designPayload = getDesignPayload();\n      const designPreviewUrl = `${window.location.origin}${routeRoot}pages/diy?design_payload=${encodeURIComponent(designPayload)}&view=assembly`;\n      saveDesignSnapshot(designCode);\n\n      const properties = {\n        'Design ID': designCode.toUpperCase(),\n        'Wrist size': state.size.label,\n        'Finished fit': `${(getOccupiedMm() / 10).toFixed(2)} cm`,\n        'Components': `${state.beads.length} pieces / ${new Set(state.beads.map((bead) => bead.sku || bead.id)).size} materials`,\n        'Assembly order': 'Start at position 01 (12 o\u2019clock), then follow clockwise.',\n        '_Assembly guide': designPreviewUrl,\n        '_Target wrist': state.size.label,\n        '_Calculated fit': `${getOccupiedMm().toFixed(1)} mm / ${(getOccupiedMm() / 10).toFixed(2)} cm`,\n        '_Material count': `${state.beads.length} pieces / ${new Set(state.beads.map((bead) => bead.sku || bead.id)).size} SKUs`,\n        '_Material summary': getBeadSummary().slice(0, 240),\n        '_Assembly summary': getAssemblyRuns().join(' | ').slice(0, 240),\n        '_Calculated total': money(currency, totalCents),\n        '_Design code': designCode,\n        '_Design preview': designPreviewUrl,\n        '_Design payload': designPayload,\n        'Atelier note': state.note.trim()\n      };\n\n      splitPropertyText(getMaterialSummaryLines()).slice(0, 4).forEach((chunk, index) => {\n        properties[index === 0 ? 'Material quantities' : `Material quantities ${index + 1}`] = chunk;\n      });\n      splitPropertyText(getExactAssemblyLines(), 220).slice(0, 20).forEach((chunk, index) => {\n        properties[index === 0 ? 'Clockwise sequence' : `Clockwise sequence ${index + 1}`] = chunk;\n      });\n\n      const groupedComponents = new Map();\n      state.beads.forEach((bead) => {\n        const component = componentBySku.get(bead.sku);\n        if (!component) return;\n        const entry = groupedComponents.get(bead.sku) || { bead, component, quantity: 0 };\n        entry.quantity += 1;\n        groupedComponents.set(bead.sku, entry);\n      });\n\n      const componentEntries = Array.from(groupedComponents.values());\n      const primary = componentEntries[0];\n      if (!primary || !Number(primary.component.id)) {\n        setNotice('The selected materials are not available for checkout yet.');\n        render();\n        return;\n      }\n\n      const parentVariantId = Number(primary.component.id);\n      const cartItems = [{\n        id: parentVariantId,\n        quantity: primary.quantity,\n        properties: {\n          ...properties,\n          '_Primary material SKU': primary.bead.sku,\n          '_Primary material': `${primary.bead.name} / ${Number(primary.bead.mm || 0)}mm / ${getItemTypeLabel(primary.bead)}`\n        }\n      }];\n      componentEntries.slice(1).forEach(({ bead, component, quantity }) => {\n        cartItems.push({\n          id: Number(component.id),\n          quantity,\n          parent_id: parentVariantId,\n          properties: {\n            '_Design code': designCode,\n            '_Material SKU': bead.sku,\n            '_Material': `${bead.name} / ${Number(bead.mm || 0)}mm / ${getItemTypeLabel(bead)}`\n          }\n        });\n      });\n\r\n      addButtons.forEach((button) => {\r\n        button.disabled = true;\r\n      });\r\n      setAddButtonsLoading(true);\r\n\r\n      try {\r\n        const response = await fetch(`${routeRoot}cart/add.js`, {\r\n          method: 'POST',\r\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n          body: JSON.stringify({ items: cartItems })\n        });\r\n\r\n        if (!response.ok) throw new Error(await response.text());\r\n        window.location.href = `${routeRoot}cart`;\r\n      } catch (error) {\r\n        console.error('Maison Lune DIY add to cart failed.', error);\n        setAddButtonsLoading(false);\r\n        setNotice('Cart add failed. Check the selected material variants and try again.');\n        render();\r\n      }\r\n    };\r\n\r\n    const activateReorderDrag = (event) => {\r\n      if (!dragState || dragState.active) return;\r\n\r\n      const dx = Math.abs(event.clientX - dragState.startX);\r\n      const dy = Math.abs(event.clientY - dragState.startY);\r\n      if (dx + dy <= 5) return;\r\n\r\n      const bead = state.beads[dragState.sourceIndex];\r\n      if (!bead) {\r\n        cleanupDrag();\r\n        return;\r\n      }\r\n\r\n      dragState.active = true;\r\n      dragState.bead = bead;\r\n      dragState.insertIndex = dragState.sourceIndex;\r\n      root.classList.add('is-dragging-bead');\r\n      renderPreview();\r\n    };\r\n\r\n    const handlePreviewPointerDown = (event) => {\r\n      const beadButton = event.target.closest('[data-diy-drag-index]');\r\n      if (!preview) return;\r\n\r\n      if (!beadButton) {\r\n        dragState = {\r\n          type: 'rotate',\r\n          active: false,\r\n          pointerId: event.pointerId,\r\n          startX: event.clientX,\r\n          startY: event.clientY,\r\n          startAngle: angleFromPoint(event.clientX, event.clientY),\r\n          startRotation: state.rotation\r\n        };\r\n        event.preventDefault();\r\n        return;\r\n      }\r\n\r\n      if (!root.contains(beadButton)) return;\r\n\r\n      dragState = {\r\n        type: 'reorder',\r\n        sourceIndex: Number(beadButton.dataset.diyDragIndex),\r\n        active: false,\r\n        pointerId: event.pointerId,\r\n        startX: event.clientX,\r\n        startY: event.clientY,\r\n        x: event.clientX,\r\n        y: event.clientY\r\n      };\r\n\r\n      event.preventDefault();\r\n    };\r\n\r\n    const handlePreviewPointerMove = (event) => {\r\n      if (!dragState) return;\r\n      if (dragState.pointerId != null && event.pointerId != null && event.pointerId !== dragState.pointerId) return;\r\n\r\n      if (dragState.type === 'rotate') {\r\n        const dx = Math.abs(event.clientX - dragState.startX);\r\n        const dy = Math.abs(event.clientY - dragState.startY);\r\n        if (!dragState.active && dx + dy <= 6) return;\r\n\r\n        dragState.active = true;\r\n        event.preventDefault();\r\n        const delta = angleFromPoint(event.clientX, event.clientY) - dragState.startAngle;\r\n        state.rotation = dragState.startRotation + delta;\r\n        root.classList.add('is-rotating-bracelet');\r\n        renderPreview();\r\n        return;\r\n      }\r\n\r\n      if (dragState.type !== 'reorder') return;\r\n      activateReorderDrag(event);\r\n      if (!dragState.active) return;\r\n\r\n      event.preventDefault();\r\n      dragState.x = event.clientX;\r\n      dragState.y = event.clientY;\r\n      dragState.insertIndex = insertionIndexFromPoint(event.clientX, event.clientY);\r\n      setTrashState(isPointInTrash(event.clientX, event.clientY));\r\n      renderDragGhost();\r\n    };\r\n\r\n    const handlePreviewPointerUp = (event) => {\r\n      if (!dragState) return;\r\n      if (dragState.pointerId != null && event.pointerId != null && event.pointerId !== dragState.pointerId) return;\r\n\r\n      if (dragState.type === 'rotate') {\r\n        root.classList.remove('is-rotating-bracelet');\r\n        cleanupDrag();\r\n        render();\r\n        return;\r\n      }\r\n\r\n      const removedBead = dragState.bead;\r\n      const shouldRemove = dragState.active && removedBead && isPointInTrash(event.clientX, event.clientY);\r\n      const removedName = removedBead?.name;\r\n\r\n      if (dragState.active && removedBead && dragState.type === 'reorder') {\r\n        const sourceIndex = clamp(dragState.sourceIndex, 0, state.beads.length - 1);\r\n        let insertIndex = clamp(dragState.insertIndex, 0, state.beads.length);\r\n        const [bead] = state.beads.splice(sourceIndex, 1);\r\n        if (!shouldRemove && bead) {\r\n          if (insertIndex > sourceIndex) insertIndex -= 1;\r\n          state.beads.splice(clamp(insertIndex, 0, state.beads.length), 0, bead);\r\n        }\r\n      }\r\n\r\n      cleanupDrag();\r\n      render();\r\n      if (shouldRemove && removedName) {\r\n        setNotice(`${removedName} removed. Price updated.`);\r\n      }\r\n    };\r\n\r\n    const handlePreviewPointerCancel = () => {\r\n      if (dragState?.type === 'rotate') {\r\n        root.classList.remove('is-rotating-bracelet');\r\n        cleanupDrag();\r\n        render();\r\n        return;\r\n      }\r\n\r\n      cleanupDrag();\r\n      render();\r\n    };\r\n\r\n    renderPalette();\n    const restoredDesign = restoreDesignSnapshot();\n    if (restoredDesign) syncRestoredDesignControls();\n    syncSizeControls();\n    render();\n    if (!restoredDesign) {\n      window.setTimeout(openWristSetup, 160);\n    } else if (new URLSearchParams(window.location.search).get('view') === 'assembly') {\n      window.setTimeout(() => openAssembly(new URLSearchParams(window.location.search).get('design') || 'SHARED DESIGN'), 280);\n    }\n\r\n    root.addEventListener('click', (event) => {\r\n      const button = event.target.closest('button');\r\n      if (!button || !root.contains(button)) return;\n\n      if (button.hasAttribute('data-diy-assembly-close')) {\n        closeAssembly();\n        return;\n      }\n\n      if (button.hasAttribute('data-diy-receipt-close')) {\n        closeReceipt();\n        return;\n      }\n\n      if (button.hasAttribute('data-diy-material-preview-close')) {\n        closeMaterialPreview();\n        return;\n      }\n\n      if (button.dataset.diyPreviewAdd) {\n        const id = button.dataset.diyPreviewAdd;\n        closeMaterialPreview();\n        suppressNextPaletteClick = false;\n        addBead(id);\n        return;\n      }\n\r\n      if (button.dataset.diyWristWrap) {\r\n        setWristSetupWrap(button.dataset.diyWristWrap);\r\n        return;\r\n      }\r\n\r\n      if (button.hasAttribute('data-diy-wrist-confirm')) {\r\n        applyWristSize(wristInput?.value || DEFAULT_WRIST_CM, selectedWristWrap, { render: false });\r\n        closeWristSetup();\r\n        render();\r\n        return;\r\n      }\r\n\r\n      if (button.dataset.diyMobileScroll) {\n        if (button.dataset.diyMobileScroll === 'selected' && mobileSelection) {\n          mobileSelection.hidden = false;\n          window.requestAnimationFrame(() => mobileSelection.classList.add('is-open'));\n        }\n        return;\n      }\n\n      if (button.hasAttribute('data-diy-mobile-selection-close')) {\n        mobileSelection?.classList.remove('is-open');\n        window.setTimeout(() => { if (mobileSelection) mobileSelection.hidden = true; }, 220);\n        return;\n      }\n\r\n      if (button.dataset.diyAddBead) {\n        if (suppressNextPaletteClick) {\n          suppressNextPaletteClick = false;\n          return;\n        }\n        const rect = button.getBoundingClientRect();\n        addBead(button.dataset.diyAddBead, state.beads.length, {\r\n          x: rect.left + rect.width / 2,\r\n          y: rect.top + rect.height / 2\r\n        });\r\n        return;\r\n      }\r\n\r\n      if (button.dataset.diyRemoveIndex) {\n        state.beads.splice(Number(button.dataset.diyRemoveIndex), 1);\n        render();\n        return;\n      }\n\n      if (button.dataset.diyRemoveMaterial) {\n        const removeIndex = state.beads.findLastIndex((bead) => (\n          (bead.sku || bead.id) === button.dataset.diyRemoveMaterial\n        ));\n        if (removeIndex >= 0) state.beads.splice(removeIndex, 1);\n        render();\n        return;\n      }\n\r\n      if (button.dataset.diyFilter) {\n        state.filter = button.dataset.diyFilter;\n        paletteLimit = 48;\n        filterButtons.forEach((filterButton) => {\r\n          filterButton.classList.toggle('is-active', filterButton === button);\r\n        });\n        renderPalette();\n        revealMobileFilter(button);\n        return;\n      }\n\r\n      if (button.dataset.diyMaterial) {\n        state.material = button.dataset.diyMaterial;\n        state.filter = 'All';\n        paletteLimit = 48;\n        renderPalette();\n        const allFilter = filterButtons.find((filterButton) => filterButton.dataset.diyFilter === 'All' && !filterButton.hidden);\n        window.requestAnimationFrame(() => revealMobileFilter(allFilter, 'auto'));\n        return;\n      }\n\n      if (button.dataset.diyAction === 'show-more') {\n        paletteLimit += 48;\n        renderPalette();\n        return;\n      }\n\r\n      if (button.dataset.diySize) {\n        state.size = {\n          key: button.dataset.diySize,\n          label: button.dataset.label,\n          cm: Number(button.dataset.cm),\n          wristCm: Number(button.dataset.cm),\n          wrapMode: 'single',\n          targetMm: Number(button.dataset.cm) * 10\n        };\n        selectedWristWrap = 'single';\n        syncSizeControls();\n        if (wristInput) wristInput.value = Number(button.dataset.cm).toFixed(1);\n        setWristSetupWrap('single');\n        render();\n        return;\n      }\n      if (button.dataset.diyAction === 'signature') {\n        seedSignature();\n        return;\n      }\n\n      if (button.dataset.diyAction === 'wrist') {\n        openWristSetup();\n        return;\n      }\n\n      if (button.dataset.diyAction === 'assembly') {\n        openAssembly('PREVIEW');\n        return;\n      }\n\n      if (button.dataset.diyAction === 'share') {\n        shareDesign();\n        return;\n      }\n\n      if (button.dataset.diyAction === 'review') {\n        openReceipt();\n        return;\n      }\n\r\n      if (button.dataset.diyAction === 'undo') {\r\n        state.beads.pop();\r\n        render();\r\n        return;\r\n      }\r\n\r\n      if (button.dataset.diyAction === 'clear') {\r\n        state.beads = [];\r\n        render();\r\n        return;\r\n      }\r\n\r\n      if (button.dataset.diyAction === 'zoom-in') {\r\n        state.zoom = clamp(state.zoom + 0.16, ZOOM_MIN, ZOOM_MAX);\r\n        render();\r\n        return;\r\n      }\r\n\r\n      if (button.dataset.diyAction === 'zoom-out') {\r\n        state.zoom = clamp(state.zoom - 0.16, ZOOM_MIN, ZOOM_MAX);\r\n        render();\r\n        return;\r\n      }\r\n\r\n      if (button.dataset.diyAction === 'add') {\n        addToCart(button);\n      }\n    });\r\n\r\n    root.addEventListener('input', (event) => {\n      if (event.target.matches('[data-diy-search]')) {\n        state.search = event.target.value;\n        paletteLimit = 48;\n        renderPalette();\n      }\n\n      if (event.target.matches('[data-diy-note]')) {\n        state.note = event.target.value.slice(0, 240);\n        noteFields.forEach((field) => {\n          if (field !== event.target && field.value !== state.note) field.value = state.note;\n        });\n      }\n\r\n      if (event.target.matches('[data-diy-wrist-input]')) {\r\n        updateWristSetupPreview();\r\n      }\n    });\n\n    root.addEventListener('pointerdown', (event) => {\n      const card = event.target.closest('[data-diy-add-bead]');\n      if (!card || card.disabled || (event.button != null && event.button !== 0)) return;\n      window.clearTimeout(materialPreviewTimer);\n      materialPreviewPointer = { x: event.clientX, y: event.clientY, id: card.dataset.diyAddBead };\n      materialPreviewTimer = window.setTimeout(() => openMaterialPreview(card.dataset.diyAddBead), 520);\n    });\n\n    root.addEventListener('pointermove', (event) => {\n      if (!materialPreviewPointer) return;\n      if (Math.hypot(event.clientX - materialPreviewPointer.x, event.clientY - materialPreviewPointer.y) > 9) {\n        window.clearTimeout(materialPreviewTimer);\n        materialPreviewPointer = null;\n      }\n    });\n\n    const clearMaterialPreviewHold = () => {\n      window.clearTimeout(materialPreviewTimer);\n      materialPreviewPointer = null;\n    };\n    root.addEventListener('pointerup', clearMaterialPreviewHold);\n    root.addEventListener('pointercancel', clearMaterialPreviewHold);\n\r\n    root.addEventListener('dragstart', (event) => {\r\n      const button = event.target.closest('[data-diy-add-bead]');\r\n      if (!button || button.disabled) return;\r\n      paletteDragId = button.dataset.diyAddBead;\r\n      event.dataTransfer.effectAllowed = 'copy';\r\n      event.dataTransfer.setData('text/plain', paletteDragId);\r\n    });\r\n\r\n    root.addEventListener('dragend', () => {\r\n      paletteDragId = '';\r\n      cleanupDrag();\r\n      render();\r\n    });\r\n\r\n    if (stage) {\r\n      stage.addEventListener('wheel', (event) => {\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        const direction = event.deltaY > 0 ? -1 : 1;\r\n        state.zoom = clamp(state.zoom + direction * 0.14, ZOOM_MIN, ZOOM_MAX);\r\n        render();\r\n      }, { passive: false });\r\n    }\r\n\r\n    if (preview) {\r\n      preview.addEventListener('dragover', (event) => {\n        const beadId = paletteDragId || event.dataTransfer.getData('text/plain');\n        const bead = beadById.get(beadId);\n        if (!bead) return;\n        const insertIndex = insertionIndexFromPoint(event.clientX, event.clientY);\n\n        event.preventDefault();\n\n        if (findCompatibleInsertIndex(bead, state.beads, insertIndex) < 0) {\n          event.dataTransfer.dropEffect = 'none';\r\n          setNotice(`Cannot add ${bead.name}: the maximum bracelet length is full.`);\r\n          return;\r\n        }\r\n\r\n        event.dataTransfer.dropEffect = 'copy';\r\n        dragState = {\r\n          type: 'palette',\n          active: true,\n          bead,\n          insertIndex,\n          x: event.clientX,\r\n          y: event.clientY\r\n        };\r\n        root.classList.add('is-dragging-bead');\r\n        renderPreview();\r\n      });\r\n\r\n      preview.addEventListener('drop', (event) => {\r\n        event.preventDefault();\r\n        const beadId = paletteDragId || event.dataTransfer.getData('text/plain');\r\n        const insertIndex = dragState?.insertIndex ?? insertionIndexFromPoint(event.clientX, event.clientY);\r\n        cleanupDrag();\r\n        paletteDragId = '';\r\n        addBead(beadId, insertIndex, { x: event.clientX, y: event.clientY });\r\n      });\r\n\r\n      preview.addEventListener('pointerdown', handlePreviewPointerDown);\r\n      document.addEventListener('pointermove', handlePreviewPointerMove, { passive: false });\r\n      document.addEventListener('pointerup', handlePreviewPointerUp);\r\n      document.addEventListener('pointercancel', handlePreviewPointerCancel);\r\n    }\r\n\r\n    if ('ResizeObserver' in window && preview) {\r\n      const observer = new ResizeObserver(() => renderPreview());\r\n      observer.observe(preview);\r\n    } else {\r\n      window.addEventListener('resize', renderPreview);\r\n    }\r\n  };\r\n\r\n  const initAll = (scope = document) => scope.querySelectorAll(SELECTOR).forEach(initRoot);\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', () => initAll());\r\n  } else {\r\n    initAll();\r\n  }\r\n\r\n  document.addEventListener('shopify:section:load', (event) => initAll(event.target));\r\n})();\r\n"],
  "mappings": "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",
  "names": ["radius"]
}
