{
  "version": 3,
  "sources": ["/cdn/shop/t/28/assets/xape-size-finder.js?cb=20261112T174924Z"],
  "sourcesContent": ["/**\n * XAPE Size Finder \u2014 recommendation engine + drawer UI.\n * Original work for Xplosive Ape; not a copy of any third-party liquid.\n * Rules are documented in RULES.md. This file is safe to require() from Node.\n */\n(function (root, factory) {\n  var api = factory();\n  if (typeof module === 'object' && module.exports) {\n    module.exports = api;\n  }\n  root.XapeSizeFinder = api;\n})(typeof window !== 'undefined' ? window : globalThis, function () {\n  'use strict';\n\n  var STORAGE_KEY = 'xape-size-finder-v1';\n  var CM_PER_IN = 2.54;\n  var BMI_REF = 22.5;\n\n  var SIZE_ORDER = ['XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', '2XL', '3XL', '4XL', '5XL', '6XL'];\n  var SIZE_ALIASES = { '2XL': 'XXL', XXL: '2XL', '2X': 'XXL', '3X': '3XL', '4X': '4XL', '5X': '5XL' };\n\n  var SHAPE_DELTA = {\n    chest: { slimmer: -4, average: 0, broader: 4 },\n    stomach: { flatter: -4, average: 0, rounder: 4 },\n    hips: { narrower: -3, average: 0, fuller: 3 }\n  };\n\n  var FIT_INDEX_SHIFT = { slim: -0.5, regular: 0, relaxed: 0.5 };\n\n  var DEFAULT_EASE = {\n    top: { ideal: 11, snug: 4, roomy: 18 },\n    hoodie: { ideal: 16, snug: 8, roomy: 24 },\n    oversized: { ideal: 24, snug: 16, roomy: 32 },\n    bottomWaist: { ideal: 2, snug: -4, roomy: 8 },\n    lengthTop: { ideal: 0, snug: -4, roomy: 6 },\n    inseam: { ideal: 0, snug: -3, roomy: 4 }\n  };\n\n  function clamp(n, lo, hi) {\n    return Math.min(hi, Math.max(lo, n));\n  }\n\n  function round1(n) {\n    return Math.round(n * 10) / 10;\n  }\n\n  function normalizeSize(label) {\n    if (label == null) return '';\n    return String(label).replace(/\\s+/g, '').toUpperCase();\n  }\n\n  function sizeAliasSet(label) {\n    var n = normalizeSize(label);\n    var set = {};\n    set[n] = true;\n    if (SIZE_ALIASES[n]) set[SIZE_ALIASES[n]] = true;\n    return set;\n  }\n\n  function sizesMatch(a, b) {\n    var left = sizeAliasSet(a);\n    return Object.keys(sizeAliasSet(b)).some(function (k) { return left[k]; });\n  }\n\n  // Canonical rank treats 2XL / XXL (and 2X / 3X \u2026) as the same step.\n  var SIZE_RANK_ORDER = ['XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', '3XL', '4XL', '5XL', '6XL'];\n\n  function sizeCanonical(label) {\n    var n = normalizeSize(label);\n    if (n === '2XL' || n === '2X' || n === 'XXL') return 'XXL';\n    if (n === '3X' || n === 'XXXL') return '3XL';\n    if (n === '4X') return '4XL';\n    if (n === '5X') return '5XL';\n    if (n === '6X') return '6XL';\n    return n;\n  }\n\n  function sizeRank(label) {\n    return SIZE_RANK_ORDER.indexOf(sizeCanonical(label));\n  }\n\n  function offeredSizeLabels(variants) {\n    var out = [];\n    var seen = {};\n    (variants || []).forEach(function (v) {\n      var label = v && v.size;\n      if (label == null || label === '') return;\n      var key = sizeCanonical(label) || ('raw:' + normalizeSize(label));\n      if (seen[key]) return;\n      seen[key] = true;\n      out.push(String(label));\n    });\n    out.sort(function (a, b) {\n      var ra = sizeRank(a);\n      var rb = sizeRank(b);\n      if (ra === -1 && rb === -1) return normalizeSize(a).localeCompare(normalizeSize(b));\n      if (ra === -1) return 1;\n      if (rb === -1) return -1;\n      return ra - rb;\n    });\n    return out;\n  }\n\n  function nearestOfferedSize(wanted, offered) {\n    if (!wanted || !offered || !offered.length) return null;\n    var i;\n    for (i = 0; i < offered.length; i++) {\n      if (sizesMatch(offered[i], wanted)) return offered[i];\n    }\n    var wantRank = sizeRank(wanted);\n    var ranked = [];\n    for (i = 0; i < offered.length; i++) {\n      var r = sizeRank(offered[i]);\n      if (r !== -1) ranked.push({ label: offered[i], rank: r });\n    }\n    if (wantRank === -1 || !ranked.length) return null;\n    if (wantRank < ranked[0].rank) return ranked[0].label;\n    if (wantRank > ranked[ranked.length - 1].rank) return ranked[ranked.length - 1].label;\n    var best = null;\n    for (i = 0; i < ranked.length; i++) {\n      var x = ranked[i];\n      var dist = Math.abs(x.rank - wantRank);\n      if (!best || dist < best.dist || (dist === best.dist && x.rank > wantRank)) {\n        best = { label: x.label, dist: dist };\n      }\n    }\n    return best ? best.label : null;\n  }\n\n  function availabilityNote(chartSize, selectSize) {\n    if (!chartSize || !selectSize || sizesMatch(chartSize, selectSize)) return '';\n    return chartSize + \" isn't made in this style; nearest available is \" + selectSize;\n  }\n\n  function resolveSelectSize(wanted, variants) {\n    var offered = offeredSizeLabels(variants);\n    if (!wanted) return offered.length ? offered[0] : null;\n    if (!offered.length) return wanted;\n    return nearestOfferedSize(wanted, offered) || wanted;\n  }\n\n  function parseNumber(value) {\n    if (typeof value === 'number' && isFinite(value)) return value;\n    if (value == null) return null;\n    var m = String(value).replace(',', '.').match(/-?\\d+(?:\\.\\d+)?/);\n    return m ? parseFloat(m[0]) : null;\n  }\n\n  function parseMeas(value) {\n    if (value == null || value === '') return null;\n    if (typeof value === 'number' && isFinite(value)) {\n      return { min: value, max: value, mid: value, isRange: false };\n    }\n    var text = String(value).trim();\n    var parts = text.split(/\\s*[-\u2013\u2014]\\s*/);\n    if (parts.length === 2) {\n      var a = parseNumber(parts[0]);\n      var b = parseNumber(parts[1]);\n      if (a != null && b != null) {\n        return { min: Math.min(a, b), max: Math.max(a, b), mid: (a + b) / 2, isRange: true };\n      }\n    }\n    var n = parseNumber(text);\n    if (n == null) return null;\n    return { min: n, max: n, mid: n, isRange: false };\n  }\n\n  function isNearEvenInch(cm) {\n    var inches = cm / CM_PER_IN;\n    var nearest = Math.round(inches);\n    return Math.abs(inches - nearest) < 0.08 && nearest % 2 === 0;\n  }\n\n  function notesSayToFit(notes, column) {\n    if (!notes || !column) return false;\n    var n = notes.toLowerCase();\n    var c = column.toLowerCase();\n    if (/to-?\\s*fit body range/.test(n) && n.indexOf(c) !== -1) return true;\n    var except = n.match(/except\\s+([^,.]+),\\s*which is a to-?\\s*fit/i);\n    if (except && except[1].toLowerCase().indexOf(c) !== -1) return true;\n    if (n.indexOf(c) !== -1 && /to-?\\s*fit/.test(n)) return true;\n    return false;\n  }\n\n  function classifyColumns(columns, rows, fitNotes) {\n    var names = (columns || []).map(function (c) { return String(c); });\n    var sizeIdx = 0;\n    var dataNames = [];\n    names.forEach(function (name, i) {\n      if (i === 0 && /^size$/i.test(name)) return;\n      dataNames.push({ name: name, index: names.length === Object.keys(rows || {}).length ? i : i - ( /^size$/i.test(names[0]) ? 1 : 0) });\n    });\n    // rows are { size: [values in column order excluding Size] }\n    var firstRow = null;\n    Object.keys(rows || {}).some(function (k) { firstRow = rows[k]; return true; });\n    if (!Array.isArray(firstRow)) firstRow = [];\n\n    var colMeta = [];\n    var widthMid = null;\n    names.forEach(function (name, i) {\n      if (i === 0 && /^size$/i.test(name)) return;\n      var dataIndex = i - ( /^size$/i.test(names[0]) ? 1 : 0);\n      if (/^width$/i.test(name) && firstRow[dataIndex] != null) {\n        var parsed = parseMeas(firstRow[dataIndex]);\n        if (parsed) widthMid = parsed.mid;\n      }\n    });\n\n    names.forEach(function (name, i) {\n      if (i === 0 && /^size$/i.test(name)) return;\n      var dataIndex = i - ( /^size$/i.test(names[0]) ? 1 : 0);\n      var key = name.toLowerCase().replace(/\\s+/g, ' ').trim();\n      var values = [];\n      Object.keys(rows || {}).forEach(function (size) {\n        values.push(parseMeas((rows[size] || [])[dataIndex]));\n      });\n      var samples = values.filter(Boolean);\n      var anyRange = samples.some(function (v) { return v.isRange; });\n      var allEvenInch = samples.length > 0 && samples.every(function (v) { return !v.isRange && isNearEvenInch(v.mid); });\n      var median = samples.length ? samples[Math.floor(samples.length / 2)].mid : null;\n\n      var role = 'garment';\n      var dim = 'other';\n      if (/to\\s*fit/.test(key) || notesSayToFit(fitNotes, name) || anyRange) {\n        role = 'toFit';\n      } else if ((/^chest$/.test(key) || /^waist$/.test(key)) && allEvenInch && median != null && median >= 60 && median <= 130) {\n        if (!( /^chest$/.test(key) && widthMid && Math.abs(median - widthMid * 2) <= 3)) {\n          role = 'toFit';\n        }\n      }\n\n      if (/chest/.test(key)) dim = 'chest';\n      else if (/waist/.test(key)) dim = 'waist';\n      else if (/hip/.test(key)) dim = 'hips';\n      else if (/^width$/.test(key)) dim = 'width';\n      else if (/inseam/.test(key)) dim = 'inseam';\n      else if (/length/.test(key)) dim = 'length';\n      else if (/height/.test(key)) dim = 'height';\n\n      if (role !== 'toFit' && dim === 'chest' && widthMid && median && Math.abs(median - widthMid * 2) <= 3) {\n        role = 'garment';\n        dim = 'chest';\n      }\n\n      colMeta.push({ name: name, dataIndex: dataIndex, role: role, dim: dim });\n    });\n    return colMeta;\n  }\n\n  function detectCategory(title, columns, colMeta) {\n    var t = (title || '').toLowerCase();\n    var hasInseam = colMeta.some(function (c) { return c.dim === 'inseam'; });\n    var hasWaist = colMeta.some(function (c) { return c.dim === 'waist'; });\n    var hasChest = colMeta.some(function (c) { return c.dim === 'chest'; });\n    var isBottom = hasInseam || (hasWaist && !hasChest) || /jogger|short|pant|trouser/.test(t);\n    var isHoodie = /hoodie|sweat|zip/.test(t);\n    var isOversized = /oversized|relaxed|ss26/.test(t);\n\n    if (!isOversized && !isBottom) {\n      var chestCol = colMeta.find(function (c) { return c.dim === 'chest' && c.role === 'garment'; });\n      var widthCol = colMeta.find(function (c) { return c.dim === 'width'; });\n      // If smallest garment chest is very large, treat as oversized cut.\n    }\n\n    return {\n      kind: isBottom ? 'bottom' : (isHoodie ? 'hoodie' : 'top'),\n      oversized: isOversized\n    };\n  }\n\n  function estimateBody(sex, heightCm, weightKg) {\n    var h = clamp(Number(heightCm) || 0, 120, 220);\n    var w = clamp(Number(weightKg) || 0, 30, 200);\n    var bmi = w / Math.pow(h / 100, 2);\n    var d = bmi - BMI_REF;\n    var female = sex === 'female';\n    var chest = female ? 0.515 * h + 1.0 * d : 0.52 * h + 1.2 * d;\n    var waist = female ? 0.42 * h + 1.6 * d : 0.45 * h + 1.8 * d;\n    var hips = female ? 0.56 * h + 1.2 * d : 0.53 * h + 1.1 * d;\n    var length = 0.4 * h;\n    var inseam = 0.445 * h;\n    return {\n      heightCm: round1(h),\n      weightKg: round1(w),\n      bmi: round1(bmi),\n      chest: round1(clamp(chest, 70, 165)),\n      waist: round1(clamp(waist, 55, 165)),\n      hips: round1(clamp(hips, 70, 175)),\n      length: round1(length),\n      inseam: round1(inseam),\n      sex: female ? 'female' : 'male'\n    };\n  }\n\n  function applyShape(body, shape) {\n    shape = shape || {};\n    var chestAdj = SHAPE_DELTA.chest[shape.chest] || 0;\n    var waistAdj = SHAPE_DELTA.stomach[shape.stomach] || 0;\n    var hipAdj = SHAPE_DELTA.hips[shape.hips] || 0;\n    return Object.assign({}, body, {\n      chest: round1(clamp(body.chest + chestAdj, 70, 165)),\n      waist: round1(clamp(body.waist + waistAdj, 55, 165)),\n      hips: round1(clamp(body.hips + hipAdj, 70, 175)),\n      shape: {\n        chest: shape.chest || 'average',\n        stomach: shape.stomach || 'average',\n        hips: shape.hips || 'average'\n      }\n    });\n  }\n\n  function orderedSizes(rows) {\n    var labels = Object.keys(rows || {});\n    var known = [];\n    var rest = [];\n    labels.forEach(function (label) {\n      var n = normalizeSize(label);\n      var idx = SIZE_ORDER.indexOf(n);\n      if (idx === -1 && n === 'XXL') idx = SIZE_ORDER.indexOf('XXL');\n      if (idx === -1) rest.push(label);\n      else known.push({ label: label, idx: idx });\n    });\n    known.sort(function (a, b) { return a.idx - b.idx; });\n    return known.map(function (x) { return x.label; }).concat(rest);\n  }\n\n  function garmentChestForRow(row, colMeta) {\n    var chest = colMeta.find(function (c) { return c.dim === 'chest' && c.role === 'garment'; });\n    if (chest && row[chest.dataIndex] != null) {\n      var p = parseMeas(row[chest.dataIndex]);\n      if (p) return p.mid;\n    }\n    var width = colMeta.find(function (c) { return c.dim === 'width'; });\n    if (width && row[width.dataIndex] != null) {\n      var w = parseMeas(row[width.dataIndex]);\n      if (w) return w.mid * 2;\n    }\n    return null;\n  }\n\n  function easeBand(category, colMeta, rows) {\n    var kind = category.kind;\n    if (kind === 'bottom') return DEFAULT_EASE.bottomWaist;\n    if (category.oversized) return DEFAULT_EASE.oversized;\n    if (kind === 'hoodie') {\n      var sizes = orderedSizes(rows);\n      if (sizes.length) {\n        var smallest = garmentChestForRow(rows[sizes[0]], colMeta);\n        if (smallest != null && smallest >= 115) return DEFAULT_EASE.oversized;\n      }\n      return DEFAULT_EASE.hoodie;\n    }\n    return DEFAULT_EASE.top;\n  }\n\n  function primaryBodyMeas(category, body) {\n    return category.kind === 'bottom' ? body.waist : body.chest;\n  }\n\n  function toFitCol(colMeta, category) {\n    if (category.kind === 'bottom') {\n      return colMeta.find(function (c) { return c.dim === 'waist' && c.role === 'toFit'; }) ||\n        colMeta.find(function (c) { return c.role === 'toFit' && (c.dim === 'hips' || c.dim === 'waist'); });\n    }\n    return colMeta.find(function (c) { return c.dim === 'chest' && c.role === 'toFit'; }) ||\n      colMeta.find(function (c) { return c.role === 'toFit' && c.dim === 'chest'; });\n  }\n\n  function sizeContinuousIndex(sizes, rows, colMeta, category, body) {\n    if (!sizes.length) return null;\n    var primary = primaryBodyMeas(category, body);\n    var tf = toFitCol(colMeta, category);\n    var scores = sizes.map(function (label, i) {\n      var row = rows[label] || [];\n      if (tf) {\n        var meas = parseMeas(row[tf.dataIndex]);\n        if (!meas) return { i: i, target: null, delta: Infinity };\n        var mid = meas.mid;\n        var span = meas.isRange ? (meas.max - meas.min) : (2 * CM_PER_IN);\n        if (!meas.isRange) {\n          meas = { min: mid - CM_PER_IN, max: mid + CM_PER_IN, mid: mid, isRange: true };\n          span = 2 * CM_PER_IN;\n        }\n        var delta;\n        if (primary >= meas.min && primary <= meas.max) {\n          delta = (primary - meas.mid) / Math.max(span, 1);\n        } else if (primary < meas.min) {\n          delta = (primary - meas.mid) / Math.max(span, 1);\n        } else {\n          delta = (primary - meas.mid) / Math.max(span, 1);\n        }\n        return { i: i, mid: meas.mid, delta: primary - mid, abs: Math.abs(primary - mid) };\n      }\n\n      if (category.kind === 'bottom') {\n        var waistCol = colMeta.find(function (c) { return c.dim === 'waist'; });\n        if (waistCol) {\n          var w = parseMeas(row[waistCol.dataIndex]);\n          if (w) {\n            var ease = w.mid - body.waist;\n            var band = DEFAULT_EASE.bottomWaist;\n            return { i: i, mid: w.mid, delta: ease - band.ideal, abs: Math.abs(ease - band.ideal) };\n          }\n        }\n      }\n\n      var gChest = garmentChestForRow(row, colMeta);\n      if (gChest != null) {\n        var easeC = gChest - body.chest;\n        var bandC = easeBand(category, colMeta, rows);\n        return { i: i, mid: gChest, delta: easeC - bandC.ideal, abs: Math.abs(easeC - bandC.ideal) };\n      }\n      return { i: i, mid: null, delta: Infinity, abs: Infinity };\n    });\n\n    var best = scores.reduce(function (a, b) {\n      if (b.abs < a.abs) return b;\n      return a;\n    }, scores[0]);\n\n    if (!best || !isFinite(best.abs)) return { index: 0, scores: scores, method: 'fallback' };\n\n    // Interpolate a continuous index between nearest neighbours.\n    var i = best.i;\n    var idx = i;\n    if (tf && isFinite(best.delta)) {\n      var prev = scores[i - 1];\n      var next = scores[i + 1];\n      if (best.delta < 0 && prev && isFinite(prev.delta) && (prev.delta - best.delta) !== 0) {\n        // body is smaller than this size mid; maybe between prev and this\n        if (prev.delta < 0 && Math.abs(prev.delta) < Math.abs(best.delta)) {\n          idx = i - 1;\n        } else if (prev.delta <= 0 && best.delta >= 0) {\n          var t = (0 - prev.delta) / (best.delta - prev.delta);\n          idx = (i - 1) + t;\n        } else if (prev.delta > 0) {\n          idx = i;\n        } else {\n          var span = Math.abs(prev.mid - best.mid) || 1;\n          var t2 = (primary - prev.mid) / span;\n          idx = (i - 1) + clamp(t2, 0, 1);\n        }\n      } else if (best.delta > 0 && next && isFinite(next.delta)) {\n        var span2 = Math.abs(next.mid - best.mid) || 1;\n        var t3 = (primary - best.mid) / span2;\n        idx = i + clamp(t3, 0, 1);\n      }\n    } else if (isFinite(best.delta)) {\n      var neigh = best.delta < 0 ? scores[i - 1] : scores[i + 1];\n      if (neigh && isFinite(neigh.abs) && isFinite(neigh.delta) && (neigh.delta * best.delta <= 0 || neigh.abs)) {\n        var denom = (neigh.abs + best.abs) || 1;\n        if (best.delta < 0 && i > 0) {\n          idx = i - neigh.abs / denom;\n        } else if (best.delta > 0 && i < scores.length - 1) {\n          idx = i + (best.abs === 0 ? 0 : 1 - neigh.abs / denom);\n          // simpler: weighted by inverse abs\n          var wBest = 1 / Math.max(best.abs, 0.01);\n          var wNeigh = 1 / Math.max(neigh.abs, 0.01);\n          idx = (i * wBest + (i + 1) * wNeigh) / (wBest + wNeigh);\n        }\n      }\n    }\n\n    return { index: clamp(idx, 0, sizes.length - 1), scores: scores, method: tf ? 'toFit' : 'garmentEase' };\n  }\n\n  function classifyFitBand(delta, snug, roomy) {\n    if (delta <= snug) return 'snug';\n    if (delta >= roomy) return 'roomy';\n    return 'ideal';\n  }\n\n  function measurementBreakdown(label, row, colMeta, category, body, rows) {\n    var items = [];\n    function add(key, title, status, detail) {\n      items.push({ key: key, title: title, status: status, detail: detail });\n    }\n\n    var tfChest = category.kind === 'bottom' ? null : colMeta.find(function (c) { return c.dim === 'chest' && c.role === 'toFit'; });\n    var tfWaist = colMeta.find(function (c) { return c.dim === 'waist' && c.role === 'toFit'; });\n    var gChest = category.kind === 'bottom' ? null : garmentChestForRow(row, colMeta);\n    var lengthCol = colMeta.find(function (c) { return c.dim === 'length'; });\n    var inseamCol = colMeta.find(function (c) { return c.dim === 'inseam'; });\n    var widthCol = colMeta.find(function (c) { return c.dim === 'width'; });\n\n    if (tfChest) {\n      var c = parseMeas(row[tfChest.dataIndex]);\n      if (c) {\n        var lo = c.isRange ? c.min : c.mid - CM_PER_IN;\n        var hi = c.isRange ? c.max : c.mid + CM_PER_IN;\n        var status = body.chest < lo - 1 ? 'roomy' : body.chest > hi + 1 ? 'snug' : 'ideal';\n        add('chest', 'Chest', status, 'Your chest ' + round1(body.chest) + ' cm vs ' + round1(lo) + '\u2013' + round1(hi) + ' cm');\n      }\n    } else if (gChest != null) {\n      var band = easeBand(category, colMeta, rows);\n      var ease = gChest - body.chest;\n      add('chest', 'Chest', classifyFitBand(ease, band.snug, band.roomy), 'About ' + round1(ease) + ' cm of room');\n    }\n\n    if (tfWaist) {\n      var w = parseMeas(row[tfWaist.dataIndex]);\n      if (w) {\n        var wlo = w.isRange ? w.min : w.mid - CM_PER_IN;\n        var whi = w.isRange ? w.max : w.mid + CM_PER_IN;\n        var wstatus = body.waist < wlo - 1 ? 'roomy' : body.waist > whi + 1 ? 'snug' : 'ideal';\n        add('waist', 'Waist', wstatus, 'Your waist ' + round1(body.waist) + ' cm vs ' + round1(wlo) + '\u2013' + round1(whi) + ' cm');\n      }\n    } else {\n      var waistCol = colMeta.find(function (c) { return c.dim === 'waist' && c.role === 'garment'; });\n      if (waistCol) {\n        var gw = parseMeas(row[waistCol.dataIndex]);\n        if (gw) {\n          var wease = gw.mid - body.waist;\n          add('waist', 'Waist', classifyFitBand(wease, DEFAULT_EASE.bottomWaist.snug, DEFAULT_EASE.bottomWaist.roomy), 'About ' + round1(wease) + ' cm of room');\n        }\n      }\n    }\n\n    if (lengthCol) {\n      var len = parseMeas(row[lengthCol.dataIndex]);\n      if (len) {\n        var ld = len.mid - body.length;\n        add('length', 'Length', classifyFitBand(ld, DEFAULT_EASE.lengthTop.snug, DEFAULT_EASE.lengthTop.roomy), 'Garment ' + round1(len.mid) + ' cm');\n      }\n    } else if (inseamCol) {\n      var ins = parseMeas(row[inseamCol.dataIndex]);\n      if (ins) {\n        var idelta = ins.mid - body.inseam;\n        add('length', 'Inseam', classifyFitBand(idelta, DEFAULT_EASE.inseam.snug, DEFAULT_EASE.inseam.roomy), 'Garment ' + round1(ins.mid) + ' cm');\n      }\n    } else if (widthCol && category.kind === 'bottom') {\n      var width = parseMeas(row[widthCol.dataIndex]);\n      if (width) add('length', 'Width', 'ideal', 'Garment width ' + round1(width.mid) + ' cm');\n    }\n\n    return items;\n  }\n\n  function confidenceFrom(index, sizes, breakdown, method, clamped) {\n    var frac = index - Math.round(index);\n    var between = Math.abs(index - Math.round(index)) >= 0.28 && Math.abs(index - Math.round(index)) <= 0.72;\n    var atEnd = (index <= 0.15 && clamped.neededLow) || (index >= sizes.length - 1.15 && clamped.neededHigh);\n    var hasIdeal = breakdown.some(function (b) { return b.status === 'ideal'; });\n    var hasSnugOrRoomy = breakdown.some(function (b) { return b.status === 'snug' || b.status === 'roomy'; });\n    if (method === 'fallback') return { key: 'limited', label: 'Limited data' };\n    if (atEnd && hasSnugOrRoomy) return { key: 'limited', label: 'Limited data' };\n    if (between) return { key: 'between', label: 'Between sizes' };\n    if (hasIdeal && !hasSnugOrRoomy) return { key: 'great', label: 'Great fit' };\n    return { key: 'good', label: 'Good fit' };\n  }\n\n  function recommend(chart, profile) {\n    var columns = chart.columns || [];\n    var rows = chart.rows || {};\n    var fitNotes = chart.fitNotes || chart.notes || '';\n    var title = chart.title || chart.chartTitle || '';\n    var colMeta = classifyColumns(columns, rows, fitNotes);\n    var category = detectCategory(title, columns, colMeta);\n    // Auto oversized: smallest garment chest very large\n    if (category.kind !== 'bottom') {\n      var sizesTmp = orderedSizes(rows);\n      if (sizesTmp.length) {\n        var smallestC = garmentChestForRow(rows[sizesTmp[0]], colMeta);\n        if (smallestC != null && smallestC >= 115) category = Object.assign({}, category, { oversized: true });\n      }\n    }\n\n    var body0 = estimateBody(profile.sex, profile.heightCm, profile.weightKg);\n    var body = applyShape(body0, profile.shape);\n    var sizes = orderedSizes(rows);\n    if (!sizes.length) {\n      return { ok: false, reason: 'no-sizes', body: body, bodyRaw: body0 };\n    }\n\n    var placed = sizeContinuousIndex(sizes, rows, colMeta, category, body);\n    var rawIndex = placed ? placed.index : 0;\n    var fit = profile.fit || 'regular';\n    var shift = FIT_INDEX_SHIFT[fit] != null ? FIT_INDEX_SHIFT[fit] : 0;\n    var shifted = rawIndex + shift;\n    var neededLow = shifted < 0;\n    var neededHigh = shifted > sizes.length - 1;\n    var clamped = clamp(shifted, 0, sizes.length - 1);\n    var nearest = Math.round(clamped);\n    nearest = clamp(nearest, 0, sizes.length - 1);\n    var bestLabel = sizes[nearest];\n    var breakdown = measurementBreakdown(bestLabel, rows[bestLabel] || [], colMeta, category, body, rows);\n    var conf = confidenceFrom(shifted, sizes, breakdown, placed && placed.method, { neededLow: neededLow, neededHigh: neededHigh });\n\n    var all = sizes.map(function (label) {\n      return {\n        label: label,\n        breakdown: measurementBreakdown(label, rows[label] || [], colMeta, category, body, rows)\n      };\n    });\n\n    return {\n      ok: true,\n      body: body,\n      bodyRaw: body0,\n      category: category,\n      method: placed && placed.method,\n      rawIndex: round1(rawIndex),\n      shiftedIndex: round1(shifted),\n      size: bestLabel,\n      sizes: sizes,\n      confidence: conf,\n      breakdown: breakdown,\n      all: all,\n      notes: fitNotes\n    };\n  }\n\n  /* ---------------- persistence & UI (browser only) ---------------- */\n\n  function loadState() {\n    try {\n      var raw = root.localStorage && root.localStorage.getItem(STORAGE_KEY);\n      if (!raw) return null;\n      return JSON.parse(raw);\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function saveState(state) {\n    try {\n      if (!root.localStorage) return;\n      var payload = {\n        sex: state.sex,\n        heightCm: state.heightCm,\n        weightKg: state.weightKg,\n        heightUnit: state.heightUnit,\n        weightUnit: state.weightUnit,\n        shape: state.shape,\n        fit: state.fit,\n        savedAt: Date.now()\n      };\n      root.localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\n    } catch (e) { /* private mode */ }\n  }\n\n  function defaultState() {\n    var saved = loadState() || {};\n    return {\n      sex: saved.sex === 'female' ? 'female' : 'male',\n      heightCm: saved.heightCm || 178,\n      weightKg: saved.weightKg || 80,\n      heightUnit: saved.heightUnit === 'ft' ? 'ft' : 'cm',\n      weightUnit: saved.weightUnit === 'lb' ? 'lb' : 'kg',\n      shape: {\n        chest: (saved.shape && saved.shape.chest) || 'average',\n        stomach: (saved.shape && saved.shape.stomach) || 'average',\n        hips: (saved.shape && saved.shape.hips) || 'average'\n      },\n      fit: saved.fit || 'regular',\n      step: 1,\n      previewSize: null\n    };\n  }\n\n  function cmToFtIn(cm) {\n    var total = Math.round(cm / CM_PER_IN);\n    var ft = Math.floor(total / 12);\n    var inch = total - ft * 12;\n    return { ft: ft, inch: inch };\n  }\n\n  function ftInToCm(ft, inch) {\n    return (Number(ft) * 12 + Number(inch)) * CM_PER_IN;\n  }\n\n  function kgToLb(kg) { return kg * 2.20462262; }\n  function lbToKg(lb) { return lb / 2.20462262; }\n\n  function parseChartFromData(data) {\n    var rows = data.rows;\n    // Shopify may give rows as object or as array of [size, values]\n    if (Array.isArray(rows)) {\n      var obj = {};\n      rows.forEach(function (row) {\n        if (Array.isArray(row) && row.length === 2) obj[row[0]] = row[1];\n        else if (row && row.size) obj[row.size] = row.values;\n      });\n      rows = obj;\n    } else if (rows && typeof rows === 'object') {\n      // already a map\n    } else {\n      rows = {};\n    }\n    var columns = data.columns;\n    if (typeof columns === 'string') {\n      try { columns = JSON.parse(columns); } catch (e) { columns = []; }\n    }\n    if (typeof data.rows === 'string') {\n      try { rows = JSON.parse(data.rows); } catch (e) { /* keep */ }\n    }\n    return {\n      title: data.chartTitle || data.title || '',\n      fitNotes: data.fitNotes || '',\n      columns: columns || [],\n      rows: rows\n    };\n  }\n\n  function selectSizeOnPage(sizeLabel) {\n    if (typeof document === 'undefined') return false;\n    var aliases = sizeAliasSet(sizeLabel);\n    var radios = document.querySelectorAll('variant-radios input[type=\"radio\"][name=\"Size\"], input[type=\"radio\"][name=\"Size\"]');\n    for (var i = 0; i < radios.length; i++) {\n      if (aliases[normalizeSize(radios[i].value)]) {\n        radios[i].click();\n        radios[i].dispatchEvent(new Event('change', { bubbles: true }));\n        radios[i].dispatchEvent(new Event('input', { bubbles: true }));\n        return true;\n      }\n    }\n    var options = document.querySelectorAll('variant-selects select[name=\"options[Size]\"], select[name=\"options[Size]\"], select[name=\"Size\"]');\n    for (var j = 0; j < options.length; j++) {\n      var sel = options[j];\n      for (var k = 0; k < sel.options.length; k++) {\n        if (aliases[normalizeSize(sel.options[k].value)] || aliases[normalizeSize(sel.options[k].text)]) {\n          sel.selectedIndex = k;\n          sel.dispatchEvent(new Event('change', { bubbles: true }));\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function variantAvailable(data, sizeLabel) {\n    var list = (data && data.variants) || [];\n    for (var i = 0; i < list.length; i++) {\n      if (sizesMatch(list[i].size, sizeLabel)) return !!list[i].available;\n    }\n    return null;\n  }\n\n  function getFocusable(dialog) {\n    return Array.prototype.slice.call(\n      dialog.querySelectorAll(\n        'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n      )\n    ).filter(function (el) {\n      return !el.hasAttribute('hidden') && el.offsetParent !== null;\n    });\n  }\n\n  function formatHeight(cm, unit) {\n    if (unit === 'ft') {\n      var x = cmToFtIn(cm);\n      return x.ft + '\\u2032' + x.inch + '\\u2033';\n    }\n    return Math.round(cm) + ' cm';\n  }\n\n  function formatWeight(kg, unit) {\n    if (unit === 'lb') return Math.round(kgToLb(kg)) + ' lb';\n    return Math.round(kg) + ' kg';\n  }\n\n  function convertPart(value, toIn) {\n    var number = Number(value);\n    if (!isFinite(number)) return String(value);\n    if (toIn) return (number / CM_PER_IN).toFixed(1);\n    if (Number.isInteger(number)) return String(number);\n    return String(parseFloat(number.toFixed(2)));\n  }\n\n  function formatValue(value, toIn) {\n    var parts = String(value).split(/\\s*[-\u2013\u2014]\\s*/);\n    if (parts.length === 2 && parts[0] !== '' && parts[1] !== '') {\n      return convertPart(parts[0], toIn) + '\u2013' + convertPart(parts[1], toIn);\n    }\n    return convertPart(String(value), toIn);\n  }\n\n  function setChartUnit(root, unit) {\n    root.querySelectorAll('[data-xape-unit]').forEach(function (button) {\n      var active = button.getAttribute('data-xape-unit') === unit;\n      button.classList.toggle('is-active', active);\n      button.setAttribute('aria-pressed', active ? 'true' : 'false');\n    });\n    root.querySelectorAll('[data-xape-cm]').forEach(function (cell) {\n      var cm = cell.getAttribute('data-xape-cm');\n      cell.textContent = unit === 'in' ? formatValue(cm, true) : formatValue(cm, false);\n    });\n  }\n\n  function bindUi(root) {\n    if (root.getAttribute('data-xape-finder-bound') === 'true') return;\n    root.setAttribute('data-xape-finder-bound', 'true');\n\n    var dataEl = root.querySelector('[data-xape-finder-data]');\n    var data = {};\n    if (dataEl) {\n      try { data = JSON.parse(dataEl.textContent); } catch (e) { data = {}; }\n    }\n    var chart = parseChartFromData(data);\n    var state = defaultState();\n    var view = 'finder';\n    var dialog = root.querySelector('[data-xape-size-chart-dialog]');\n    var titleEl = root.querySelector('[data-xape-title]');\n    var unitsEl = root.querySelector('[data-xape-units]');\n    var finderEl = root.querySelector('[data-xape-finder]');\n    var chartView = root.querySelector('[data-xape-chart-view]');\n    var footerEl = root.querySelector('[data-xape-footer]');\n\n    function currentRecommend() {\n      var result = recommend(chart, {\n        sex: state.sex,\n        heightCm: state.heightCm,\n        weightKg: state.weightKg,\n        shape: state.shape,\n        fit: state.fit\n      });\n      if (result && result.ok) {\n        result.selectSize = resolveSelectSize(result.size, data.variants);\n        result.availabilityNote = availabilityNote(result.size, result.selectSize);\n      }\n      return result;\n    }\n\n    function persist() { saveState(state); }\n\n    function setView(next, step) {\n      view = next;\n      if (step) state.step = step;\n      if (titleEl) {\n        var rawTitle = view === 'chart'\n          ? (data.strings && data.strings.chartTitle) || 'Sizing Chart & Fit'\n          : (data.strings && data.strings.finderTitle) || 'Find your perfect size';\n        titleEl.textContent = String(rawTitle).replace(/&amp;/gi, '&').replace(/&lt;/gi, '<').replace(/&gt;/gi, '>');\n      }\n      if (unitsEl) unitsEl.hidden = view !== 'chart';\n      if (finderEl) finderEl.hidden = view !== 'finder';\n      if (chartView) chartView.hidden = view !== 'chart';\n      render();\n    }\n\n    function openDialog(nextView) {\n      root._xapeLastFocus = document.activeElement;\n      if (typeof dialog.showModal === 'function') {\n        if (!dialog.open) dialog.showModal();\n      } else {\n        dialog.setAttribute('open', '');\n      }\n      root.querySelectorAll('[data-xape-size-chart-open]').forEach(function (btn) {\n        btn.setAttribute('aria-expanded', 'true');\n      });\n      document.body.style.overflow = 'hidden';\n      setView(nextView || 'finder', nextView === 'chart' ? state.step : state.step || 1);\n      window.setTimeout(function () {\n        var focus = dialog.querySelector('[data-xape-size-chart-close]');\n        if (focus) focus.focus();\n      }, 10);\n    }\n\n    function closeDialog() {\n      if (typeof dialog.close === 'function') {\n        if (dialog.open) dialog.close();\n      } else {\n        dialog.removeAttribute('open');\n      }\n      root.querySelectorAll('[data-xape-size-chart-open]').forEach(function (btn) {\n        btn.setAttribute('aria-expanded', 'false');\n      });\n      document.body.style.overflow = '';\n      if (root._xapeLastFocus && typeof root._xapeLastFocus.focus === 'function') {\n        root._xapeLastFocus.focus();\n      }\n    }\n\n    function silhouetteSvg() {\n      var b = estimateBody(state.sex, state.heightCm, state.weightKg);\n      var weightFactor = clamp((b.bmi - 18) / 16, 0.15, 1);\n      var scaleY = clamp((state.heightCm - 150) / 50, 0.85, 1.15);\n      var bodyW = 36 + weightFactor * 28;\n      var hipW = state.sex === 'female' ? bodyW + 6 : bodyW - 2;\n      var shoulder = state.sex === 'female' ? bodyW - 4 : bodyW + 4;\n      var cx = 60;\n      return (\n        '<svg class=\"xape-finder__silhouette\" viewBox=\"0 0 120 200\" width=\"90\" height=\"150\" aria-hidden=\"true\" focusable=\"false\">' +\n        '<circle cx=\"' + cx + '\" cy=\"' + (28 / scaleY) + '\" r=\"14\" fill=\"currentColor\"/>' +\n        '<path fill=\"currentColor\" d=\"' +\n        'M' + (cx - shoulder / 2) + ' 48 ' +\n        'L' + (cx + shoulder / 2) + ' 48 ' +\n        'L' + (cx + bodyW / 2) + ' 95 ' +\n        'L' + (cx + hipW / 2) + ' 118 ' +\n        'L' + (cx + 10) + ' 188 ' +\n        'L' + (cx - 10) + ' 188 ' +\n        'L' + (cx - hipW / 2) + ' 118 ' +\n        'L' + (cx - bodyW / 2) + ' 95 Z\"/>' +\n        '</svg>'\n      );\n    }\n\n    function optionGroup(name, legend, options, current) {\n      var html = '<div class=\"xape-finder__choices\" role=\"radiogroup\" aria-label=\"' + legend + '\">';\n      html += '<p class=\"xape-finder__legend\">' + legend + '</p><div class=\"xape-finder__choice-row\">';\n      options.forEach(function (opt) {\n        var pressed = current === opt.value;\n        html += '<button type=\"button\" class=\"xape-finder__choice' + (pressed ? ' is-active' : '') + '\" role=\"radio\" aria-checked=\"' + pressed + '\" data-xape-field=\"' + name + '\" data-xape-value=\"' + opt.value + '\">';\n        if (opt.icon) html += '<span class=\"xape-finder__choice-icon\" aria-hidden=\"true\">' + opt.icon + '</span>';\n        html += '<span class=\"xape-finder__choice-label\">' + opt.label + '</span>';\n        if (opt.hint) html += '<span class=\"xape-finder__choice-hint\">' + opt.hint + '</span>';\n        html += '</button>';\n      });\n      html += '</div></div>';\n      return html;\n    }\n\n    function renderStep1(result) {\n      var live = result && (result.selectSize || result.size) ? (result.selectSize || result.size) : '\u2014';\n      var liveNote = result && result.confidence ? result.confidence.label : '';\n      return (\n        '<div class=\"xape-finder__step\" data-step=\"1\">' +\n        '<p class=\"xape-finder__kicker\">01 / 03</p>' +\n        '<h3 class=\"xape-finder__heading\">Let\\'s find your fit</h3>' +\n        '<p class=\"xape-finder__sub\">Two measurements are all it takes.</p>' +\n        optionGroup('sex', 'Sizing', [\n          { value: 'female', label: 'Female' },\n          { value: 'male', label: 'Male' }\n        ], state.sex) +\n        '<div class=\"xape-finder__measures\">' +\n        silhouetteSvg() +\n        '<div class=\"xape-finder__sliders\">' +\n        '<div class=\"xape-finder__slider-block\">' +\n        '<div class=\"xape-finder__slider-head\"><span>Height</span>' +\n        '<div class=\"xape-size-chart__units xape-finder__mini-units\" role=\"group\" aria-label=\"Height units\">' +\n        '<button type=\"button\" class=\"xape-size-chart__unit' + (state.heightUnit === 'cm' ? ' is-active' : '') + '\" data-xape-hunit=\"cm\" aria-pressed=\"' + (state.heightUnit === 'cm') + '\">CM</button>' +\n        '<button type=\"button\" class=\"xape-size-chart__unit' + (state.heightUnit === 'ft' ? ' is-active' : '') + '\" data-xape-hunit=\"ft\" aria-pressed=\"' + (state.heightUnit === 'ft') + '\">FT/IN</button>' +\n        '</div></div>' +\n        '<div class=\"xape-finder__value\">' + formatHeight(state.heightCm, state.heightUnit) + '</div>' +\n        '<div class=\"xape-finder__range-row\">' +\n        '<button type=\"button\" class=\"xape-finder__stepper\" data-xape-adj=\"height\" data-xape-dir=\"-1\" aria-label=\"Decrease height\">\u2212</button>' +\n        '<input type=\"range\" min=\"140\" max=\"210\" step=\"1\" value=\"' + Math.round(state.heightCm) + '\" data-xape-range=\"height\" aria-label=\"Height in centimetres\">' +\n        '<button type=\"button\" class=\"xape-finder__stepper\" data-xape-adj=\"height\" data-xape-dir=\"1\" aria-label=\"Increase height\">+</button>' +\n        '</div></div>' +\n        '<div class=\"xape-finder__slider-block\">' +\n        '<div class=\"xape-finder__slider-head\"><span>Weight</span>' +\n        '<div class=\"xape-size-chart__units xape-finder__mini-units\" role=\"group\" aria-label=\"Weight units\">' +\n        '<button type=\"button\" class=\"xape-size-chart__unit' + (state.weightUnit === 'kg' ? ' is-active' : '') + '\" data-xape-wunit=\"kg\" aria-pressed=\"' + (state.weightUnit === 'kg') + '\">KG</button>' +\n        '<button type=\"button\" class=\"xape-size-chart__unit' + (state.weightUnit === 'lb' ? ' is-active' : '') + '\" data-xape-wunit=\"lb\" aria-pressed=\"' + (state.weightUnit === 'lb') + '\">LBS</button>' +\n        '</div></div>' +\n        '<div class=\"xape-finder__value\">' + formatWeight(state.weightKg, state.weightUnit) + '</div>' +\n        '<div class=\"xape-finder__range-row\">' +\n        '<button type=\"button\" class=\"xape-finder__stepper\" data-xape-adj=\"weight\" data-xape-dir=\"-1\" aria-label=\"Decrease weight\">\u2212</button>' +\n        '<input type=\"range\" min=\"40\" max=\"180\" step=\"1\" value=\"' + Math.round(state.weightKg) + '\" data-xape-range=\"weight\" aria-label=\"Weight in kilograms\">' +\n        '<button type=\"button\" class=\"xape-finder__stepper\" data-xape-adj=\"weight\" data-xape-dir=\"1\" aria-label=\"Increase weight\">+</button>' +\n        '</div></div>' +\n        '</div></div>' +\n        '<div class=\"xape-finder__live\">' +\n        '<div><p class=\"xape-finder__legend\">Live estimate</p><p class=\"xape-finder__sub\">Refined in the next steps</p></div>' +\n        '<div class=\"xape-finder__live-size\">' + live + '</div>' +\n        '</div>' +\n        '<p class=\"xape-finder__privacy\">Saved privately on this device, so every piece can show your size.</p>' +\n        '</div>'\n      );\n    }\n\n    function iconChest(kind) {\n      if (kind === 'slimmer') return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M18 10h12c2 8 2 16 0 28H18c-2-12-2-20 0-28z\"/></svg>';\n      if (kind === 'broader') return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M14 10h20c4 8 4 16 0 28H14c-4-12-4-20 0-28z\"/></svg>';\n      return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M16 10h16c3 8 3 16 0 28H16c-3-12-3-20 0-28z\"/></svg>';\n    }\n    function iconStomach(kind) {\n      if (kind === 'flatter') return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M20 8v32M28 8v32\"/></svg>';\n      if (kind === 'rounder') return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M18 8c8 8 8 24 0 32M30 8c8 8 8 24 0 32\"/></svg>';\n      return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M19 8c4 8 4 24 0 32M29 8c4 8 4 24 0 32\"/></svg>';\n    }\n    function iconHips(kind) {\n      if (kind === 'narrower') return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M18 8c0 10 2 16 4 32M30 8c0 10-2 16-4 32\"/></svg>';\n      if (kind === 'fuller') return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M16 8c-2 12 2 20 6 32M32 8c2 12-2 20-6 32\"/></svg>';\n      return '<svg viewBox=\"0 0 48 48\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" d=\"M17 8c-1 12 2 20 5 32M31 8c1 12-2 20-5 32\"/></svg>';\n    }\n\n    function renderStep2() {\n      return (\n        '<div class=\"xape-finder__step\" data-step=\"2\">' +\n        '<p class=\"xape-finder__kicker\">02 / 03</p>' +\n        '<h3 class=\"xape-finder__heading\">Your shape</h3>' +\n        '<p class=\"xape-finder__sub\">Clothes fit bodies, not numbers. Not sure? Leave it at average.</p>' +\n        optionGroup('shape.chest', 'Chest', [\n          { value: 'slimmer', label: 'Slimmer', icon: iconChest('slimmer') },\n          { value: 'average', label: 'Average', icon: iconChest('average') },\n          { value: 'broader', label: 'Broader', icon: iconChest('broader') }\n        ], state.shape.chest) +\n        optionGroup('shape.stomach', 'Stomach', [\n          { value: 'flatter', label: 'Flatter', icon: iconStomach('flatter') },\n          { value: 'average', label: 'Average', icon: iconStomach('average') },\n          { value: 'rounder', label: 'Rounder', icon: iconStomach('rounder') }\n        ], state.shape.stomach) +\n        optionGroup('shape.hips', 'Hips', [\n          { value: 'narrower', label: 'Narrower', icon: iconHips('narrower') },\n          { value: 'average', label: 'Average', icon: iconHips('average') },\n          { value: 'fuller', label: 'Fuller', icon: iconHips('fuller') }\n        ], state.shape.hips) +\n        '</div>'\n      );\n    }\n\n    function renderStep3() {\n      return (\n        '<div class=\"xape-finder__step\" data-step=\"3\">' +\n        '<p class=\"xape-finder__kicker\">03 / 03</p>' +\n        '<h3 class=\"xape-finder__heading\">How do you like it to fit?</h3>' +\n        '<p class=\"xape-finder__sub\">We will size around the way you wear it.</p>' +\n        '<div class=\"xape-finder__fit-list\" role=\"radiogroup\" aria-label=\"Preferred fit\">' +\n        [\n          { value: 'slim', label: 'Slim', hint: 'Follows the body. Sharp and tailored.' },\n          { value: 'regular', label: 'Regular', hint: 'The silhouette we designed it for.' },\n          { value: 'relaxed', label: 'Relaxed', hint: 'Room to move and layer underneath.' }\n        ].map(function (opt) {\n          var on = state.fit === opt.value;\n          return '<button type=\"button\" class=\"xape-finder__fit' + (on ? ' is-active' : '') + '\" role=\"radio\" aria-checked=\"' + on + '\" data-xape-field=\"fit\" data-xape-value=\"' + opt.value + '\">' +\n            '<span class=\"xape-finder__fit-label\">' + opt.label + '</span>' +\n            '<span class=\"xape-finder__choice-hint\">' + opt.hint + '</span></button>';\n        }).join('') +\n        '</div></div>'\n      );\n    }\n\n    function renderResult(result) {\n      var shown = state.previewSize || result.size;\n      var entry = (result.all || []).find(function (s) { return sizesMatch(s.label, shown); }) || { label: shown, breakdown: result.breakdown };\n      var sizes = result.sizes || [];\n      var youIndex = sizes.findIndex(function (s) { return sizesMatch(s, result.size); });\n      var scale = '<div class=\"xape-finder__scale\" role=\"listbox\" aria-label=\"Sizes\">';\n      sizes.forEach(function (label, i) {\n        var isYou = sizesMatch(label, result.size);\n        var isOn = sizesMatch(label, shown);\n        scale += '<button type=\"button\" class=\"xape-finder__scale-size' + (isOn ? ' is-active' : '') + (isYou ? ' is-you' : '') + '\" role=\"option\" aria-selected=\"' + isOn + '\" data-xape-preview-size=\"' + label + '\">';\n        if (isYou) scale += '<span class=\"xape-finder__you\">You</span>';\n        scale += '<span>' + label + '</span></button>';\n      });\n      scale += '</div>';\n      var rows = (entry.breakdown || []).map(function (b) {\n        var dots = ['snug', 'ideal', 'roomy'].map(function (k) {\n          return '<span class=\"xape-finder__dot' + (b.status === k ? ' is-on' : '') + '\"></span>';\n        }).join('');\n        return '<div class=\"xape-finder__fitrow\"><span class=\"xape-finder__fitrow-name\">' + b.title + '</span>' +\n          '<div class=\"xape-finder__dots\" aria-hidden=\"true\"><span>Snug</span><span class=\"xape-finder__dot-track\">' + dots + '</span><span>Roomy</span></div>' +\n          '<span class=\"xape-finder__fitrow-status\">' + (b.status === 'ideal' ? 'Ideal' : b.status === 'snug' ? 'Snug' : 'Roomy') + '</span></div>';\n      }).join('');\n\n      return (\n        '<div class=\"xape-finder__step xape-finder__result\" data-step=\"result\">' +\n        '<p class=\"xape-finder__kicker\">Best match</p>' +\n        '<div class=\"xape-finder__badge\" aria-hidden=\"true\"><span>' + (result.selectSize || result.size) + '</span></div>' +\n        '<p class=\"xape-finder__confidence\">' + result.confidence.label + '</p>' +\n        '<p class=\"xape-finder__sub\">A recommendation from your measurements and this piece\\'s size chart. Tap a size to see how it would fit.</p>' +\n        scale + rows +\n        (result.availabilityNote ? '<p class=\"xape-finder__fit-note\">' + result.availabilityNote + '</p>' : '') +\n        (result.notes ? '<p class=\"xape-finder__fit-note\">' + result.notes + '</p>' : '') +\n        '<p class=\"xape-finder__disclaimer\">This is a general recommendation. Individual fit may vary by style and preference.</p>' +\n        '</div>'\n      );\n    }\n\n    function renderProductChip() {\n      if (!data.title) return '';\n      var img = data.image ? '<img src=\"' + data.image + '\" alt=\"\" width=\"48\" height=\"48\">' : '';\n      return '<div class=\"xape-finder__product\">' + img + '<div><p class=\"xape-finder__product-title\">' + data.title + '</p></div></div>';\n    }\n\n    function renderFooter(result) {\n      if (view === 'chart') {\n        return '<button type=\"button\" class=\"xape-finder__text-btn\" data-xape-goto=\"finder\">Back to size finder</button>';\n      }\n      var html = '';\n      if (state.step === 1) {\n        html += '<button type=\"button\" class=\"xape-finder__primary\" data-xape-goto=\"2\">Continue \u2192</button>';\n      } else if (state.step === 2) {\n        html += '<button type=\"button\" class=\"xape-finder__back\" data-xape-goto=\"1\" aria-label=\"Back\">\u2190</button>';\n        html += '<button type=\"button\" class=\"xape-finder__primary\" data-xape-goto=\"3\">Continue \u2192</button>';\n      } else if (state.step === 3) {\n        html += '<button type=\"button\" class=\"xape-finder__back\" data-xape-goto=\"2\" aria-label=\"Back\">\u2190</button>';\n        html += '<button type=\"button\" class=\"xape-finder__primary\" data-xape-goto=\"result\">Find my size \u2192</button>';\n      } else {\n        var requested = state.previewSize || (result && result.size);\n        var shown = resolveSelectSize(requested, data.variants) || requested;\n        var avail = variantAvailable(data, shown);\n        var label = 'Select ' + (shown || '');\n        if (avail === false) label += ' (sold out)';\n        html += '<button type=\"button\" class=\"xape-finder__back\" data-xape-goto=\"3\" aria-label=\"Back\">\u2190</button>';\n        html += '<button type=\"button\" class=\"xape-finder__primary\" data-xape-select-size=\"' + (shown || '') + '\">' + label + '</button>';\n      }\n      html += '<button type=\"button\" class=\"xape-finder__text-btn\" data-xape-goto=\"chart\">See full size chart</button>';\n      return html;\n    }\n\n    function render() {\n      if (view === 'chart') {\n        if (footerEl) footerEl.innerHTML = renderFooter();\n        return;\n      }\n      var result = currentRecommend();\n      if (state.step === 'result' && result.ok && !state.previewSize) state.previewSize = result.selectSize || result.size;\n      var body = renderProductChip();\n      if (state.step === 1) body += renderStep1(result);\n      else if (state.step === 2) body += renderStep2();\n      else if (state.step === 3) body += renderStep3();\n      else body += renderResult(result);\n      if (finderEl) finderEl.innerHTML = body;\n      if (footerEl) footerEl.innerHTML = renderFooter(result);\n    }\n\n    root.querySelectorAll('[data-xape-size-chart-open]').forEach(function (btn) {\n      btn.addEventListener('click', function () {\n        openDialog(btn.getAttribute('data-xape-open-view') || 'finder');\n      });\n    });\n    var closeBtn = root.querySelector('[data-xape-size-chart-close]');\n    if (closeBtn) closeBtn.addEventListener('click', closeDialog);\n    if (dialog) {\n      dialog.addEventListener('click', function (event) {\n        if (event.target === dialog) closeDialog();\n      });\n      dialog.addEventListener('cancel', function (event) {\n        event.preventDefault();\n        closeDialog();\n      });\n      dialog.addEventListener('keydown', function (event) {\n        if (event.key === 'Escape') {\n          event.preventDefault();\n          closeDialog();\n          return;\n        }\n        if (event.key !== 'Tab') return;\n        var focusable = getFocusable(dialog);\n        if (!focusable.length) { event.preventDefault(); return; }\n        var first = focusable[0];\n        var last = focusable[focusable.length - 1];\n        if (event.shiftKey && document.activeElement === first) {\n          event.preventDefault();\n          last.focus();\n        } else if (!event.shiftKey && document.activeElement === last) {\n          event.preventDefault();\n          first.focus();\n        }\n      });\n    }\n    root.querySelectorAll('[data-xape-unit]').forEach(function (button) {\n      button.addEventListener('click', function () {\n        setChartUnit(root, button.getAttribute('data-xape-unit'));\n      });\n    });\n\n    function onRootClick(event) {\n      var t = event.target.closest('[data-xape-field], [data-xape-hunit], [data-xape-wunit], [data-xape-adj], [data-xape-goto], [data-xape-preview-size], [data-xape-select-size]');\n      if (!t) return;\n      if (t.hasAttribute('data-xape-hunit')) {\n        state.heightUnit = t.getAttribute('data-xape-hunit');\n        persist(); render(); return;\n      }\n      if (t.hasAttribute('data-xape-wunit')) {\n        state.weightUnit = t.getAttribute('data-xape-wunit');\n        persist(); render(); return;\n      }\n      if (t.hasAttribute('data-xape-adj')) {\n        var field = t.getAttribute('data-xape-adj');\n        var dir = Number(t.getAttribute('data-xape-dir'));\n        if (field === 'height') {\n          var stepH = state.heightUnit === 'ft' ? CM_PER_IN : 1;\n          state.heightCm = clamp(state.heightCm + dir * stepH, 140, 210);\n        } else {\n          var stepW = state.weightUnit === 'lb' ? 0.453592 : 1;\n          state.weightKg = clamp(state.weightKg + dir * stepW, 40, 180);\n        }\n        persist(); render(); return;\n      }\n      if (t.hasAttribute('data-xape-field')) {\n        var name = t.getAttribute('data-xape-field');\n        var value = t.getAttribute('data-xape-value');\n        if (name.indexOf('shape.') === 0) state.shape[name.split('.')[1]] = value;\n        else state[name] = value;\n        persist(); render(); return;\n      }\n      if (t.hasAttribute('data-xape-goto')) {\n        var goto = t.getAttribute('data-xape-goto');\n        if (goto === 'chart') setView('chart');\n        else if (goto === 'finder') { state.step = state.step === 'result' ? 'result' : 1; setView('finder'); }\n        else if (goto === 'result') { state.step = 'result'; state.previewSize = null; persist(); render(); }\n        else { state.step = Number(goto); persist(); render(); }\n        return;\n      }\n      if (t.hasAttribute('data-xape-preview-size')) {\n        state.previewSize = t.getAttribute('data-xape-preview-size');\n        render();\n        return;\n      }\n      if (t.hasAttribute('data-xape-select-size')) {\n        var size = t.getAttribute('data-xape-select-size');\n        var ok = selectSizeOnPage(size);\n        closeDialog();\n        if (!ok) {\n          /* still close; PDP may not expose a size input on some templates */\n        }\n      }\n    }\n\n    function onInput(event) {\n      var t = event.target;\n      if (t && t.getAttribute('data-xape-range') === 'height') {\n        state.heightCm = clamp(Number(t.value), 140, 210);\n        persist();\n        // Update live bits without full rerender of the range (avoids losing drag)\n        var val = root.querySelector('.xape-finder__slider-block:first-child .xape-finder__value') ||\n          t.closest('.xape-finder__slider-block').querySelector('.xape-finder__value');\n        if (val) val.textContent = formatHeight(state.heightCm, state.heightUnit);\n        var sil = root.querySelector('.xape-finder__silhouette');\n        if (sil) {\n          var wrap = document.createElement('div');\n          wrap.innerHTML = silhouetteSvg();\n          sil.replaceWith(wrap.firstChild);\n        }\n        var rec = currentRecommend();\n        var live = root.querySelector('.xape-finder__live-size');\n        if (live && (rec.selectSize || rec.size)) live.textContent = rec.selectSize || rec.size;\n        return;\n      }\n      if (t && t.getAttribute('data-xape-range') === 'weight') {\n        state.weightKg = clamp(Number(t.value), 40, 180);\n        persist();\n        var valW = t.closest('.xape-finder__slider-block').querySelector('.xape-finder__value');\n        if (valW) valW.textContent = formatWeight(state.weightKg, state.weightUnit);\n        var silW = root.querySelector('.xape-finder__silhouette');\n        if (silW) {\n          var wrapW = document.createElement('div');\n          wrapW.innerHTML = silhouetteSvg();\n          silW.replaceWith(wrapW.firstChild);\n        }\n        var recW = currentRecommend();\n        var liveW = root.querySelector('.xape-finder__live-size');\n        if (liveW && (recW.selectSize || recW.size)) liveW.textContent = recW.selectSize || recW.size;\n      }\n    }\n\n    root.addEventListener('click', onRootClick);\n    root.addEventListener('input', onInput);\n  }\n\n  function initAll() {\n    if (typeof document === 'undefined') return;\n    document.querySelectorAll('[data-xape-size-chart]').forEach(bindUi);\n  }\n\n  if (typeof document !== 'undefined') {\n    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initAll);\n    else initAll();\n    document.addEventListener('shopify:section:load', initAll);\n  }\n\n  return {\n    estimateBody: estimateBody,\n    applyShape: applyShape,\n    recommend: recommend,\n    classifyColumns: classifyColumns,\n    parseMeas: parseMeas,\n    selectSizeOnPage: selectSizeOnPage,\n    offeredSizeLabels: offeredSizeLabels,\n    nearestOfferedSize: nearestOfferedSize,\n    resolveSelectSize: resolveSelectSize,\n    availabilityNote: availabilityNote,\n    sizesMatch: sizesMatch,\n    initAll: initAll,\n    STORAGE_KEY: STORAGE_KEY\n  };\n});\n"],
  "mappings": "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",
  "names": ["root", "i", "span", "status", "c"]
}
