{
  "version": 3,
  "sources": ["/cdn/shop/t/42/assets/trh-cushion-calc-v4.js?cb=20261030v4"],
  "sourcesContent": ["/* TRH 2026-10-30 visual consistency: one card / total / breakdown style for every calculator (drapery, outdoor, roman, cushion, pillow, bolster, add-on).\n   Only presentation; no pricing logic. Injected once, last in <head>, so theme/snippet label & list styles can't change the cards. */\n(function () {\n  if (window.__trhDc3Lock) return; window.__trhDc3Lock = 1;\n  var P = 'html body .trh-dc3-options ';\n  var css = [\n    '.trh-dc3-options{container-type:inline-size;text-align:left}',\n    P + '.trh-dc3-card,' + P + '.trh-dc3-card *{font-family:inherit!important;letter-spacing:normal!important;text-transform:none!important;font-style:normal!important}',\n    P + '.trh-dc3-card{font-size:12px!important;line-height:1.35!important;color:#333!important;font-weight:400!important;text-align:left!important;margin:0!important}',\n    P + '.trh-dc3-card__t{font-size:14px!important;font-weight:700!important;line-height:1.3!important;color:#252525!important;margin:0 0 2px!important}',\n    P + '.trh-dc3-card__s{font-size:11.5px!important;line-height:1.35!important;color:#777!important;margin:0 0 6px!important;font-weight:400!important}',\n    P + '.trh-dc3-card ul{list-style:none!important;margin:0 0 6px!important;padding:0!important}',\n    P + '.trh-dc3-card li{font-size:12px!important;line-height:1.4!important;color:#333!important;margin:0 0 2px!important;padding:0!important;font-weight:400!important;list-style:none!important}',\n    P + '.trh-dc3-card li::before,' + P + '.trh-dc3-card li::marker{content:none!important}',\n    P + '.trh-dc3-card li b{font-weight:700!important}',\n    P + '.trh-dc3-card__p{font-size:16px!important;font-weight:700!important;line-height:1.3!important;color:#28a745!important}',\n    P + '.trh-dc3-each{display:block!important;font-size:11px!important;font-weight:400!important;color:#777!important}',\n    P + '.trh-dc3-det,' + P + '.trh-dc3-det summary{font-size:11px!important;line-height:1.4!important;padding:0!important;border:0!important;background:none!important}',\n    P + '.trh-dc3-det{margin:4px 0 0!important}' ,\n    P + '.trh-dc3-det summary{margin:0!important;display:list-item!important}',\n    P + '.trh-dc3-det summary{color:#7C8C74!important}',\n    P + '.trh-dc3-badge{font-size:10px!important;line-height:1.4!important;font-weight:700!important;color:#333!important;background:#DDC762!important;border-radius:8px!important;padding:1px 7px!important;top:-9px!important;right:8px!important}',\n    P + '.trh-dc3-min{font-size:11px!important;color:#b45309!important}',\n    P + '.trh-dc3-head{font-size:13px!important;line-height:1.5!important;color:#555!important;font-weight:400!important;margin:4px 0 8px!important}',\n    'html body .trh-dc3-total{font-family:inherit!important;font-size:20px!important;font-weight:700!important;line-height:1.3!important;color:#28a745!important;margin:14px 0 8px!important;letter-spacing:normal!important;text-transform:none!important}',\n    'html body .trh-dc3-break{font-family:inherit!important;font-size:14px!important;line-height:1.7!important;color:#7C8C74!important;font-weight:400!important;text-align:left!important;border-top:1px solid #ddd!important;padding-top:8px!important}',\n    'html body .trh-dc3-break p{margin:0!important;font-size:14px!important;line-height:1.7!important}',\n    /* one layout: a column narrower than 440px (every calculator column on desktop, and every phone) gets the stacked row cards */\n    '@container (max-width:440px){',\n    '  ' + P + '.trh-dc3-grid{grid-template-columns:1fr!important;gap:10px!important}',\n    '  ' + P + '.trh-dc3-card{display:grid!important;grid-template-columns:1fr auto;column-gap:12px;padding:12px!important}',\n    '  ' + P + '.trh-dc3-card.is-sel{padding:11px!important}',\n    '  ' + P + '.trh-dc3-card__t,' + P + '.trh-dc3-card__s,' + P + '.trh-dc3-card ul{grid-column:1}',\n    '  ' + P + '.trh-dc3-card__p{grid-column:2;grid-row:1 / span 3;align-self:center;text-align:right!important;font-size:17px!important}',\n    '  ' + P + '.trh-dc3-det{grid-column:1 / -1}',\n    '}',\n    /* add-on: same price colour / weight as the calculator cards */\n    'html body .trh-pa__sum b,html body .trh-pa__ok b{color:#28a745!important;font-weight:700!important}'\n  ].join('\\n');\n  function inject() {\n    if (document.getElementById('trh-dc3-lock')) return;\n    var s = document.createElement('style'); s.id = 'trh-dc3-lock'; s.textContent = css;\n    (document.head || document.documentElement).appendChild(s);\n  }\n  inject();\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', inject);\n  window.addEventListener('load', function () { var s = document.getElementById('trh-dc3-lock'); if (s && s !== document.head.lastElementChild) document.head.appendChild(s); });\n})();\n/* TRH 2026-10-30 shared pattern-repeat box (identical block in every TRH calculator file).\n * Store fabrics: prefilled from the fabric's metafields / description, visible and editable by the customer.\n * Edits write straight into that fabric's details object, so every calculator's existing repeat math uses them. */\n(function () {\n  if (window.TRHRepeatBox) return;\n  var CSS = '.trh-rpt{display:none;margin:6px 0 6px;padding:8px 10px;border:1px solid #e0dbd1;border-radius:8px;background:#faf8f4;font-weight:normal;text-align:left}' +\n    '.trh-rpt__row{display:flex;flex-wrap:wrap;gap:8px}' +\n    '.trh-rpt label{display:flex;flex-direction:column;gap:2px;font-size:12px;color:#555;flex:1 1 110px;margin:0;font-weight:normal}' +\n    '.trh-rpt input,.trh-rpt select{font:inherit;font-size:13px;padding:5px 7px;border:1px solid #cfc9bf;border-radius:5px;background:#fff;width:100%;box-sizing:border-box;margin:0;height:auto}' +\n    '.trh-rpt__t{font-size:12.5px;color:#252525;margin:0 0 6px;font-weight:600}.trh-rpt__h{font-size:11.5px;color:#777;margin:6px 0 0;line-height:1.4}';\n  function num(v) { var n = parseFloat(v); return n > 0 ? Math.round(n * 1000) / 1000 : 0; }\n  function selOf(m) { return m.match === 'drop' ? (m.drop === 0.25 ? 'quarter-drop' : 'half-drop') : (m.match === 'random' ? 'random' : 'straight'); }\n  function applySel(m, s) {\n    if (s === 'half-drop') { m.match = 'drop'; m.drop = 0.5; } else if (s === 'quarter-drop') { m.match = 'drop'; m.drop = 0.25; }\n    else if (s === 'random') { m.match = 'random'; m.drop = 0; } else { m.match = 'straight'; m.drop = 0; }\n  }\n  function toIn(n, unit) { n = parseFloat(n); if (!(n > 0)) return 0; if (/cm/i.test(unit || '')) n = n / 2.54; return Math.round(n * 1000) / 1000; }\n  /* repeat info written in a product description, e.g. \"Vertical Repeat: 46.25 in\", \"Repeat: 25.25\\\" V x 13.5\\\" H\", \"Half Drop\" */\n  function parseText(t) {\n    if (!t) return null;\n    t = String(t).replace(/<[^>]*>/g, ' ').replace(/&quot;|\\u201d|\\u2033/g, '\"').replace(/\\s+/g, ' ');\n    var N = '(\\\\d+(?:\\\\.\\\\d+)?)\\\\s*(cm|in\\\\.?|inches|\")?';\n    var r = { vr: 0, hr: 0, match: null, drop: 0 };\n    var vh = t.match(new RegExp('repeat\\\\s*[:\\\\-]?\\\\s*' + N + '\\\\s*v(?:ert(?:ical)?)?\\\\.?\\\\s*(?:x|by|,)\\\\s*' + N + '\\\\s*h', 'i'));\n    if (vh) { r.vr = toIn(vh[1], vh[2]); r.hr = toIn(vh[3], vh[4]); }\n    var v = t.match(new RegExp('(?:vertical|vert\\\\.?|\\\\bv\\\\.)\\\\s*repeat\\\\s*[:\\\\-]?\\\\s*' + N, 'i'));\n    var h = t.match(new RegExp('(?:horizontal|horiz\\\\.?|\\\\bh\\\\.)\\\\s*repeat\\\\s*[:\\\\-]?\\\\s*' + N, 'i'));\n    if (!r.vr && v) r.vr = toIn(v[1], v[2]);\n    if (!r.hr && h) r.hr = toIn(h[1], h[2]);\n    if (!r.vr) { var g = t.replace(/(?:horizontal|horiz\\.?|\\bh\\.)\\s*repeat/ig, '').match(new RegExp('\\\\brepeat\\\\s*[:\\\\-]?\\\\s*' + N, 'i')); if (g) r.vr = toIn(g[1], g[2]); }\n    if (/half[\\s-]*drop/i.test(t)) { r.match = 'drop'; r.drop = 0.5; }\n    else if (/quarter[\\s-]*drop/i.test(t)) { r.match = 'drop'; r.drop = 0.25; }\n    else if (/straight\\s*(?:match|across)/i.test(t)) r.match = 'straight';\n    else if (/random\\s*match|free\\s*match/i.test(t)) r.match = 'random';\n    return (r.vr || r.hr || r.match) ? r : null;\n  }\n  function css() { if (document.getElementById('trhRptCss')) return; var s = document.createElement('style'); s.id = 'trhRptCss'; s.textContent = CSS; document.head.appendChild(s); }\n  /* show the box for `meta` (a store fabric's details) after `anchor`; onChange() re-runs the calculator */\n  function attach(id, anchor, meta, onChange) {\n    if (!anchor || !anchor.parentNode) return;\n    css();\n    var box = document.getElementById(id);\n    if (!box) {\n      box = document.createElement('div'); box.id = id; box.className = 'trh-rpt';\n      box.innerHTML = '<p class=\"trh-rpt__t\">Pattern repeat</p><div class=\"trh-rpt__row\">' +\n        '<label>Vertical repeat (inches)<input type=\"number\" min=\"0\" step=\"any\" inputmode=\"decimal\" data-rpt=\"vr\" placeholder=\"0 = plain\"></label>' +\n        '<label>Horizontal repeat (inches)<input type=\"number\" min=\"0\" step=\"any\" inputmode=\"decimal\" data-rpt=\"hr\" placeholder=\"0 = plain\"></label>' +\n        '<label>Pattern match<select data-rpt=\"m\"><option value=\"straight\">Straight match</option><option value=\"half-drop\">Half-drop match</option><option value=\"random\">Random / plain</option></select></label>' +\n        '</div><p class=\"trh-pm-help\" style=\"display:block;font-size:11.5px;color:#777;line-height:1.4;font-weight:normal;margin:4px 0 0\">Not sure? Check your fabric\\u2019s label or listing. Motifs in level rows across the fabric = Straight. Motifs staggered diagonally = Half-drop (uses a little more fabric). Solids, linens and textures = Random.</p><p class=\"trh-rpt__h\"></p>';\n      anchor.parentNode.insertBefore(box, anchor.nextSibling);\n      var upd = function () {\n        var m = box._meta; if (!m) return;\n        m.vr = num(box.querySelector('[data-rpt=vr]').value); m.hr = num(box.querySelector('[data-rpt=hr]').value);\n        applySel(m, box.querySelector('[data-rpt=m]').value); m.edited = true;\n        if (box._cb) box._cb();\n      };\n      box.addEventListener('input', upd); box.addEventListener('change', upd);\n    }\n    box._cb = onChange;\n    if (!meta) { box._meta = null; box.style.display = 'none'; return; }\n    if (box._meta !== meta) {\n      box._meta = meta;\n      if (!meta.auto) meta.auto = { vr: meta.vr || 0, hr: meta.hr || 0 };\n      box.querySelector('[data-rpt=vr]').value = meta.vr > 0 ? meta.vr : '';\n      box.querySelector('[data-rpt=hr]').value = meta.hr > 0 ? meta.hr : '';\n      var sel = box.querySelector('[data-rpt=m]'), sv = selOf(meta);\n      if (sv === 'quarter-drop' && !sel.querySelector('option[value=\"quarter-drop\"]')) { var o = document.createElement('option'); o.value = 'quarter-drop'; o.textContent = 'Quarter-drop match'; sel.appendChild(o); }\n      sel.value = sv;\n      box.querySelector('.trh-rpt__h').textContent = (meta.auto.vr > 0 || meta.auto.hr > 0)\n        ? 'Filled in from this fabric\\u2019s details. Change it if your fabric label or sample shows a different repeat; we add the yardage needed to match and center the pattern.'\n        : 'No repeat on file for this fabric. If it has a pattern, enter the repeat from the fabric label or sample (leave blank for plain fabric) and we add the yardage needed to match and center it.';\n    }\n    box.style.display = 'block';\n  }\n  function hide(id) { var b = document.getElementById(id); if (b) b.style.display = 'none'; }\n  window.TRHRepeatBox = { attach: attach, hide: hide, parseText: parseText };\n})();\n\n/* ===== TRH made-to-order calculator kit v4 (2026-10-30) =====================\n * Shared by the Roman shade, cushion and pillow calculators so they look and\n * behave like the drapery calculator v3: live pricing, option cards, sticky\n * mobile bar, \"How many like this?\", exact cents (screen = cart), locked\n * made-to-order cart lines.  Exposes window.TRHCalcKit (idempotent).\n * ========================================================================== */\n(function () {\n  'use strict';\n  if (window.TRHCalcKit) return;\n\n  function FM() {\n    return window.TRHFabricMin || {\n      qty: function (y) { return Math.max(Math.ceil(y - 1e-9), 1); },\n      info: function () { return { min: 1, unit: 'yard' }; },\n      toUnits: function (y) { return Math.round(y * 1000) / 1000; },\n      label: function (n) { return n + (n === 1 ? ' yard' : ' yards'); },\n      abbr: function () { return 'yd'; },\n      per: function () { return '/yd'; }\n    };\n  }\n  function $(id) { return document.getElementById(id); }\n  function val(id) { var e = $(id); return e ? e.value : ''; }\n  function esc(s) { var d = document.createElement('div'); d.textContent = s == null ? '' : String(s); return d.innerHTML; }\n  function sanitize(str) { return str ? String(str).replace(/[\\r\\n\\t]+/g, ' ').replace(/\"/g, \"'\").trim().slice(0, 500) : ''; }\n  function cents(n) { return Math.round(n * 100); }\n  function money(c) { return '$' + (c / 100).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }\n  function r2(n) { return Math.round(n * 100) / 100; }\n  function fmtIn(n) { return (Math.round(n * 100) / 100) + '\"'; }\n  function ceil(n) { return Math.ceil(n - 1e-9); }\n  /* round a cut up to whole repeats (0 / missing repeat = no change) */\n  function toRepeat(len, rep) { return rep > 0 ? r2(Math.ceil(len / rep - 1e-9) * rep) : len; }\n\n  function parseInches(s, wantVertical) {\n    if (s == null) return null;\n    s = String(s).trim();\n    if (!s || /^(none|random|n\\/a|-)$/i.test(s)) return null;\n    if (wantVertical) { var vm = s.match(/([\\d.\\s\\/\\u00bc\\u00bd\\u00be]+)\\s*(?:in|inches|\")?\\s*V\\b/i); if (vm) s = vm[1]; }\n    var map = { '\\u00bc': 0.25, '\\u00bd': 0.5, '\\u00be': 0.75 }, n = null, mm;\n    if ((mm = s.match(/^\\s*(\\d+)\\s+(\\d+)\\s*\\/\\s*(\\d+)/))) n = parseInt(mm[1], 10) + parseInt(mm[2], 10) / parseInt(mm[3], 10);\n    else if ((mm = s.match(/^\\s*(\\d+)\\s*\\/\\s*(\\d+)/))) n = parseInt(mm[1], 10) / parseInt(mm[2], 10);\n    else if ((mm = s.match(/^\\s*(\\d*\\.?\\d+)?\\s*([\\u00bc\\u00bd\\u00be])?/)) && (mm[1] || mm[2])) n = (mm[1] ? parseFloat(mm[1]) : 0) + (mm[2] ? map[mm[2]] : 0);\n    if (n == null || !(n > 0)) return null;\n    var m = s.slice(mm[0].length).match(/^\\s*(cm|mm|in|inch|inches|\")?/i) || [];\n    var unit = (m[1] || '').toLowerCase();\n    if (unit === 'cm') n = n / 2.54;\n    if (unit === 'mm') n = n / 25.4;\n    return Math.round(n * 1000) / 1000;\n  }\n  function parseMatch(pm, railroadedRaw) {\n    var t = String(pm || '').toLowerCase();\n    var res = { match: 'straight', drop: 0, railroaded: false };\n    if (/railroad/.test(t)) res.railroaded = true;\n    if (/half|offset|stagger/.test(t)) { res.match = 'drop'; res.drop = 0.5; }\n    else if (/quarter/.test(t)) { res.match = 'drop'; res.drop = 0.25; }\n    else if (/random|free|no side/.test(t)) res.match = 'random';\n    if (/^\\s*(yes|true|y)\\s*$/i.test(String(railroadedRaw || ''))) res.railroaded = true;\n    return res;\n  }\n  function checkWidth(w) {\n    if (w == null || !(w > 0)) return { width: 54, note: 'Fabric width not on file; we used 54\" and will confirm before cutting.' };\n    if (w < 20 || w > 130) return { width: 54, note: 'The listed fabric width (' + r2(w) + '\") looks incorrect; we used 54\" and will confirm before cutting.' };\n    return { width: w, note: '' };\n  }\n  function trimMinYards(t) {\n    if (!t) return 1;\n    var n = 0;\n    (t.tags || []).forEach(function (x) { x = String(x).toLowerCase(); if (x.slice(0, 4) === 'min-') { var v = parseInt(x.slice(4), 10); if (v > n) n = v; } });\n    if (t.vendor === 'The ReBorn House' || /^TRH\\d/i.test(String(t.title || ''))) return Math.max(5, n);\n    return n > 1 ? n : 1;\n  }\n\n  /* Fabric details (width / repeat / match / railroaded) from the fabric's custom.* metafields.\n     cb(meta) is called once; a newer call cancels an older one (per key). */\n  var seqs = {};\n  function fetchFabricMeta(cfg, fabric, cb, key) {\n    key = key || 'fabric';\n    var seq = (seqs[key] = (seqs[key] || 0) + 1);\n    if (!fabric || !fabric.id || !cfg.storeDomain || !cfg.storefrontToken) { cb(null); return; }\n    var f = function (k) { return k + ': metafield(namespace: \"custom\", key: \"' + k + '\") { value }'; };\n    var q = 'query($id: ID!) { node(id: $id) { ... on ProductVariant { product { ' +\n      ['width', 'vertical_repeat', 'horizontal_repeat', 'repeat', 'pattern_match', 'railroaded'].map(f).join(' ') + ' description } } } }';\n    fetch('https://' + cfg.storeDomain + '/api/' + (cfg.apiVersion || '2024-01') + '/graphql.json', {\n      method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Storefront-Access-Token': cfg.storefrontToken },\n      body: JSON.stringify({ query: q, variables: { id: 'gid://shopify/ProductVariant/' + String(fabric.id).split('/').pop() } })\n    }).then(function (r) { return r.json(); }).then(function (d) {\n      if (seq !== seqs[key]) return;\n      var p = d && d.data && d.data.node && d.data.node.product;\n      var g = function (k) { return p && p[k] ? p[k].value : null; };\n      var vr = parseInches(g('vertical_repeat'), false); if (vr == null) vr = parseInches(g('repeat'), true);\n      var m = parseMatch(g('pattern_match'), g('railroaded'));\n      var hr0 = parseInches(g('horizontal_repeat'), false) || 0, fromDesc = false;   /* TRH 2026-10-30: description fallback */\n      var dsc = window.TRHRepeatBox && p && p.description ? window.TRHRepeatBox.parseText(p.description) : null;\n      if (dsc) { if (vr == null && dsc.vr) { vr = dsc.vr; fromDesc = true; } if (!hr0 && dsc.hr) { hr0 = dsc.hr; fromDesc = true; } if (!g('pattern_match') && dsc.match) { m.match = dsc.match; m.drop = dsc.drop; } }\n      var w = parseInches(g('width'), false);\n      var chk = checkWidth(w != null ? w : (fabric.fabricWidth || null));\n      cb({ width: chk.width, widthNote: chk.note, vr: vr || 0, hr: hr0, fromDesc: fromDesc,\n           match: m.match, drop: m.drop, railroaded: m.railroaded,\n           raw: { width: g('width'), vertical_repeat: g('vertical_repeat'), repeat: g('repeat'), pattern_match: g('pattern_match'), railroaded: g('railroaded') } });\n    }).catch(function () {\n      if (seq !== seqs[key]) return;\n      var chk = checkWidth(fabric.fabricWidth || null);\n      cb({ width: chk.width, widthNote: chk.note, vr: 0, hr: 0, match: 'straight', drop: 0, railroaded: false, raw: { error: true } });\n    });\n  }\n  function repeatText(m, src) {\n    if (!m) return '';\n    var parts = [];\n    if (m.vr > 0 && m.match !== 'random') parts.push('Pattern repeat used: <strong>' + fmtIn(m.vr) + ' vertical' + (m.hr > 0 ? ' x ' + fmtIn(m.hr) + ' horizontal' : '') + '</strong>, ' + (m.match === 'drop' ? 'half-drop match' : 'straight match') + ' (from ' + esc(src || 'fabric details') + '). Each piece is cut to whole repeats so the pattern can be centered and matched.');\n    else if (m.vr > 0) parts.push('Pattern: random / free match, no repeat adjustment needed.');\n    else parts.push('No pattern repeat on file (plain or small-scale), so no repeat allowance is added.');\n    if (m.railroaded) parts.push('This fabric is railroaded (pattern runs across the roll).');\n    if (m.widthNote) parts.push('<span style=\"color:#b45309\">' + esc(m.widthNote) + '</span>');\n    return parts.join(' ');\n  }\n\n  /* ---------------------------------------------------------------- look */\n  var CSS = [\n    '.trh-dc3-head{font-size:13px;color:#555;margin:4px 0 8px;font-weight:normal}',\n    '.trh-dc3-grid{display:grid;grid-template-columns:repeat(var(--trh-cols,3),minmax(0,1fr));gap:12px 8px}',\n    '.trh-dc3-card{position:relative;display:block;border:1px solid #ccc;border-radius:10px;background:#fff;padding:10px 8px 10px;cursor:pointer;font-weight:normal;font-size:12px;line-height:1.35;color:#333;transition:border-color .15s,box-shadow .15s;text-align:left}',\n    '.trh-dc3-card input{position:absolute;opacity:0;width:1px;height:1px;margin:0;padding:0}',\n    '.trh-dc3-card.is-sel{border:2px solid #7C8C74;box-shadow:0 2px 8px rgba(124,140,116,.35);padding:9px 7px}',\n    '.trh-dc3-card.is-off{background:#f3f3f3;color:#888;cursor:default}',\n    '.trh-dc3-card__t{font-weight:700;font-size:13px;margin-bottom:2px}',\n    '.trh-dc3-card__s{font-size:11px;color:#777;margin-bottom:6px}',\n    '.trh-dc3-card ul{list-style:none;margin:0 0 6px;padding:0}',\n    '.trh-dc3-card li{margin:0 0 2px}',\n    '.trh-dc3-card__p{font-weight:700;font-size:15px;color:#28a745}',\n    '.trh-dc3-each{display:block;font-weight:normal;font-size:11px;color:#777}',\n    '.trh-dc3-det{margin-top:6px;font-size:11px;color:#777}',\n    '.trh-dc3-det summary{cursor:pointer;color:#7C8C74;font-size:11px}',\n    '.trh-dc3-badge{position:absolute;top:-9px;right:6px;background:#DDC762;color:#333;font-size:10px;font-weight:700;border-radius:8px;padding:1px 6px}',\n    '.trh-dc3-min{color:#b45309;font-size:11px}',\n    '.trh-dc3-hint,.trh-dc3-note{font-size:13px;color:#666;font-weight:normal;font-style:italic;margin:6px 0}',\n    '.trh-dc3-total{font-size:18px;font-weight:bold;margin:12px 0 8px;color:#28a745}',\n    '.trh-dc3-break{font-size:14px;line-height:1.7;border-top:1px solid #ddd;padding-top:8px;color:#7C8C74;font-weight:normal;text-align:left}',\n    '.trh-dc3-break p{margin:0}',\n    '.trh-dc3-small{font-size:12px;color:#777}',\n    '.trh-k4-info{display:block;font-size:12px;color:#555;line-height:1.45;margin-top:4px;font-weight:normal}',\n    '.trh-k4-qnote{display:block;font-size:12px;color:#777;font-weight:normal}',\n    '.trh-k4-com{display:none;flex-direction:column;gap:10px}',\n    '.trh-k4-com label{display:block}',\n    '.trh-k4-row{display:flex;align-items:center;gap:8px}',\n    '.trh-k4-row input{width:auto!important;margin:0!important}',\n    '.trh-k4-btn{background:#DDC762;color:#fff;border:none;border-radius:6px;font-size:16px;font-weight:600;text-transform:uppercase;padding:14px;margin-top:20px;width:100%;cursor:pointer}',\n    '.trh-k4-btn:disabled{background:#a3cfbb;cursor:not-allowed}',\n    '.trh-dc3-bar{display:none}',\n    '@media (max-width:749px){',\n    '  .trh-dc3-grid{grid-template-columns:1fr;gap:10px}',\n    '  .trh-dc3-card{display:grid;grid-template-columns:1fr auto;column-gap:10px;padding:12px}',\n    '  .trh-dc3-card.is-sel{padding:11px}',\n    '  .trh-dc3-card__p{grid-column:2;grid-row:1 / span 3;align-self:center;font-size:17px}',\n    '  .trh-dc3-card ul{grid-column:1}',\n    '  .trh-dc3-det{grid-column:1 / -1}',\n    '  .trh-dc3-bar{position:fixed;left:0;right:0;bottom:0;z-index:999;background:#fff;border-top:1px solid #ddd;box-shadow:0 -4px 12px rgba(0,0,0,.12);padding:10px 14px calc(10px + env(safe-area-inset-bottom));align-items:center;gap:12px}',\n    '  .trh-dc3-bar.is-on{display:flex}',\n    '  .trh-dc3-bar__s{flex:1;font-size:13px;line-height:1.3;color:#333}',\n    '  .trh-dc3-bar__s b{font-size:17px;color:#28a745}',\n    '  .trh-dc3-bar button{flex:0 0 auto;width:auto!important;margin:0!important;background:#DDC762;color:#fff;border:none;border-radius:6px;font-size:15px;font-weight:600;text-transform:uppercase;padding:12px 18px}',\n    '  .trh-dc3-bar button:disabled{background:#a3cfbb}',\n    '}'\n  ].join('\\n');\n  function injectCSS() {\n    if ($('trh-dc3-css') || $('trh-k4-css')) return;\n    var st = document.createElement('style'); st.id = 'trh-k4-css'; st.textContent = CSS; document.head.appendChild(st);\n  }\n  function el(html) { var d = document.createElement('div'); d.innerHTML = html.trim(); return d.firstChild; }\n\n  /* cards: opts = [{key,title,sub,lines:[html],det:[text],totalC,eachC,eachWord,available,reason,best}] */\n  function cardsHtml(opts, selKey, q, groupName, label) {\n    var n = opts.length;\n    return '<div class=\"trh-dc3-grid\" style=\"--trh-cols:' + (n >= 4 ? 2 : n) + '\" role=\"radiogroup\" aria-label=\"' + esc(label || 'Options') + '\">' +\n      opts.map(function (o) {\n        if (!o.available) return '<div class=\"trh-dc3-card is-off\" aria-disabled=\"true\"><div class=\"trh-dc3-card__t\">' + esc(o.title) + '</div><div class=\"trh-dc3-card__s\">' + esc(o.reason || '') + '</div></div>';\n        var sel = o.key === selKey;\n        return '<label class=\"trh-dc3-card' + (sel ? ' is-sel' : '') + '\"><input type=\"radio\" name=\"' + groupName + '\" value=\"' + esc(o.key) + '\"' + (sel ? ' checked' : '') + '>' +\n          (o.best ? '<span class=\"trh-dc3-badge\">' + esc(o.badge || 'Recommended') + '</span>' : '') +\n          '<div class=\"trh-dc3-card__t\">' + esc(o.title) + '</div>' + (o.sub ? '<div class=\"trh-dc3-card__s\">' + esc(o.sub) + '</div>' : '') +\n          '<ul>' + (o.lines || []).map(function (l) { return '<li>' + l + '</li>'; }).join('') + '</ul>' +\n          '<div class=\"trh-dc3-card__p\">' + money(o.totalC) + (q > 1 ? '<span class=\"trh-dc3-each\">' + money(o.eachC) + ' each x ' + q + '</span>' : '') + '</div>' +\n          (o.det && o.det.length ? '<details class=\"trh-dc3-det\"><summary>Workroom details</summary>' + o.det.map(esc).join('<br>') + '</details>' : '') +\n          '</label>';\n      }).join('') + '</div>';\n  }\n\n  /* sticky bar: returns update(totalC|null, title) */\n  function stickyBar(wrapEl, realBtn, onClick) {\n    var bar = $('trhDc3Bar');\n    if (!bar) {\n      bar = el('<div id=\"trhDc3Bar\" class=\"trh-dc3-bar\" role=\"region\" aria-label=\"Add to cart\"><div class=\"trh-dc3-bar__s\"></div><button type=\"button\">Add to Cart</button></div>');\n      document.body.appendChild(bar);\n      bar.querySelector('button').addEventListener('click', onClick);\n      if ('IntersectionObserver' in window && wrapEl && realBtn) {\n        var inCalc = false, realVis = false;\n        var upd = function () { bar.classList.toggle('is-on', inCalc && !realVis); };\n        new IntersectionObserver(function (es) { inCalc = es[0].isIntersecting; upd(); }).observe(wrapEl);\n        new IntersectionObserver(function (es) { realVis = es[0].isIntersecting; upd(); }).observe(realBtn);\n      }\n    }\n    return function (totalC, title) {\n      var s = bar.querySelector('.trh-dc3-bar__s'), b = bar.querySelector('button');\n      if (totalC != null) { s.innerHTML = '<b>' + money(totalC) + '</b><br><span>' + esc(title || '') + '</span>'; b.disabled = false; }\n      else { s.innerHTML = '<span>Enter sizes to see your price</span>'; b.disabled = true; }\n    };\n  }\n\n  /* \"How many like this?\" relabel of an existing quantity input */\n  function qtyField(input, word, max) {\n    if (!input) return;\n    input.max = String(max || 20); input.min = '1'; input.step = '1';\n    var lbl = input.closest('label');\n    if (lbl) {\n      for (var i = 0; i < lbl.childNodes.length; i++) { var n = lbl.childNodes[i]; if (n.nodeType === 3 && n.textContent.trim()) { n.textContent = 'How many ' + word + ' like this? '; break; } }\n      if (!lbl.querySelector('.trh-k4-qnote')) lbl.insertBefore(el('<span class=\"trh-k4-qnote\">Identical ' + word + ' are made together and priced as one order (1\\u2013' + (max || 20) + ').</span>'), input);\n    }\n  }\n\n  /* Locked made-to-order lines: the cart shows _lock_label instead of +/- */\n  function lock(props, label) { props._locked = 'true'; props._lock_label = label; props._calc = 'v4'; return props; }\n\n  function postCart(items) {\n    window.__trhLastCartItems = items;\n    return fetch('/cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ items: items }) })\n      .then(function (resp) {\n        if (!resp.ok) return resp.json().then(function (d) { throw new Error(d.description || d.message || 'Failed to add to cart'); });\n        return resp.json();\n      });\n  }\n  /* the cart total of a set of items (dollars x qty, as Shopify charges) */\n  function itemsTotalC(items, priceC) { return items.reduce(function (s, it) { return s + priceC(it) * it.quantity; }, 0); }\n\n  window.TRHCalcKit = {\n    version: 'v4', FM: FM, $: $, val: val, esc: esc, sanitize: sanitize, cents: cents, money: money, r2: r2, fmtIn: fmtIn, ceil: ceil,\n    toRepeat: toRepeat, parseInches: parseInches, parseMatch: parseMatch, checkWidth: checkWidth, trimMinYards: trimMinYards,\n    fetchFabricMeta: fetchFabricMeta, repeatText: repeatText, injectCSS: injectCSS, el: el, cardsHtml: cardsHtml,\n    stickyBar: stickyBar, qtyField: qtyField, lock: lock, postCart: postCart, itemsTotalC: itemsTotalC, MAX_QTY: 20,\n    TRIM_LABOR_PER_INCH: 1.5\n  };\n})();\n\n/**\n * TRH Cushion Calculator - Browser Module\n * =========================================================================\n * Manages the cushion calculator form, price calculation, yardage,\n * and add-to-cart flow via /cart/add.js ($1 variant x dollar amount,\n * same pattern as drapery).\n *\n * Dependencies:\n *   - window.TRHFabricBrowser (shared fabric/trim selection module)\n *\n * Exposes:\n *   - window.TRHCushionCalculator.init(config)\n *   - window.TRHCushionCalculator.setBrowseTarget(target)\n *\n * @module TRHCushionCalculator\n * @version 2.0.0\n */\n/* TRH Cushion Calculator v4 (2026-10-30): drapery-v3 look (edge-finish cards, live total with cents,\n * sticky mobile bar, \"How many cushions like this?\"), screen total = cart total to the cent,\n * locked cart lines, whole-repeat pattern matching from the fabric's metafields (each plate\n * rounded to whole vertical/horizontal repeats + 1 repeat per order to place the pattern),\n * railroaded layout, self-welt yardage shown, sew/fill/tufting rates unchanged. */\n(function () {\n  var K = window.TRHCalcKit;\n  var _meta = null, _metaLoading = false, _bar = null, MAX_QTY = 20;\n  var WELT_IN_PER_YD = 700;   /* 1 yd of 54\" fabric ~ 700\" of 1.5\" bias welt (same factor as contrast welt) */\n  'use strict';\n\n  // -------------------------------------------------------------------------\n  // Constants \u2014 must mirror api/lib/cushion-calculator.js EXACTLY\n  // -------------------------------------------------------------------------\n\n  var LOG_PREFIX = '[TRHCushionCalc]';\n\n  /** Fill pricing per square inch, keyed by thickness (1-8). */\n  var FILL_RATES = {\n    1: { foam: 0.08, foamFeather: 0.15, feather: 0.19, outdoor: 0.15 },\n    2: { foam: 0.10, foamFeather: 0.18, feather: 0.22, outdoor: 0.17 },\n    3: { foam: 0.12, foamFeather: 0.20, feather: 0.25, outdoor: 0.20 },\n    4: { foam: 0.14, foamFeather: 0.22, feather: 0.28, outdoor: 0.22 },\n    5: { foam: 0.17, foamFeather: 0.26, feather: 0.31, outdoor: 0.26 },\n    6: { foam: 0.19, foamFeather: 0.27, feather: 0.34, outdoor: 0.29 },\n    7: { foam: 0.21, foamFeather: 0.31, feather: 0.37, outdoor: 0.31 },\n    8: { foam: 0.23, foamFeather: 0.33, feather: 0.40, outdoor: 0.33 }\n  };\n\n  var FILL_TYPE_MAP = {\n    'Foam - Soft':              'foam',\n    'Foam - Medium':            'foam',\n    'Foam - Firm':              'foam',\n    'Feather & Foam - Soft':    'foamFeather',\n    'Feather & Foam - Medium':  'foamFeather',\n    'Feather & Foam - Firm':    'foamFeather',\n    'Feather Only':             'feather',\n    'Outdoor':                  'outdoor'\n  };\n\n  /**\n   * Cover-only option: the customer buys just the sewn cover with no\n   * foam/fill insert, so the fill component of the price is $0.\n   * Must match api/lib/cushion-calculator.js NO_FILL_OPTION exactly.\n   */\n  var NO_FILL_OPTION = 'No Fill (Cover Only)';\n\n  var SEW_MULTIPLIERS = {\n    'No Band, No Welt':   1,\n    'No Band with Welt':  1.5,\n    'Band, No Welt':      2,\n    'Band with Welt':     2.5\n  };\n\n  var TUFTING_PRICE_PER_BUTTON = 10;\n  var DEFAULT_FABRIC_WIDTH = 54;\n  var SEAM_ALLOWANCE = 1;\n  var MIN_FABRIC_YARDS = 3; /* default only; per-fabric minimum comes from _FM() */\n  var MIN_TRIM_YARDS = 5;\n  var MIN_CONTRAST_YARDS = 3;\n\n  var REPEAT_CHART = [\n    [0,  0],\n    [14, 0.10],\n    [19, 0.15],\n    [27, 0.20],\n    [36, 0.25],\n    [45, 0.30],\n    [54, 0.35]\n  ];\n\n  var YARDAGE_NOTE = 'Yardage is based on standard 54\\u201d wide fabric and is sold in whole yards. Some fabrics and trims have their own minimum order, shown when you select them. If you have questions about a specific fabric\\u2019s width or repeat, please reach out.';\n\n  /* TRH yardage note 2026-10-26 (Rachel t360u): short, accurate note; names the selected fabric's / trim's own minimum (TRHFabricMin + trimMinYards) */\n  function yardageNote(noStoreFabric) {\n    var storeFabric = !noStoreFabric && !_ownFabric && _selectedFabric;\n    var unitWord = (storeFabric && _FM().info(_selectedFabric).unit === 'meter') ? 'meters' : 'yards';\n    var parts = [_ownFabric ? 'Yardage is based on standard 54\\u201d wide fabric.' : 'Yardage is based on standard 54\\u201d wide fabric and is sold in whole ' + unitWord + '.'];\n    var named = false;\n    if (storeFabric) {\n      var fMin = _FM().info(_selectedFabric).min;\n      if (fMin > 1) { parts.push('This fabric has a minimum order of ' + _FM().label(fMin, _selectedFabric) + '.'); named = true; }\n    }\n    if (_selectedTrim && !_ownTrim && trimMinYards(_selectedTrim) > 1) {\n      parts.push('This trim has a minimum order of ' + trimMinYards(_selectedTrim) + ' yards.'); named = true;\n    }\n    if (!named && !storeFabric) parts.push('Some fabrics and trims have their own minimum order, shown when you select them.');\n    parts.push('If you have questions about a specific fabric\\u2019s width or repeat, please reach out.');\n    return parts.join(' ');\n  }\n\n  /* TRH fabric min fix 2026-10-26: per-fabric minimum + unit (see TRHFabricMin in trh-fabric-browser.js) */\n  function _FM() {\n    return window.TRHFabricMin || {\n      qty: function (y) { return Math.max(Math.ceil(y), 1); },\n      info: function () { return { min: 1, unit: 'yard' }; },\n      label: function (n) { return n + ' yards'; },\n      abbr: function () { return 'yd'; },\n      per: function () { return '/yd'; }\n    };\n  }\n\n  // -------------------------------------------------------------------------\n  // Module state\n  // -------------------------------------------------------------------------\n\n  var _config = null;\n  var _selectedFabric = null;\n  var _selectedTrim = null;\n  var _selectedContrast = null;\n  var _ownFabric = false;\n  var _ownTrim = false;\n  var _ownContrast = false;\n  var _isSubmitting = false;\n  var _boundListeners = [];\n  /** Tracks which target a catalog browse is for: 'fabric' or 'contrast'. */\n  var _browseTarget = 'fabric';\n  /** Selected photo files for reference upload. */\n  var _photoFiles = [];\n\n  // -------------------------------------------------------------------------\n  // DOM helper\n  // -------------------------------------------------------------------------\n\n  function $(id) { return document.getElementById(id); }\n\n  function roundTo(value, decimals) {\n    var factor = Math.pow(10, decimals);\n    return Math.round(value * factor) / factor;\n  }\n\n  // -------------------------------------------------------------------------\n  // Pricing calculations (mirror server-side EXACTLY)\n  // -------------------------------------------------------------------------\n\n  function calculateFillPrice(length, width, thickness, fillType) {\n    /* Cover-only: no foam/fill insert, so no fill charge. */\n    if (fillType === NO_FILL_OPTION) return 0;\n    var t = Math.min(Math.max(Math.round(thickness), 1), 8);\n    var rateKey = FILL_TYPE_MAP[fillType];\n    if (!rateKey) return 0;\n    var rates = FILL_RATES[t];\n    if (!rates) return 0;\n    var rate = rates[rateKey];\n    if (rate == null) return 0;\n    /* TRH 2026-10-31: round to cents before rounding up, so float noise (20 x 20 x 0.14 = 56.00000000000001) doesn't add $1. Rates unchanged. */\n    return Math.ceil(Math.round(length * width * rate * 100) / 100);\n  }\n\n  /* TRH CUSHION V6 2026-10-31 (Rachel t744u): a banded cushion with welt has TWO welt rows (top + bottom).\n     The rate table above is unchanged; the welt-row rate is read from it (No Band with Welt - No Band, No Welt)\n     and the second row is charged on top of 'Band with Welt'. */\n  var WELT_ROW_RATE = SEW_MULTIPLIERS['No Band with Welt'] - SEW_MULTIPLIERS['No Band, No Welt'];\n  function calculateSewPrice(length, width, edgeFinish) {\n    var m = SEW_MULTIPLIERS[edgeFinish];\n    if (m == null) return 0;\n    if (edgeFinish === 'Band with Welt') m += WELT_ROW_RATE;   /* second welt row */\n    return Math.ceil((length + width) * m);\n  }\n\n  function calculateButtonCount(tuftingType, spacing, length, width) {\n    if (!tuftingType || tuftingType === 'No Tufting' || !spacing || spacing <= 0) return 0;\n    var bL = Math.ceil((length - spacing) / spacing) + 1;\n    var bW = Math.ceil((width - spacing) / spacing) + 1;\n    var straight = bL * bW;\n    if (tuftingType.indexOf('Diamond') !== -1) {\n      return straight + (bL - 1) * (bW - 1);\n    }\n    return straight;\n  }\n\n  /* Whole-repeat layout (Anderson yardage chart method + Fabric Formula repeat rule): each plate is\n     rounded up to whole repeats so the pattern can be centered and matched; railroaded goods are laid\n     with the cushion's long side across the roll when it fits. Returns { inches, plateDown, plateAcross, platesAcross, rotated } */\n  function cushionLayout(length, width, thickness, fabricWidth, vr, hr, railroaded) {\n    var sa = SEAM_ALLOWANCE;\n    var L = Math.max(length, width), W = Math.min(length, width);\n    var down = L + sa, across = W + sa, rotated = false;\n    if (railroaded && L + sa <= fabricWidth) { down = W + sa; across = L + sa; rotated = true; }\n    if (vr > 0) down = K.toRepeat(down, vr);\n    if (hr > 0) across = K.toRepeat(across, hr);\n    var boxingW = thickness + sa;\n    var boxingPerimeter = 2 * (L + W) + 4;\n    var platesAcross = (2 * across <= fabricWidth) ? 2 : 1;\n    var plateFabricInches = platesAcross === 2 ? down : 2 * down;\n    var remainingW = fabricWidth - (platesAcross * across);\n    var boxingFabricInches;\n    if (remainingW >= boxingW) {\n      var stripsNextToPlates = Math.floor(remainingW / boxingW);\n      var boxingLengthFromPlates = stripsNextToPlates * plateFabricInches;\n      if (boxingLengthFromPlates >= boxingPerimeter) boxingFabricInches = 0;\n      else boxingFabricInches = Math.ceil((boxingPerimeter - boxingLengthFromPlates) / fabricWidth) * boxingW;\n    } else {\n      boxingFabricInches = Math.ceil(boxingPerimeter / fabricWidth) * boxingW;\n    }\n    return { inches: plateFabricInches + boxingFabricInches, plateDown: K.r2(down), plateAcross: K.r2(across), platesAcross: platesAcross, rotated: rotated };\n  }\n  function calculateBoxCushionYardage(length, width, thickness, fabricWidth) {\n    return cushionLayout(length, width, thickness, fabricWidth, 0, 0, false).inches / 36;\n  }\n\n  function calculateTrimYardage(edgeFinish, length, width) {\n    var totalInches;\n    if (edgeFinish === 'No Band with Welt') {\n      totalInches = (length * 2) + (width * 2);\n    } else if (edgeFinish === 'Band with Welt') {\n      totalInches = (length * 4) + (width * 4);\n    } else {\n      return 0;\n    }\n    return Math.ceil(totalInches / 36);\n  }\n\n  function calculateContrastYardage(edgeFinish, length, width) {\n    var totalInches;\n    if (edgeFinish === 'No Band with Welt') {\n      totalInches = (length * 2) + (width * 2);\n    } else if (edgeFinish === 'Band with Welt') {\n      totalInches = (length * 4) + (width * 4);\n    } else {\n      return 0;\n    }\n    var yards = totalInches / 700;\n    return Math.round(yards * 4) / 4;\n  }\n\n  function getRepeatAdjustment(combinedRepeat) {\n    if (!combinedRepeat || combinedRepeat <= 0) return 0;\n    for (var i = REPEAT_CHART.length - 1; i >= 0; i--) {\n      if (combinedRepeat > (i === 0 ? 0 : REPEAT_CHART[i - 1][0])) {\n        return REPEAT_CHART[i][1];\n      }\n    }\n    return 0;\n  }\n\n  /* TRH trim min 2026-10-26 (Rachel): only The ReBorn House (TRH) trims have the 5 yd minimum; other\n     brands' trims have none (sold by the yard, 1+; a min-N tag on a trim still applies) */\n  function trimMinYards(t) {\n    if (!t) return 1;\n    var n = 0;\n    (t.tags || []).forEach(function (x) { x = String(x).toLowerCase(); if (x.slice(0, 4) === 'min-') { var v = parseInt(x.slice(4), 10); if (v > n) n = v; } });\n    if (t.vendor === 'The ReBorn House' || /^TRH\\d/i.test(String(t.title || ''))) return Math.max(5, n);\n    return n > 1 ? n : 1;\n  }\n  function applyMinimum(yards, type) {\n    var ceiled = Math.ceil(yards);\n    if (type === 'trim') return Math.max(ceiled, trimMinYards(_selectedTrim));\n    if (type === 'contrast') return Math.max(ceiled, MIN_CONTRAST_YARDS);\n    return Math.max(ceiled, MIN_FABRIC_YARDS);\n  }\n\n  // -------------------------------------------------------------------------\n  // Full calculation (mirrors server calculateCushionPrice)\n  // -------------------------------------------------------------------------\n\n  function calculateAll(edgeOverride) {\n    var length = parseFloat(($('cushion-length') || {}).value) || 0;\n    var width = parseFloat(($('cushion-width') || {}).value) || 0;\n    var thickness = parseFloat(($('cushion-thickness') || {}).value) || 0;\n    var edgeFinish = edgeOverride || ($('cushion-edge') || {}).value || '';\n    var fillType = ($('cushion-fill') || {}).value || '';\n    var tuftingType = ($('cushion-tufting') || {}).value || 'No Tufting';\n    var tuftingSpacing = parseFloat(($('cushion-tufting-spacing') || {}).value) || 0;\n    var quantity = parseInt(($('cushion-quantity') || {}).value, 10) || 1;\n    var fabricWidth = parseFloat(($('cushion-fabric-width') || {}).value) || DEFAULT_FABRIC_WIDTH;\n\n    if (length <= 0 || width <= 0 || thickness <= 0 || !edgeFinish || !fillType) return null;\n    if (quantity < 1) quantity = 1;\n    thickness = Math.min(thickness, 8);\n\n    /* pattern: store fabric -> metafields; own fabric -> the COM fields */\n    var vr = 0, hr = 0, match = 'straight', railroaded = false, src = '';\n    if (_ownFabric) {\n      vr = parseFloat(($('cushionComRepeat') || {}).value) || 0; hr = parseFloat(($('cushionComHRepeat') || {}).value) || 0;\n      railroaded = !!($('cushionComRailroaded') && $('cushionComRailroaded').checked); src = 'your fabric';\n    } else if (_selectedFabric && _meta) {\n      vr = _meta.vr || 0; hr = _meta.hr || 0; match = _meta.match || 'straight'; railroaded = !!_meta.railroaded; src = 'fabric details';\n      if (_meta.width) fabricWidth = _meta.width;\n    }\n    if (match === 'random') { vr = 0; hr = 0; }\n\n    var hasWelt = /with Welt/.test(edgeFinish);\n    var weltType = '';\n    var weltSelect = $('cushion-welt');\n    if (hasWelt) weltType = (weltSelect && weltSelect.value) || (edgeOverride ? 'Self Welt' : '');\n\n    var fillPrice = calculateFillPrice(length, width, thickness, fillType);\n    var sewPrice = calculateSewPrice(length, width, edgeFinish);\n    var buttonCount = calculateButtonCount(tuftingType, tuftingSpacing, length, width);\n    var tuftingPrice = buttonCount * TUFTING_PRICE_PER_BUTTON;\n    var perCushionPrice = sewPrice + fillPrice + tuftingPrice;\n\n    var lay = cushionLayout(length, width, thickness, fabricWidth, vr, hr, railroaded);\n    var plain = cushionLayout(length, width, thickness, fabricWidth, 0, 0, railroaded);\n    var baseYardage = lay.inches / 36;\n    var tuftingYardageAdj = (tuftingType !== 'No Tufting' && tuftingSpacing > 0) ? Math.ceil(length / 36) : 0;\n    var weltRows = edgeFinish === 'Band with Welt' ? 2 : (edgeFinish === 'No Band with Welt' ? 1 : 0);\n    var weltInches = weltRows * (2 * (length + width) + 4);\n    var selfWeltYards = weltType === 'Self Welt' ? Math.ceil(weltInches * quantity / WELT_IN_PER_YD * 4 - 1e-9) / 4 : 0;\n    var placement = vr > 0 ? vr / 36 : 0;                  /* one repeat per order to reach the motif */\n    /* TRH CUSHION V5 2026-10-31 (Rachel): motif centered = one repeat to reach the motif + the rows needed;\n       the last plate row is cut at its real length (not rounded up to a whole repeat); never less than plain */\n    var lastRowTrim = vr > 0 ? Math.max(0, lay.plateDown - plain.plateDown) / 36 : 0;\n    var neededYards = Math.max((baseYardage + tuftingYardageAdj) * quantity + placement - lastRowTrim, (plain.inches / 36 + tuftingYardageAdj) * quantity) + selfWeltYards;\n    var repeatExtra = Math.max(0, (lay.inches - plain.inches) / 36 * quantity + placement - lastRowTrim);\n    var fabricYardsFinal = _ownFabric ? K.ceil(neededYards) : _FM().qty(neededYards, _selectedFabric);\n\n    var trimYards = 0;\n    if (weltType === 'Trim') {\n      trimYards = Math.ceil(weltInches * quantity / 36 - 1e-9);   /* TRH CUSHION V5: by the inch of welt, rounded once per order */\n      if (!_ownTrim) trimYards = Math.max(trimYards, trimMinYards(_selectedTrim));\n    }\n    var contrastYards = 0;\n    if (weltType === 'Contrast Fabric Welt') {\n      contrastYards = Math.ceil(weltInches * quantity / WELT_IN_PER_YD * 4 - 1e-9) / 4;   /* TRH CUSHION V5: by the inch of welt (same factor as self welt) */\n      contrastYards = _ownContrast ? Math.ceil(contrastYards) : _FM().qty(contrastYards, _selectedContrast);\n    }\n\n    /* exact cents: price x whole units, exactly what the cart charges */\n    var fabricCostC = (_selectedFabric && !_ownFabric && _selectedFabric.price > 0) ? K.cents(_selectedFabric.price * fabricYardsFinal) : 0;\n    var trimCostC = (_selectedTrim && !_ownTrim && _selectedTrim.price > 0 && trimYards > 0) ? K.cents(_selectedTrim.price * trimYards) : 0;\n    var contrastCostC = (_selectedContrast && !_ownContrast && _selectedContrast.price > 0 && contrastYards > 0) ? K.cents(_selectedContrast.price * contrastYards) : 0;\n    var cushionTotal = perCushionPrice * quantity;        /* whole dollars ($1 variant x qty) */\n    var totalC = cushionTotal * 100 + fabricCostC + trimCostC + contrastCostC;\n\n    return {\n      total: totalC / 100, totalC: totalC, eachC: Math.round(totalC / quantity),\n      breakdown: { sewPrice: sewPrice, fillPrice: fillPrice, tuftingPrice: tuftingPrice, buttonCount: buttonCount, perCushionPrice: perCushionPrice,\n        cushionTotal: cushionTotal, fabricCost: fabricCostC / 100, trimCost: trimCostC / 100, contrastCost: contrastCostC / 100,\n        fabricCostC: fabricCostC, trimCostC: trimCostC, contrastCostC: contrastCostC },\n      yardage: { baseYardage: roundTo(baseYardage, 2), tuftingYardageAdj: tuftingYardageAdj, neededYards: roundTo(neededYards, 3), repeatExtra: roundTo(repeatExtra, 2),\n        selfWeltYards: selfWeltYards, fabricYardsFinal: fabricYardsFinal, trimYards: trimYards, contrastYards: contrastYards, layout: lay,\n        minApplied: !_ownFabric && fabricYardsFinal > K.ceil(neededYards) },\n      pattern: { vr: vr, hr: hr, match: match, railroaded: railroaded, src: src, fabricWidth: fabricWidth },\n      inputs: { length: length, width: width, thickness: thickness, edgeFinish: edgeFinish, fillType: fillType, tuftingType: tuftingType,\n        tuftingSpacing: tuftingSpacing, quantity: quantity, fabricWidth: fabricWidth, weltType: weltType }\n    };\n  }\n\n  // -------------------------------------------------------------------------\n  // UI update functions\n  // -------------------------------------------------------------------------\n\n  function updateConditionalUI() {\n    var edgeSelect = $('cushion-edge');\n    var weltSection = $('cushion-welt-section');\n    var weltSelect = $('cushion-welt');\n    var trimSection = $('cushion-trim-section');\n    var contrastSection = $('cushion-contrast-section');\n\n    if (!edgeSelect) return;\n\n    var showWelt = (edgeSelect.value === 'No Band with Welt' || edgeSelect.value === 'Band with Welt');\n    if (weltSection) weltSection.style.display = showWelt ? '' : 'none';\n\n    var needsTrim = false;\n    var needsContrast = false;\n    if (showWelt && weltSelect && weltSelect.value) {\n      needsTrim = (weltSelect.value === 'Trim');\n      needsContrast = (weltSelect.value === 'Contrast Fabric Welt');\n    }\n\n    if (trimSection) trimSection.style.display = needsTrim ? '' : 'none';\n    if (contrastSection) contrastSection.style.display = needsContrast ? '' : 'none';\n\n    // Tufting spacing\n    var tuftingSelect = $('cushion-tufting');\n    var spacingSection = $('cushion-tufting-spacing-section');\n    if (tuftingSelect && spacingSection) {\n      var showSpacing = (tuftingSelect.value && tuftingSelect.value !== 'No Tufting');\n      spacingSection.style.display = showSpacing ? '' : 'none';\n    }\n\n    updateCalculation();\n  }\n\n  function updateCalculation() {\n    var result = calculateAll();\n    var info = $('cushionRepeatInfo');\n    if (info) info.innerHTML = _metaLoading ? 'Reading fabric details\\u2026' : (result && (_selectedFabric || _ownFabric) ? K.repeatText({ vr: result.pattern.vr, hr: result.pattern.hr, match: result.pattern.match, railroaded: result.pattern.railroaded, widthNote: !_ownFabric && _meta ? _meta.widthNote : '' }, result.pattern.src) : '');\n    if (window.TRHRepeatBox) { if (info && !_ownFabric && _selectedFabric && _meta && !_metaLoading) window.TRHRepeatBox.attach('cushionRptBox', info, _meta, updateCalculation); else window.TRHRepeatBox.hide('cushionRptBox'); }   /* TRH 2026-10-30 */\n    if (_metaLoading) result = null;\n    var miss = cushionMissing(result);   /* TRH CUSHION V5 */\n    updateYardageDisplay(result);\n    updatePricingDisplay(miss ? null : result);\n    renderCards(result);\n    if (_bar) {\n      _bar(!miss ? result.totalC : null, result ? 'Cushion - ' + result.inputs.edgeFinish : '');\n      if (miss) { var bs = document.querySelector('#trhDc3Bar .trh-dc3-bar__s'); if (bs) bs.innerHTML = '<span>' + K.esc(miss) + '</span>'; }\n    }\n    var addBtn = $('cushion-add-to-cart');\n    if (addBtn && !_isSubmitting) { addBtn.disabled = !!miss; addBtn.style.opacity = miss ? '0.55' : ''; addBtn.style.cursor = miss ? 'not-allowed' : ''; addBtn.title = miss || ''; }\n  }\n  /* TRH CUSHION V5 2026-10-31: the step still missing before the price is complete (null = complete) */\n  function cushionMissing(result) {\n    var v = function (id) { return ($(id) || {}).value || ''; };\n    if (!(parseFloat(v('cushion-length')) > 0) || !(parseFloat(v('cushion-width')) > 0) || !(parseFloat(v('cushion-thickness')) > 0)) return 'Enter the cushion size to see your price';\n    if (!v('cushion-edge')) return 'Choose an edge finish to see your price';\n    if (!v('cushion-fill')) return 'Choose a fill to see your price';\n    if (_metaLoading) return 'Reading fabric details\\u2026';\n    if (!result) return 'Enter the cushion details to see your price';\n    if (!_selectedFabric && !_ownFabric) return 'Choose a fabric (or your own) to see your price';\n    if (/with Welt/.test(result.inputs.edgeFinish) && !result.inputs.weltType) return 'Choose a welt type to see your price';\n    if (result.inputs.weltType === 'Trim' && !_ownTrim && !_selectedTrim) return 'Choose a trim (or your own) to see your price';\n    if (result.inputs.weltType === 'Contrast Fabric Welt' && !_ownContrast && !_selectedContrast) return 'Choose a contrast welt fabric (or your own) to see your price';\n    return null;\n  }\n  var EDGES = [\n    { v: 'No Band, No Welt', sub: 'Knife edge, clean seam' },\n    { v: 'No Band with Welt', sub: 'Knife edge with welt cord' },\n    { v: 'Band, No Welt', sub: 'Boxed sides, clean seams' },\n    { v: 'Band with Welt', sub: 'Boxed sides, welt top and bottom' }\n  ];\n  function renderCards(result) {\n    var box = $('cushionOptions'); if (!box) return;\n    if (!result || (!_selectedFabric && !_ownFabric)) { box.innerHTML = '<p class=\"trh-dc3-hint\">Enter the cushion size, fill and fabric (or your own) to compare edge finishes.</p>'; return; }\n    var q = result.inputs.quantity, cur = result.inputs.edgeFinish;\n    var cards = EDGES.map(function (e) {\n      var r = e.v === cur ? result : calculateAll(e.v);\n      if (!r) return { key: e.v, title: e.v, available: false, reason: '' };\n      var b = r.breakdown, y = r.yardage, lines = [];\n      lines.push('<b>' + (_ownFabric ? y.fabricYardsFinal + ' yards to send' : K.esc(_FM().label(y.fabricYardsFinal, _selectedFabric)) + ' of fabric') + '</b>' + (y.minApplied ? ' <span class=\"trh-dc3-min\">(incl. minimum)</span>' : ''));\n      if (r.inputs.weltType) lines.push('Welt: ' + K.esc(r.inputs.weltType));\n      var det = [   /* TRH 2026-10-30 hide breakdown: no sewing / fill / tufting prices */\n        'Plates cut ' + y.layout.plateDown + '\" x ' + y.layout.plateAcross + '\"' + (y.layout.rotated ? ' (railroaded, long side across the roll)' : '') + ', ' + y.layout.platesAcross + ' across the roll' + (r.pattern.vr ? ', rounded to whole repeats' : ''),\n        'Fabric needed ' + y.neededYards + ' yd' + (y.repeatExtra ? ' (incl. ' + y.repeatExtra + ' yd for the pattern repeat)' : '') + (y.selfWeltYards ? ' (incl. ' + y.selfWeltYards + ' yd self welt)' : '')];\n      return { key: e.v, title: e.v, sub: e.sub, available: true, totalC: r.totalC, eachC: r.eachC, lines: lines, det: det };\n    });\n    box.innerHTML = '<div class=\"trh-dc3-head\">Your cushion: <b>' + result.inputs.length + '\" x ' + result.inputs.width + '\" x ' + result.inputs.thickness + '\"</b>' + (q > 1 ? ', ' + q + ' identical cushions' : '') + '. Choose the edge finish:</div>' +\n      K.cardsHtml(cards, cur, q, 'trhCuOpt', 'Edge finish options');\n  }\n\n\n  function setupV4() {\n    K.injectCSS();\n    var form = $('cushion-form');\n    var qf = $('cushion-quantity'); K.qtyField(qf, 'cushions', MAX_QTY);\n    var fwf = $('cushion-fabric-width');\n    if (fwf && !$('cushionRepeatInfo')) fwf.parentNode.insertBefore(K.el('<span id=\"cushionRepeatInfo\" class=\"trh-k4-info\" aria-live=\"polite\"></span>'), fwf.nextSibling);\n    var colorLbl = $('cushionCustomFabricColor') ? $('cushionCustomFabricColor').parentElement : null;\n    if (colorLbl && !$('cushionComSpecs')) colorLbl.parentNode.insertBefore(K.el('<div id=\"cushionComSpecs\" class=\"trh-k4-com\">' +\n      '<label for=\"cushionComRepeat\">Vertical Pattern Repeat (inches):<input type=\"number\" id=\"cushionComRepeat\" min=\"0\" step=\"any\" inputmode=\"decimal\" placeholder=\"0 for plain fabric\"></label>' +\n      '<label for=\"cushionComHRepeat\">Horizontal Pattern Repeat (inches):<input type=\"number\" id=\"cushionComHRepeat\" min=\"0\" step=\"any\" inputmode=\"decimal\" placeholder=\"0 if none\"></label>' +\n      '<label class=\"trh-k4-row\" for=\"cushionComRailroaded\"><input type=\"checkbox\" id=\"cushionComRailroaded\"> My fabric is railroaded (pattern runs across the roll)</label></div>'), colorLbl.nextSibling);\n    ['cushionComRepeat', 'cushionComHRepeat', 'cushionComRailroaded'].forEach(function (id) { var e = $(id); if (e) { e.addEventListener('input', updateCalculation); e.addEventListener('change', updateCalculation); } });\n    var own = $('cushionOwnFabric');\n    var syncCom = function () { var s = $('cushionComSpecs'); if (s) s.style.display = own && own.checked ? 'flex' : 'none'; };\n    if (own) own.addEventListener('change', syncCom); syncCom();\n    /* the edge finish choice moves to the cards; the select stays (hidden) as the source of truth */\n    var edge = $('cushion-edge'); if (edge && edge.closest('label')) edge.closest('label').style.display = 'none';\n    if (edge && !edge.value) edge.value = 'Band with Welt';\n    var w = $('cushion-welt'); if (w && !w.value) w.value = 'Self Welt';\n    var yd = $('cushion-yardage-display'); if (yd) yd.style.display = 'none';\n    var pr = $('cushion-pricing-display');\n    if (pr && !$('cushionOptions')) pr.parentNode.insertBefore(K.el('<div id=\"cushionOptions\" class=\"trh-dc3-options\"></div>'), pr);\n    var box = $('cushionOptions');\n    if (box) box.addEventListener('change', function (e) {\n      if (e.target && e.target.name === 'trhCuOpt' && edge) { edge.value = e.target.value; if (/with Welt/.test(edge.value) && w && !w.value) w.value = 'Self Welt'; updateConditionalUI(); }\n    });\n    _bar = K.stickyBar($('cushionCalculatorWrapper') || form, $('cushion-add-to-cart'), handleAddToCart);\n    if (!$('trhCuV5Css')) { var cs = document.createElement('style'); cs.id = 'trhCuV5Css'; cs.textContent = '[id^=\"price-template--\"],shopify-payment-terms{display:none!important}'; document.head.appendChild(cs); }   /* TRH CUSHION V5: one live price */\n  }\n  function updateYardageDisplay(result) { var el = $('cushion-yardage-display'); if (el) { el.innerHTML = ''; el.style.display = 'none'; } }\n\n  function updatePricingDisplay(result) {\n    var el = $('cushion-pricing-display');\n    if (!el) return;\n    if (!result || (!_selectedFabric && !_ownFabric)) { el.style.display = 'none'; el.innerHTML = ''; return; }\n    var b = result.breakdown, y = result.yardage, q = result.inputs.quantity, rows = [];\n    rows.push('<p class=\"trh-dc3-total\">Total: ' + K.money(result.totalC) + '</p><div class=\"trh-dc3-break\">');\n    if (q > 1) rows.push('<p><strong>Cushions:</strong> ' + q + ' identical, ' + K.money(result.eachC) + ' per cushion</p>');\n    /* TRH 2026-10-30 hide breakdown: no labor, sewing / fill prices or cost lines */\n    if (_ownFabric) rows.push('<p><strong>Fabric to send (your own):</strong> ' + y.fabricYardsFinal + ' yards</p>');\n    else rows.push('<p><strong>Fabric:</strong> ' + K.esc(_FM().label(y.fabricYardsFinal, _selectedFabric)) + (y.minApplied ? ' (this fabric\\u2019s minimum order)' : '') + '</p>');\n    if (y.selfWeltYards) rows.push('<p class=\"trh-dc3-small\">Includes ' + y.selfWeltYards + ' yd for the self welt (cording).</p>');\n    if (result.inputs.weltType === 'Trim') rows.push('<p><strong>Trim:</strong> ' + y.trimYards + ' yards' + (_ownTrim ? ' (your own)' : '') + '</p>');\n    if (result.inputs.weltType === 'Contrast Fabric Welt') rows.push('<p><strong>Contrast welt fabric:</strong> ' + (_ownContrast ? y.contrastYards + (y.contrastYards === 1 ? ' yard' : ' yards') + ' (your own)' : K.esc(_FM().label(y.contrastYards, _selectedContrast))) + '</p>');\n    rows.push('</div>');\n    el.innerHTML = rows.join('');\n    el.style.display = 'block';\n  }\n\n  function pricingRow(label, amount) {\n    return '<div class=\"cushion-pricing-row\"><span>' + label + '</span><span>$' + Math.ceil(amount) + '</span></div>';\n  }\n\n  function escapeHTML(str) {\n    if (!str) return '';\n    var d = document.createElement('div');\n    d.appendChild(document.createTextNode(str));\n    return d.innerHTML;\n  }\n\n  // -------------------------------------------------------------------------\n  // Swatch preview management (matches drapery pattern)\n  // -------------------------------------------------------------------------\n\n  function showFabricSwatch(fabric) {\n    var preview = $('cushionFabricSwatchPreview');\n    var img = $('cushionFabricSwatchImage');\n    var price = $('cushionFabricSwatchPrice');\n    var clearBtn = $('cushionFabricClearBtn');\n    if (!preview) return;\n\n    if (img && fabric.imageUrl) { img.src = fabric.imageUrl; img.alt = fabric.title || ''; }\n    if (price) price.textContent = '$' + fabric.price.toFixed(2) + _FM().per(fabric);\n    if (clearBtn) clearBtn.classList.add('visible');\n    preview.style.display = 'flex';\n  }\n\n  function hideFabricSwatch() {\n    var preview = $('cushionFabricSwatchPreview');\n    var clearBtn = $('cushionFabricClearBtn');\n    if (preview) preview.style.display = 'none';\n    if (clearBtn) clearBtn.classList.remove('visible');\n  }\n\n  function showTrimSwatch(trim) {\n    var preview = $('cushionTrimSwatchPreview');\n    var img = $('cushionTrimSwatchImage');\n    var price = $('cushionTrimSwatchPrice');\n    var clearBtn = $('cushionTrimClearBtn');\n    if (!preview) return;\n\n    if (img && trim.imageUrl) { img.src = trim.imageUrl; img.alt = trim.title || ''; }\n    if (price) price.textContent = '$' + trim.price.toFixed(2) + '/yd';\n    if (clearBtn) clearBtn.classList.add('visible');\n    preview.style.display = 'flex';\n  }\n\n  function hideTrimSwatch() {\n    var preview = $('cushionTrimSwatchPreview');\n    var clearBtn = $('cushionTrimClearBtn');\n    if (preview) preview.style.display = 'none';\n    if (clearBtn) clearBtn.classList.remove('visible');\n  }\n\n  function showContrastSwatch(contrast) {\n    var preview = $('cushionContrastSwatchPreview');\n    var img = $('cushionContrastSwatchImage');\n    var price = $('cushionContrastSwatchPrice');\n    var clearBtn = $('cushionContrastClearBtn');\n    if (!preview) return;\n\n    if (img && contrast.imageUrl) { img.src = contrast.imageUrl; img.alt = contrast.title || ''; }\n    if (price) price.textContent = '$' + contrast.price.toFixed(2) + _FM().per(contrast);\n    if (clearBtn) clearBtn.classList.add('visible');\n    preview.style.display = 'flex';\n  }\n\n  function hideContrastSwatch() {\n    var preview = $('cushionContrastSwatchPreview');\n    var clearBtn = $('cushionContrastClearBtn');\n    if (preview) preview.style.display = 'none';\n    if (clearBtn) clearBtn.classList.remove('visible');\n  }\n\n  // -------------------------------------------------------------------------\n  // Thickness validation (max 8\")\n  // -------------------------------------------------------------------------\n\n  function enforceThicknessMax() {\n    var el = $('cushion-thickness');\n    if (!el) return;\n    var val = parseFloat(el.value);\n    if (val > 8) {\n      el.value = 8;\n      showThicknessTooltip();\n    }\n  }\n\n  function showThicknessTooltip() {\n    var tip = $('cushion-thickness-tooltip');\n    if (tip) {\n      tip.style.display = 'block';\n      setTimeout(function () { tip.style.display = 'none'; }, 3000);\n    }\n  }\n\n  // -------------------------------------------------------------------------\n  // COM toggles (matches drapery handleOwnFabricChange / handleOwnTrimChange)\n  // -------------------------------------------------------------------------\n\n  function handleOwnFabricToggle() {\n    var cb = $('cushionOwnFabric');\n    _ownFabric = cb ? cb.checked : false;\n\n    var fabricField = $('cushionFabricField');\n    var browseBtn = $('cushionBrowseFabricsBtn');\n    var customFabricNameLabel = $('cushionCustomFabricName') ? $('cushionCustomFabricName').parentElement : null;\n    var customFabricColorLabel = $('cushionCustomFabricColor') ? $('cushionCustomFabricColor').parentElement : null;\n    var swatchPreview = $('cushionFabricSwatchPreview');\n    var widthField = $('cushion-fabric-width');\n\n    // Show/hide COM fields (parentElement = <label>)\n    if (customFabricNameLabel) customFabricNameLabel.style.display = _ownFabric ? 'block' : 'none';\n    if (customFabricColorLabel) customFabricColorLabel.style.display = _ownFabric ? 'block' : 'none';\n\n    // Disable (not hide) search field and browse button\n    if (fabricField) {\n      fabricField.disabled = _ownFabric;\n      fabricField.value = _ownFabric\n        ? ''\n        : (_selectedFabric ? _selectedFabric.title + ' ($' + _selectedFabric.price.toFixed(2) + _FM().per(_selectedFabric) + ')' : '');\n      if (_ownFabric) {\n        fabricField.classList.remove('selected');\n      } else {\n        fabricField.classList.toggle('selected', !!_selectedFabric);\n      }\n    }\n    if (browseBtn) browseBtn.disabled = _ownFabric;\n    if (swatchPreview) swatchPreview.style.display = _ownFabric ? 'none' : (_selectedFabric ? 'flex' : 'none');\n\n    // Fabric width: editable for own, readonly for store fabric\n    if (widthField) {\n      if (_ownFabric) {\n        _selectedFabric = null;\n        widthField.removeAttribute('readonly');\n        widthField.style.background = '#fff';\n      } else {\n        widthField.setAttribute('readonly', 'readonly');\n        widthField.style.background = '#f0f0f0';\n        if (!_selectedFabric) {\n          widthField.value = DEFAULT_FABRIC_WIDTH;\n        }\n      }\n    }\n\n    updateCalculation();\n  }\n\n  function handleOwnTrimToggle() {\n    var cb = $('cushionOwnTrim');\n    _ownTrim = cb ? cb.checked : false;\n\n    var trimField = $('cushionTrimField');\n    var browseBtn = $('cushionBrowseTrimsBtn');\n    var customTrimNameLabel = $('cushionCustomTrimName') ? $('cushionCustomTrimName').parentElement : null;\n    var customTrimColorLabel = $('cushionCustomTrimColor') ? $('cushionCustomTrimColor').parentElement : null;\n    var swatchPreview = $('cushionTrimSwatchPreview');\n\n    // Show/hide COM fields\n    if (customTrimNameLabel) customTrimNameLabel.style.display = _ownTrim ? 'block' : 'none';\n    if (customTrimColorLabel) customTrimColorLabel.style.display = _ownTrim ? 'block' : 'none';\n\n    // Disable (not hide) search field and browse button\n    if (trimField) {\n      trimField.disabled = _ownTrim;\n      trimField.value = _ownTrim\n        ? ''\n        : (_selectedTrim ? _selectedTrim.title + ' ($' + _selectedTrim.price.toFixed(2) + '/yd)' : '');\n      if (_ownTrim) {\n        trimField.classList.remove('selected');\n      } else {\n        trimField.classList.toggle('selected', !!_selectedTrim);\n      }\n    }\n    if (browseBtn) browseBtn.disabled = _ownTrim;\n    if (swatchPreview) swatchPreview.style.display = _ownTrim ? 'none' : (_selectedTrim ? 'flex' : 'none');\n\n    if (_ownTrim) {\n      _selectedTrim = null;\n    }\n\n    updateCalculation();\n  }\n\n  function handleOwnContrastToggle() {\n    var cb = $('cushionOwnContrast');\n    _ownContrast = cb ? cb.checked : false;\n\n    var contrastField = $('cushionContrastField');\n    var browseBtn = $('cushionBrowseContrastBtn');\n    var customContrastNameLabel = $('cushionCustomContrastName') ? $('cushionCustomContrastName').parentElement : null;\n    var customContrastColorLabel = $('cushionCustomContrastColor') ? $('cushionCustomContrastColor').parentElement : null;\n    var swatchPreview = $('cushionContrastSwatchPreview');\n\n    // Show/hide COM fields\n    if (customContrastNameLabel) customContrastNameLabel.style.display = _ownContrast ? 'block' : 'none';\n    if (customContrastColorLabel) customContrastColorLabel.style.display = _ownContrast ? 'block' : 'none';\n\n    // Disable (not hide) search field and browse button\n    if (contrastField) {\n      contrastField.disabled = _ownContrast;\n      contrastField.value = _ownContrast\n        ? ''\n        : (_selectedContrast ? _selectedContrast.title + ' ($' + _selectedContrast.price.toFixed(2) + _FM().per(_selectedContrast) + ')' : '');\n      if (_ownContrast) {\n        contrastField.classList.remove('selected');\n      } else {\n        contrastField.classList.toggle('selected', !!_selectedContrast);\n      }\n    }\n    if (browseBtn) browseBtn.disabled = _ownContrast;\n    if (swatchPreview) swatchPreview.style.display = _ownContrast ? 'none' : (_selectedContrast ? 'flex' : 'none');\n\n    if (_ownContrast) {\n      _selectedContrast = null;\n    }\n\n    updateCalculation();\n  }\n\n  // -------------------------------------------------------------------------\n  // Photo upload handlers\n  // -------------------------------------------------------------------------\n\n  function handlePhotoFiles(files) {\n    for (var i = 0; i < files.length; i++) {\n      if (files[i].type.indexOf('image/') !== 0) continue;\n      if (_photoFiles.length >= 10) break;\n      _photoFiles.push(files[i]);\n    }\n    renderPhotoThumbs();\n  }\n\n  function removePhoto(index) {\n    _photoFiles.splice(index, 1);\n    renderPhotoThumbs();\n  }\n\n  function renderPhotoThumbs() {\n    var container = $('cushion-photo-thumbs');\n    if (!container) return;\n    container.innerHTML = '';\n\n    _photoFiles.forEach(function (file, idx) {\n      var thumb = document.createElement('div');\n      thumb.className = 'cushion-photo-thumb';\n\n      var img = document.createElement('img');\n      img.alt = file.name;\n      var reader = new FileReader();\n      reader.onload = function (e) { img.src = e.target.result; };\n      reader.readAsDataURL(file);\n\n      var removeBtn = document.createElement('button');\n      removeBtn.type = 'button';\n      removeBtn.className = 'cushion-photo-remove';\n      removeBtn.textContent = '\\u00d7';\n      removeBtn.addEventListener('click', function () { removePhoto(idx); });\n\n      thumb.appendChild(img);\n      thumb.appendChild(removeBtn);\n      container.appendChild(thumb);\n    });\n  }\n\n  function bindPhotoUpload() {\n    var fileInput = $('cushion-photo-input');\n    var uploadArea = $('cushion-upload-area');\n    if (!fileInput || !uploadArea) return;\n\n    addTrackedListener(uploadArea, 'click', function () { fileInput.click(); });\n\n    addTrackedListener(fileInput, 'change', function () {\n      if (fileInput.files && fileInput.files.length > 0) {\n        handlePhotoFiles(fileInput.files);\n        fileInput.value = '';\n      }\n    });\n\n    addTrackedListener(uploadArea, 'dragover', function (e) {\n      e.preventDefault();\n      uploadArea.style.borderColor = '#007cba';\n      uploadArea.style.background = '#f0f8ff';\n    });\n\n    addTrackedListener(uploadArea, 'dragleave', function () {\n      uploadArea.style.borderColor = '';\n      uploadArea.style.background = '';\n    });\n\n    addTrackedListener(uploadArea, 'drop', function (e) {\n      e.preventDefault();\n      uploadArea.style.borderColor = '';\n      uploadArea.style.background = '';\n      if (e.dataTransfer && e.dataTransfer.files) {\n        handlePhotoFiles(e.dataTransfer.files);\n      }\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // Clear button handlers\n  // -------------------------------------------------------------------------\n\n  function clearFabricSelection() {\n    _selectedFabric = null;\n    hideFabricSwatch();\n    var field = $('cushionFabricField');\n    if (field) { field.value = ''; field.classList.remove('selected'); }\n    var widthField = $('cushion-fabric-width');\n    if (widthField && !_ownFabric) {\n      widthField.value = DEFAULT_FABRIC_WIDTH;\n      widthField.readOnly = true;\n      widthField.style.background = '#f0f0f0';\n    }\n    // Dispatch trh:fabric-cleared so fabric browser syncs\n    document.dispatchEvent(new CustomEvent('trh:fabric-cleared'));\n    updateCalculation();\n  }\n\n  function clearTrimSelection() {\n    _selectedTrim = null;\n    hideTrimSwatch();\n    var field = $('cushionTrimField');\n    if (field) { field.value = ''; field.classList.remove('selected'); }\n    document.dispatchEvent(new CustomEvent('trh:trim-cleared'));\n    updateCalculation();\n  }\n\n  function clearContrastSelection() {\n    _selectedContrast = null;\n    hideContrastSwatch();\n    var field = $('cushionContrastField');\n    if (field) { field.value = ''; field.classList.remove('selected'); }\n    updateCalculation();\n  }\n\n  // -------------------------------------------------------------------------\n  // Contrast fabric search autocomplete\n  // -------------------------------------------------------------------------\n\n  /** @type {number} Sequence counter guarding against stale async search renders */\n  var _contrastSearchSeq = 0;\n\n  async function showContrastSuggestions(query) {\n    var suggestionsEl = $('cushionContrastSuggestions');\n    var field = $('cushionContrastField');\n    if (!suggestionsEl) return;\n\n    var normalized = (query || '').normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase();\n    if (!normalized || normalized.length < 1) {\n      suggestionsEl.style.display = 'none';\n      suggestionsEl.innerHTML = '';\n      return;\n    }\n\n    var seq = ++_contrastSearchSeq;\n    suggestionsEl.innerHTML = '<div class=\"search-no-results\">Searching\\u2026</div>';\n    suggestionsEl.style.display = 'block';\n\n    /* Search the FULL fabric inventory server-side (the store has 5,000+\n     * fabrics \\u2014 TRHFabricBrowser.getAllFabrics() is a bounded cache and\n     * must not be used for search). */\n    var matches = [];\n    if (typeof window.TRHFabricBrowser !== 'undefined' &&\n        typeof window.TRHFabricBrowser.searchFabrics === 'function') {\n      try {\n        matches = await window.TRHFabricBrowser.searchFabrics(query, 10);\n      } catch (err) {\n        console.error('[TRHCushionCalculator] Contrast fabric search failed:', err);\n        if (seq !== _contrastSearchSeq) return;\n        suggestionsEl.innerHTML = '<div class=\"search-no-results\">Search is temporarily unavailable. Please try again.</div>';\n        return;\n      }\n    }\n\n    if (seq !== _contrastSearchSeq) return; /* superseded by a newer keystroke */\n\n    suggestionsEl.innerHTML = '';\n    if (matches.length === 0) {\n      suggestionsEl.innerHTML = '<div class=\"search-no-results\">No fabrics found</div>';\n    } else {\n      matches.forEach(function (item) {\n        var row = document.createElement('div');\n        row.className = 'search-suggestion';\n\n        var img = document.createElement('img');\n        img.src = item.imageUrl;\n        img.alt = item.title;\n        img.className = 'fabric-image';\n\n        var details = document.createElement('div');\n        details.className = 'fabric-details';\n        details.innerHTML = '<p class=\"fabric-name\">' + escapeHTML(item.title) + '</p>' +\n          '<p class=\"fabric-price\">$' + item.price.toFixed(2) + '/yd</p>';\n\n        row.appendChild(img);\n        row.appendChild(details);\n\n        row.addEventListener('click', function () {\n          _selectedContrast = { id: item.id, title: item.title, price: item.price, imageUrl: item.imageUrl || '' };\n          if (field) { field.value = item.title; field.classList.add('selected'); }\n          showContrastSwatch(_selectedContrast);\n          suggestionsEl.style.display = 'none';\n          suggestionsEl.innerHTML = '';\n          updateCalculation();\n        });\n\n        suggestionsEl.appendChild(row);\n      });\n    }\n    suggestionsEl.style.display = 'block';\n  }\n\n  // -------------------------------------------------------------------------\n  // Validation\n  // -------------------------------------------------------------------------\n\n  function validateForCart() {\n    var length = parseFloat(($('cushion-length') || {}).value);\n    var width = parseFloat(($('cushion-width') || {}).value);\n    var thickness = parseFloat(($('cushion-thickness') || {}).value);\n\n    if (!length || length <= 0) return 'Please enter a valid length.';\n    if (!width || width <= 0) return 'Please enter a valid width/depth.';\n    if (!thickness || thickness <= 0) return 'Please enter a valid thickness.';\n    if (thickness > 8) return 'Maximum thickness is 8 inches.';\n\n    var edge = ($('cushion-edge') || {}).value;\n    if (!edge) return 'Please select an edge finish.';\n    var qv = parseInt(($('cushion-quantity') || {}).value, 10);\n    if (!(qv >= 1 && qv <= MAX_QTY)) return 'Enter 1 to ' + MAX_QTY + ' cushions (for more, please contact us).';\n\n    var fill = ($('cushion-fill') || {}).value;\n    if (!fill) return 'Please select a fill type.';\n\n    var tufting = ($('cushion-tufting') || {}).value;\n    if (tufting && tufting !== 'No Tufting') {\n      var spacing = ($('cushion-tufting-spacing') || {}).value;\n      if (!spacing) return 'Please select a tufting spacing.';\n    }\n\n    // Fabric required unless COM\n    if (!_ownFabric && !_selectedFabric) {\n      return 'Please select a fabric or check \"Use My Own Fabric\".';\n    }\n    if (_ownFabric) {\n      var comFabricName = ($('cushionCustomFabricName') || {}).value || '';\n      if (!comFabricName.trim()) {\n        return 'Please enter your fabric pattern name.';\n      }\n    }\n\n    // Trim required if welt = Trim\n    var weltSection = $('cushion-welt-section');\n    var weltSelect = $('cushion-welt');\n    if (weltSection && weltSection.style.display !== 'none' && weltSelect) {\n      if (weltSelect.value === 'Trim' && !_ownTrim && !_selectedTrim) {\n        return 'Please select a trim or check \"Use My Own Trim\".';\n      }\n      if (weltSelect.value === 'Trim' && _ownTrim) {\n        var comTrimName = ($('cushionCustomTrimName') || {}).value || '';\n        if (!comTrimName.trim()) {\n          return 'Please enter your trim pattern name.';\n        }\n      }\n      if (weltSelect.value === 'Contrast Fabric Welt' && !_ownContrast && !_selectedContrast) {\n        return 'Please select a contrast fabric or check \"Use My Own Fabric\".';\n      }\n      if (weltSelect.value === 'Contrast Fabric Welt' && _ownContrast) {\n        var comContrastName = ($('cushionCustomContrastName') || {}).value || '';\n        if (!comContrastName.trim()) {\n          return 'Please enter your contrast fabric pattern name.';\n        }\n      }\n    }\n\n    return null;\n  }\n\n  // -------------------------------------------------------------------------\n  // Add to Cart (/cart/add.js \u2014 $1 variant x dollar amount, same as drapery)\n  // -------------------------------------------------------------------------\n\n  function buildCartItems(result) {\n    var items = [];\n    var groupId = 'cush-' + Date.now() + '-' + Math.random().toString(36).substr(2, 5);\n    var b = result.breakdown;\n    var y = result.yardage;\n    var inp = result.inputs;\n\n    var cushionCost = Math.max(Math.round(b.cushionTotal), 1);\n\n    var properties = {\n      '_group_id': groupId,\n      '_cushion_order': 'true',\n      'Total Price': K.money(result.totalC),\n      'Cushions': inp.quantity > 1 ? inp.quantity + ' identical (' + K.money(result.eachC) + ' per cushion)' : '1 cushion',\n      '_Labor': '$' + b.cushionTotal + ' (sewing $' + b.sewPrice + ' + fill $' + b.fillPrice + (b.tuftingPrice ? ' + tufting $' + b.tuftingPrice : '') + ' = $' + b.perCushionPrice + ' each)',\n      'Length': inp.length + '\"',\n      'Width/Depth': inp.width + '\"',\n      'Thickness': inp.thickness + '\"',\n      'Edge Finish': inp.edgeFinish,\n      'Fill': inp.fillType,\n      'Quantity': String(inp.quantity)\n    };\n\n    if (inp.tuftingType !== 'No Tufting') {\n      properties['Tufting'] = inp.tuftingType;\n      properties['Tufting Spacing'] = inp.tuftingSpacing + '\"';\n      properties['Button Count'] = String(b.buttonCount);\n    }\n\n    if (inp.weltType) {\n      properties['Welt'] = inp.weltType;\n    } else if (/No Welt/.test(inp.edgeFinish || '')) {\n      properties['Welt'] = 'No Welt';\n    }\n\n\n    // Fabric info (matches drapery property format)\n    if (_ownFabric) {\n      var comFabricName = ($('cushionCustomFabricName') || {}).value || '';\n      var comFabricColor = ($('cushionCustomFabricColor') || {}).value || '';\n      properties['Fabric'] = comFabricName + (comFabricColor ? ' - ' + comFabricColor : '') + ' (Customer Fabric)';\n    } else if (_selectedFabric) {\n      properties['Fabric'] = _selectedFabric.title + ' (' + _FM().label(y.fabricYardsFinal, _selectedFabric) + ')';\n      properties['_Fabric Cost'] = _FM().label(y.fabricYardsFinal, _selectedFabric) + ' @ $' + _selectedFabric.price.toFixed(2) + _FM().per(_selectedFabric) + ' = ' + K.money(b.fabricCostC);\n    }\n\n    // Trim info (matches drapery property format)\n    if (inp.weltType === 'Trim') {\n      if (_ownTrim) {\n        var comTrimName = ($('cushionCustomTrimName') || {}).value || '';\n        var comTrimColor = ($('cushionCustomTrimColor') || {}).value || '';\n        properties['Trim'] = comTrimName + (comTrimColor ? ' - ' + comTrimColor : '') + ' (Customer Trim)';\n      } else if (_selectedTrim) {\n        properties['Trim'] = _selectedTrim.title + ' (' + y.trimYards + ' yards)';\n        properties['_Trim Cost'] = y.trimYards + ' yards @ $' + _selectedTrim.price.toFixed(2) + '/yd = ' + K.money(b.trimCostC);\n      }\n    }\n\n    // Contrast info (matches drapery property format)\n    if (inp.weltType === 'Contrast Fabric Welt') {\n      if (_ownContrast) {\n        var comContrastName = ($('cushionCustomContrastName') || {}).value || '';\n        var comContrastColor = ($('cushionCustomContrastColor') || {}).value || '';\n        properties['Contrast Fabric'] = comContrastName + (comContrastColor ? ' - ' + comContrastColor : '') + ' (Customer Fabric)';\n      } else if (_selectedContrast) {\n        properties['Contrast Fabric'] = _selectedContrast.title + ' (' + _FM().label(y.contrastYards, _selectedContrast) + ')';\n        properties['_Contrast Cost'] = _FM().label(y.contrastYards, _selectedContrast) + ' @ $' + _selectedContrast.price.toFixed(2) + _FM().per(_selectedContrast) + ' = ' + K.money(b.contrastCostC);\n      }\n    }\n\n    // Notes\n    var notes = ($('cushion-notes') || {}).value || '';\n    if (notes) properties['Customer Notes'] = notes;\n\n    // Photos\n    if (_photoFiles.length > 0) {\n      properties['Reference Photos'] = _photoFiles.length + ' photo(s) \u2014 will be sent via email';\n    }\n\n    // Yardage\n    properties['Fabric Yardage'] = (_ownFabric ? y.fabricYardsFinal + ' yards to send' : _FM().label(y.fabricYardsFinal, _selectedFabric)) + ' (needed ' + y.neededYards + ' yd' + (y.repeatExtra ? ', incl. ' + y.repeatExtra + ' yd pattern repeat' : '') + (y.selfWeltYards ? ', incl. ' + y.selfWeltYards + ' yd self welt' : '') + ')';\n    var pt = result.pattern;\n    properties['Pattern Repeat'] = pt.vr > 0 || pt.hr > 0 ? (pt.vr ? pt.vr + '\" vertical' : '') + (pt.hr ? (pt.vr ? ' x ' : '') + pt.hr + '\" horizontal' : '') + ', plates cut to whole repeats (+1 repeat for placement)' : 'None';\n    properties['Fabric Width'] = pt.fabricWidth + ' in' + (pt.railroaded ? ', railroaded' : '');\n    properties['Cut Plan'] = 'plates ' + y.layout.plateDown + '\" x ' + y.layout.plateAcross + '\", ' + y.layout.platesAcross + ' across' + (y.layout.rotated ? ' (railroaded)' : '');\n    properties._labor = 'true';\n    K.lock(properties, inp.quantity + ' cushion' + (inp.quantity === 1 ? '' : 's'));\n    if (y.trimYards > 0) properties['Trim Yardage'] = y.trimYards + ' yards';\n    if (y.contrastYards > 0) properties['Contrast Yardage'] = _ownContrast ? y.contrastYards + ' yards' : _FM().label(y.contrastYards, _selectedContrast);\n\n    // 1. Cushion product\n    items.push({\n      id: _config.variantId,\n      quantity: cushionCost,\n      properties: properties\n    });\n\n    // 2. Fabric (separate line item)\n    if (!_ownFabric && _selectedFabric && _selectedFabric.id) {\n      items.push({\n        id: parseInt(_selectedFabric.id, 10),\n        quantity: y.fabricYardsFinal,\n        properties: {\n          '_group_id': groupId,\n          '_is_sub_item': 'true',\n          'For': 'Custom Cushion - ' + (inp.length + 'x' + inp.width + 'x' + inp.thickness),\n          'Yardage': _FM().label(y.fabricYardsFinal, _selectedFabric)\n          , '_locked': 'true', '_lock_label': _FM().label(y.fabricYardsFinal, _selectedFabric), '_calc': 'v4'\n        }\n      });\n    }\n\n    // 3. Trim (separate line item)\n    if (inp.weltType === 'Trim' && !_ownTrim && _selectedTrim && _selectedTrim.id && y.trimYards > 0) {\n      items.push({\n        id: parseInt(_selectedTrim.id, 10),\n        quantity: y.trimYards,\n        properties: {\n          '_group_id': groupId,\n          '_is_sub_item': 'true',\n          'For': 'Custom Cushion (Trim)',\n          'Yardage': y.trimYards + ' yards'\n          , '_locked': 'true', '_lock_label': y.trimYards + ' yd trim', '_calc': 'v4'\n        }\n      });\n    }\n\n    // 4. Contrast fabric (separate line item)\n    if (inp.weltType === 'Contrast Fabric Welt' && !_ownContrast && _selectedContrast && _selectedContrast.id && y.contrastYards > 0) {\n      items.push({\n        id: parseInt(_selectedContrast.id, 10),\n        quantity: y.contrastYards,\n        properties: {\n          '_group_id': groupId,\n          '_is_sub_item': 'true',\n          'For': 'Custom Cushion (Contrast Welt)',\n          'Yardage': _FM().label(y.contrastYards, _selectedContrast)\n          , '_locked': 'true', '_lock_label': _FM().label(y.contrastYards, _selectedContrast), '_calc': 'v4'\n        }\n      });\n    }\n\n    return items;\n  }\n\n  function handleAddToCart() {\n    if (_isSubmitting) return;\n\n    var error = validateForCart();\n    if (error) {\n      showMessage(error, true);\n      return;\n    }\n\n    var result = calculateAll();\n    if (!result || result.breakdown.cushionTotal <= 0) {\n      showMessage('Unable to calculate price. Please verify your selections.', true);\n      return;\n    }\n\n    _isSubmitting = true;\n    var btn = $('cushion-add-to-cart');\n    if (btn) { btn.disabled = true; btn.textContent = 'Processing...'; }\n\n    // Show loading bar\n    var msgEl = $('cushion-cart-message');\n    var loadingBar = $('cushionLoadingBar');\n    var cartMsg = $('cushionCartMessage');\n    var successIcon = $('cushionSuccessIcon');\n    var viewCartBtn = $('cushionViewCartButton');\n\n    if (msgEl) {\n      msgEl.classList.remove('error');\n      msgEl.style.display = 'flex';\n    }\n    if (successIcon) successIcon.style.display = 'none';\n    if (viewCartBtn) viewCartBtn.style.display = 'none';\n    if (cartMsg) cartMsg.textContent = 'Adding to cart...';\n    if (loadingBar) {\n      loadingBar.style.display = 'block';\n      var bar = loadingBar.querySelector('.loading-bar');\n      if (bar) { bar.classList.remove('animate'); void bar.offsetWidth; bar.classList.add('animate'); }\n    }\n\n    var items = buildCartItems(result);\n    console.log(LOG_PREFIX, 'Adding to cart:', items);\n\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ items: items })\n    })\n      .then(function (response) {\n        if (!response.ok) {\n          return response.json().then(function (data) {\n            throw new Error(data.description || data.message || 'Failed to add to cart');\n          });\n        }\n        return response.json();\n      })\n      .then(function () {\n        console.log(LOG_PREFIX, 'Successfully added to cart.');\n        _isSubmitting = false;\n        if (btn) { btn.disabled = false; btn.textContent = 'Add to Cart'; }\n\n        // Show success state\n        if (loadingBar) loadingBar.style.display = 'none';\n        if (successIcon) successIcon.style.display = '';\n        var successText = 'Added to cart!';\n        if (_photoFiles.length > 0) {\n          successText = 'Added to cart! Please email your reference photos to info@therebornhouse.com';\n        }\n        if (cartMsg) cartMsg.textContent = successText;\n        if (viewCartBtn) viewCartBtn.style.display = '';\n        if (msgEl) { msgEl.classList.remove('error'); msgEl.style.display = 'flex'; }\n      })\n      .catch(function (err) {\n        console.error(LOG_PREFIX, 'Add to cart error:', err);\n        _isSubmitting = false;\n        if (btn) { btn.disabled = false; btn.textContent = 'Add to Cart'; }\n        if (loadingBar) loadingBar.style.display = 'none';\n        showMessage(err.message || 'An error occurred. Please try again.', true);\n      });\n  }\n\n  function showMessage(text, isError) {\n    var msgEl = $('cushion-cart-message');\n    var cartMsg = $('cushionCartMessage');\n    var successIcon = $('cushionSuccessIcon');\n    var loadingBar = $('cushionLoadingBar');\n    var viewCartBtn = $('cushionViewCartButton');\n\n    if (cartMsg) cartMsg.textContent = text;\n    if (successIcon) successIcon.style.display = 'none';\n    if (loadingBar) loadingBar.style.display = 'none';\n    if (viewCartBtn) viewCartBtn.style.display = 'none';\n    if (msgEl) {\n      if (isError) {\n        msgEl.classList.add('error');\n      } else {\n        msgEl.classList.remove('error');\n      }\n      msgEl.style.display = 'flex';\n    }\n  }\n\n  // -------------------------------------------------------------------------\n  // Event binding\n  // -------------------------------------------------------------------------\n\n  function addTrackedListener(target, eventName, handler) {\n    target.addEventListener(eventName, handler);\n    _boundListeners.push({ target: target, event: eventName, handler: handler });\n  }\n\n  function removeAllListeners() {\n    _boundListeners.forEach(function (e) {\n      e.target.removeEventListener(e.event, e.handler);\n    });\n    _boundListeners = [];\n  }\n\n  function bindEvents() {\n    // Dimension inputs\n    ['cushion-length', 'cushion-width', 'cushion-thickness', 'cushion-quantity', 'cushion-fabric-width'].forEach(function (id) {\n      var el = $(id);\n      if (el) {\n        addTrackedListener(el, 'input', function () {\n          if (id === 'cushion-thickness') enforceThicknessMax();\n          updateCalculation();\n        });\n      }\n    });\n\n    // Select dropdowns\n    ['cushion-edge', 'cushion-welt', 'cushion-tufting', 'cushion-tufting-spacing', 'cushion-fill'].forEach(function (id) {\n      var el = $(id);\n      if (el) {\n        addTrackedListener(el, 'change', updateConditionalUI);\n      }\n    });\n\n    // COM toggles\n    var ownFabricCb = $('cushionOwnFabric');\n    if (ownFabricCb) addTrackedListener(ownFabricCb, 'change', handleOwnFabricToggle);\n    var ownTrimCb = $('cushionOwnTrim');\n    if (ownTrimCb) addTrackedListener(ownTrimCb, 'change', handleOwnTrimToggle);\n    var ownContrastCb = $('cushionOwnContrast');\n    if (ownContrastCb) addTrackedListener(ownContrastCb, 'change', handleOwnContrastToggle);\n\n    // Clear buttons\n    var fabricClearBtn = $('cushionFabricClearBtn');\n    if (fabricClearBtn) addTrackedListener(fabricClearBtn, 'click', clearFabricSelection);\n    var trimClearBtn = $('cushionTrimClearBtn');\n    if (trimClearBtn) addTrackedListener(trimClearBtn, 'click', clearTrimSelection);\n    var contrastClearBtn = $('cushionContrastClearBtn');\n    if (contrastClearBtn) addTrackedListener(contrastClearBtn, 'click', clearContrastSelection);\n\n    // Fabric selected/cleared events (from TRHFabricBrowser)\n    addTrackedListener(document, 'trh:fabric-selected', function (e) {\n      var fabric = e.detail ? (e.detail.fabric || e.detail) : null;\n      if (!fabric) return;\n\n      var fabricData = {\n        id: fabric.id,\n        title: fabric.title,\n        price: fabric.price,\n        imageUrl: fabric.imageUrl || '',\n        fabricWidth: fabric.fabricWidth || DEFAULT_FABRIC_WIDTH,\n        verticalRepeat: fabric.verticalRepeat || 0,\n        horizontalRepeat: fabric.horizontalRepeat || 0,\n        minQty: fabric.minQty || null,\n        unit: fabric.unit || null,\n        tags: fabric.tags || null,\n        vendor: fabric.vendor || ''\n      };\n\n      // Route based on browse target\n      if (_browseTarget === 'contrast') {\n        /* TRH welt 2026-10-26: contrast welt must be a sellable Fabric/Vinyl;\n         * put the main fabric back in the shared browser either way */\n        _browseTarget = 'fabric';\n        var fbx = window.TRHFabricBrowser;\n        if (fbx && _selectedFabric) setTimeout(function () { fbx.selectFabric(_selectedFabric); }, 0);\n        else if (fbx) setTimeout(function () { fbx.clearSelection('fabric'); }, 0);\n        if (fbx && fbx.isWeltFabric && !fbx.isWeltFabric(fabric)) { fbx.weltBlocked(fabric); return; }\n        _browseTarget = 'contrast';\n        _selectedContrast = fabricData;\n        var contrastField = $('cushionContrastField');\n        if (contrastField) { contrastField.value = fabric.title; contrastField.classList.add('selected'); }\n        showContrastSwatch(_selectedContrast);\n        _browseTarget = 'fabric'; // reset\n      } else {\n        _selectedFabric = fabricData;\n        var fabricField = $('cushionFabricField');\n        if (fabricField) fabricField.classList.add('selected');\n        showFabricSwatch(_selectedFabric);\n        _meta = null; _metaLoading = true;\n        K.fetchFabricMeta(_config, _selectedFabric, function (m) {\n          _meta = m; _metaLoading = false;\n          var wf = $('cushion-fabric-width'); if (wf && m && m.width) wf.value = m.width;\n          updateCalculation();\n        }, 'cushion');\n        // Auto-fill fabric width\n        var widthField = $('cushion-fabric-width');\n        if (widthField && fabric.fabricWidth) {\n          widthField.value = fabric.fabricWidth;\n          widthField.readOnly = true;\n          widthField.style.background = '#f0f0f0';\n        }\n      }\n\n      hideMessage();\n      updateCalculation();\n    });\n\n    addTrackedListener(document, 'trh:fabric-cleared', function () {\n      // Only clear main fabric (not contrast)\n      if (_browseTarget !== 'contrast') { _meta = null; _metaLoading = false; }\n      if (_browseTarget !== 'contrast') {\n        _selectedFabric = null;\n        hideFabricSwatch();\n        var widthField = $('cushion-fabric-width');\n        if (widthField && !_ownFabric) {\n          widthField.value = DEFAULT_FABRIC_WIDTH;\n          widthField.readOnly = true;\n          widthField.style.background = '#f0f0f0';\n        }\n        updateCalculation();\n      }\n    });\n\n    // Trim selected/cleared events\n    addTrackedListener(document, 'trh:trim-selected', function (e) {\n      var trim = e.detail ? (e.detail.trim || e.detail) : null;\n      if (!trim) return;\n      _selectedTrim = { id: trim.id, title: trim.title, price: trim.price, imageUrl: trim.imageUrl || '', vendor: trim.vendor || '', tags: trim.tags || [] };\n      var trimField = $('cushionTrimField');\n      if (trimField) trimField.classList.add('selected');\n      showTrimSwatch(_selectedTrim);\n      hideMessage();\n      updateCalculation();\n    });\n\n    addTrackedListener(document, 'trh:trim-cleared', function () {\n      _selectedTrim = null;\n      hideTrimSwatch();\n      updateCalculation();\n    });\n\n    // Contrast fabric search autocomplete\n    var contrastField = $('cushionContrastField');\n    var contrastSuggestions = $('cushionContrastSuggestions');\n    if (contrastField && contrastSuggestions) {\n      var debounce = null;\n      addTrackedListener(contrastField, 'input', function () {\n        clearTimeout(debounce);\n        debounce = setTimeout(function () { showContrastSuggestions(contrastField.value); }, 200);\n      });\n      addTrackedListener(contrastField, 'focus', function () {\n        if (contrastField.value.length > 0) showContrastSuggestions(contrastField.value);\n      });\n      addTrackedListener(document, 'click', function (e) {\n        if (!contrastField.contains(e.target) && !contrastSuggestions.contains(e.target)) {\n          contrastSuggestions.style.display = 'none';\n        }\n      });\n    }\n\n    // Photo upload\n    bindPhotoUpload();\n\n    // Add to Cart button\n    var addBtn = $('cushion-add-to-cart');\n    if (addBtn) {\n      addTrackedListener(addBtn, 'click', function (e) {\n        e.preventDefault();\n        handleAddToCart();\n      });\n    }\n  }\n\n  function hideMessage() {\n    var msgEl = $('cushion-cart-message');\n    if (msgEl) msgEl.style.display = 'none';\n  }\n\n  // -------------------------------------------------------------------------\n  // Public API\n  // -------------------------------------------------------------------------\n\n  window.TRHCushionCalculator = {\n\n    /**\n     * Set the browse target before opening the catalog.\n     * 'fabric' (default) routes trh:fabric-selected to _selectedFabric.\n     * 'contrast' routes it to _selectedContrast.\n     */\n    setBrowseTarget: function (target) {\n      _browseTarget = (target === 'contrast') ? 'contrast' : 'fabric';\n    },\n\n    init: function (config) {\n      if (_config) {\n        removeAllListeners();\n        _config = null;\n        _selectedFabric = null;\n        _selectedTrim = null;\n        _selectedContrast = null;\n        _ownFabric = false;\n        _ownTrim = false;\n        _ownContrast = false;\n        _isSubmitting = false;\n        _browseTarget = 'fabric';\n        _photoFiles = [];\n      }\n\n      _config = config || {};\n      var d4 = window.TRH_CALC_DEFAULTS || {};\n      if (!_config.storeDomain) _config.storeDomain = d4.storeDomain || (window.Shopify && window.Shopify.shop) || '';\n      if (!_config.storefrontToken) _config.storefrontToken = d4.storefrontToken || '';\n\n      if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', function () {\n          setupV4();\n          bindEvents();\n          updateConditionalUI();\n          console.log(LOG_PREFIX, 'Initialized (v4).');\n        });\n      } else {\n        setupV4();\n        bindEvents();\n        updateConditionalUI();\n        console.log(LOG_PREFIX, 'Initialized (v4).');\n      }\n    },\n\n    version: 'v4',\n    calculateAll: function (e) { return calculateAll(e); },\n    buildCartItems: function () { var r = calculateAll(); return r ? buildCartItems(r) : null; },\n    getState: function () {\n      return {\n        selectedFabric: _selectedFabric,\n        selectedTrim: _selectedTrim,\n        selectedContrast: _selectedContrast,\n        ownFabric: _ownFabric,\n        ownTrim: _ownTrim,\n        ownContrast: _ownContrast,\n        calculation: calculateAll(), meta: _meta, metaLoading: _metaLoading, version: 'v4'\n      };\n    },\n\n    destroy: function () {\n      removeAllListeners();\n      _config = null;\n      _selectedFabric = null;\n      _selectedTrim = null;\n      _selectedContrast = null;\n      _isSubmitting = false;\n      _browseTarget = 'fabric';\n      console.log(LOG_PREFIX, 'Destroyed.');\n    }\n  };\n})();\n"],
  "mappings": "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",
  "names": ["contrastField"]
}
