{
  "version": 3,
  "sources": ["/cdn/shop/t/42/assets/trh-pillow-calc-v4.js?cb=20261031safari"],
  "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 Pillow Configurator - Browser Module\n * =========================================================================\n * Manages pillow fabric selection, yardage chart lookup, and multi-item\n * add-to-cart for Made-to-Order pillow products (Throw, Lumbar, Bolster).\n *\n * Pillow variants already have correct prices in Shopify. This module adds:\n *   1. Fabric selection via the shared TRHFabricBrowser module\n *   2. Yardage chart lookup based on pillow type + size + edge finish\n *   3. Multi-line-item add-to-cart (pillow variant + fabric + optional trim/contrast)\n *\n * Dependencies:\n *   - window.TRHFabricBrowser (shared fabric/trim selection module)\n *\n * Exposes:\n *   - window.TRHPillowConfigurator.init(config)\n *   - window.TRHPillowConfigurator.getYardage()\n *   - window.TRHPillowConfigurator.getState()\n *\n * @module TRHPillowConfigurator\n * @version 1.0.0\n */\n/* TRH Pillow Configurator v4 (2026-10-30): drapery-v3 look (insert cards with live totals in cents,\n * sticky mobile bar, \"How many pillows like this?\"), screen total = cart total to the cent, pillow\n * fabric/trim tied to the pillow quantity, all made-to-order lines locked in the cart, pattern repeat\n * (each face/body cut to whole repeats + 1 repeat per order) and narrower-than-54\" fabric widths.\n * Pillow prices still come from the product variants (sew + insert + seam finish); no new prices.\n * BOLSTER HOOK: longer bolster sizes (e.g. 8\" x 56\") work as soon as the variant exists. Yardage comes\n * from window.TRH_BOLSTER_YARDAGE['Bolster 8 x 56'] = {noWelt, selfWelt, contrastWelt, trim} if set,\n * else YARDAGE_CHART, else the seamless cut model (bolsterModel) from the bolster size plan. */\n(function () {\n  'use strict';\n  var K = window.TRHCalcKit;\n  var _meta = null, _metaLoading = false, _bar = null, _variants = null, _chosenInsert = null, MAX_QTY = 20;\n\n  /* =========================================================================\n   * CONSTANTS\n   * ========================================================================= */\n\n  /** @const {string} Log prefix for console messages */\n  var LOG_PREFIX = '[TRHPillowConfigurator]';\n\n  /** @const {number} Default fabric width in inches (all chart entries use 54\") */\n  var DEFAULT_FABRIC_WIDTH = 54;\n\n  /** @const {number} Minimum fabric order in yards */\n  var MIN_FABRIC_YARDS = 3;\n\n  /** @const {number} Minimum trim order in yards */\n  var MIN_TRIM_YARDS = 5;\n\n  /** @const {number} Minimum contrast fabric order in yards */\n  var MIN_CONTRAST_YARDS = 3;\n\n  /** @const {string} Yardage disclaimer note */\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  /* =========================================================================\n   * YARDAGE CHART\n   * =========================================================================\n   * Lookup table keyed by \"{Type} {Size}\" (e.g., \"Lumbar 10 x 18\").\n   * Each entry contains yardage values for all edge finish scenarios.\n   *\n   * Fields:\n   *   noWelt       - Fabric yards when edge finish is \"No Welt\"\n   *   selfWelt     - Fabric yards when edge finish is \"Self Welt\"\n   *   contrastWelt - Additional fabric yards for contrast welt piece\n   *   trim         - Trim yardage for trim-based edge finishes\n   */\n  var YARDAGE_CHART = {\n    // -- LUMBAR PILLOW SIZES --------------------------------------------------\n    'Lumbar 10 x 18':  { noWelt: 0.33, selfWelt: 0.58, contrastWelt: 0.25, trim: 1.36 },\n    'Lumbar 10 x 20':  { noWelt: 0.33, selfWelt: 0.58, contrastWelt: 0.25, trim: 1.75 },\n    'Lumbar 10 x 22':  { noWelt: 0.33, selfWelt: 0.58, contrastWelt: 0.25, trim: 1.87 },\n    'Lumbar 12 x 18':  { noWelt: 0.39, selfWelt: 0.64, contrastWelt: 0.25, trim: 1.75 },\n    'Lumbar 12 x 20':  { noWelt: 0.39, selfWelt: 0.69, contrastWelt: 0.30, trim: 1.87 },\n    'Lumbar 12 x 22':  { noWelt: 0.39, selfWelt: 0.69, contrastWelt: 0.30, trim: 1.98 },\n    'Lumbar 12 x 34':  { noWelt: 0.78, selfWelt: 1.13, contrastWelt: 0.35, trim: 2.68 },\n    'Lumbar 12 x 40':  { noWelt: 0.78, selfWelt: 1.13, contrastWelt: 0.35, trim: 3.03 },\n    'Lumbar 14 x 18':  { noWelt: 0.44, selfWelt: 0.69, contrastWelt: 0.25, trim: 1.87 },\n    'Lumbar 14 x 20':  { noWelt: 0.44, selfWelt: 0.74, contrastWelt: 0.30, trim: 1.98 },\n    'Lumbar 14 x 26':  { noWelt: 0.89, selfWelt: 1.19, contrastWelt: 0.30, trim: 2.33 },\n    'Lumbar 14 x 46':  { noWelt: 0.89, selfWelt: 1.34, contrastWelt: 0.45, trim: 3.50 },\n    'Lumbar 18 x 22':  { noWelt: 0.56, selfWelt: 0.86, contrastWelt: 0.30, trim: 2.33 },\n    'Lumbar 20 x 26':  { noWelt: 1.22, selfWelt: 1.52, contrastWelt: 0.30, trim: 2.68 },\n    'Lumbar 20 x 30':  { noWelt: 1.22, selfWelt: 1.57, contrastWelt: 0.35, trim: 2.92 },\n    'Lumbar 20 x 36':  { noWelt: 1.22, selfWelt: 1.62, contrastWelt: 0.40, trim: 3.27 },\n    'Lumbar 25 x 34':  { noWelt: 1.50, selfWelt: 1.95, contrastWelt: 0.45, trim: 3.44 },\n\n    // -- THROW PILLOW SIZES ---------------------------------------------------\n    'Throw 12 x 12':  { noWelt: 0.34, selfWelt: 0.59, contrastWelt: 0.25, trim: 1.40 },\n    'Throw 14 x 14':  { noWelt: 0.44, selfWelt: 0.69, contrastWelt: 0.25, trim: 1.63 },\n    'Throw 16 x 16':  { noWelt: 0.50, selfWelt: 0.75, contrastWelt: 0.25, trim: 1.87 },\n    'Throw 18 x 18':  { noWelt: 0.56, selfWelt: 0.86, contrastWelt: 0.30, trim: 2.10 },\n    'Throw 20 x 20':  { noWelt: 0.61, selfWelt: 0.91, contrastWelt: 0.30, trim: 2.33 },\n    'Throw 22 x 22':  { noWelt: 0.67, selfWelt: 1.02, contrastWelt: 0.35, trim: 2.57 },\n    'Throw 24 x 24':  { noWelt: 0.72, selfWelt: 1.12, contrastWelt: 0.40, trim: 2.80 },\n    'Throw 26 x 26':  { noWelt: 1.56, selfWelt: 2.01, contrastWelt: 0.45, trim: 3.03 },\n    'Throw 28 x 28':  { noWelt: 1.67, selfWelt: 2.12, contrastWelt: 0.45, trim: 3.27 },\n\n    // -- BOLSTER PILLOW SIZES -------------------------------------------------\n    'Bolster 6 x 14':  { noWelt: 0.35, selfWelt: 0.55, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 18':  { noWelt: 0.45, selfWelt: 0.65, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 22':  { noWelt: 0.50, selfWelt: 0.70, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 28':  { noWelt: 0.60, selfWelt: 0.80, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 34':  { noWelt: 0.65, selfWelt: 0.85, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 48':  { noWelt: 0.67, selfWelt: 0.87, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 60':  { noWelt: 1.10, selfWelt: 1.30, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 72':  { noWelt: 1.20, selfWelt: 1.40, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 7 x 14':  { noWelt: 0.35, selfWelt: 0.55, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 18':  { noWelt: 0.45, selfWelt: 0.65, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 22':  { noWelt: 0.50, selfWelt: 0.70, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 28':  { noWelt: 0.63, selfWelt: 0.83, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 34':  { noWelt: 0.66, selfWelt: 0.86, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 48':  { noWelt: 0.90, selfWelt: 1.10, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 60':  { noWelt: 1.15, selfWelt: 1.35, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 72':  { noWelt: 1.25, selfWelt: 1.45, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 8 x 14':  { noWelt: 0.33, selfWelt: 0.58, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 18':  { noWelt: 0.48, selfWelt: 0.73, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 22':  { noWelt: 0.50, selfWelt: 0.75, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 28':  { noWelt: 0.80, selfWelt: 1.05, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 34':  { noWelt: 0.80, selfWelt: 1.05, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 48':  { noWelt: 1.00, selfWelt: 1.25, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 60':  { noWelt: 1.20, selfWelt: 1.45, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 72':  { noWelt: 1.30, selfWelt: 1.55, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 14':  { noWelt: 0.40, selfWelt: 0.65, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 18':  { noWelt: 0.55, selfWelt: 0.80, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 22':  { noWelt: 0.65, selfWelt: 0.90, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 28':  { noWelt: 0.83, selfWelt: 1.08, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 34':  { noWelt: 0.83, selfWelt: 1.08, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 48':  { noWelt: 1.10, selfWelt: 1.35, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 60':  { noWelt: 1.30, selfWelt: 1.55, contrastWelt: 0.25, trim: 1.70 },\n    'Bolster 9 x 72':  { noWelt: 1.40, selfWelt: 1.65, contrastWelt: 0.25, trim: 1.70 }\n  };\n\n  /* ===== TRH BOLSTER V3 BLOCK (2026-10-30, Rachel; bolster task) \u2014 bolster-only, merge as a unit =====\n   * Seamless bolsters 6/7/8\" x 14\u201358\". Values = NORMAL-orientation yardage on 54\" goods.\n   * Rule: if cover length + 1\" > the fabric's usable width (its own width \u2212 2\"), the body is cut in one\n   * piece with the fabric turned (railroaded) and 1 extra yard is added per pillow. Width = pattern().fw\n   * (selected fabric's custom.width via _meta, COM width field for own fabric, else 54\"). */\n  var TRH_BOLSTER_V3 = {\n    'Bolster 6 x 14': { noWelt: 0.35, selfWelt: 0.55, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 22': { noWelt: 0.50, selfWelt: 0.70, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 28': { noWelt: 0.60, selfWelt: 0.80, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 34': { noWelt: 0.65, selfWelt: 0.85, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 40': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 46': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 50': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 52': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 54': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 56': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 6 x 58': { noWelt: 0.75, selfWelt: 0.95, contrastWelt: 0.20, trim: 1.20 },\n    'Bolster 7 x 14': { noWelt: 0.35, selfWelt: 0.55, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 22': { noWelt: 0.50, selfWelt: 0.70, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 28': { noWelt: 0.63, selfWelt: 0.83, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 34': { noWelt: 0.66, selfWelt: 0.86, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 40': { noWelt: 0.86, selfWelt: 1.06, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 46': { noWelt: 0.86, selfWelt: 1.06, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 50': { noWelt: 0.86, selfWelt: 1.06, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 52': { noWelt: 0.90, selfWelt: 1.10, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 54': { noWelt: 0.90, selfWelt: 1.10, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 56': { noWelt: 0.90, selfWelt: 1.10, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 7 x 58': { noWelt: 0.90, selfWelt: 1.10, contrastWelt: 0.20, trim: 1.35 },\n    'Bolster 8 x 14': { noWelt: 0.33, selfWelt: 0.58, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 22': { noWelt: 0.50, selfWelt: 0.75, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 28': { noWelt: 0.80, selfWelt: 1.05, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 34': { noWelt: 0.80, selfWelt: 1.05, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 40': { noWelt: 0.98, selfWelt: 1.23, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 46': { noWelt: 0.98, selfWelt: 1.23, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 50': { noWelt: 0.98, selfWelt: 1.23, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 52': { noWelt: 1.00, selfWelt: 1.25, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 54': { noWelt: 1.00, selfWelt: 1.25, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 56': { noWelt: 1.00, selfWelt: 1.25, contrastWelt: 0.25, trim: 1.50 },\n    'Bolster 8 x 58': { noWelt: 1.00, selfWelt: 1.25, contrastWelt: 0.25, trim: 1.50 }\n  };\n  Object.keys(TRH_BOLSTER_V3).forEach(function (k) { YARDAGE_CHART[k] = TRH_BOLSTER_V3[k]; });\n  var TRH_BOLSTER_TURN_NOTE = 'This length is cut in one piece with the fabric turned (no seams), so 1 extra yard is included. Directional prints and stripes will run along the length.';\n  function trhBolsterTurned(size) {\n    var d = sizeDims(size); if (!d) return false;\n    var fw = pattern().fw || DEFAULT_FABRIC_WIDTH;\n    return (d.b + 1) > (fw - 2);\n  }\n  function trhBolsterChartEntry(key, size) {\n    var e = TRH_BOLSTER_V3[key]; if (!e) return null;\n    if (!trhBolsterTurned(size)) return { key: key, entry: e, source: 'chart' };\n    return { key: key, entry: { noWelt: Math.round((e.noWelt + 1) * 100) / 100, selfWelt: Math.round((e.selfWelt + 1) * 100) / 100, contrastWelt: e.contrastWelt, trim: e.trim }, source: 'one piece, fabric turned, +1 yd' };\n  }\n  /* ===== END TRH BOLSTER V3 BLOCK ===== */\n\n  /* =========================================================================\n   * EDGE FINISH DEFINITIONS\n   * =========================================================================\n   * Maps edge finish option values to their behavior configuration.\n   *\n   * Fields:\n   *   fabricColumn    - Which yardage column to use for main fabric\n   *   needsTrim       - Whether trim selection UI should be shown\n   *   needsContrast   - Whether contrast fabric selection UI should be shown\n   *   isCOM           - Whether this is Customer's Own Material (hides fabric browse)\n   */\n  var EDGE_FINISH_MAP = {\n    'No Welt':              { fabricColumn: 'noWelt',   needsTrim: false, needsContrast: false, isCOM: false },\n    /* TRH welt 2026-10-26 (Rachel): only a contrast welt adds yardage, so self\n     * welt uses the base (noWelt) column. Reverted 2026-10-26 (Rachel): pillows keep the selfWelt allowance column. */\n    'Self Welt':            { fabricColumn: 'selfWelt',   needsTrim: false, needsContrast: false, isCOM: false },\n    'Trim':                 { fabricColumn: 'noWelt',   needsTrim: true,  needsContrast: false, isCOM: false },\n    'Turkish Pucker':       { fabricColumn: 'noWelt',   needsTrim: true,  needsContrast: false, isCOM: false },\n    'Contrast Fabric Welt': { fabricColumn: 'noWelt',   needsTrim: false, needsContrast: true,  isCOM: false },\n    'COM':                  { fabricColumn: 'noWelt',   needsTrim: false, needsContrast: false, isCOM: true  }\n  };\n\n  /* =========================================================================\n   * MODULE STATE\n   * ========================================================================= */\n\n  /** @type {Object|null} Configuration from init() */\n  var _config = null;\n\n  /** @type {Object|null} Currently selected main fabric from TRHFabricBrowser */\n  var _selectedFabric = null;\n\n  /** @type {Object|null} Currently selected trim from TRHFabricBrowser */\n  var _selectedTrim = null;\n\n  /** @type {Object|null} Currently selected contrast fabric from TRHFabricBrowser */\n  var _selectedContrastFabric = null;\n\n  /**\n   * Where the next catalog-popup fabric selection should land: 'fabric'\n   * (the main fabric) or 'contrast'. The shared TRHFabricBrowser catalog\n   * only knows 'fabric'/'trim', so without this flag a selection made via\n   * the contrast \"Browse Fabrics\" button would overwrite the main fabric.\n   * @type {string}\n   */\n  var _fabricBrowseTarget = 'fabric';\n\n  /** @type {string|null} Currently detected size string (e.g., \"18 x 18\") */\n  var _currentSize = null;\n\n  /** @type {string|null} Currently detected edge finish (e.g., \"Self Welt\") */\n  var _currentEdgeFinish = null;\n\n  /** @type {number|null} Currently selected Shopify variant ID */\n  var _currentVariantId = null;\n\n  /** @type {boolean} Whether the customer is providing their own fabric */\n  var _ownFabric = false;\n\n  /** @type {boolean} Whether the customer is providing their own trim */\n  var _ownTrim = false;\n\n  /** @type {boolean} Whether the customer is providing their own contrast fabric */\n  var _ownContrast = false;\n\n  /** @type {boolean} Whether a cart submission is in progress */\n  var _isSubmitting = false;\n\n  /** @type {Object|null} COM (Customer's Own Material) field values */\n  var _comFields = null;\n\n  /* =========================================================================\n   * DOM HELPERS\n   * ========================================================================= */\n\n  /**\n   * Retrieves a DOM element by ID, returning null if not found.\n   * @param {string} id - Element ID\n   * @returns {HTMLElement|null}\n   */\n  function $(id) {\n    return document.getElementById(id);\n  }\n\n  /**\n   * Rounds a number to the specified decimal places.\n   * @param {number} value - Number to round\n   * @param {number} decimals - Number of decimal places\n   * @returns {number} Rounded value\n   */\n  function roundTo(value, decimals) {\n    var factor = Math.pow(10, decimals);\n    return Math.round(value * factor) / factor;\n  }\n\n  /* =========================================================================\n   * VARIANT OPTION DETECTION\n   * =========================================================================\n   * Shopify product pages render variant options as <select> elements or\n   * radio button groups. We need to detect the current Size and Edge Finish\n   * values whenever a customer changes their selection.\n   */\n\n  /**\n   * Reads the currently selected value for a given Shopify variant option name\n   * (e.g., \"Size\", \"Edge Finish\"). Searches through common Shopify theme\n   * selector patterns: <select> elements and radio button groups.\n   *\n   * @param {string} optionName - The option name to look for (case-insensitive)\n   * @returns {string|null} The selected value, or null if not found\n   */\n  function getSelectedOptionValue(optionName) {\n    var lowerName = optionName.toLowerCase();\n\n    // Strategy 1: Look for <select> elements whose associated <label>\n    // contains the option name\n    var selects = document.querySelectorAll(\n      'select[name*=\"option\"], select[data-option-name], .product-form__input select'\n    );\n    for (var i = 0; i < selects.length; i++) {\n      var select = selects[i];\n\n      // Check data-option-name attribute\n      var dataName = select.getAttribute('data-option-name');\n      if (dataName && dataName.toLowerCase() === lowerName) {\n        return select.value;\n      }\n\n      // Check the associated label text\n      var label = _findLabelForElement(select);\n      if (label && label.toLowerCase().indexOf(lowerName) !== -1) {\n        return select.value;\n      }\n    }\n\n    // Strategy 2: Look for checked radio buttons in fieldsets/groups\n    // labeled with the option name\n    var fieldsets = document.querySelectorAll(\n      'fieldset, .product-form__input, [data-option-name]'\n    );\n    for (var j = 0; j < fieldsets.length; j++) {\n      var fieldset = fieldsets[j];\n\n      var fsDataName = fieldset.getAttribute('data-option-name');\n      var legendEl = fieldset.querySelector('legend');\n      var fsLabel = fsDataName || (legendEl ? legendEl.textContent : '');\n\n      if (fsLabel.toLowerCase().indexOf(lowerName) !== -1) {\n        var checkedRadio = fieldset.querySelector('input[type=\"radio\"]:checked');\n        if (checkedRadio) {\n          return checkedRadio.value;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Finds the label text associated with a form element. Checks for\n   * <label> elements with matching `for` attribute, parent label wrappers,\n   * and adjacent siblings.\n   *\n   * @param {HTMLElement} element - The form element\n   * @returns {string|null} Label text, or null if not found\n   * @private\n   */\n  function _findLabelForElement(element) {\n    // Check for label with matching \"for\" attribute\n    if (element.id) {\n      var label = document.querySelector('label[for=\"' + element.id + '\"]');\n      if (label) return label.textContent.trim();\n    }\n\n    // Check parent label wrapper\n    var parent = element.closest('label');\n    if (parent) return parent.textContent.trim();\n\n    // Check previous sibling label\n    var prev = element.previousElementSibling;\n    if (prev && prev.tagName === 'LABEL') return prev.textContent.trim();\n\n    // Check parent container for a label child\n    var container = element.closest('.product-form__input');\n    if (container) {\n      var containerLabel = container.querySelector('label');\n      if (containerLabel) return containerLabel.textContent.trim();\n    }\n\n    return null;\n  }\n\n  /**\n   * Reads the currently selected Shopify variant ID from the product form.\n   * Looks for a hidden input or select with name=\"id\" inside the product form.\n   *\n   * @returns {string|null} Numeric variant ID string, or null\n   */\n  function getSelectedVariantId() {\n    var form = document.querySelector(\n      'form[action*=\"/cart/add\"], form.product-form, form[data-type=\"add-to-cart-form\"]'\n    );\n    if (!form) return null;\n\n    var idInput = form.querySelector('input[name=\"id\"], select[name=\"id\"]');\n    if (idInput) return idInput.value;\n\n    return null;\n  }\n\n  /* =========================================================================\n   * YARDAGE LOOKUP\n   * ========================================================================= */\n\n  /**\n   * Builds the yardage chart lookup key from the pillow type and size.\n   *\n   * @param {string} pillowType - 'throw', 'lumbar', or 'bolster' (case-insensitive)\n   * @param {string} size - Size string from the variant option (e.g., \"18 x 18\")\n   * @returns {string} Lookup key (e.g., \"Throw 18 x 18\")\n   */\n  function buildLookupKey(pillowType, size) {\n    var type = pillowType.charAt(0).toUpperCase() + pillowType.slice(1).toLowerCase();\n    // Strip inch marks (\", \u2033, in, inches) from the size string\n    var cleanSize = size.replace(/[\"\u2033'']/g, '').replace(/\\s*(in|inches)\\b/gi, '').trim();\n    // Normalize multiple spaces to single space\n    cleanSize = cleanSize.replace(/\\s+/g, ' ');\n    return type + ' ' + cleanSize;\n  }\n\n  /**\n   * Looks up yardage values from the chart for the given pillow type, size,\n   * and edge finish combination.\n   *\n   * Returns an object describing fabric yardage for the main fabric, trim\n   * yardage (if applicable), and contrast fabric yardage (if applicable).\n   *\n   * @param {string} pillowType - 'throw', 'lumbar', or 'bolster'\n   * @param {string} size - Size string (e.g., \"18 x 18\")\n   * @param {string} edgeFinish - Edge finish option value (e.g., \"Self Welt\", \"Trim\")\n   * @returns {Object|null} Yardage result object, or null if not found\n   * @returns {number} return.fabricYardage - Main fabric yardage (yards)\n   * @returns {number} return.trimYardage - Trim yardage, 0 if not applicable\n   * @returns {number} return.contrastYardage - Contrast fabric yardage, 0 if not applicable\n   * @returns {string} return.lookupKey - The key used for the chart lookup\n   */\n  function bolsterModel(D, L) {\n    /* seamless cut model (/workspace/bolster_sizes_20261030-1410/gen_v2.py): body pi*D+1 around x L+1 long,\n       2 end circles D+1. Normal orientation when L+1 fits the usable 52\" of 54\" goods; otherwise the body is\n       railroaded (cut down the roll, no seam) and needs one extra yard. Welt adds 0.20 yd (6-7\") / 0.25 yd (8-9\"). */\n    var C = Math.PI * D + 1, usable = DEFAULT_FABRIC_WIDTH - 2, wadd = D >= 8 ? 0.25 : 0.20;\n    var upright = (C + ((usable - (L + 1)) >= 2 * (D + 1) ? 0 : D + 1)) / 36;\n    var b48 = YARDAGE_CHART['Bolster ' + D + ' x 48'];\n    var y = (L + 1) > usable ? Math.max(Math.max(upright, b48 ? b48.noWelt : 0) + 1, (L + 3) / 36) : upright;\n    y = Math.round(y * 100) / 100;\n    var trimByD = { 6: 1.20, 7: 1.35, 8: 1.50, 9: 1.70 };   /* chart trim per diameter (ends) */\n    return { noWelt: y, selfWelt: Math.round((y + wadd) * 100) / 100, contrastWelt: wadd, trim: trimByD[D] || Math.round((C - 1) * 2 / 36 * 100) / 100, model: true };\n  }\n  function chartEntry(pillowType, size) {\n    var key = buildLookupKey(pillowType, size);\n    var ov = (window.TRH_BOLSTER_YARDAGE || {})[key];\n    if (ov) return { key: key, entry: ov, source: 'override' };\n    var dd = pillowType === 'bolster' ? sizeDims(size) : null;\n    /* bolsters longer than 54\" goods can hold (L+1 > 52\") are cut seamless (railroaded), so the old seamed chart rows don't apply */\n    if (dd) { var trhB = trhBolsterChartEntry(key, size); if (trhB) return trhB; } /* TRH BOLSTER V3 */\n    if (dd && dd.b + 1 > DEFAULT_FABRIC_WIDTH - 2) return { key: key, entry: bolsterModel(dd.a, dd.b), source: 'seamless cut model' };\n    if (YARDAGE_CHART[key]) return { key: key, entry: YARDAGE_CHART[key], source: 'chart' };\n    if (pillowType === 'bolster') {\n      var d = sizeDims(size);\n      if (d) return { key: key, entry: bolsterModel(d.a, d.b), source: 'seamless cut model' };\n    }\n    return null;\n  }\n  function sizeDims(size) {\n    var m = String(size || '').replace(/[\"\\u2033'\\u2019]/g, '').match(/(\\d+(?:\\.\\d+)?)\\s*x\\s*(\\d+(?:\\.\\d+)?)/i);\n    return m ? { a: parseFloat(m[1]), b: parseFloat(m[2]) } : null;\n  }\n  /* TRH PILLOW V5: trim follows the pillow edge: perimeter + 4\" overlap (throw / lumbar); bolsters keep the chart (two ends) */\n  function trimByPerimeter(pillowType, size, chartTrim) {\n    var d = sizeDims(size);\n    if (!d || pillowType === 'bolster') return chartTrim;\n    return (2 * (d.a + d.b) + 4) / 36;\n  }\n  function lookupYardage(pillowType, size, edgeFinish) {\n    var ce = chartEntry(pillowType, size);\n    if (!ce) { console.warn(LOG_PREFIX, 'No yardage chart entry for:', size); return null; }\n    var finish = EDGE_FINISH_MAP[edgeFinish];\n    if (!finish) { console.warn(LOG_PREFIX, 'Unknown edge finish:', edgeFinish); return null; }\n    var e = ce.entry;\n    return {\n      fabricYardage: roundTo(e[finish.fabricColumn], 2),\n      trimYardage: finish.needsTrim ? roundTo(trimByPerimeter(pillowType, size, e.trim), 2) : 0,\n      contrastYardage: finish.needsContrast ? roundTo(e.contrastWelt, 2) : 0,\n      lookupKey: ce.key, source: ce.source\n    };\n  }\n  /* Geometry used only for the pattern-repeat / fabric-width ADJUSTMENT to the chart (chart = 54\" plain goods).\n     Throw/lumbar: 2 faces of (A+1) x (B+1) per pillow, B across the roll. Bolster: body pi*D+1 x L+1. */\n  function faceModelInches(pillowType, size, q, fw, vr, hr) {\n    var d = sizeDims(size); if (!d) return 0;\n    if (pillowType === 'bolster') {\n      var C = Math.PI * d.a + 1, long = (d.b + 1) > fw - 2;\n      var down = long ? d.b + 3 : C;\n      return q * (vr > 0 ? K.toRepeat(down, vr) : down);\n    }\n    var down2 = Math.min(d.a, d.b) + 1, across = Math.max(d.a, d.b) + 1;\n    var ac = hr > 0 ? K.toRepeat(across, hr) : across;\n    if (ac > fw) { var t = down2; down2 = across; across = t; ac = hr > 0 ? K.toRepeat(across, hr) : across; }\n    var perRow = Math.max(1, Math.floor(fw / ac));\n    var dn = vr > 0 ? K.toRepeat(down2, vr) : down2;\n    return Math.ceil(2 * q / perRow) * dn;\n  }\n  /* TRH PILLOW V5 2026-10-31 (Rachel): order fabric for q pillows = chart yardage x q + the extra a pattern\n     repeat needs. Motif centered: one repeat to reach the motif, then the rows of pieces (each row rounded to\n     whole repeats), never less than the plain yardage. Uses the fabric's usable width (width - 2\" selvedges).\n     Replaces the old chart + repeat extra + 1 placement repeat (which counted the repeat twice). */\n  function repeatExtraInches(pillowType, size, q, fw, vr, hr) {\n    var d = sizeDims(size); if (!d || !(vr > 0 || hr > 0)) return null;\n    var usable = (fw || DEFAULT_FABRIC_WIDTH) - 2;\n    if (pillowType === 'bolster') {\n      var C = Math.PI * d.a + 1, long = (d.b + 1) > usable;\n      var dn0 = long ? d.b + 3 : C;\n      if (!(vr > 0)) return 0;\n      return Math.max(0, vr + (q - 1) * K.toRepeat(dn0, vr) + dn0 - q * dn0);\n    }\n    var down = Math.min(d.a, d.b) + 1, across = Math.max(d.a, d.b) + 1;\n    if (across > usable) { var t = down; down = across; across = t; }\n    function perRow(step) { return across > usable ? 1 : 1 + Math.floor((usable - across) / step + 1e-9); }\n    var faces = 2 * q;\n    var rowsPlain = Math.ceil(faces / perRow(across)), plain = rowsPlain * down;\n    var ac = hr > 0 ? Math.max(across, K.toRepeat(across, hr)) : across;\n    var rows = Math.ceil(faces / perRow(ac));\n    var rowH = vr > 0 ? K.toRepeat(down, vr) : down;\n    var centered = (vr > 0 ? vr : 0) + (rows - 1) * rowH + down;\n    return { centered: centered, plain: plain };\n  }\n  function orderFabric(base, q) {\n    var p = pattern(), needed = base * q;\n    if (_config && _currentSize) {\n      var rx = repeatExtraInches(_config.pillowType, _currentSize, q, p.fw, p.vr, p.hr);\n      if (typeof rx === 'number') needed = base * q + rx / 36;                       /* bolster: body piece only, chart keeps the ends */\n      else if (rx) {                                                                 /* throw / lumbar: the repeat layout itself, plus the welt allowance */\n        var ce = chartEntry(_config.pillowType, _currentSize), welt = ce ? Math.max(0, base - ce.entry.noWelt) : 0;\n        needed = Math.max(base * q, rx.centered / 36 + welt * q);\n      }\n    }\n    return { needed: roundTo(needed, 3), extra: roundTo(needed - base * q, 2) };\n  }\n  function pattern() {\n    if (_ownFabric) {\n      var fw0 = parseFloat(($('trhPillowComWidth') || {}).value) || DEFAULT_FABRIC_WIDTH;\n      return { fw: fw0, vr: parseFloat(($('trhPillowComRepeat') || {}).value) || 0, hr: parseFloat(($('trhPillowComHRepeat') || {}).value) || 0, match: 'straight', railroaded: false, src: 'your fabric', widthNote: '' };\n    }\n    if (_selectedFabric && _meta) {\n      var r = _meta.match === 'random';\n      return { fw: _meta.width || DEFAULT_FABRIC_WIDTH, vr: r ? 0 : (_meta.vr || 0), hr: r ? 0 : (_meta.hr || 0), match: _meta.match, railroaded: !!_meta.railroaded, src: 'fabric details', widthNote: _meta.widthNote || '' };\n    }\n    return { fw: DEFAULT_FABRIC_WIDTH, vr: 0, hr: 0, match: 'straight', railroaded: false, src: '', widthNote: '' };\n  }\n\n  /* =========================================================================\n   * VARIANT CHANGE DETECTION\n   * =========================================================================\n   * We listen for changes to Shopify variant option selectors to detect\n   * the current size and edge finish, then update the yardage display\n   * and visibility of trim/contrast/COM UI sections.\n   */\n\n  /**\n   * Reads the current variant options from the DOM and updates internal state.\n   * Called whenever a variant option selector changes.\n   */\n  function syncVariantOptions() {\n    // Read the Size option\n    var size = getSelectedOptionValue('Size');\n    if (size) {\n      _currentSize = size.trim();\n    }\n\n    // Read the Edge Finish / Seam Finish option (products may use either name)\n    var edgeFinish = getSelectedOptionValue('Seam Finish') || getSelectedOptionValue('Edge Finish');\n    if (edgeFinish) {\n      _currentEdgeFinish = edgeFinish.trim();\n    }\n\n    // Read the variant ID\n    var variantId = getSelectedVariantId();\n    if (variantId) {\n      _currentVariantId = variantId;\n    }\n\n    // Update the UI based on the new state\n    updateEdgeFinishUI();\n    updateYardageDisplay();\n  }\n\n  /**\n   * Updates the visibility of trim selection, contrast fabric selection,\n   * and COM fields based on the currently selected edge finish.\n   */\n  function updateEdgeFinishUI() {\n    if (!_currentEdgeFinish) return;\n\n    var finish = EDGE_FINISH_MAP[_currentEdgeFinish];\n    if (!finish) return;\n\n    // Trim selection UI visibility\n    var trimSection = $('trh-pillow-trim-section');\n    if (trimSection) {\n      trimSection.style.display = finish.needsTrim ? 'block' : 'none';\n    }\n\n    // Contrast fabric selection UI visibility\n    var contrastSection = $('trh-pillow-contrast-section');\n    if (contrastSection) {\n      contrastSection.style.display = finish.needsContrast ? 'block' : 'none';\n    }\n\n    // COM fields visibility (hide fabric browse, show custom fields)\n    var fabricSection = $('trh-pillow-fabric-section');\n    var comSection = $('trh-pillow-com-section');\n    if (fabricSection) {\n      fabricSection.style.display = finish.isCOM ? 'none' : 'block';\n    }\n    if (comSection) {\n      comSection.style.display = finish.isCOM ? 'block' : 'none';\n    }\n  }\n\n  /**\n   * Handles the COM / Off-Site Fabric checkbox toggle.\n   * Hides fabric browse and shows COM text fields (or vice versa).\n   */\n  function handleOwnFabricToggle() {\n    var cb = $('pillowOwnFabric');\n    _ownFabric = cb ? cb.checked : false;\n\n    var browseSection = $('trh-pillow-fabric-browse-section');\n    var comSection = $('trh-pillow-com-section');\n\n    if (browseSection) browseSection.style.display = _ownFabric ? 'none' : 'block';\n    if (comSection) comSection.style.display = _ownFabric ? 'block' : 'none';\n\n    if (_ownFabric) {\n      _selectedFabric = null;\n    }\n\n    updateYardageDisplay();\n  }\n\n  /**\n   * Handles the COM / Off-Site Trim checkbox toggle.\n   * Hides trim browse and shows COM text fields (or vice versa).\n   */\n  function handleOwnTrimToggle() {\n    var cb = $('pillowOwnTrim');\n    _ownTrim = cb ? cb.checked : false;\n\n    var browseSection = $('trh-pillow-trim-browse-section');\n    var comSection = $('trh-pillow-trim-com-section');\n\n    if (browseSection) browseSection.style.display = _ownTrim ? 'none' : 'block';\n    if (comSection) comSection.style.display = _ownTrim ? 'block' : 'none';\n\n    if (_ownTrim) {\n      _selectedTrim = null;\n    }\n\n    updateYardageDisplay();\n  }\n\n  /**\n   * Handles the COM / Off-Site Contrast Fabric checkbox toggle.\n   * Hides contrast browse and shows COM text fields (or vice versa).\n   */\n  function handleOwnContrastToggle() {\n    var cb = $('pillowOwnContrast');\n    _ownContrast = cb ? cb.checked : false;\n\n    var browseSection = $('trh-pillow-contrast-browse-section');\n    var comSection = $('trh-pillow-contrast-com-section');\n\n    if (browseSection) browseSection.style.display = _ownContrast ? 'none' : 'block';\n    if (comSection) comSection.style.display = _ownContrast ? 'block' : 'none';\n\n    if (_ownContrast) {\n      _selectedContrastFabric = null;\n    }\n\n    updateYardageDisplay();\n  }\n\n  /**\n   * Updates the yardage display element with the current calculated yardage\n   * values. Shows fabric yardage, and trim or contrast yardage when applicable.\n   */\n  /**\n   * Applies the minimum yardage rule: fabric >= 3yd, trim >= 5yd, contrast >= 3yd.\n   * @param {number} yards - Raw yardage from chart\n   * @param {string} type - 'fabric', 'trim', or 'contrast'\n   * @returns {number} Yardage with minimum applied\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    /* TRH fabric min fix 2026-10-26: store fabric -> its own minimum and unit */\n    if (type === 'contrast') return _FM().qty(yards, _selectedContrastFabric);\n    return _FM().qty(yards, _selectedFabric);\n  }\n\n  /** Fabric object for a yardage type ('fabric' or 'contrast'). */\n  function fabricFor(type) {\n    return type === 'contrast' ? _selectedContrastFabric : _selectedFabric;\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  function updateYardageDisplay() {\n    var displayEl = $('trh-pillow-yardage-display');\n    if (displayEl) { displayEl.innerHTML = ''; displayEl.style.display = 'none'; }\n    updatePricingDisplay();\n  }\n\n  /**\n   * Updates the price breakdown display showing pillow + fabric + trim = total.\n   */\n  /* ---------- v4 pricing (exact cents; pillow price = Shopify variant) ---------- */\n  function optIndex(name) {\n    if (!_variants || !_variants.options) return -1;\n    for (var i = 0; i < _variants.options.length; i++) if (String(_variants.options[i].name || _variants.options[i]).toLowerCase() === name) return i;\n    return -1;\n  }\n  function norm(s) { return String(s || '').replace(/[\\u2033\\u201d]/g, '\"').replace(/\\s+/g, ' ').trim(); }\n  function variantFor(size, insert, seam) {\n    if (!_variants) return null;\n    var si = optIndex('size'), ii = optIndex('insert'), fi = optIndex('seam finish');\n    return _variants.variants.filter(function (v) {\n      var o = [v.option1, v.option2, v.option3];\n      return (si < 0 || norm(o[si]) === norm(size)) && (ii < 0 || norm(o[ii]) === norm(insert)) && (fi < 0 || norm(o[fi]) === norm(seam));\n    })[0] || null;\n  }\n  function insertValues() { var ii = optIndex('insert'); return ii < 0 ? [] : (_variants.options[ii].values || []); }\n  function computeFor(insert, seamName) {\n    var seam = seamName || _currentEdgeFinish;\n    if (!_config || !_currentSize || !seam) return null;\n    var finish = EDGE_FINISH_MAP[seam]; if (!finish) return null;\n    var y = lookupYardage(_config.pillowType, _currentSize, seam); if (!y) return null;\n    var v = variantFor(_currentSize, insert, seam);\n    if (!v) return { insert: insert, available: false };\n    var q = getFormQuantity(), r = { insert: insert, available: v.available !== false, variant: v, q: q, y: y, finish: finish };\n    r.pillowC = Math.round(Number(v.price)) * q;          /* product JSON price is in cents */\n    r.fabricQty = 0; r.fabricC = 0; r.trimQty = 0; r.trimC = 0; r.contrastQty = 0; r.contrastC = 0;\n    if (!finish.isCOM) {\n      var of = orderFabric(y.fabricYardage, q);\n      r.fabricNeeded = of.needed; r.repeatExtra = of.extra;\n      if (_ownFabric) r.fabricQty = K.ceil(of.needed);\n      else if (_selectedFabric) { r.fabricQty = applyMinimum(of.needed, 'fabric'); r.fabricC = K.cents(_selectedFabric.price * r.fabricQty); r.minApplied = r.fabricQty > K.ceil(of.needed); }\n    }\n    if (finish.needsTrim && y.trimYardage > 0) {\n      var tn = y.trimYardage * q;\n      r.trimQty = _ownTrim ? K.ceil(tn) : applyMinimum(tn, 'trim');\n      if (!_ownTrim && _selectedTrim) r.trimC = K.cents(_selectedTrim.price * r.trimQty);\n    }\n    if (finish.needsContrast && y.contrastYardage > 0) {\n      var cn = y.contrastYardage * q;\n      r.contrastQty = _ownContrast ? K.ceil(cn) : applyMinimum(cn, 'contrast');\n      if (!_ownContrast && _selectedContrastFabric) r.contrastC = K.cents(_selectedContrastFabric.price * r.contrastQty);\n    }\n    r.totalC = r.pillowC + r.fabricC + r.trimC + r.contrastC;\n    r.eachC = Math.round(r.totalC / q);\n    return r;\n  }\n  function currentInsert() { return getSelectedOptionValue('Insert'); }\n  function setInsert(value) {\n    var selects = document.querySelectorAll('select[name*=\"option\"], select[data-option-name], .product-form__input select');\n    for (var i = 0; i < selects.length; i++) {\n      var lab = (selects[i].getAttribute('data-option-name') || _findLabelForElement(selects[i]) || '').toLowerCase();\n      if (lab.indexOf('insert') !== -1) { selects[i].value = value; selects[i].dispatchEvent(new Event('change', { bubbles: true })); return; }\n    }\n    var radios = document.querySelectorAll('fieldset input[type=\"radio\"]');\n    for (var j = 0; j < radios.length; j++) if (radios[j].value === value) { var fs = radios[j].closest('fieldset'); if (fs && /insert/i.test(fs.textContent)) { radios[j].checked = true; radios[j].dispatchEvent(new Event('change', { bubbles: true })); return; } }\n  }\n  function updatePricingDisplay() {\n    var pricingEl = $('trh-pillow-pricing-display'), box = $('trhPillowOptions');\n    var info = $('trhPillowRepeatInfo');\n    var p = pattern();\n    if (info) info.innerHTML = _metaLoading ? 'Reading fabric details\\u2026' : ((_selectedFabric || _ownFabric) ? K.repeatText({ vr: p.vr, hr: p.hr, match: p.match, railroaded: p.railroaded, widthNote: p.widthNote }, p.src) : '');\n    if (window.TRHRepeatBox) { if (info && !_ownFabric && _selectedFabric && _meta && !_metaLoading) window.TRHRepeatBox.attach('trhPillowRptBox', info, _meta, updateYardageDisplay); else window.TRHRepeatBox.hide('trhPillowRptBox'); }   /* TRH 2026-10-30 */\n    var cur = currentInsert();\n    var finish = _currentEdgeFinish ? EDGE_FINISH_MAP[_currentEdgeFinish] : null;\n    var st = v5State(finish);\n    var r = st.ready ? computeFor(cur) : null;\n    if (st.ready && (!r || !r.available)) { st.ready = false; st.msg = 'Choose an available insert and seam finish'; }\n    v5RenderPicker(st.ready);\n    if (!st.ready) {\n      if (pricingEl) { pricingEl.style.display = 'none'; pricingEl.innerHTML = ''; }\n      if (box) box.innerHTML = '<p class=\"trh-dc3-hint\">' + K.esc(st.msg) + '.</p>';\n      v5Price(null, st.msg);\n      return;\n    }\n    var q = r.q;\n    if (box) box.innerHTML = '';\n    if (pricingEl) {\n      var rows = ['<p class=\"trh-dc3-total\">Total: ' + K.money(r.totalC) + '</p><div class=\"trh-dc3-break\">'];\n      rows.push('<p><strong>Your pillow:</strong> ' + K.esc(v5SizeLabel(_currentSize)) + ', ' + K.esc(v5InsertTitle(cur)) + ', ' + K.esc(_currentEdgeFinish) + '</p>');\n      if (q > 1) rows.push('<p><strong>Pillows:</strong> ' + q + ' identical, ' + K.money(r.eachC) + ' per pillow</p>');\n      /* TRH 2026-10-30 hide breakdown: no sewing/insert price or fabric cost lines */\n      if (finish.isCOM || _ownFabric) rows.push('<p><strong>Fabric to send (your own):</strong> ' + (finish.isCOM ? 'see notes' : r.fabricQty + ' yards') + '</p>');\n      else rows.push('<p><strong>Fabric:</strong> ' + K.esc(_FM().label(r.fabricQty, _selectedFabric)) + (r.minApplied ? ' (this fabric\\u2019s minimum order)' : '') + '</p>');\n      if (finish.needsTrim) rows.push('<p><strong>Trim:</strong> ' + r.trimQty + ' yards' + (_ownTrim ? ' (your own)' : (_selectedTrim && r.trimQty > K.ceil(r.y.trimYardage * q) ? ' (this trim\\u2019s minimum order)' : '')) + '</p>');\n      if (finish.needsContrast) rows.push('<p><strong>Contrast welt fabric:</strong> ' + r.contrastQty + (r.contrastQty === 1 ? ' yard' : ' yards') + (_ownContrast ? ' (your own)' : (_selectedContrastFabric && r.contrastQty > K.ceil(r.y.contrastYardage * q) ? ' (this fabric\\u2019s minimum order)' : '')) + '</p>');\n      if (_config.pillowType === 'bolster' && !finish.isCOM && trhBolsterTurned(_currentSize)) rows.push('<p class=\"trh-dc3-small trh-bolster-turn-note\">' + K.esc(TRH_BOLSTER_TURN_NOTE) + '</p>'); /* TRH BOLSTER V3 */\n      var det = ['Size ' + _currentSize + ', ' + _currentEdgeFinish + ', ' + cur];\n      if (!finish.isCOM) det.push('Fabric needed ' + r.fabricNeeded + ' yd for ' + q + ' pillow' + (q === 1 ? '' : 's') + (r.repeatExtra ? ' (incl. ' + r.repeatExtra + ' yd to center the pattern)' : '') + (r.y.source !== 'chart' ? ' [' + r.y.source + ']' : ''));\n      rows.push('<details class=\"trh-dc3-det\"><summary>Workroom details</summary>' + det.map(K.esc).join('<br>') + '</details>');\n      rows.push('<p class=\"trh-dc3-small\">' + K.esc(yardageNote(finish.isCOM)) + '</p></div>');\n      pricingEl.innerHTML = rows.join('');\n      pricingEl.style.display = 'block';\n    }\n    v5Price(r.totalC, null, (_config.productTitle || 'Pillow').replace(/^MADE TO ORDER /i, '') + ' - ' + v5SizeLabel(_currentSize));\n  }\n\n  /* ===== TRH PILLOW V5 BLOCK (2026-10-31, Rachel t725u) \u2014 size-first picker, only real combinations,\n   * one live price, sticky bar names the missing step. The theme's dropdowns stay (hidden) and still drive\n   * the variant, so add-to-cart is unchanged. ===== */\n  var V5_INSERT_ORDER = ['No Insert', 'Down', 'Down Alternative', 'Outdoor'];\n  var V5_INSERT_INFO = {\n    'No Insert': ['Cover only', 'No insert'],\n    'Down': ['Down', 'Classic down insert'],\n    'Down Alternative': ['Down Alternative', 'Hypoallergenic down-like fill'],\n    'Outdoor': ['Outdoor (waterproof)', 'Water-resistant fill for outdoor use']\n  };\n  var V5_SEAM_INFO = {\n    'No Welt': 'Clean knife edge',\n    'Self Welt': 'Welt cord in the same fabric',\n    'Trim': 'Your choice of trim sewn into the edge',\n    'Turkish Pucker': 'Gathered Turkish corners',\n    'Contrast Fabric Welt': 'Welt cord in a second fabric'\n  };\n  var _v5Note = '', _v5NoteT = null;\n  function v5Attr(s) { return K.esc(s).replace(/\"/g, '&quot;'); }\n  function v5InsertTitle(ins) { return (V5_INSERT_INFO[ins] || [ins])[0]; }\n  function v5SizeLabel(s) { var d = sizeDims(s); return d ? d.a + '\\u2033 \\u00d7 ' + d.b + '\\u2033' : String(s || ''); }\n  function v5Has(size, ins, seam) {\n    if (!_variants) return false;\n    return _variants.variants.some(function (v) {\n      var o = v.options || [];\n      return norm(o[optIndex('size')]) === norm(size) && (ins == null || norm(o[optIndex('insert')]) === norm(ins)) && (seam == null || norm(o[optIndex('seam finish')] || o[optIndex('edge finish')]) === norm(seam)) && v.available !== false;\n    });\n  }\n  function v5Values(name) { var i = optIndex(name); return i < 0 ? [] : (_variants.options[i].values || []); }\n  function v5Sizes() {\n    return v5Values('size').slice().sort(function (x, y) {\n      var a = sizeDims(x), b = sizeDims(y); if (!a || !b) return 0;\n      return a.a - b.a || a.b - b.b;\n    });\n  }\n  function v5Inserts(size) {\n    var vals = v5Values('insert');\n    var ordered = V5_INSERT_ORDER.filter(function (x) { return vals.indexOf(x) !== -1; }).concat(vals.filter(function (x) { return V5_INSERT_ORDER.indexOf(x) === -1; }));\n    return ordered.filter(function (ins) { return v5Has(size, ins, null); });\n  }\n  function v5Seams(size, ins) {\n    var vals = v5Values('seam finish'); if (!vals.length) vals = v5Values('edge finish');\n    return vals.filter(function (s) { return v5Has(size, ins, s); });\n  }\n  function v5SetOptions(size, ins, seam) {\n    var map = { size: size, insert: ins, 'seam finish': seam, 'edge finish': seam }, last = null, changed = [];\n    var selects = document.querySelectorAll('variant-selects select, select[name*=\"option\"]');\n    for (var i = 0; i < selects.length; i++) {\n      var nm = (selects[i].name.match(/options\\[(.+)\\]/) || [])[1] || selects[i].getAttribute('data-option-name') || _findLabelForElement(selects[i]) || '';\n      var want = map[String(nm).toLowerCase().trim()];\n      if (want != null && selects[i].value !== want) {\n        for (var j = 0; j < selects[i].options.length; j++) if (norm(selects[i].options[j].value) === norm(want)) {\n          /* Select via the property first (marks the select \"dirty\"). Safari resets a\n             non-dirty select to its first option when the selected option loses its\n             [selected] attribute, which made every size tap snap back to 12x12. */\n          selects[i].options[j].selected = true; selects[i].selectedIndex = j;\n          changed.push([selects[i], j]); last = selects[i];\n          break;\n        }\n      }\n    }\n    /* The theme reads option[selected] for every select, so move the attribute on each\n       changed select: add it to the new option first, then remove it from the others.\n       The dispatched select is left to the theme's own change handler, which moves it. */\n    for (var c = 0; c < changed.length; c++) {\n      var sel = changed[c][0], idx = changed[c][1];\n      if (sel !== last) {\n        sel.options[idx].setAttribute('selected', 'selected');\n        for (var k = 0; k < sel.options.length; k++) if (k !== idx) sel.options[k].removeAttribute('selected');\n      }\n      if (sel.selectedIndex !== idx) { sel.options[idx].selected = true; sel.selectedIndex = idx; }\n    }\n    if (last) last.dispatchEvent(new Event('change', { bubbles: true }));\n    syncVariantOptions();\n  }\n  function v5Choose(kind, value) {\n    var size = _currentSize, ins = currentInsert(), seam = _currentEdgeFinish, notes = [];\n    if (kind === 'size') size = value; else if (kind === 'insert') ins = value; else seam = value;\n    var insList = v5Inserts(size);\n    if (insList.indexOf(ins) === -1 && insList.length) {\n      var alt = insList[0];\n      if (ins === 'Down Alternative' && insList.indexOf('Down') !== -1) alt = 'Down';\n      else if (ins === 'Down' && insList.indexOf('Down Alternative') !== -1) alt = 'Down Alternative';\n      else if (ins && ins !== 'No Insert') { var other = insList.filter(function (x) { return x !== 'No Insert'; }); if (other.length) alt = other[0]; }\n      /* TRH PILLOW V6 2026-10-31 (Rachel t745u): switch silently, no explanatory note */\n      ins = alt;\n    }\n    var seamList = v5Seams(size, ins);\n    if (seamList.indexOf(seam) === -1 && seamList.length) {\n      seam = seamList[0];\n    }\n    _v5Note = notes.join(' ');\n    clearTimeout(_v5NoteT); if (_v5Note) _v5NoteT = setTimeout(function () { _v5Note = ''; var n = $('trhV5Note'); if (n) n.style.display = 'none'; }, 7000);\n    v5SetOptions(size, ins, seam);\n  }\n  function v5ChipPrice(c) { return c && c.available ? c.totalC : null; }\n  function v5RenderPicker(ready) {\n    var host = $('trhV5Picker'); if (!host || !_variants || !_currentSize) return;\n    var cur = currentInsert(), seam = _currentEdgeFinish, q = getFormQuantity();\n    var shape = _config.pillowType === 'bolster' ? 'Size (diameter \\u00d7 length)' : (_config.pillowType === 'lumbar' ? 'Size (height \\u00d7 width)' : 'Size');\n    var sizes = v5Sizes(), html = [];\n    html.push('<div class=\"trh-v5-h\">' + shape + '</div><div class=\"trh-v5-sizes\" role=\"radiogroup\" aria-label=\"Size\">');\n    sizes.forEach(function (s) {\n      var sel = norm(s) === norm(_currentSize);\n      html.push('<button type=\"button\" class=\"trh-v5-chip' + (sel ? ' is-sel' : '') + '\" role=\"radio\" aria-checked=\"' + sel + '\" data-v5=\"size\" data-val=\"' + v5Attr(s) + '\">' + K.esc(v5SizeLabel(s)) + '</button>');\n    });\n    html.push('</div>');\n    var insList = v5Inserts(_currentSize), missing = v5Values('insert').filter(function (x) { return insList.indexOf(x) === -1; });\n    html.push('<div class=\"trh-v5-h\">Insert</div><div class=\"trh-v5-cards\" role=\"radiogroup\" aria-label=\"Insert\">');\n    insList.forEach(function (ins) {\n      var vs = v5Has(_currentSize, ins, seam) ? seam : (v5Seams(_currentSize, ins)[0] || seam);\n      var price = ready ? v5ChipPrice(computeFor(ins, vs)) : null;\n      var v = variantFor(_currentSize, ins, vs);\n      var fromC = v ? Math.round(Number(v.price)) * q : null;\n      var sel = ins === cur, inf = V5_INSERT_INFO[ins] || [ins, ''];\n      html.push('<button type=\"button\" class=\"trh-v5-card' + (sel ? ' is-sel' : '') + '\" role=\"radio\" aria-checked=\"' + sel + '\" data-v5=\"insert\" data-val=\"' + v5Attr(ins) + '\"><span class=\"trh-v5-t\">' + K.esc(inf[0]) + '</span><span class=\"trh-v5-s\">' + K.esc(inf[1]) + '</span><span class=\"trh-v5-p\">' + (price != null ? K.money(price) : (fromC != null ? 'From ' + K.money(fromC) : '')) + '</span></button>');\n    });\n    html.push('</div>');\n    /* TRH PILLOW V6 2026-10-31 (Rachel t745u): no 'isn't made in this size' text; unavailable inserts are simply not shown */\n    var seams = v5Seams(_currentSize, cur);\n    html.push('<div class=\"trh-v5-h\">Seam finish</div><div class=\"trh-v5-cards\" role=\"radiogroup\" aria-label=\"Seam finish\">');\n    seams.forEach(function (sm) {\n      var price = ready ? v5ChipPrice(computeFor(cur, sm)) : null;\n      var v = variantFor(_currentSize, cur, sm), fromC = v ? Math.round(Number(v.price)) * q : null;\n      var sel = sm === seam;\n      html.push('<button type=\"button\" class=\"trh-v5-card' + (sel ? ' is-sel' : '') + '\" role=\"radio\" aria-checked=\"' + sel + '\" data-v5=\"seam\" data-val=\"' + v5Attr(sm) + '\"><span class=\"trh-v5-t\">' + K.esc(sm) + '</span><span class=\"trh-v5-s\">' + K.esc(V5_SEAM_INFO[sm] || '') + '</span><span class=\"trh-v5-p\">' + (price != null ? K.money(price) : (fromC != null ? 'From ' + K.money(fromC) : '')) + '</span></button>');\n    });\n    html.push('</div>');\n    host.innerHTML = html.join('');\n  }\n  function v5State(finish) {\n    if (!_variants) return { ready: false, msg: 'Loading prices\\u2026' };\n    if (!_currentSize || !finish) return { ready: false, msg: 'Choose a size' };\n    if (!variantFor(_currentSize, currentInsert(), _currentEdgeFinish)) return { ready: false, msg: 'Choose an available insert and seam finish' };\n    if (_metaLoading) return { ready: false, msg: 'Reading fabric details\\u2026' };\n    if (!finish.isCOM && !_ownFabric && !_selectedFabric) return { ready: false, msg: 'Choose a fabric (or your own) to see your price' };\n    if (finish.needsTrim && !_ownTrim && !_selectedTrim) return { ready: false, msg: 'Choose a trim (or your own) to see your price' };\n    if (finish.needsContrast && !_ownContrast && !_selectedContrastFabric) return { ready: false, msg: 'Choose a contrast welt fabric (or your own) to see your price' };\n    return { ready: true, msg: '' };\n  }\n  /* one price: top of page, sticky bar and the Add to Cart button follow the same state */\n  function v5Price(totalC, msg, title) {\n    var v = (_variants && _currentSize) ? variantFor(_currentSize, currentInsert(), _currentEdgeFinish) : null;\n    var fromC = v ? Math.round(Number(v.price)) * getFormQuantity() : null;\n    var top = $('trhV5TopPrice');\n    if (top) top.innerHTML = totalC != null ? '<span class=\"trh-v5-top\">' + K.money(totalC) + ' USD</span>' : (fromC != null ? '<span class=\"trh-v5-top\">From ' + K.money(fromC) + ' USD</span><span class=\"trh-v5-topnote\">' + K.esc(msg || '') + '</span>' : '');\n    if (_bar) {\n      _bar(totalC, title);\n      if (totalC == null) { var bs = document.querySelector('#trhDc3Bar .trh-dc3-bar__s'); if (bs) bs.innerHTML = (fromC != null ? '<b>From ' + K.money(fromC) + '</b><br>' : '') + '<span>' + K.esc(msg || '') + '</span>'; }\n    }\n    var add = $('trh-pillow-add-to-cart');\n    if (add && !_isSubmitting) { add.disabled = totalC == null; add.style.opacity = totalC == null ? '0.55' : ''; add.style.cursor = totalC == null ? 'not-allowed' : ''; add.title = totalC == null ? (msg || '') : ''; }\n  }\n  var V5_CSS = [\n    'variant-selects,.product-form__input--dropdown{display:none!important}',\n    '[id^=\"price-template--\"],shopify-payment-terms,.product__info-container .installment{display:none!important}',\n    '.trh-v5-top{display:block;font-size:1.8rem;letter-spacing:.1rem;margin:.6rem 0 .2rem}',\n    '.trh-v5-topnote{display:block;font-size:12px;color:#777;font-style:italic}',\n    '#trhV5Picker{margin:6px 0 16px}',\n    '.trh-v5-h{font-size:14px;color:#444;margin:14px 0 6px}',\n    '.trh-v5-sizes{display:flex;flex-wrap:wrap;gap:8px}',\n    '.trh-v5-chip{border:1px solid #ccc;border-radius:20px;background:#fff;padding:8px 12px;font-size:13px;color:#333;cursor:pointer;min-width:84px}',\n    '.trh-v5-chip.is-sel{border:2px solid #7C8C74;padding:7px 11px;font-weight:700;box-shadow:0 2px 6px rgba(124,140,116,.3)}',\n    '.trh-v5-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}',\n    '.trh-v5-card{display:flex;flex-direction:column;align-items:flex-start;text-align:left;border:1px solid #ccc;border-radius:10px;background:#fff;padding:10px;cursor:pointer;color:#333;font-family:inherit}',\n    '.trh-v5-card.is-sel{border:2px solid #7C8C74;padding:9px;box-shadow:0 2px 8px rgba(124,140,116,.35)}',\n    '.trh-v5-t{font-weight:700;font-size:13px}',\n    '.trh-v5-s{font-size:11px;color:#777;margin:2px 0 6px}',\n    '.trh-v5-p{font-weight:700;font-size:14px;color:#28a745;margin-top:auto}',\n    '.trh-v5-note{margin:10px 0 0;padding:8px 10px;border-radius:8px;background:#fff8e1;border:1px solid #f0d78c;font-size:12px;color:#6b5500}',\n    '.trh-v5-miss{margin-top:6px;font-size:11.5px;color:#777;line-height:1.4}',\n    '@media (max-width:749px){.trh-v5-cards{grid-template-columns:1fr}.trh-v5-card{display:grid;grid-template-columns:1fr auto;column-gap:10px}.trh-v5-t,.trh-v5-s{grid-column:1}.trh-v5-p{grid-column:2;grid-row:1 / span 2;align-self:center;margin:0;font-size:15px}}'\n  ].join('\\n');\n  function v5Setup() {\n    if (!$('trhV5Css')) { var st = document.createElement('style'); st.id = 'trhV5Css'; st.textContent = V5_CSS; document.head.appendChild(st); }\n    var priceBlock = document.querySelector('[id^=\"price-template--\"]');\n    if (priceBlock && !$('trhV5TopPrice')) priceBlock.parentNode.insertBefore(K.el('<div id=\"trhV5TopPrice\" class=\"trh-v5-topwrap\" aria-live=\"polite\"></div>'), priceBlock.nextSibling);\n    var sec = $('trh-pillow-fabric-section');\n    if (sec && !$('trhV5Picker')) sec.parentNode.insertBefore(K.el('<div id=\"trhV5Picker\" class=\"trh-v5\"></div>'), sec);\n    var host = $('trhV5Picker');\n    if (host) addTrackedListener(host, 'click', function (e) {\n      var b = e.target.closest ? e.target.closest('[data-v5]') : null; if (!b) return;\n      e.preventDefault(); v5Choose(b.getAttribute('data-v5'), b.getAttribute('data-val'));\n    });\n  }\n  /* first load: if the theme opened on a combination that doesn't exist, move to the nearest real one */\n  function v5Normalize() {\n    if (!_variants || !_currentSize) return;\n    if (!variantFor(_currentSize, currentInsert(), _currentEdgeFinish)) { v5Choose('size', _currentSize); _v5Note = ''; }\n  }\n  /* ===== END TRH PILLOW V5 BLOCK ===== */\n\n  /** Builds a single pricing row HTML string. */\n  function row(label, amount) {\n    return '<div class=\"trh-pillow-fabric__pricing-row\"><span>' + label + '</span><span>$' + Math.ceil(amount) + '</span></div>';\n  }\n\n  /**\n   * Reads the current variant price from the product page DOM.\n   * @returns {number} Price in dollars\n   */\n  function getVariantPrice() {\n    var priceEl = document.querySelector('.price-item--regular, .price .money, .product__price .money, [data-product-price]');\n    if (priceEl) {\n      var text = priceEl.textContent.replace(/[^0-9.]/g, '');\n      var val = parseFloat(text);\n      if (!isNaN(val)) return val;\n    }\n    return 0;\n  }\n\n  /* =========================================================================\n   * ADD TO CART\n   * =========================================================================\n   * Intercepts the product form submission and sends a multi-item POST\n   * to /cart/add.js containing:\n   *   1. The pillow variant (with fabric/trim metadata as line item properties)\n   *   2. The fabric variant (with calculated yardage as quantity)\n   *   3. Optionally: trim variant or contrast fabric variant\n   */\n\n  /**\n   * Validates that all required selections have been made before allowing\n   * add-to-cart. Returns an error message string if invalid, or null if valid.\n   *\n   * @returns {string|null} Error message, or null if valid\n   */\n  function validateForCart() {\n    if (!_currentVariantId) {\n      return 'Please select a pillow size and edge finish.';\n    }\n\n    if (!_currentSize || !_currentEdgeFinish) {\n      return 'Please select a pillow size and edge finish.';\n    }\n\n    var finish = EDGE_FINISH_MAP[_currentEdgeFinish];\n    if (!finish) {\n      return 'Unknown edge finish selected.';\n    }\n    var qf = $('trhPillowQty');\n    if (qf) { var qv = parseInt(qf.value, 10); if (!(qv >= 1 && qv <= MAX_QTY)) return 'Enter 1 to ' + MAX_QTY + ' pillows (for more, please contact us).'; }\n    if (!_variants) return 'Prices are still loading. Please try again in a moment.';\n    var rr = computeFor(currentInsert());\n    if (!rr || !rr.available) return 'This size / insert / seam finish combination is not available.';\n\n    // COM requires custom material details\n    if (finish.isCOM) {\n      var comName = $('trh-pillow-com-name');\n      if (!comName || !comName.value.trim()) {\n        return 'Please enter your fabric name/description for COM.';\n      }\n      return null;\n    }\n\n    // Main fabric is required unless COM checkbox is checked\n    if (!_ownFabric && !_selectedFabric) {\n      return 'Please select a fabric or check COM / Off-Site Fabric.';\n    }\n\n    // Trim is required for trim-based finishes unless COM trim is checked\n    if (finish.needsTrim && !_ownTrim && !_selectedTrim) {\n      return 'Please select a trim or check COM / Off-Site Trim.';\n    }\n\n    // Contrast fabric is required for contrast welt (unless COM)\n    if (finish.needsContrast && !_ownContrast && !_selectedContrastFabric) {\n      return 'Please select a contrast fabric or check COM / Off-Site Contrast Fabric.';\n    }\n\n    // Verify yardage data exists for this combination\n    var yardage = lookupYardage(_config.pillowType, _currentSize, _currentEdgeFinish);\n    if (!yardage) {\n      return 'Yardage data not available for this size/finish combination.';\n    }\n\n    return null;\n  }\n\n  /**\n   * Reads the quantity input value from the product form. Falls back to 1\n   * if not found or invalid.\n   *\n   * @returns {number} User-specified quantity (minimum 1)\n   */\n  function getFormQuantity() {\n    var f = $('trhPillowQty');\n    if (f) { var v = parseInt(f.value, 10); return isNaN(v) || v < 1 ? 1 : Math.min(v, MAX_QTY); }\n    var form = document.querySelector('form[action*=\"/cart/add\"], form.product-form, form[data-type=\"add-to-cart-form\"]');\n    var qtyInput = form && form.querySelector('input[name=\"quantity\"]');\n    var val = qtyInput ? parseInt(qtyInput.value, 10) : 1;\n    return isNaN(val) || val < 1 ? 1 : val;\n  }\n\n  /**\n   * Collects COM (Customer's Own Material) field values from the DOM.\n   *\n   * @returns {Object} COM field values\n   * @returns {string} return.name - Fabric name/description\n   * @returns {string} return.brand - Fabric brand\n   * @returns {string} return.link - Link to fabric online\n   * @returns {string} return.notes - Additional notes\n   */\n  function collectCOMFields() {\n    return {\n      name: ($('trh-pillow-com-name') && $('trh-pillow-com-name').value.trim()) || '',\n      brand: ($('trh-pillow-com-brand') && $('trh-pillow-com-brand').value.trim()) || '',\n      color: ($('trh-pillow-com-color') && $('trh-pillow-com-color').value.trim()) || '',\n      link: ($('trh-pillow-com-link') && $('trh-pillow-com-link').value.trim()) || '',\n      notes: ($('trh-pillow-com-notes') && $('trh-pillow-com-notes').value.trim()) || ''\n    };\n  }\n\n  /**\n   * Collects COM trim field values from the DOM.\n   * @returns {Object} COM trim field values\n   */\n  function collectTrimCOMFields() {\n    return {\n      name: ($('trh-pillow-trim-com-name') && $('trh-pillow-trim-com-name').value.trim()) || '',\n      brand: ($('trh-pillow-trim-com-brand') && $('trh-pillow-trim-com-brand').value.trim()) || '',\n      color: ($('trh-pillow-trim-com-color') && $('trh-pillow-trim-com-color').value.trim()) || '',\n      link: ($('trh-pillow-trim-com-link') && $('trh-pillow-trim-com-link').value.trim()) || '',\n      notes: ($('trh-pillow-trim-com-notes') && $('trh-pillow-trim-com-notes').value.trim()) || ''\n    };\n  }\n\n  /**\n   * Collects COM contrast fabric field values from the DOM.\n   * @returns {Object} COM contrast fabric field values\n   */\n  function collectContrastCOMFields() {\n    return {\n      name: ($('trh-pillow-contrast-com-name') && $('trh-pillow-contrast-com-name').value.trim()) || '',\n      brand: ($('trh-pillow-contrast-com-brand') && $('trh-pillow-contrast-com-brand').value.trim()) || '',\n      color: ($('trh-pillow-contrast-com-color') && $('trh-pillow-contrast-com-color').value.trim()) || '',\n      link: ($('trh-pillow-contrast-com-link') && $('trh-pillow-contrast-com-link').value.trim()) || '',\n      notes: ($('trh-pillow-contrast-com-notes') && $('trh-pillow-contrast-com-notes').value.trim()) || ''\n    };\n  }\n\n  /**\n   * Builds the array of line items to send to /cart/add.js. Each item\n   * includes the variant ID, quantity, and line item properties.\n   *\n   * @returns {Array<Object>} Array of cart line items\n   */\n  function buildCartItems() {\n    var items = [];\n    var productTitle = _config.productTitle || 'Made-to-Order Pillow';\n    var r = computeFor(currentInsert());\n    if (!r || !r.available) return items;\n    var finish = r.finish, q = r.q;\n    var groupId = 'g' + Date.now().toString(36) + Math.random().toString(36).substr(2, 4);\n    var p = { '_group_id': groupId, 'Size': _currentSize, 'Edge Finish': _currentEdgeFinish, 'Insert': r.insert,\n      'Total Price': K.money(r.totalC), 'Pillows': q > 1 ? q + ' identical (' + K.money(r.eachC) + ' per pillow)' : '1 pillow' };\n    if (finish.isCOM || _ownFabric) {\n      var com = collectCOMFields();\n      p['Fabric'] = 'COM' + (com.name ? ' - ' + com.name : '');\n      if (com.brand) p['Fabric Brand'] = com.brand; if (com.color) p['Fabric Pattern Color'] = com.color;\n      if (com.link) p['Fabric Link'] = com.link; if (com.notes) p['Fabric Notes'] = com.notes;\n      if (_ownFabric && !finish.isCOM) p['COM Yardage to Send'] = r.fabricQty + ' yards';\n    } else if (_selectedFabric) { p['Fabric'] = _selectedFabric.title + ' (' + _FM().label(r.fabricQty, _selectedFabric) + ')'; p['_Fabric Cost'] = _FM().label(r.fabricQty, _selectedFabric) + ' = ' + K.money(r.fabricC); }\n    if (!finish.isCOM) {\n      var pt = pattern();\n      p['Fabric Yardage'] = 'needed ' + r.fabricNeeded + ' yd for ' + q + (r.repeatExtra ? ' (incl. ' + r.repeatExtra + ' yd repeat/width)' : '') + (r.y.source !== 'chart' ? ' [' + r.y.source + ']' : '');\n      p['Pattern Repeat'] = pt.vr > 0 ? pt.vr + '\" vertical' + (pt.hr ? ' x ' + pt.hr + '\" horizontal' : '') + ', faces cut to whole repeats (+1 repeat for placement)' : 'None';\n      p['Fabric Width'] = pt.fw + ' in';\n    }\n    if (finish.needsTrim) {\n      if (_ownTrim) { var tc = collectTrimCOMFields(); p['Trim'] = 'COM' + (tc.name ? ' - ' + tc.name : '') + ' (' + r.trimQty + ' yd)'; if (tc.brand) p['Trim Brand'] = tc.brand; if (tc.color) p['Trim Pattern Color'] = tc.color; if (tc.link) p['Trim Link'] = tc.link; if (tc.notes) p['Trim Notes'] = tc.notes; }\n      else if (_selectedTrim) { p['Trim'] = _selectedTrim.title + ' (' + r.trimQty + ' yd)'; p['_Trim Cost'] = r.trimQty + ' yd = ' + K.money(r.trimC); }\n    }\n    if (finish.needsContrast) {\n      if (_ownContrast) { var cc = collectContrastCOMFields(); p['Contrast Fabric'] = 'COM' + (cc.name ? ' - ' + cc.name : '') + ' (' + r.contrastQty + ' yd)'; if (cc.brand) p['Contrast Fabric Brand'] = cc.brand; if (cc.color) p['Contrast Fabric Pattern Color'] = cc.color; if (cc.link) p['Contrast Fabric Link'] = cc.link; if (cc.notes) p['Contrast Fabric Notes'] = cc.notes; }\n      else if (_selectedContrastFabric) { p['Contrast Fabric'] = _selectedContrastFabric.title + ' (' + _FM().label(r.contrastQty, _selectedContrastFabric) + ')'; p['_Contrast Cost'] = _FM().label(r.contrastQty, _selectedContrastFabric) + ' = ' + K.money(r.contrastC); }\n    }\n    p['_pillow_order'] = 'true';\n    K.lock(p, q + ' pillow' + (q === 1 ? '' : 's'));\n    items.push({ id: parseInt(r.variant.id, 10), quantity: q, properties: p });\n    var forW = productTitle + ' - ' + _currentSize;\n    if (!finish.isCOM && !_ownFabric && _selectedFabric && r.fabricQty > 0)\n      items.push({ id: parseInt(_selectedFabric.id, 10), quantity: r.fabricQty, properties: K.lock({ '_group_id': groupId, '_is_sub_item': 'true', 'For': forW, 'Pillow Size': _currentSize, 'Seam Finish': _currentEdgeFinish, 'Yardage': _FM().label(r.fabricQty, _selectedFabric) }, _FM().label(r.fabricQty, _selectedFabric)) });\n    if (finish.needsTrim && !_ownTrim && _selectedTrim && r.trimQty > 0)\n      items.push({ id: parseInt(_selectedTrim.id, 10), quantity: r.trimQty, properties: K.lock({ '_group_id': groupId, '_is_sub_item': 'true', 'For': forW, 'Pillow Size': _currentSize, 'Seam Finish': _currentEdgeFinish, 'Trim Placement': 'pillow edge' }, r.trimQty + ' yd trim') });\n    if (finish.needsContrast && !_ownContrast && _selectedContrastFabric && r.contrastQty > 0)\n      items.push({ id: parseInt(_selectedContrastFabric.id, 10), quantity: r.contrastQty, properties: K.lock({ '_group_id': groupId, '_is_sub_item': 'true', 'For': forW + ' (Contrast Welt)', 'Pillow Size': _currentSize, 'Seam Finish': _currentEdgeFinish, 'Yardage': _FM().label(r.contrastQty, _selectedContrastFabric) }, _FM().label(r.contrastQty, _selectedContrastFabric)) });\n    return items;\n  }\n\n  /**\n   * Handles the add-to-cart action. Validates selections, builds the\n   * multi-item payload, and POSTs to Shopify's /cart/add.js endpoint.\n   * On success, redirects to the cart page.\n   *\n   * @param {Event} [event] - The form submission event (will be prevented)\n   */\n  function handleAddToCart(event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    // Prevent double-submission\n    if (_isSubmitting) return;\n\n    // Validate\n    var error = validateForCart();\n    if (error) {\n      showCartError(error);\n      return;\n    }\n\n    var items = buildCartItems();\n    if (items.length === 0) {\n      showCartError('Unable to build cart items. Please verify your selections.');\n      return;\n    }\n\n    _isSubmitting = true;\n    updateSubmitButtonState(true);\n\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 items to cart.');\n          });\n        }\n        return response.json();\n      })\n      .then(function (data) {\n        console.log(LOG_PREFIX, 'Successfully added to cart:', data);\n        _isSubmitting = false;\n        updateSubmitButtonState(false);\n\n        // Redirect to cart or show success\n        window.location.href = '/cart';\n      })\n      .catch(function (err) {\n        console.error(LOG_PREFIX, 'Add to cart error:', err);\n        _isSubmitting = false;\n        updateSubmitButtonState(false);\n        showCartError(err.message || 'An error occurred. Please try again.');\n      });\n  }\n\n  /**\n   * Shows an error message near the add-to-cart button.\n   *\n   * @param {string} message - Error message to display\n   */\n  function showCartError(message) {\n    var statusEl = $('trh-pillow-cart-status');\n    if (statusEl) {\n      statusEl.textContent = message;\n      statusEl.style.display = 'block';\n      statusEl.style.background = '#faf1f1';\n      statusEl.style.border = '1px solid #dfc1c1';\n      statusEl.style.color = '#7a2f2f';\n    } else {\n      console.error(LOG_PREFIX, message);\n      alert(message);\n    }\n  }\n\n  /**\n   * Hides the cart error/status message.\n   */\n  function hideCartError() {\n    var statusEl = $('trh-pillow-cart-status');\n    if (statusEl) {\n      statusEl.textContent = '';\n      statusEl.style.display = 'none';\n    }\n  }\n\n  /**\n   * Updates the submit/add-to-cart button's disabled state and label\n   * during cart submission.\n   *\n   * @param {boolean} isLoading - Whether a submission is in progress\n   */\n  function updateSubmitButtonState(isLoading) {\n    var btn = $('trh-pillow-add-to-cart');\n    if (!btn) return;\n\n    if (isLoading) {\n      btn.disabled = true;\n      btn.textContent = 'Adding...';\n      btn.style.background = '#888';\n    } else {\n      btn.disabled = false;\n      btn.textContent = 'Add to Cart';\n      btn.style.background = '#1a1a1a';\n      setTimeout(updatePricingDisplay, 0);   /* TRH PILLOW V5: back to the live price state */\n    }\n  }\n\n  /* =========================================================================\n   * EVENT HANDLING\n   * ========================================================================= */\n\n  /** @type {Array<Object>} Tracked event listeners for cleanup */\n  var _boundListeners = [];\n\n  /**\n   * Adds an event listener and tracks it for cleanup on destroy.\n   *\n   * @param {EventTarget} target - DOM element or event target\n   * @param {string} eventName - Event name\n   * @param {Function} handler - Event handler\n   * @param {Object} [options] - addEventListener options\n   */\n  function addTrackedListener(target, eventName, handler, options) {\n    target.addEventListener(eventName, handler, options);\n    _boundListeners.push({\n      target: target,\n      event: eventName,\n      handler: handler,\n      options: options\n    });\n  }\n\n  /**\n   * Removes all tracked event listeners. Called during cleanup/destroy.\n   */\n  function removeAllListeners() {\n    _boundListeners.forEach(function (entry) {\n      entry.target.removeEventListener(entry.event, entry.handler, entry.options);\n    });\n    _boundListeners = [];\n  }\n\n  /**\n   * Handles the `trh:fabric-selected` custom event from TRHFabricBrowser.\n   * Updates internal state with the selected fabric data.\n   *\n   * @param {CustomEvent} event - Event with fabric data in `detail.fabric`\n   */\n  function onFabricSelected(event) {\n    var fabric = event.detail ? event.detail.fabric : null;\n    if (!fabric) return;\n\n    /* Route catalog-popup selections made via the contrast \"Browse Fabrics\"\n     * button to the contrast slot instead of overwriting the main fabric. */\n    if (_fabricBrowseTarget === 'contrast') {\n      _fabricBrowseTarget = 'fabric';\n\n      /* TRH welt 2026-10-26: contrast welt must be a sellable Fabric/Vinyl */\n      if (window.TRHFabricBrowser && TRHFabricBrowser.isWeltFabric && !TRHFabricBrowser.isWeltFabric(fabric)) {\n        if (_selectedFabric) TRHFabricBrowser.selectFabric(_selectedFabric); else TRHFabricBrowser.clearSelection('fabric');\n        TRHFabricBrowser.weltBlocked(fabric);\n        return;\n      }\n\n      _selectedContrastFabric = {\n        id: fabric.id,\n        title: fabric.title,\n        price: fabric.price,\n        imageUrl: fabric.imageUrl || '',\n        minQty: fabric.minQty || null,\n        unit: fabric.unit || null,\n        tags: fabric.tags || null,\n        vendor: fabric.vendor || ''\n      };\n\n      var contrastField = $('pillowContrastFabricField');\n      if (contrastField) {\n        contrastField.value = fabric.title;\n        contrastField.classList.add('selected');\n      }\n\n      /* The shared browser also wrote this selection into ITS main-fabric\n       * field/swatch UI \u2014 undo that without firing our cleared handler on\n       * stale state (the browser's clear event is handled idempotently). */\n      if (window.TRHFabricBrowser && _selectedFabric) {\n        window.TRHFabricBrowser.selectFabric(_selectedFabric);\n      } else if (window.TRHFabricBrowser) {\n        window.TRHFabricBrowser.clearSelection('fabric');\n      }\n\n      console.log(LOG_PREFIX, 'Contrast fabric selected via catalog:', fabric.title);\n      hideCartError();\n      updatePricingDisplay();\n      return;\n    }\n\n    _selectedFabric = {\n      id: fabric.id,\n      title: fabric.title,\n      price: fabric.price,\n      imageUrl: fabric.imageUrl || '',\n      fabricWidth: fabric.fabricWidth || DEFAULT_FABRIC_WIDTH,\n      minQty: fabric.minQty || null,\n      unit: fabric.unit || null,\n      tags: fabric.tags || null,\n      vendor: fabric.vendor || ''\n    };\n\n    console.log(LOG_PREFIX, 'Fabric selected:', _selectedFabric.title);\n    hideCartError();\n    _meta = null; _metaLoading = true;\n    K.fetchFabricMeta(_config, _selectedFabric, function (m) { _meta = m; _metaLoading = false; updateYardageDisplay(); }, 'pillow');\n    updateYardageDisplay();\n  }\n\n  /**\n   * Handles the `trh:fabric-cleared` custom event from TRHFabricBrowser.\n   * Clears the selected fabric from internal state.\n   */\n  function onFabricCleared() {\n    _selectedFabric = null; _meta = null; _metaLoading = false;\n    console.log(LOG_PREFIX, 'Fabric selection cleared.');\n    updateYardageDisplay();\n  }\n\n  /**\n   * Handles the `trh:trim-selected` custom event from TRHFabricBrowser.\n   * Updates internal state with the selected trim data.\n   *\n   * @param {CustomEvent} event - Event with trim data in `detail.trim`\n   */\n  function onTrimSelected(event) {\n    var trim = event.detail ? event.detail.trim : null;\n    if (!trim) return;\n\n    _selectedTrim = {\n      id: trim.id,\n      title: trim.title,\n      price: trim.price,\n      imageUrl: trim.imageUrl || '',\n      vendor: trim.vendor || '',\n      tags: trim.tags || []\n    };\n\n    console.log(LOG_PREFIX, 'Trim selected:', _selectedTrim.title);\n    hideCartError();\n    updateYardageDisplay(); /* TRH trim min 2026-10-26: trim minimum depends on the trim chosen */\n    updatePricingDisplay();\n  }\n\n  /**\n   * Handles the `trh:trim-cleared` custom event from TRHFabricBrowser.\n   * Clears the selected trim from internal state.\n   */\n  function onTrimCleared() {\n    _selectedTrim = null;\n    console.log(LOG_PREFIX, 'Trim selection cleared.');\n    updateYardageDisplay();\n    updatePricingDisplay();\n  }\n\n  /**\n   * Handles contrast fabric selection. This listens for a dedicated\n   * custom event dispatched when a contrast fabric is chosen (may\n   * come from a second TRHFabricBrowser instance or a custom UI).\n   *\n   * @param {CustomEvent} event - Event with contrast fabric in `detail.fabric`\n   */\n  function onContrastFabricSelected(event) {\n    var fabric = event.detail ? event.detail.fabric : null;\n    if (!fabric) return;\n\n    _selectedContrastFabric = {\n      id: fabric.id,\n      title: fabric.title,\n      price: fabric.price,\n      imageUrl: fabric.imageUrl || ''\n    };\n\n    console.log(LOG_PREFIX, 'Contrast fabric selected:', _selectedContrastFabric.title);\n    hideCartError();\n    updatePricingDisplay();\n  }\n\n  /**\n   * Handles contrast fabric cleared event.\n   */\n  function onContrastFabricCleared() {\n    _selectedContrastFabric = null;\n    console.log(LOG_PREFIX, 'Contrast fabric selection cleared.');\n    updatePricingDisplay();\n  }\n\n  /** @type {number} Sequence counter guarding against stale async search renders */\n  var _contrastSearchSeq = 0;\n\n  /**\n   * Shows search suggestions for the contrast fabric field. Searches the\n   * FULL fabric inventory server-side via TRHFabricBrowser.searchFabrics()\n   * (the store has 5,000+ fabrics; getAllFabrics() is a bounded cache and\n   * must not be used for search).\n   * @param {string} query - Search query string\n   */\n  async function showContrastSuggestions(query) {\n    var suggestionsEl = $('pillowContrastSuggestions');\n    var field = $('pillowContrastFabricField');\n    if (!suggestionsEl) return;\n\n    var normalized = (query || '').normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase();\n\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 style=\"padding:12px;font-size:13px;color:#999;\">Searching\\u2026</div>';\n    suggestionsEl.style.display = 'block';\n\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(LOG_PREFIX, 'Contrast fabric search failed:', err);\n        if (seq !== _contrastSearchSeq) return;\n        suggestionsEl.innerHTML = '<div style=\"padding:12px;font-size:13px;color:#999;\">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\n    if (matches.length === 0) {\n      suggestionsEl.innerHTML = '<div style=\"padding:12px;font-size:13px;color:#999;\">No fabrics found</div>';\n    } else {\n      matches.forEach(function (item) {\n        var row = document.createElement('div');\n        row.style.cssText = 'padding:10px 12px;cursor:pointer;border-bottom:1px solid #eee;font-size:14px;display:flex;align-items:center;gap:10px;';\n        row.addEventListener('mouseenter', function () { row.style.background = '#f0f8ff'; });\n        row.addEventListener('mouseleave', function () { row.style.background = ''; });\n\n        var img = document.createElement('img');\n        img.src = item.imageUrl;\n        img.alt = item.title;\n        img.style.cssText = 'width:40px;height:40px;object-fit:cover;border-radius:4px;border:1px solid #ddd;flex-shrink:0;';\n\n        var details = document.createElement('div');\n        details.innerHTML = '<div style=\"font-weight:500;\">' + escapeHTML(item.title) + '</div>' +\n          '<div style=\"font-size:12px;color:#666;\">$' + item.price.toFixed(2) + _FM().per(item) + '</div>';\n\n        row.appendChild(img);\n        row.appendChild(details);\n\n        row.addEventListener('click', function () {\n          _selectedContrastFabric = {\n            id: item.id,\n            title: item.title,\n            price: item.price,\n            imageUrl: item.imageUrl || ''\n          };\n          if (field) {\n            field.value = item.title;\n            field.classList.add('selected');\n          }\n          suggestionsEl.style.display = 'none';\n          suggestionsEl.innerHTML = '';\n          console.log(LOG_PREFIX, 'Contrast fabric selected via search:', item.title);\n          hideCartError();\n          updatePricingDisplay();\n        });\n\n        suggestionsEl.appendChild(row);\n      });\n    }\n\n    suggestionsEl.style.display = 'block';\n  }\n\n  /**\n   * Escapes HTML entities for safe display.\n   * @param {string} str - Raw string\n   * @returns {string} Escaped string\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   * Binds all event listeners needed by the pillow configurator:\n   *   - Variant option change detection (size + edge finish selectors)\n   *   - TRHFabricBrowser custom events (fabric/trim selected/cleared)\n   *   - Product form submission interception\n   */\n  function bindEvents() {\n    // COM toggle checkboxes\n    var ownFabricCb = $('pillowOwnFabric');\n    if (ownFabricCb) {\n      addTrackedListener(ownFabricCb, 'change', handleOwnFabricToggle);\n    }\n    var ownTrimCb = $('pillowOwnTrim');\n    if (ownTrimCb) {\n      addTrackedListener(ownTrimCb, 'change', handleOwnTrimToggle);\n    }\n    var ownContrastCb = $('pillowOwnContrast');\n    if (ownContrastCb) {\n      addTrackedListener(ownContrastCb, 'change', handleOwnContrastToggle);\n    }\n\n    // Contrast fabric search autocomplete (uses TRHFabricBrowser.searchFabrics())\n    var contrastField = $('pillowContrastFabricField');\n    var contrastSuggestions = $('pillowContrastSuggestions');\n    if (contrastField && contrastSuggestions) {\n      var contrastDebounce = null;\n      addTrackedListener(contrastField, 'input', function () {\n        clearTimeout(contrastDebounce);\n        contrastDebounce = setTimeout(function () {\n          showContrastSuggestions(contrastField.value);\n        }, 200);\n      });\n      addTrackedListener(contrastField, 'focus', function () {\n        if (contrastField.value.length > 0) {\n          showContrastSuggestions(contrastField.value);\n        }\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    // Listen for TRHFabricBrowser custom events\n    addTrackedListener(document, 'trh:fabric-selected', onFabricSelected);\n    addTrackedListener(document, 'trh:fabric-cleared', onFabricCleared);\n    addTrackedListener(document, 'trh:trim-selected', onTrimSelected);\n    addTrackedListener(document, 'trh:trim-cleared', onTrimCleared);\n\n    // Listen for contrast fabric events (custom, used by a second fabric browser)\n    addTrackedListener(document, 'trh:contrast-fabric-selected', onContrastFabricSelected);\n    addTrackedListener(document, 'trh:contrast-fabric-cleared', onContrastFabricCleared);\n\n    // Intercept variant option changes on <select> elements\n    var variantSelects = document.querySelectorAll(\n      'select[name*=\"option\"], select[data-option-name], .product-form__input select'\n    );\n    for (var i = 0; i < variantSelects.length; i++) {\n      addTrackedListener(variantSelects[i], 'change', function () {\n        syncVariantOptions();\n      });\n    }\n\n    // Intercept variant option changes on radio buttons\n    var variantRadios = document.querySelectorAll(\n      '.product-form__input input[type=\"radio\"], fieldset input[type=\"radio\"]'\n    );\n    for (var j = 0; j < variantRadios.length; j++) {\n      addTrackedListener(variantRadios[j], 'change', function () {\n        syncVariantOptions();\n      });\n    }\n\n    // Watch for hidden variant ID changes (some themes update this via JS)\n    // Watch for variant ID changes via the hidden form input\n    var form = document.querySelector(\n      'form[action*=\"/cart/add\"], form.product-form, form[data-type=\"add-to-cart-form\"]'\n    );\n    if (form) {\n      var idInput = form.querySelector('input[name=\"id\"]');\n      if (idInput) {\n        var observer = new MutationObserver(function () {\n          syncVariantOptions();\n        });\n        observer.observe(idInput, { attributes: true, attributeFilter: ['value'] });\n      }\n    }\n\n    // Quantity change \u2014 recalculate yardage and pricing when quantity changes\n    if (form) {\n      var qtyInput = form.querySelector('input[name=\"quantity\"]');\n      if (qtyInput) {\n        addTrackedListener(qtyInput, 'change', function () {\n          updateYardageDisplay();\n        });\n        addTrackedListener(qtyInput, 'input', function () {\n          updateYardageDisplay();\n        });\n      }\n    }\n\n    // Use our own dedicated Add to Cart button \u2014 no form interception needed\n    var trhAddBtn = $('trh-pillow-add-to-cart');\n    if (trhAddBtn) {\n      addTrackedListener(trhAddBtn, 'click', function (e) {\n        e.preventDefault();\n        handleAddToCart(e);\n      });\n    }\n  }\n\n  /* =========================================================================\n   * INITIALIZATION & CLEANUP\n   * ========================================================================= */\n\n  /**\n   * Cleans up all event listeners and resets module state. Can be called\n   * before re-initialization or when the module is no longer needed.\n   */\n\n  function setupV4() {\n    K.injectCSS();\n    var sec = $('trh-pillow-fabric-section');\n    var add = $('trh-pillow-add-to-cart');\n    if (add) { add.style.background = '#DDC762'; add.style.color = '#fff'; add.style.fontWeight = '600'; add.style.letterSpacing = '0'; }\n    var pr = $('trh-pillow-pricing-display');\n    if (pr) { pr.style.background = 'transparent'; pr.style.border = 'none'; pr.style.padding = '0'; }\n    if (pr && !$('trhPillowOptions')) pr.parentNode.insertBefore(K.el('<div id=\"trhPillowOptions\" class=\"trh-dc3-options\" style=\"margin-top:12px\"></div>'), pr);\n    if (pr && !$('trhPillowQty')) pr.parentNode.insertBefore(K.el('<label for=\"trhPillowQty\" style=\"display:block;margin-top:12px;font-size:14px;color:#444\">How many pillows like this? ' +\n      '<span class=\"trh-k4-qnote\">Identical pillows are made together and priced as one order (1\\u2013' + MAX_QTY + ').</span>' +\n      '<input type=\"number\" id=\"trhPillowQty\" min=\"1\" max=\"' + MAX_QTY + '\" step=\"1\" value=\"1\" inputmode=\"numeric\" style=\"width:100%;padding:10px;margin-top:4px;border:1px solid #ccc;border-radius:6px;font-size:16px\"></label>'), $('trhPillowOptions'));\n    var com = $('trh-pillow-com-section');\n    if (com && !$('trhPillowComRepeat')) com.appendChild(K.el('<div><input type=\"number\" id=\"trhPillowComWidth\" min=\"20\" max=\"130\" step=\"any\" placeholder=\"Fabric width in inches (54 if unsure)\">' +\n      '<input type=\"number\" id=\"trhPillowComRepeat\" min=\"0\" step=\"any\" placeholder=\"Vertical pattern repeat in inches (0 for plain)\">' +\n      '<input type=\"number\" id=\"trhPillowComHRepeat\" min=\"0\" step=\"any\" placeholder=\"Horizontal pattern repeat in inches (0 for plain)\"></div>'));\n    var fb = $('trh-pillow-fabric-browse-section');\n    if (fb && !$('trhPillowRepeatInfo')) fb.appendChild(K.el('<span id=\"trhPillowRepeatInfo\" class=\"trh-k4-info\" aria-live=\"polite\"></span>'));\n    ['trhPillowQty', 'trhPillowComWidth', 'trhPillowComRepeat', 'trhPillowComHRepeat'].forEach(function (id) { var e = $(id); if (e) { addTrackedListener(e, 'input', updateYardageDisplay); addTrackedListener(e, 'change', updateYardageDisplay); } });\n    /* theme quantity box is replaced by \"How many pillows like this?\" (it drives the fabric too) */\n    var st = document.createElement('style'); st.textContent = '.product-form__quantity,quantity-input,.price-per-item__container{display:none!important}'; document.head.appendChild(st);\n    var box = $('trhPillowOptions');\n    if (box) addTrackedListener(box, 'change', function (e) { if (e.target && e.target.name === 'trhPiOpt') { setInsert(e.target.value); setTimeout(syncVariantOptions, 60); } });\n    _bar = K.stickyBar(sec, add, function (e) { handleAddToCart(e); });\n    v5Setup();   /* TRH PILLOW V5 */\n    var handle = _config.handle || (location.pathname.match(/\\/products\\/([^\\/?#]+)/) || [])[1];\n    fetch('/products/' + handle + '.js').then(function (r) { return r.json(); }).then(function (pj) {\n      _variants = { options: pj.options.map(function (o) { return typeof o === 'string' ? { name: o, values: [] } : o; }), variants: pj.variants };\n      v5Normalize();   /* TRH PILLOW V5 */\n      updateYardageDisplay();\n    }).catch(function () { _variants = null; });\n  }\n\n  function cleanup() {\n    removeAllListeners();\n    _config = null;\n    _selectedFabric = null;\n    _selectedTrim = null;\n    _selectedContrastFabric = null;\n    _currentSize = null;\n    _currentEdgeFinish = null;\n    _currentVariantId = null;\n    _isSubmitting = false;\n    _ownFabric = false;\n    _ownTrim = false;\n    _ownContrast = false;\n    _comFields = null;\n  }\n\n  /* =========================================================================\n   * PUBLIC API\n   * ========================================================================= */\n\n  /**\n   * @namespace TRHPillowConfigurator\n   * @description Browser-side pillow configurator module for The ReBorn House.\n   * Manages fabric selection, yardage lookup, and multi-item add-to-cart\n   * for Made-to-Order pillow products.\n   */\n  window.TRHPillowConfigurator = {\n\n    /**\n     * Sets where the next catalog-popup fabric selection should land.\n     * Call with 'contrast' right before opening the fabric catalog from the\n     * contrast \"Browse Fabrics\" button; resets to 'fabric' automatically\n     * after the next selection.\n     * @param {string} target - 'fabric' or 'contrast'\n     */\n    setFabricBrowseTarget: function (target) {\n      _fabricBrowseTarget = target === 'contrast' ? 'contrast' : 'fabric';\n    },\n\n    /**\n     * Initializes the pillow configurator module. Binds event listeners,\n     * reads initial variant option state, and prepares the add-to-cart\n     * interception.\n     *\n     * Must be called after the DOM is ready and after the product form\n     * has been rendered by Shopify.\n     *\n     * @param {Object} config - Configuration object\n     * @param {string} config.pillowType - Pillow type: 'throw', 'lumbar', or 'bolster'\n     * @param {string} config.productTitle - Product title for line item properties\n     *   (e.g., \"Throw Pillow\", \"Lumbar Pillow\")\n     *\n     * @example\n     * TRHPillowConfigurator.init({\n     *   pillowType: 'throw',\n     *   productTitle: 'Custom Throw Pillow'\n     * });\n     */\n    init: function (config) {\n      // Clean up any previous initialization\n      if (_config) {\n        cleanup();\n      }\n\n      // Validate required config\n      if (!config || !config.pillowType) {\n        console.error(LOG_PREFIX, 'config.pillowType is required (throw, lumbar, or bolster).');\n        return;\n      }\n\n      var validTypes = ['throw', 'lumbar', 'bolster'];\n      if (validTypes.indexOf(config.pillowType.toLowerCase()) === -1) {\n        console.error(LOG_PREFIX, 'Invalid pillowType. Must be one of:', validTypes.join(', '));\n        return;\n      }\n\n      var d4 = window.TRH_CALC_DEFAULTS || {};\n      _config = {\n        pillowType: config.pillowType.toLowerCase(),\n        productTitle: config.productTitle || 'Made-to-Order Pillow',\n        handle: config.handle || null,\n        storeDomain: config.storeDomain || d4.storeDomain || (window.Shopify && window.Shopify.shop) || '',\n        storefrontToken: config.storefrontToken || d4.storefrontToken || ''\n      };\n\n      // Bind events and read initial state\n      if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', function () {\n          bindEvents();\n          setupV4();\n          syncVariantOptions();\n          console.log(LOG_PREFIX, 'Initialized.', {\n            pillowType: _config.pillowType,\n            productTitle: _config.productTitle\n          });\n        });\n      } else {\n        bindEvents();\n        setupV4();\n        syncVariantOptions();\n        console.log(LOG_PREFIX, 'Initialized.', {\n          pillowType: _config.pillowType,\n          productTitle: _config.productTitle\n        });\n      }\n    },\n\n    /**\n     * Returns the current yardage calculation based on the selected variant\n     * options (size + edge finish). Returns null if options are not yet\n     * selected or if no yardage data exists for the combination.\n     *\n     * @returns {Object|null} Yardage result object with fabricYardage,\n     *   trimYardage, contrastYardage, and lookupKey; or null\n     */\n    version: 'v4',\n    computeFor: function (ins) { return computeFor(ins || currentInsert()); },\n    buildCartItems: function () { return buildCartItems(); },\n    bolsterModel: function (D, L) { return bolsterModel(D, L); },\n    getYardage: function () {\n      if (!_config || !_currentSize || !_currentEdgeFinish) {\n        return null;\n      }\n      return lookupYardage(_config.pillowType, _currentSize, _currentEdgeFinish);\n    },\n\n    /**\n     * Returns a snapshot of the current module state including selected\n     * fabric, trim, contrast fabric, variant options, and yardage.\n     *\n     * @returns {Object} Current state snapshot\n     * @returns {Object|null} return.config - Current configuration\n     * @returns {Object|null} return.selectedFabric - Selected main fabric\n     * @returns {Object|null} return.selectedTrim - Selected trim\n     * @returns {Object|null} return.selectedContrastFabric - Selected contrast fabric\n     * @returns {string|null} return.currentSize - Currently selected size\n     * @returns {string|null} return.currentEdgeFinish - Currently selected edge finish\n     * @returns {string|null} return.currentVariantId - Currently selected variant ID\n     * @returns {Object|null} return.yardage - Current yardage lookup result\n     */\n    getState: function () {\n      return {\n        config: _config ? { pillowType: _config.pillowType, productTitle: _config.productTitle } : null,\n        selectedFabric: _selectedFabric,\n        selectedTrim: _selectedTrim,\n        selectedContrastFabric: _selectedContrastFabric,\n        currentSize: _currentSize,\n        currentEdgeFinish: _currentEdgeFinish,\n        currentVariantId: _currentVariantId,\n        yardage: (_config && _currentSize && _currentEdgeFinish)\n          ? lookupYardage(_config.pillowType, _currentSize, _currentEdgeFinish)\n          : null\n      };\n    },\n\n    /**\n     * Destroys the module instance. Removes all event listeners and resets\n     * all internal state. The module can be re-initialized by calling\n     * init() again.\n     */\n    destroy: function () {\n      cleanup();\n      console.log(LOG_PREFIX, 'Destroyed.');\n    }\n  };\n})();\n"],
  "mappings": "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",
  "names": ["row"]
}
