{
  "version": 3,
  "sources": ["/cdn/shop/t/38/assets/fh-model-preview.js?x=20537"],
  "sourcesContent": ["/*\n * FilamentHub 3D colour previewer (section: fh-model-preview).\n * three.js r160 + fflate from jsDelivr; parsing in fh-model-parse.js. Nothing is uploaded.\n */\nimport * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.160.0/+esm';\nimport { OrbitControls } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/controls/OrbitControls.js/+esm';\nimport { RoomEnvironment } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/environments/RoomEnvironment.js/+esm';\nimport { unzipSync } from 'https://cdn.jsdelivr.net/npm/fflate@0.8.2/+esm';\nimport { toCreasedNormals } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/utils/BufferGeometryUtils.js/+esm';\n\nconst root = document.querySelector('[data-fh-mp]');\nif (root) init(root).catch((e) => console.error('3D preview failed to start', e));\n\nasync function init(root) {\n  const { parseSTL, parse3MF, measure } = await import(root.dataset.parseUrl);\n  const $ = (sel) => root.querySelector(sel);\n  const el = {\n    stage: $('[data-fh-mp-stage]'), canvas: $('[data-fh-mp-canvas]'),\n    overlay: $('[data-fh-mp-overlay]'), overlayText: $('[data-fh-mp-overlay-text]'),\n    dropHint: $('[data-fh-mp-drop-hint]'), stats: $('[data-fh-mp-stats]'),\n    drop: $('[data-fh-mp-drop]'), file: $('[data-fh-mp-file]'), filename: $('[data-fh-mp-filename]'), error: $('[data-fh-mp-error]'),\n    slots: $('[data-fh-mp-slots]'), picking: $('[data-fh-mp-picking]'), search: $('[data-fh-mp-search]'),\n    chips: $('[data-fh-mp-chips]'), swatches: $('[data-fh-mp-swatches]'),\n    settings: $('[data-fh-mp-settings]'), estimate: null,\n    cartList: $('[data-fh-mp-cart-list]'), add: $('[data-fh-mp-add]'), addTop: $('[data-fh-mp-add-top]'), cartMsg: $('[data-fh-mp-cart-msg]'),\n  };\n  const maxBytes = (+root.dataset.maxMb || 150) * 1024 * 1024;\n  const params = new URLSearchParams(location.search);\n\n  /* ---------------- scene ---------------- */\n  const renderer = new THREE.WebGLRenderer({ canvas: el.canvas, antialias: true, preserveDrawingBuffer: true });\n  renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n  renderer.outputColorSpace = THREE.SRGBColorSpace;\n  // No filmic tone mapping: ACES lifted and desaturated colours (PLA Pro Red #9a1e1c rendered as bright scarlet).\n  // Lighting has ~20% headroom so the brightest filaments (silk yellows, bright oranges) can reach their\n  // photo colour; per-filament render colours in fh-preview-colours.json are calibrated against this setup.\n  renderer.toneMapping = THREE.NoToneMapping;\n  renderer.shadowMap.enabled = true;\n  renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n\n  const scene = new THREE.Scene();\n  scene.background = new THREE.Color('#eef1f4');\n  const pmrem = new THREE.PMREMGenerator(renderer);\n  scene.environment = pmrem.fromScene(new RoomEnvironment(renderer), 0.04).texture;\n\n  const camera = new THREE.PerspectiveCamera(35, 1, 0.1, 10000);\n  const controls = new OrbitControls(camera, el.canvas);\n  controls.enableDamping = true;\n  controls.dampingFactor = 0.08;\n  controls.autoRotateSpeed = 1.6;\n\n  scene.add(new THREE.HemisphereLight(0xffffff, 0xb8c0c8, 0.42));\n  const key = new THREE.DirectionalLight(0xffffff, 1.02);\n  key.castShadow = true;\n  key.shadow.mapSize.set(2048, 2048);\n  key.shadow.bias = -0.0004;\n  key.shadow.normalBias = 0.02;\n  scene.add(key, key.target);\n\n  const plate = new THREE.Group();\n  scene.add(plate);\n  const modelOuter = new THREE.Group(); // Z-up (slicer) -> Y-up (three)\n  modelOuter.rotation.x = -Math.PI / 2;\n  const modelInner = new THREE.Group();\n  modelOuter.add(modelInner);\n  scene.add(modelOuter);\n\n  let needsRender = true;\n  const requestRender = () => { needsRender = true; };\n  controls.addEventListener('change', requestRender);\n  const resize = () => {\n    const w = el.stage.clientWidth, h = el.stage.clientHeight;\n    if (!w || !h) return;\n    renderer.setSize(w, h, false);\n    camera.aspect = w / h;\n    camera.updateProjectionMatrix();\n    requestRender();\n  };\n  new ResizeObserver(resize).observe(el.stage);\n  (function loop() {\n    requestAnimationFrame(loop);\n    const moved = controls.update();\n    if (needsRender || moved || controls.autoRotate) {\n      renderer.render(scene, camera);\n      needsRender = false;\n    }\n  })();\n\n  function buildPlate(size) {\n    plate.clear();\n    const s = Math.max(256, Math.ceil(size / 32) * 32);\n    const base = new THREE.Mesh(\n      new THREE.BoxGeometry(s, 2, s),\n      new THREE.MeshStandardMaterial({ color: '#2f3338', roughness: 0.75, metalness: 0.1 })\n    );\n    base.position.y = -1.02;\n    base.receiveShadow = true;\n    plate.add(base);\n    const grid = new THREE.GridHelper(s, s / 16, '#5d646c', '#464c53');\n    grid.position.y = 0.01;\n    grid.material.transparent = true;\n    grid.material.opacity = 0.55;\n    plate.add(grid);\n  }\n\n  /* ---------------- filament materials ---------------- */\n  const FINISH = {\n    satin: { roughness: 0.45, metalness: 0 },\n    matte: { roughness: 0.93, metalness: 0 },\n    silk: { roughness: 0.22, metalness: 0.1, clearcoat: 0.9, clearcoatRoughness: 0.15 },\n    metal: { roughness: 0.3, metalness: 0.8 },\n    translucent: { roughness: 0.12, metalness: 0, transmission: 0.55, thickness: 3, ior: 1.45 },\n    glow: { roughness: 0.5, metalness: 0 },\n    sparkle: { roughness: 0.3, metalness: 0.2, clearcoat: 0.8, clearcoatRoughness: 0.2 },\n    stone: { roughness: 0.85, metalness: 0 },\n    wood: { roughness: 0.8, metalness: 0 },\n    cf: { roughness: 0.78, metalness: 0.05 },\n  };\n  const finishOf = (title) => {\n    const t = title.toLowerCase();\n    if (/silk/.test(t)) return 'silk';\n    // range words beat colour names: \"PLA Matte Dark Galaxy Purple\" is matte, not sparkle\n    if (/matte/.test(t)) return 'matte';\n    if (/metal/.test(t)) return 'metal';\n    if (/transparent|translucent|crystal|clear/.test(t)) return 'translucent';\n    if (/luminous|glow/.test(t)) return 'glow';\n    if (/galaxy|glitter|starlight|sparkle|saturn/.test(t)) return 'sparkle';\n    if (/marble|rock|stone/.test(t)) return 'stone';\n    if (/wood/.test(t)) return 'wood';\n    if (/\\bcf\\b|carbon|cfrp/.test(t)) return 'cf';\n    return 'satin';\n  };\n  const modeOf = (f) => {\n    if (f.hex.length >= 3) return 2; // tri: three sides\n    if (f.hex.length === 2) return /rainbow|gradient|fast change/i.test(f.title) ? 3 : 1; // gradient or dual\n    return 0;\n  };\n  const FH_GLSL = `\n    uniform int uMode; uniform vec3 uC1; uniform vec3 uC2; uniform vec3 uC3; uniform vec2 uZ;\n    varying vec3 vFhPos; varying vec3 vFhN;\n    vec3 fhColour() {\n      if (uMode == 0) return uC1;\n      vec3 n = normalize(vFhN);\n      if (uMode == 1) return mix(uC1, uC2, smoothstep(-0.18, 0.18, n.x + n.y * 0.55));\n      if (uMode == 2) {\n        float t = (atan(n.y, n.x) + 3.14159265) / 6.28318531 * 3.0;\n        float f = fract(t); int i = int(floor(t));\n        vec3 a = i == 0 ? uC1 : (i == 1 ? uC2 : uC3);\n        vec3 b = i == 0 ? uC2 : (i == 1 ? uC3 : uC1);\n        return mix(a, b, smoothstep(0.82, 1.0, f));\n      }\n      float h = clamp((vFhPos.z - uZ.x) / max(uZ.y - uZ.x, 0.001), 0.0, 1.0);\n      return mix(uC1, uC2, 0.5 - 0.5 * cos(h * 6.28318531));\n    }\n  `;\n  const zRange = new THREE.Vector2(0, 1);\n  function makeMaterial(fil) {\n    const finish = finishOf(fil.title);\n    const cols = (fil.renderHex ? [fil.renderHex] : fil.hex).map((h) => {\n      const c = new THREE.Color(h);\n      const hsl = c.getHSL({});\n      if (hsl.l > 0.86) c.setHSL(hsl.h, hsl.s, 0.86); // keep shading on whites instead of clipping to flat white\n      return c;\n    });\n    while (cols.length < 3) cols.push(cols[cols.length - 1].clone());\n    const mat = new THREE.MeshPhysicalMaterial({ color: 0xffffff, side: THREE.DoubleSide, envMapIntensity: 0.42, ...FINISH[finish] });\n    // white reflections wash out colour; only glossy finishes keep full specular\n    if (!['silk', 'metal', 'sparkle', 'translucent'].includes(finish)) mat.specularIntensity = 0.2;\n    if (finish === 'glow') mat.emissive = cols[0].clone().multiplyScalar(0.12);\n    const u = { uMode: { value: modeOf(fil) }, uC1: { value: cols[0] }, uC2: { value: cols[1] }, uC3: { value: cols[2] }, uZ: { value: zRange } };\n    mat.onBeforeCompile = (sh) => {\n      Object.assign(sh.uniforms, u);\n      sh.vertexShader = 'varying vec3 vFhPos; varying vec3 vFhN;\\n' +\n        sh.vertexShader.replace('#include <begin_vertex>', '#include <begin_vertex>\\n vFhPos = position; vFhN = normal;');\n      sh.fragmentShader = sh.fragmentShader\n        .replace('void main() {', FH_GLSL + '\\nvoid main() {')\n        .replace('#include <color_fragment>', '#include <color_fragment>\\n diffuseColor.rgb = fhColour();');\n    };\n    mat.customProgramCacheKey = () => 'fh-' + finish;\n    return mat;\n  }\n  const previewMaterial = new THREE.MeshPhysicalMaterial({ color: '#c9ced4', roughness: 0.6, side: THREE.DoubleSide });\n\n  /* ---------------- filaments ---------------- */\n  let filaments = [];\n  const byHandle = new Map();\n  async function loadFilaments() {\n    const base = (window.Shopify && Shopify.routes && Shopify.routes.root) || '/';\n    const url = (p) => `${base}collections/${encodeURIComponent(root.dataset.collection)}?view=fh-colours.json&page=${p}`;\n    const first = await fetch(url(1)).then((r) => r.json());\n    const rest = await Promise.all(Array.from({ length: Math.max(0, first.pages - 1) }, (_, i) => fetch(url(i + 2)).then((r) => r.json())));\n    const seen = new Set();\n    filaments = [first, ...rest].flatMap((p) => p.items)\n      .filter((f) => f && f.hex && f.hex[0] && !/^swatch/i.test(f.title) && !seen.has(f.handle) && seen.add(f.handle))\n      .map((f) => ({ ...f, hex: f.hex.filter((h) => /^#[0-9a-f]{6}$/i.test(h)) }))\n      .filter((f) => f.hex.length)\n      .sort((a, b) => (ORDER[materialOf(a.title)] - ORDER[materialOf(b.title)]) || a.title.localeCompare(b.title));\n    // colours measured from the product photos (assets/fh-preview-colours.json):\n    // chip = how the filament looks (swatches, matching), render = value calibrated so the lit 3D model matches the photos\n    let measured = {};\n    try { if (root.dataset.coloursUrl) measured = await fetch(root.dataset.coloursUrl).then((r) => (r.ok ? r.json() : {})); } catch (e) { /* fall back to hex */ }\n    filaments.forEach((f) => {\n      byHandle.set(f.handle, f); f._mat = materialOf(f.title); f._range = rangeOf(f);\n      const m = measured[f.handle];\n      if (m && f.hex.length === 1) { f.chip = m.chip; f.renderHex = m.render; }\n    });\n  }\n  const materialOf = (title) => {\n    const t = title.toLowerCase();\n    if (/^(f?pla|pla)\\b|^fpla/.test(t)) return 'pla';\n    if (/^petg|^pet\\b/.test(t)) return 'petg';\n    if (/^abs|^asa/.test(t)) return 'abs';\n    if (/tpu|flex/.test(t)) return 'tpu';\n    return 'other';\n  };\n  const ORDER = { pla: 0, petg: 1, abs: 2, tpu: 3, other: 4 };\n  const MATERIALS = [['all', 'All'], ['pla', 'PLA'], ['petg', 'PETG'], ['abs', 'ABS / ASA'], ['tpu', 'TPU / Flex'], ['other', 'Other']];\n  // range names inside a title, longest first (\"PLA Dual Silk - Red\" -> \"Dual Silk\")\n  const RANGES = ['dual silk', 'tri silk', 'silk rainbow', 'matte rainbow', 'crystal rainbow', 'matte dual', 'matte tri', 'matte tool',\n    'hyper speed', 'ht gf', '95a silk', 'cfrp-cf', 'silk', 'matte', 'dual', 'tri', 'rainbow', 'gradient', 'marble', 'wood', 'metallic',\n    'metal', 'galaxy', 'luminous', 'crystal', 'transparent', 'translucent', 'saturn', 'rock', 'starlight', 'aero', 'esd', 'ht', 'cf',\n    'pro', '95a', 'glitter', 'chameleon', 'magic'];\n  const MAIN_WORD = { pla: 'PLA', petg: 'PETG' };\n  function rangeOf(f) {\n    const t = f.title.replace(/\\s+-\\s+.*$/, ''); // drop \" - Colour\"\n    const [first, ...words] = t.split(/\\s+/);\n    const lower = words.map((w) => w.toLowerCase());\n    let word = '';\n    for (const r of RANGES) { // first whole-word match, keeping the title's own capitalisation\n      const rw = r.split(' ');\n      const i = lower.findIndex((_, k) => rw.every((x, j) => lower[k + j] === x));\n      if (i >= 0) { word = words.slice(i, i + rw.length).join(' '); break; }\n    }\n    const mat = materialOf(f.title);\n    // keep the material word only when it differs from the group (FPLA, ASA, PET...)\n    if (MAIN_WORD[mat] && first.toUpperCase() === MAIN_WORD[mat]) return word || 'Standard';\n    return word ? `${first} ${word}` : first;\n  }\n  let matFilter = 'all';\n  let rangeFilter = '';\n  let stockOnly = false;\n  const chipMatch = (f) =>\n    (matFilter === 'all' || f._mat === matFilter) && (!rangeFilter || f._range === rangeFilter) && (!stockOnly || f.available);\n\n  /* colour matching (CIE Lab distance) */\n  const lab = (hex) => {\n    const c = new THREE.Color(hex); // linear\n    const f = (v) => (v > 0.008856 ? Math.cbrt(v) : 7.787 * v + 16 / 116);\n    const x = f((c.r * 0.4124 + c.g * 0.3576 + c.b * 0.1805) / 0.95047);\n    const y = f(c.r * 0.2126 + c.g * 0.7152 + c.b * 0.0722);\n    const z = f((c.r * 0.0193 + c.g * 0.1192 + c.b * 0.9505) / 1.08883);\n    return [116 * y - 16, 500 * (x - y), 200 * (y - z)];\n  };\n  function nearest(hex) {\n    const t = lab(hex);\n    let best = null, bd = Infinity;\n    for (const f of filaments) {\n      if (f.hex.length > 1) continue;\n      const l = f._lab || (f._lab = lab(f.chip || f.hex[0]));\n      // most models are printed in standard PLA: other materials and specialty ranges\n      // (Rock, Aero, ESD, HT, Marble...) only win on a clearly closer colour\n      const standard = ['Pro', 'Matte', 'Silk', 'Standard'].includes(f._range);\n      const d = (l[0] - t[0]) ** 2 + (l[1] - t[1]) ** 2 + (l[2] - t[2]) ** 2 + (f.available ? 0 : 400) +\n        (materialOf(f.title) === 'pla' ? 0 : 350) + (standard ? 0 : 300);\n      if (d < bd) { bd = d; best = f; }\n    }\n    return best;\n  }\n  function defaults() {\n    const want = ['White', 'Black', 'Red', 'Blue', 'Yellow', 'Green', 'Orange', 'Purple', 'Grey', 'Pink'];\n    const pool = filaments.filter((f) => f.available && f.hex.length === 1);\n    const pick = (name) => pool.find((f) => /^PLA Pro/i.test(f.title) && f.colour === name) ||\n      pool.find((f) => /^PLA/i.test(f.title) && f.colour === name);\n    const out = want.map(pick).filter(Boolean);\n    return out.length ? out : pool.slice(0, 8);\n  }\n\n  /* ---------------- model state ---------------- */\n  let parts = []; // { key, name, colour, mesh, filament }\n  let active = 0;\n\n  function clearModel() {\n    modelInner.children.slice().forEach((m) => {\n      m.geometry.dispose();\n      if (m.material !== previewMaterial) m.material.dispose();\n      modelInner.remove(m);\n    });\n    parts = [];\n  }\n\n  function showModel(parsed, label, isSample = false) {\n    clearModel();\n    const box = new THREE.Box3();\n    let tris = 0;\n    sampleShown = false; // the sample is a closed solid, so it gets a real estimate too\n    for (const p of parsed.parts) {\n      let g = new THREE.BufferGeometry();\n      g.setAttribute('position', new THREE.BufferAttribute(p.positions, 3));\n      // smooth shading that keeps edges sharper than 35 degrees (flat shading showed faceted bands)\n      if (p.positions.length / 9 <= 1500000) g = toCreasedNormals(g, THREE.MathUtils.degToRad(35));\n      else g.computeVertexNormals();\n      g.computeBoundingBox();\n      box.union(g.boundingBox);\n      tris += p.positions.length / 9;\n      const mesh = new THREE.Mesh(g, previewMaterial);\n      mesh.castShadow = true;\n      mesh.receiveShadow = true;\n      modelInner.add(mesh);\n      parts.push({ key: p.key, name: p.name, colour: p.colour, mesh, filament: null, vol: p.vol || 0, aV: p.aV || 0, aH: p.aH || 0, pick: p.pick });\n    }\n    // sit on the plate, centred\n    const c = box.getCenter(new THREE.Vector3());\n    modelInner.position.set(-c.x, -c.y, -box.min.z);\n    zRange.set(box.min.z, box.max.z);\n    const size = box.getSize(new THREE.Vector3());\n    buildPlate(Math.max(size.x, size.y) * 1.25);\n    fitCamera(size);\n\n    // colours: designer's colours matched to real filaments, else a varied default palette\n    const pre = (params.get('filaments') || params.get('filament') || '').split(',').map((h) => byHandle.get(h.trim())).filter(Boolean);\n    const pal = defaults();\n    // the fallback vase shows off a silk; the robot sample uses its designer's colours (matched below)\n    const sampleCols = isSample && parsed.parts[0] && parsed.parts[0].name === 'Vase body' ? [\n      filaments.find((f) => f.available && /silk/i.test(f.title) && /gold/i.test(f.title) && f.hex.length === 1) ||\n        filaments.find((f) => f.available && /silk/i.test(f.title) && f.hex.length === 1) ||\n        filaments.find((f) => f.available && /^PLA Matte (Lake Green|Emerald Green|Teal Blue|Lavender)$/i.test(f.title)),\n      filaments.find((f) => f.available && /^PLA Matte Black$/i.test(f.title)) || filaments.find((f) => f.available && f.colour === 'Black'),\n    ] : [];\n    parts.forEach((p, i) => {\n      const picked = p.pick && byHandle.get(p.pick);\n      p.filament = pre[i] || sampleCols[i] || (picked && picked.available ? picked : null) || (p.colour && /^#[0-9a-f]{6}/i.test(p.colour) && nearest(p.colour)) || pal[i % pal.length] || filaments[0];\n      applyFilament(p);\n    });\n    active = 0;\n    modelStats = `${size.x.toFixed(0)} \u00D7 ${size.y.toFixed(0)} \u00D7 ${size.z.toFixed(0)} mm \u00B7 ${parts.length} colour${parts.length === 1 ? '' : 's'} \u00B7 ${tris.toLocaleString()} triangles`;\n    el.filename.textContent = label;\n    renderSlots();\n    renderSwatches();\n    renderCart();\n    requestRender();\n  }\n\n  /* ---------------- filament usage estimate ----------------\n   * Like a slicer, roughly: shell = side area x (walls x line width) + up/down-facing area x\n   * (top/bottom layers x layer height); the rest of the enclosed volume is filled at the infill %.\n   * Painted / surface-only colours (vol 0) only use shell. Supports, brim and purge are covered\n   * by the allowance %. Grams = cm3 x material density. */\n  let sampleShown = false;\n  let modelStats = '';\n  const PRESETS = {\n    light: { walls: 2, infill: 10, tb: 3 },\n    standard: { walls: 2, infill: 15, tb: 4 },\n    strong: { walls: 4, infill: 40, tb: 5 },\n  };\n  const print = { walls: 2, infill: 15, tb: 4, layer: 0.2, extra: 5, line: 0.42 };\n  const densityOf = (title) => {\n    const t = title.toLowerCase();\n    if (/aero|\\blw\\b/.test(t)) return 0.9;\n    if (/cf\\b|cfrp|carbon|\\bgf\\b/.test(t)) return /^(pa|nylon)/.test(t) ? 1.2 : 1.3;\n    if (/^petg|^pet\\b/.test(t)) return 1.27;\n    if (/^abs/.test(t)) return 1.04;\n    if (/^asa/.test(t)) return 1.07;\n    if (/tpu|shoeflex|insoleflex/.test(t)) return 1.21;\n    if (/^pc\\b/.test(t)) return 1.2;\n    if (/^pa\\b|nylon/.test(t)) return 1.14;\n    if (/^pva/.test(t)) return 1.23;\n    return 1.24; // PLA and PLA blends\n  };\n  const netGrams = (f) => {\n    const m = String(f.net || '').toLowerCase().match(/([\\d.]+)\\s*(kg|g)/);\n    if (!m) return 1000;\n    const n = parseFloat(m[1]) * (m[2] === 'kg' ? 1000 : 1);\n    return n > 50 ? n : 1000;\n  };\n  function gramsFor(p) {\n    if (!p.filament) return 0;\n    const shell = p.aV * print.walls * print.line + p.aH * print.tb * print.layer; // mm3\n    const solidShell = p.vol > 0 ? Math.min(shell, p.vol) : shell;\n    const inside = Math.max(p.vol - shell, 0) * (print.infill / 100);\n    return ((solidShell + inside) / 1000) * densityOf(p.filament.title) * (1 + print.extra / 100);\n  }\n  // one line per filament: total grams over every part printed in it, spools needed\n  function usage() {\n    const map = new Map();\n    for (const p of parts) {\n      if (!p.filament) continue;\n      const u = map.get(p.filament) || { filament: p.filament, grams: 0 };\n      u.grams += sampleShown ? 0 : gramsFor(p);\n      map.set(p.filament, u);\n    }\n    for (const u of map.values()) u.rolls = Math.max(1, Math.ceil(u.grams / netGrams(u.filament)));\n    return [...map.values()];\n  }\n  const fmtG = (g) => (g >= 1000 ? `${(g / 1000).toFixed(2)} kg` : `${Math.max(1, Math.round(g))} g`);\n\n  function fitCamera(size) {\n    const radius = Math.max(size.length() / 2, 5);\n    const dist = (radius / Math.sin(THREE.MathUtils.degToRad(camera.fov / 2))) * 1.05;\n    const target = new THREE.Vector3(0, size.z * 0.45, 0);\n    const dir = new THREE.Vector3(0.9, 0.75, 1.25).normalize();\n    camera.position.copy(target).addScaledVector(dir, dist);\n    camera.near = Math.max(0.1, dist / 200);\n    camera.far = dist * 50;\n    camera.updateProjectionMatrix();\n    controls.target.copy(target);\n    controls.minDistance = radius * 0.3;\n    controls.maxDistance = dist * 6;\n    controls.update();\n    // key light framed around the model for crisp shadows\n    key.position.set(radius * 1.4, radius * 3, radius * 1.1);\n    key.target.position.set(0, 0, 0);\n    const sc = key.shadow.camera;\n    sc.left = sc.bottom = -radius * 1.6;\n    sc.right = sc.top = radius * 1.6;\n    sc.near = 0.1;\n    sc.far = radius * 8;\n    sc.updateProjectionMatrix();\n    homeView = { pos: camera.position.clone(), target: controls.target.clone() };\n  }\n  let homeView = null;\n\n  function applyFilament(p) {\n    if (p.mesh.material !== previewMaterial) p.mesh.material.dispose();\n    p.mesh.material = p.filament ? makeMaterial(p.filament) : previewMaterial;\n    requestRender();\n  }\n\n  /* ---------------- UI ---------------- */\n  const esc = (s) => String(s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n  const swatchBg = (f) => (f.hex.length === 1 ? (f.chip || f.hex[0]) : `linear-gradient(135deg, ${f.hex.map((h, i) => `${h} ${Math.round((i / f.hex.length) * 100)}% ${Math.round(((i + 1) / f.hex.length) * 100)}%`).join(', ')})`);\n\n  function renderSlots() {\n    el.slots.innerHTML = parts.map((p, i) => `\n      <li>\n        <button type=\"button\" class=\"fh-mp__slot${i === active ? ' is-active' : ''}\" data-slot=\"${i}\" aria-pressed=\"${i === active}\">\n          <span class=\"fh-mp__slot-dot\" style=\"background:${p.filament ? swatchBg(p.filament) : '#ccc'}\"></span>\n          <span class=\"fh-mp__slot-text\">\n            <span class=\"fh-mp__slot-name\">${esc(p.name)}${p.colour ? `<span class=\"fh-mp__orig\" title=\"Colour set in the file\" style=\"background:${esc(p.colour)}\"></span>` : ''}</span>\n            <span class=\"fh-mp__slot-fil\">${p.filament ? esc(p.filament.title) + (sampleShown ? '' : ` \u00B7 \u2248 ${fmtG(gramsFor(p))}`) : 'Choose a filament'}</span>\n          </span>\n          <span class=\"fh-mp__slot-edit\">${i === active ? 'Picking' : 'Change'}</span>\n        </button>\n      </li>`).join('');\n    const p = parts[active];\n    el.picking.textContent = p ? (parts.length > 1 ? `Picking for: ${p.name}` : 'Pick a colour') : 'Pick a colour';\n  }\n  el.slots.addEventListener('click', (e) => {\n    const b = e.target.closest('[data-slot]');\n    if (!b) return;\n    active = +b.dataset.slot;\n    renderSlots();\n    renderSwatches();\n    flash(parts[active]);\n    // picker sits under the viewer: bring it into view if it's below the fold\n    const picker = root.querySelector('[data-fh-mp-picker]');\n    if (picker && picker.getBoundingClientRect().top > window.innerHeight - 160) picker.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n  el.slots.addEventListener('mouseover', (e) => { const b = e.target.closest('[data-slot]'); if (b) highlight(+b.dataset.slot); });\n  el.slots.addEventListener('mouseleave', () => highlight(-1));\n\n  function highlight(i) {\n    parts.forEach((p, k) => {\n      const m = p.mesh.material;\n      if (m === previewMaterial) return;\n      m.transparent = i >= 0 && k !== i;\n      m.opacity = m.transparent ? 0.18 : 1;\n      m.depthWrite = !m.transparent;\n      m.needsUpdate = true;\n    });\n    requestRender();\n  }\n  function flash(p) {\n    if (!p) return;\n    highlight(parts.indexOf(p));\n    clearTimeout(flash.t);\n    flash.t = setTimeout(() => highlight(-1), 650);\n  }\n\n  function renderChips() {\n    const chipBtn = (attr, val, label, on, count) =>\n      `<button type=\"button\" class=\"fh-mp__chip${on ? ' is-on' : ''}\" ${attr}=\"${esc(val)}\" aria-pressed=\"${on}\">${esc(label)}${count != null ? ` <span class=\"fh-mp__count\">${count}</span>` : ''}</button>`;\n    const inStock = (f) => !stockOnly || f.available;\n    let html = '<div class=\"fh-mp__chiprow\">' +\n      MATERIALS.filter(([k]) => k === 'all' || filaments.some((f) => f._mat === k))\n        .map(([k, label]) => chipBtn('data-mat', k, label, k === matFilter)).join('') +\n      `<button type=\"button\" class=\"fh-mp__chip fh-mp__chip--stock${stockOnly ? ' is-on' : ''}\" data-stock aria-pressed=\"${stockOnly}\">In stock only</button></div>`;\n    if (matFilter !== 'all') {\n      const counts = new Map();\n      filaments.filter((f) => f._mat === matFilter && inStock(f)).forEach((f) => counts.set(f._range, (counts.get(f._range) || 0) + 1));\n      const ranges = [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));\n      const label = MATERIALS.find(([k]) => k === matFilter)[1];\n      html += '<div class=\"fh-mp__chiprow fh-mp__chiprow--sub\" role=\"group\" aria-label=\"Filter by range\">' +\n        chipBtn('data-range', '', `All ${label}`, !rangeFilter) +\n        ranges.map(([r, n]) => chipBtn('data-range', r, r, r === rangeFilter, n)).join('') + '</div>';\n    }\n    el.chips.innerHTML = html;\n  }\n  el.chips.addEventListener('click', (e) => {\n    const b = e.target.closest('button');\n    if (!b) return;\n    if (b.hasAttribute('data-mat')) { matFilter = b.dataset.mat; rangeFilter = ''; }\n    else if (b.hasAttribute('data-range')) rangeFilter = b.dataset.range;\n    else if (b.hasAttribute('data-stock')) stockOnly = !stockOnly;\n    renderChips();\n    renderSwatches();\n  });\n  el.search.addEventListener('input', () => renderSwatches());\n\n  function renderSwatches() {\n    if (!filaments.length) return;\n    const words = el.search.value.toLowerCase().split(/\\s+/).filter(Boolean);\n    const list = filaments.filter((f) => chipMatch(f) && words.every((w) => f.title.toLowerCase().includes(w)));\n    const current = parts[active] && parts[active].filament;\n    el.swatches.innerHTML = list.length ? list.map((f) => `\n      <button type=\"button\" class=\"fh-mp__sw${f.available ? '' : ' is-oos'}${current === f ? ' is-on' : ''}\" role=\"option\" aria-selected=\"${current === f}\"\n        data-handle=\"${esc(f.handle)}\" title=\"${esc(f.title)}${f.available ? '' : ' (out of stock)'}\">\n        <span class=\"fh-mp__sw-chip\" style=\"background:${swatchBg(f)}\"></span>\n        <span class=\"fh-mp__sw-name\">${esc(f.title)}</span>\n      </button>`).join('') : '<p class=\"fh-mp__loading\">No filaments match that search.</p>';\n  }\n  el.swatches.addEventListener('click', (e) => {\n    const b = e.target.closest('[data-handle]');\n    if (!b || !parts[active]) return;\n    parts[active].filament = byHandle.get(b.dataset.handle);\n    applyFilament(parts[active]);\n    renderSlots();\n    renderSwatches();\n    renderCart();\n  });\n\n  function renderCart() {\n    const list = usage();\n    el.cartList.innerHTML = list.map(({ filament: f, grams, rolls }) => `\n      <li class=\"fh-mp__cart-item${f.available ? '' : ' is-oos'}\">\n        <span class=\"fh-mp__slot-dot\" style=\"background:${swatchBg(f)}\"></span>\n        <span class=\"fh-mp__cart-text\">\n          <a href=\"${esc(f.url)}\">${esc(f.title)}</a>\n          ${sampleShown ? '' : `<span class=\"fh-mp__cart-use\">\u2248 ${fmtG(grams)} \u00B7 ${rolls} roll${rolls > 1 ? 's' : ''}${rolls > 1 ? ` of ${netGrams(f) / 1000} kg` : ''}</span>`}\n        </span>\n        <span class=\"fh-mp__price\">${f.available ? `${rolls > 1 ? `${rolls} \u00D7 ` : ''}${esc(f.price)}` : 'Out of stock'}</span>\n      </li>`).join('');\n    const buyable = list.filter((u) => u.filament.available);\n    const rollCount = buyable.reduce((n, u) => n + u.rolls, 0);\n    el.add.disabled = !buyable.length;\n    el.add.textContent = !buyable.length ? 'Add these filaments to cart'\n      : rollCount === 1 ? 'Add this filament to cart' : `Add ${rollCount} rolls to cart`;\n    if (el.addTop) {\n      el.addTop.disabled = !buyable.length;\n      el.addTop.dataset.label = !buyable.length ? 'Add to cart' : rollCount === 1 ? 'Add 1 roll to cart' : `Add ${rollCount} rolls to cart`;\n      el.addTop.textContent = el.addTop.dataset.label;\n    }\n    const total = list.reduce((g, u) => g + u.grams, 0);\n    el.stats.textContent = modelStats + (sampleShown || !total ? '' : ` \u00B7 \u2248 ${fmtG(total)} of filament`);\n    if (el.estimate) {\n      el.estimate.innerHTML = sampleShown\n        ? 'Load your own model to estimate how much filament it needs.'\n        : `Estimated filament: <strong>${fmtG(total)}</strong>. A colour that needs more than one spool is added as extra rolls.`;\n    }\n    el.cartMsg.textContent = '';\n  }\n\n  /* print settings card */\n  function renderSettings() {\n    if (!el.settings) return;\n    const on = (k) => PRESETS[k].walls === print.walls && PRESETS[k].infill === print.infill && PRESETS[k].tb === print.tb;\n    el.settings.innerHTML = `\n      <div class=\"fh-mp__presets\" role=\"group\" aria-label=\"Print strength presets\">\n        ${Object.keys(PRESETS).map((k) => `<button type=\"button\" class=\"fh-mp__chip${on(k) ? ' is-on' : ''}\" data-preset=\"${k}\" aria-pressed=\"${on(k)}\">${k[0].toUpperCase() + k.slice(1)}</button>`).join('')}\n      </div>\n      <div class=\"fh-mp__fields\">\n        <label class=\"fh-mp__field\"><span>Walls</span><input type=\"number\" min=\"1\" max=\"10\" step=\"1\" value=\"${print.walls}\" data-set=\"walls\"></label>\n        <label class=\"fh-mp__field\"><span>Top / bottom layers</span><input type=\"number\" min=\"0\" max=\"20\" step=\"1\" value=\"${print.tb}\" data-set=\"tb\"></label>\n        <label class=\"fh-mp__field\"><span>Layer height</span><select data-set=\"layer\">${[0.08, 0.12, 0.16, 0.2, 0.24, 0.28].map((v) => `<option value=\"${v}\"${v === print.layer ? ' selected' : ''}>${v} mm</option>`).join('')}</select></label>\n        <label class=\"fh-mp__field\"><span>Supports, brim &amp; waste</span><select data-set=\"extra\">${[0, 5, 10, 20, 30].map((v) => `<option value=\"${v}\"${v === print.extra ? ' selected' : ''}>+${v}%</option>`).join('')}</select></label>\n        <label class=\"fh-mp__field fh-mp__field--wide\"><span>Infill <output>${print.infill}%</output></span><input type=\"range\" min=\"0\" max=\"100\" step=\"5\" value=\"${print.infill}\" data-set=\"infill\"></label>\n      </div>\n      <p class=\"fh-mp__estimate\" data-fh-mp-estimate></p>`;\n    el.estimate = el.settings.querySelector('[data-fh-mp-estimate]');\n  }\n  if (el.settings) {\n    el.settings.addEventListener('click', (e) => {\n      const b = e.target.closest('[data-preset]');\n      if (!b) return;\n      Object.assign(print, PRESETS[b.dataset.preset]);\n      renderSettings();\n      renderSlots();\n      renderCart();\n    });\n    el.settings.addEventListener('input', (e) => {\n      const f = e.target.closest('[data-set]');\n      if (!f) return;\n      const v = parseFloat(f.value);\n      if (!isFinite(v)) return;\n      print[f.dataset.set] = v;\n      if (f.dataset.set === 'infill') f.parentElement.querySelector('output').textContent = `${v}%`;\n      el.settings.querySelectorAll('[data-preset]').forEach((x) => {\n        const pr = PRESETS[x.dataset.preset];\n        const isOn = pr.walls === print.walls && pr.infill === print.infill && pr.tb === print.tb;\n        x.classList.toggle('is-on', isOn);\n        x.setAttribute('aria-pressed', isOn);\n      });\n      renderSlots();\n      renderCart();\n    });\n  }\n  renderSettings();\n\n  el.add.addEventListener('click', async () => {\n    const items = usage().filter((u) => u.filament.available).map((u) => ({ id: u.filament.variant, quantity: u.rolls }));\n    if (!items.length) return;\n    el.add.disabled = true;\n    if (el.addTop) { el.addTop.disabled = true; el.addTop.textContent = 'Adding\u2026'; }\n    el.cartMsg.textContent = 'Adding\u2026';\n    // Same flow as the theme's product-form.js: ask for the cart drawer's sections with the add,\n    // then let the drawer re-render itself (otherwise it keeps the empty HTML from page load).\n    const cart = document.querySelector('cart-drawer') || document.querySelector('cart-notification');\n    const body = { items };\n    if (cart && typeof cart.getSectionsToRender === 'function') {\n      body.sections = cart.getSectionsToRender().map((s) => s.id);\n      body.sections_url = window.location.pathname;\n      if (typeof cart.setActiveElement === 'function') cart.setActiveElement(el.add);\n    }\n    try {\n      const res = await fetch(root.dataset.cartAddUrl + '.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n        body: JSON.stringify(body),\n      });\n      const data = await res.json();\n      if (!res.ok || data.status) throw new Error(data.description || data.message || 'Could not add to cart');\n      el.cartMsg.innerHTML = `Added to your cart. <a href=\"${esc(root.dataset.cartUrl)}\">View cart</a>`;\n      if (el.addTop) el.addTop.textContent = 'Added to cart \u2713';\n      // keep other cart widgets (rolls discount bar etc.) in sync, as the theme does\n      // publish / PUB_SUB_EVENTS are top-level declarations in pubsub.js / constants.js (not on window)\n      if (typeof publish === 'function' && typeof PUB_SUB_EVENTS !== 'undefined') {\n        publish(PUB_SUB_EVENTS.cartUpdate, { source: 'fh-model-preview', cartData: data });\n      }\n      if (cart && data.sections && typeof cart.renderContents === 'function') cart.renderContents(data);\n      else refreshCartBubble();\n    } catch (err) {\n      el.cartMsg.textContent = err.message;\n      if (el.addTop) el.addTop.textContent = 'Could not add, try again';\n    } finally {\n      el.add.disabled = false;\n      if (el.addTop) {\n        el.addTop.disabled = false;\n        setTimeout(() => { if (!el.add.disabled) el.addTop.textContent = el.addTop.dataset.label; }, 2500);\n      }\n    }\n  });\n  // top bar button: same add as the summary card\n  if (el.addTop) el.addTop.addEventListener('click', () => el.add.click());\n  async function refreshCartBubble() {\n    const bubble = document.getElementById('cart-icon-bubble');\n    if (!bubble) return;\n    try {\n      const html = await fetch(`${root.dataset.cartUrl}?section_id=cart-icon-bubble`).then((r) => r.text());\n      const fresh = new DOMParser().parseFromString(html, 'text/html').querySelector('.shopify-section');\n      if (fresh) bubble.innerHTML = fresh.innerHTML;\n    } catch (e) { /* cosmetic only */ }\n  }\n\n  /* toolbar */\n  root.querySelectorAll('[data-fh-mp-action]').forEach((b) => b.addEventListener('click', () => {\n    const a = b.dataset.fhMpAction;\n    if (a === 'reset' && homeView) { camera.position.copy(homeView.pos); controls.target.copy(homeView.target); controls.update(); requestRender(); }\n    if (a === 'rotate') { controls.autoRotate = !controls.autoRotate; b.setAttribute('aria-pressed', controls.autoRotate); }\n    if (a === 'plate') { plate.visible = !plate.visible; b.setAttribute('aria-pressed', plate.visible); requestRender(); }\n    if (a === 'snapshot') {\n      renderer.render(scene, camera);\n      el.canvas.toBlob((blob) => {\n        const link = document.createElement('a');\n        link.href = URL.createObjectURL(blob);\n        link.download = 'filamenthub-3d-preview.png';\n        link.click();\n        setTimeout(() => URL.revokeObjectURL(link.href), 5000);\n      });\n    }\n  }));\n\n  /* ---------------- loading files ---------------- */\n  const busy = (msg) => { el.overlay.hidden = !msg; if (msg) el.overlayText.textContent = msg; };\n  const showError = (msg) => { el.error.hidden = !msg; el.error.textContent = msg || ''; };\n\n  async function loadFile(file) {\n    showError('');\n    const ext = (file.name.split('.').pop() || '').toLowerCase();\n    if (!['stl', '3mf'].includes(ext)) return showError('Please choose an STL or 3MF file.');\n    if (file.size > maxBytes) return showError(`That file is ${(file.size / 1048576).toFixed(0)} MB. The limit is ${root.dataset.maxMb} MB.`);\n    busy('Reading your model\u2026');\n    await new Promise((r) => setTimeout(r, 30)); // let the overlay paint\n    try {\n      const buf = await file.arrayBuffer();\n      const parsed = ext === 'stl' ? parseSTL(buf, file.name.replace(/\\.stl$/i, '')) : parse3MF(unzipSync(new Uint8Array(buf)));\n      busy('Building the 3D view\u2026');\n      await new Promise((r) => setTimeout(r, 30));\n      showModel(parsed, file.name);\n    } catch (err) {\n      console.error(err);\n      showError(err && err.message ? `Sorry, that file could not be opened. ${err.message}` : 'Sorry, that file could not be opened.');\n    } finally {\n      busy('');\n    }\n  }\n  el.file.addEventListener('change', () => el.file.files[0] && loadFile(el.file.files[0]));\n  let dragDepth = 0;\n  const dropTargets = [el.stage, el.drop];\n  dropTargets.forEach((t) => {\n    t.addEventListener('dragenter', (e) => { e.preventDefault(); dragDepth++; el.dropHint.hidden = false; t.classList.add('is-drag'); });\n    t.addEventListener('dragover', (e) => e.preventDefault());\n    t.addEventListener('dragleave', () => { if (--dragDepth <= 0) { dragDepth = 0; el.dropHint.hidden = true; t.classList.remove('is-drag'); } });\n    t.addEventListener('drop', (e) => {\n      e.preventDefault();\n      dragDepth = 0;\n      el.dropHint.hidden = true;\n      t.classList.remove('is-drag');\n      const f = e.dataTransfer.files && e.dataTransfer.files[0];\n      if (f) loadFile(f);\n    });\n  });\n\n  /* ---------------- sample model: a two-part vase ---------------- */\n  /* default sample: simplified FilamentHub robot (assets/fh-sample-model.json, 16-bit quantised mesh;\n     vol / aV / aH come from the full-detail 3MF so filament estimates stay accurate) */\n  async function loadSample() {\n    const url = root.dataset.sampleUrl;\n    if (!url) throw new Error('no sample');\n    const data = await fetch(url).then((r) => { if (!r.ok) throw new Error('sample ' + r.status); return r.json(); });\n    const bytes = (b64) => { const s = atob(b64); const a = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) a[i] = s.charCodeAt(i); return a.buffer; };\n    return {\n      parts: data.parts.map((p) => {\n        const q = new Uint16Array(bytes(p.v));\n        const idx = p.i32 ? new Uint32Array(bytes(p.i)) : new Uint16Array(bytes(p.i));\n        const positions = new Float32Array(idx.length * 3);\n        for (let t = 0; t < idx.length; t++) {\n          const v = idx[t] * 3;\n          positions[t * 3] = p.min[0] + q[v] * p.scale[0];\n          positions[t * 3 + 1] = p.min[1] + q[v + 1] * p.scale[1];\n          positions[t * 3 + 2] = p.min[2] + q[v + 2] * p.scale[2];\n        }\n        return { key: p.key, name: p.name, colour: p.colour, positions, vol: p.vol, aV: p.aV, aH: p.aH, pick: p.pick };\n      }),\n    };\n  }\n\n  function sampleModel() {\n    const toParts = (geo) => {\n      geo.rotateX(Math.PI / 2); // lathe is Y-up, slicer space is Z-up\n      const g = geo.toNonIndexed();\n      return new Float32Array(g.attributes.position.array);\n    };\n    const prof = [new THREE.Vector2(0, 4)]; // closed profile: solid vase, so the filament estimate is meaningful\n    for (let i = 0; i <= 40; i++) {\n      const t = i / 40, y = 4 + t * 110;\n      prof.push(new THREE.Vector2(30 + 14 * Math.sin(t * Math.PI * 1.15) + 6 * Math.sin(t * Math.PI * 4), y));\n    }\n    const topR = prof[prof.length - 1].x; // rim sits on the top edge (read before closing the profile)\n    prof.push(new THREE.Vector2(0, 114));\n    const body = new THREE.LatheGeometry(prof, 96);\n    const lip = new THREE.TorusGeometry(topR, 2.6, 18, 96).rotateX(Math.PI / 2).translate(0, 115, 0);\n    const foot = new THREE.CylinderGeometry(31, 33, 4, 96).translate(0, 2, 0);\n    return {\n      parts: [\n        (({ p }) => ({ key: 'e1', name: 'Vase body', colour: null, positions: p, ...measure(p) }))({ p: toParts(body) }),\n        (({ p }) => ({ key: 'e2', name: 'Rim and foot', colour: null, positions: p, ...measure(p) }))({ p: concat(toParts(lip), toParts(foot)) }),\n      ],\n    };\n  }\n  const concat = (a, b) => { const o = new Float32Array(a.length + b.length); o.set(a); o.set(b, a.length); return o; };\n\n  /* ---------------- start ---------------- */\n  resize();\n  busy('Loading filaments\u2026');\n  try {\n    await loadFilaments();\n  } catch (e) {\n    console.error(e);\n    el.swatches.innerHTML = '<p class=\"fh-mp__loading\">Filaments could not be loaded. Please refresh the page.</p>';\n  }\n  busy('');\n  renderChips();\n  let sample;\n  try { busy('Loading the sample model\u2026'); sample = await loadSample(); } catch (e) { sample = sampleModel(); }\n  busy('');\n  showModel(sample, 'Showing a sample model. Load your own to try your print.', true);\n}\n"],
  "mappings": "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",
  "names": ["root", "p"]
}
