{"product_id":"book-glazing","title":"Glazing","description":"\u003cp\u003e\u003cstrong\u003eTime to add a little razzle dazzle.\u003c\/strong\u003e\u003c\/p\u003e\u003cp\u003eGlazing (painting) isn't included in your clay-building workshop—think of it as the sequel. Book your glaze time separately when you're ready to add that perfect pop of colour.\u003c\/p\u003e\u003cp data-start=\"65\" data-end=\"191\"\u003eEach person (adults and children) attending must book and pay for their own seat. No helpers or observers, including children.\u003c\/p\u003e\u003cp data-start=\"193\" data-end=\"282\"\u003e\u003cstrong\u003eEach glazing booking includes 1 piece, 1 hour, plus a 30-minute grace period for details.\u003c\/strong\u003e\u003c\/p\u003e\u003cp data-start=\"284\" data-end=\"502\" data-is-last-node=\"\" data-is-only-node=\"\"\u003eHowever, for clay wheel participants, a maximum of 2 pieces may be glazed per booking as long as both pieces were made in the wheel class. If you need more than 1.5 hours, you must book another full glazing session on another day to continue. Tables are reserved for the next session.\u003c\/p\u003e\n\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Work+Sans:wght@400;600;700\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cdiv id=\"gz-root\"\u003e\u003c\/div\u003e\n\n\u003cstyle\u003e\n  #gz-root {\n    font-family: 'Work Sans', sans-serif;\n    max-width: 720px;\n    margin: 0 auto;\n    padding: 8px 0 40px;\n    color: #1a1a1a;\n  }\n  .gz-step-label {\n    font-family: 'Work Sans', sans-serif;\n    font-size: 11px;\n    font-weight: 700;\n    letter-spacing: 0.12em;\n    text-transform: uppercase;\n    color: #999;\n    margin-bottom: 10px;\n  }\n  .gz-provinces {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-bottom: 28px;\n  }\n  .gz-prov-chip {\n    font-family: 'Work Sans', sans-serif;\n    font-size: 13px;\n    padding: 8px 20px;\n    border: 1.5px solid #ddd;\n    border-radius: 100px;\n    cursor: pointer;\n    background: #fff;\n    color: #444;\n    transition: all 0.15s ease;\n    white-space: nowrap;\n  }\n  .gz-prov-chip:hover { border-color: #1a1a1a !important; color: #1a1a1a !important; }\n  .gz-prov-chip.selected {\n    background: #1a1a1a !important;\n    border-color: #1a1a1a !important;\n    color: #fff !important;\n    font-weight: 600 !important;\n  }\n  .gz-select-wrap { margin-bottom: 28px; }\n  .gz-select {\n    font-family: 'Work Sans', sans-serif;\n    font-size: 14px;\n    width: 100%;\n    max-width: 400px;\n    padding: 10px 14px;\n    border: 1.5px solid #ddd;\n    border-radius: 8px;\n    background: #fff;\n    color: #1a1a1a;\n    appearance: none;\n    -webkit-appearance: none;\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'\/%3E%3C\/svg%3E\");\n    background-repeat: no-repeat;\n    background-position: right 14px center;\n    cursor: pointer;\n    transition: border-color 0.15s;\n  }\n  .gz-select:focus { outline: none; border-color: #1a1a1a; }\n  .gz-dates {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-bottom: 28px;\n  }\n  .gz-date-chip {\n    font-family: 'Work Sans', sans-serif;\n    font-size: 13px;\n    padding: 8px 16px;\n    border: 1.5px solid #ddd;\n    border-radius: 100px;\n    cursor: pointer;\n    background: #fff;\n    color: #444;\n    transition: all 0.15s ease;\n    white-space: nowrap;\n  }\n  .gz-date-chip:hover { border-color: #1a1a1a !important; color: #1a1a1a !important; }\n  .gz-date-chip.selected {\n    background: #1a1a1a !important;\n    border-color: #1a1a1a !important;\n    color: #fff !important;\n    font-weight: 600 !important;\n  }\n\n  \/* Slot cards *\/\n  .gz-slots {\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    margin-bottom: 12px;\n  }\n  .gz-slot {\n    font-family: 'Work Sans', sans-serif;\n    padding: 18px;\n    border: 1.5px solid #e0e0e0;\n    border-radius: 10px;\n    background: #fff;\n  }\n  .gz-slot.sold-out { opacity: 0.5; }\n  .gz-slot-header {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    margin-bottom: 0;\n  }\n  .gz-slot-time {\n    font-size: 18px;\n    font-weight: 700;\n    color: #1a1a1a;\n    flex-shrink: 0;\n  }\n  .gz-slot.sold-out .gz-slot-time { color: #bbb; }\n  .gz-slot-sold-label {\n    font-size: 11px;\n    font-weight: 600;\n    letter-spacing: 0.06em;\n    text-transform: uppercase;\n    padding: 3px 10px;\n    border-radius: 100px;\n    background: #f0f0f0;\n    color: #aaa;\n  }\n  .gz-spaces-left {\n    font-family: 'Work Sans', sans-serif;\n    font-size: 11px;\n    font-weight: 600;\n    color: #c0392b;\n    letter-spacing: 0.04em;\n    margin-left: auto;\n  }\n\n  \/* Glazing question *\/\n  .gz-question {\n    margin-top: 14px;\n  }\n  .gz-question-label {\n    display: block;\n    font-size: 11px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.08em;\n    margin-bottom: 6px;\n    color: #1a1a1a;\n  }\n  .gz-question-label span { color: #c0392b; }\n  .gz-textarea {\n    font-family: 'Work Sans', sans-serif;\n    width: 100%;\n    padding: 10px 12px;\n    border: 1.5px solid #ddd;\n    border-radius: 8px;\n    font-size: 14px;\n    color: #1a1a1a;\n    resize: vertical;\n    box-sizing: border-box;\n    transition: border-color 0.15s;\n  }\n  .gz-textarea:focus { outline: none; border-color: #1a1a1a; }\n  .gz-textarea.error { border-color: #c0392b !important; }\n  .gz-question-hint {\n    font-size: 11px;\n    color: #888;\n    margin-top: 5px;\n  }\n\n  \/* Qty + button row *\/\n  .gz-actions {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    margin-top: 14px;\n  }\n  .gz-qty {\n    display: flex;\n    align-items: center;\n    border: 1.5px solid #ddd;\n    border-radius: 8px;\n    overflow: hidden;\n    flex-shrink: 0;\n  }\n  .gz-qty-btn {\n    width: 34px;\n    height: 34px;\n    background: #f7f7f7;\n    border: none;\n    font-size: 18px;\n    cursor: pointer;\n    color: #444;\n    transition: background 0.1s;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n  }\n  .gz-qty-btn:hover { background: #eee; }\n  .gz-qty-btn:disabled { color: #ccc; cursor: default; }\n  .gz-qty-val {\n    width: 34px;\n    text-align: center;\n    font-size: 14px;\n    font-weight: 700;\n    color: #1a1a1a;\n    border-left: 1px solid #ddd;\n    border-right: 1px solid #ddd;\n    line-height: 34px;\n    flex-shrink: 0;\n  }\n  #gz-root .gz-register-btn {\n    font-family: 'Work Sans', sans-serif !important;\n    font-size: 12px !important;\n    font-weight: 700 !important;\n    letter-spacing: 0.08em !important;\n    text-transform: uppercase !important;\n    padding: 8px 18px !important;\n    background: #1a1a1a !important;\n    color: #fff !important;\n    border: none !important;\n    border-radius: 6px !important;\n    cursor: pointer !important;\n    transition: background 0.15s !important;\n    flex: 1 !important;\n    text-align: center !important;\n  }\n  #gz-root .gz-register-btn:hover { background: #333 !important; }\n  #gz-root .gz-register-btn:disabled {\n    background: #aaa !important;\n    cursor: default !important;\n  }\n\n  .gz-loading, .gz-empty, .gz-prompt {\n    font-family: 'Work Sans', sans-serif;\n    font-size: 14px;\n    color: #999;\n    padding: 20px 0;\n    text-align: center;\n  }\n  .gz-spinner {\n    display: inline-block;\n    width: 18px;\n    height: 18px;\n    border: 2px solid #eee;\n    border-top-color: #555;\n    border-radius: 50%;\n    animation: gz-spin 0.7s linear infinite;\n    vertical-align: middle;\n    margin-right: 8px;\n  }\n  @keyframes gz-spin { to { transform: rotate(360deg); } }\n  .gz-section { margin-bottom: 28px; }\n  .gz-divider {\n    border: none;\n    border-top: 1px solid #f0f0f0;\n    margin: 0 0 28px;\n  }\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n  var EDGE_URL = 'https:\/\/snxibhbhhchjthfmjtaj.supabase.co\/functions\/v1\/public-glazing'\n\n  var PROVINCES = [\n    { label: 'British Columbia', prefix: 'BC' },\n    { label: 'Alberta',          prefix: 'AB' },\n    { label: 'Ontario',          prefix: 'ON' },\n  ]\n\n  var root = document.getElementById('gz-root')\n\n  var allWeeks = []\n  var studioList = []\n  var selectedProvince = null\n  var selectedStudio = null\n  var selectedWeek = null\n  var selectedDate = null\n  var slotQty = {}\n\n  root.innerHTML = '\u003cdiv class=\"gz-loading\"\u003e\u003cspan class=\"gz-spinner\"\u003e\u003c\/span\u003eLoading available sessions\\u2026\u003c\/div\u003e'\n\n  fetch(EDGE_URL)\n    .then(function(r) { return r.json() })\n    .then(function(data) {\n      allWeeks = data.weeks || []\n      if (!allWeeks.length) {\n        root.innerHTML = '\u003cdiv class=\"gz-empty\"\u003eNo glazing sessions are currently scheduled. Check back soon!\u003c\/div\u003e'\n        return\n      }\n      var studioMap = {}\n      for (var i = 0; i \u003c allWeeks.length; i++) {\n        for (var j = 0; j \u003c allWeeks[i].dates.length; j++) {\n          for (var k = 0; k \u003c allWeeks[i].dates[j].studios.length; k++) {\n            var s = allWeeks[i].dates[j].studios[k]\n            if (!studioMap[s.studio_id]) studioMap[s.studio_id] = s.studio_name\n          }\n        }\n      }\n      studioList = Object.keys(studioMap).map(function(id) {\n        return { studio_id: id, studio_name: studioMap[id] }\n      }).sort(function(a, b) { return a.studio_name.localeCompare(b.studio_name) })\n\n      var activeProvs = PROVINCES.filter(function(p) {\n        return studioList.some(function(s) { return s.studio_id.indexOf(p.prefix) === 0 })\n      })\n      if (activeProvs.length === 1) selectedProvince = activeProvs[0].prefix\n\n      render()\n    })\n    .catch(function() {\n      root.innerHTML = '\u003cdiv class=\"gz-empty\"\u003eCouldn\\'t load sessions right now \\u2014 please refresh the page.\u003c\/div\u003e'\n    })\n\n  \/\/ Persist textarea values across renders\n  var glazingAnswers = {}\n\n  function saveGlazingAnswers() {\n    var textareas = root.querySelectorAll('.gz-textarea')\n    for (var i = 0; i \u003c textareas.length; i++) {\n      var key = textareas[i].getAttribute('data-slot-key')\n      if (key) glazingAnswers[key] = textareas[i].value\n    }\n  }\n\n  function render() {\n    saveGlazingAnswers()\n    root.innerHTML = ''\n    renderProvincePicker()\n    renderStudioPicker()\n    renderWeekPicker()\n    renderDatePicker()\n    renderSlots()\n  }\n\n  function activeProvinceCount() {\n    return PROVINCES.filter(function(p) {\n      return studioList.some(function(s) { return s.studio_id.indexOf(p.prefix) === 0 })\n    }).length\n  }\n\n  function weeksForStudio(studioId) {\n    return allWeeks.filter(function(w) {\n      return w.dates.some(function(d) {\n        return d.studios.some(function(s) { return s.studio_id === studioId })\n      })\n    })\n  }\n\n  function datesForStudioInWeek(studioId, weekStart) {\n    var week = allWeeks.find(function(w) { return w.week_start === weekStart })\n    if (!week) return []\n    return week.dates.filter(function(d) {\n      return d.studios.some(function(s) { return s.studio_id === studioId })\n    })\n  }\n\n  function makeHr() {\n    var hr = document.createElement('hr')\n    hr.className = 'gz-divider'\n    return hr\n  }\n\n  function renderProvincePicker() {\n    var activeProvs = PROVINCES.filter(function(p) {\n      return studioList.some(function(s) { return s.studio_id.indexOf(p.prefix) === 0 })\n    })\n    if (activeProvs.length \u003c= 1) return\n\n    var wrap = document.createElement('div')\n    wrap.className = 'gz-section'\n    var label = document.createElement('div')\n    label.className = 'gz-step-label'\n    label.textContent = 'Step 1 \\u2014 Choose your province'\n    wrap.appendChild(label)\n    var chips = document.createElement('div')\n    chips.className = 'gz-provinces'\n    activeProvs.forEach(function(p) {\n      var chip = document.createElement('button')\n      chip.className = 'gz-prov-chip' + (selectedProvince === p.prefix ? ' selected' : '')\n      chip.textContent = p.label\n      chip.addEventListener('click', function() {\n        selectedProvince = p.prefix\n        selectedStudio = null\n        selectedWeek = null\n        selectedDate = null\n        render()\n      })\n      chips.appendChild(chip)\n    })\n    wrap.appendChild(chips)\n    root.appendChild(wrap)\n    root.appendChild(makeHr())\n  }\n\n  function renderStudioPicker() {\n    if (!selectedProvince) return\n    var provinceStudios = studioList.filter(function(s) {\n      return s.studio_id.indexOf(selectedProvince) === 0\n    })\n    if (!provinceStudios.length) return\n\n    var stepNum = activeProvinceCount() \u003e 1 ? 2 : 1\n    var wrap = document.createElement('div')\n    wrap.className = 'gz-section gz-select-wrap'\n    var label = document.createElement('div')\n    label.className = 'gz-step-label'\n    label.textContent = 'Step ' + stepNum + ' \\u2014 Choose your studio'\n    wrap.appendChild(label)\n    var select = document.createElement('select')\n    select.className = 'gz-select'\n    var placeholder = document.createElement('option')\n    placeholder.value = ''\n    placeholder.textContent = '\\u2014 Select a studio \\u2014'\n    placeholder.disabled = true\n    placeholder.selected = !selectedStudio\n    select.appendChild(placeholder)\n    provinceStudios.forEach(function(studio) {\n      var opt = document.createElement('option')\n      opt.value = studio.studio_id\n      opt.textContent = studio.studio_name\n      opt.selected = selectedStudio === studio.studio_id\n      select.appendChild(opt)\n    })\n    select.addEventListener('change', function() {\n      selectedStudio = select.value || null\n      selectedWeek = null\n      selectedDate = null\n      render()\n    })\n    wrap.appendChild(select)\n    root.appendChild(wrap)\n    root.appendChild(makeHr())\n  }\n\n  function renderWeekPicker() {\n    if (!selectedStudio) return\n    var weeks = weeksForStudio(selectedStudio)\n    if (!weeks.length) return\n\n    var stepNum = activeProvinceCount() \u003e 1 ? 3 : 2\n    var wrap = document.createElement('div')\n    wrap.className = 'gz-section gz-select-wrap'\n    var label = document.createElement('div')\n    label.className = 'gz-step-label'\n    label.textContent = 'Step ' + stepNum + ' \\u2014 Choose a week'\n    wrap.appendChild(label)\n    var select = document.createElement('select')\n    select.className = 'gz-select'\n    var placeholder = document.createElement('option')\n    placeholder.value = ''\n    placeholder.textContent = '\\u2014 Select a week \\u2014'\n    placeholder.disabled = true\n    placeholder.selected = !selectedWeek\n    select.appendChild(placeholder)\n    weeks.forEach(function(w) {\n      var opt = document.createElement('option')\n      opt.value = w.week_start\n      opt.textContent = w.label\n      opt.selected = selectedWeek === w.week_start\n      select.appendChild(opt)\n    })\n    select.addEventListener('change', function() {\n      selectedWeek = select.value || null\n      selectedDate = null\n      var dates = datesForStudioInWeek(selectedStudio, selectedWeek)\n      if (dates.length === 1) selectedDate = dates[0].date\n      render()\n    })\n    wrap.appendChild(select)\n    root.appendChild(wrap)\n    root.appendChild(makeHr())\n  }\n\n  function renderDatePicker() {\n    if (!selectedStudio || !selectedWeek) return\n    var dates = datesForStudioInWeek(selectedStudio, selectedWeek)\n    if (!dates.length || dates.length === 1) return\n\n    var stepNum = activeProvinceCount() \u003e 1 ? 4 : 3\n    var wrap = document.createElement('div')\n    wrap.className = 'gz-section'\n    var label = document.createElement('div')\n    label.className = 'gz-step-label'\n    label.textContent = 'Step ' + stepNum + ' \\u2014 Choose a date'\n    wrap.appendChild(label)\n    var chips = document.createElement('div')\n    chips.className = 'gz-dates'\n    dates.forEach(function(d) {\n      var chip = document.createElement('button')\n      chip.className = 'gz-date-chip' + (selectedDate === d.date ? ' selected' : '')\n      chip.textContent = d.label\n      chip.addEventListener('click', function() {\n        selectedDate = d.date\n        render()\n      })\n      chips.appendChild(chip)\n    })\n    wrap.appendChild(chips)\n    root.appendChild(wrap)\n    root.appendChild(makeHr())\n  }\n\n  function renderSlots() {\n    if (!selectedStudio || !selectedDate) {\n      if (selectedStudio \u0026\u0026 selectedWeek \u0026\u0026 !selectedDate) {\n        var p = document.createElement('div')\n        p.className = 'gz-prompt'\n        p.textContent = 'Choose a date above to see available times.'\n        root.appendChild(p)\n      }\n      return\n    }\n\n    var weekObj = allWeeks.find(function(w) { return w.week_start === selectedWeek })\n    var dateObj = weekObj ? weekObj.dates.find(function(d) { return d.date === selectedDate }) : null\n    var studioObj = dateObj ? dateObj.studios.find(function(s) { return s.studio_id === selectedStudio }) : null\n    if (!studioObj) return\n\n    var provCount = activeProvinceCount()\n    var totalSteps = provCount \u003e 1 ? 5 : 4\n    var wrap = document.createElement('div')\n    wrap.className = 'gz-section'\n    var label = document.createElement('div')\n    label.className = 'gz-step-label'\n    label.textContent = 'Step ' + totalSteps + ' \\u2014 Pick a time'\n    wrap.appendChild(label)\n\n    var slotsList = document.createElement('div')\n    slotsList.className = 'gz-slots'\n\n    studioObj.slots.forEach(function(slot) {\n      var isSoldOut = slot.spaces_left !== null \u0026\u0026 slot.spaces_left === 0\n      var card = document.createElement('div')\n      card.className = 'gz-slot' + (isSoldOut ? ' sold-out' : '')\n\n      \/\/ Header row: time + sold out badge or spaces left\n      var header = document.createElement('div')\n      header.className = 'gz-slot-header'\n      var timeEl = document.createElement('span')\n      timeEl.className = 'gz-slot-time'\n      timeEl.textContent = slot.time\n      header.appendChild(timeEl)\n\n      if (isSoldOut) {\n        var badge = document.createElement('span')\n        badge.className = 'gz-slot-sold-label'\n        badge.textContent = 'Sold Out'\n        header.appendChild(badge)\n      } else if (slot.spaces_left !== null \u0026\u0026 slot.spaces_left \u003c= 5) {\n        var warning = document.createElement('span')\n        warning.className = 'gz-spaces-left'\n        warning.textContent = slot.spaces_left + (slot.spaces_left === 1 ? ' space left' : ' spaces left')\n        header.appendChild(warning)\n      }\n\n      card.appendChild(header)\n\n      if (!isSoldOut) {\n        var key = slot.register_url\n        if (!slotQty[key]) slotQty[key] = 1\n\n        \/\/ Glazing question\n        var question = document.createElement('div')\n        question.className = 'gz-question'\n\n        var qLabel = document.createElement('label')\n        qLabel.className = 'gz-question-label'\n        qLabel.innerHTML = 'What are you glazing? \u003cspan\u003e*\u003c\/span\u003e'\n        question.appendChild(qLabel)\n\n        var textarea = document.createElement('textarea')\n        textarea.className = 'gz-textarea'\n        textarea.rows = 3\n        textarea.placeholder = 'e.g. Emma \u0026 Liam Fowler: 2 bunny mugs'\n        textarea.setAttribute('data-slot-key', key)\n        textarea.value = glazingAnswers[key] || ''\n        textarea.addEventListener('input', function() {\n          textarea.classList.remove('error')\n        })\n        question.appendChild(textarea)\n\n        var hint = document.createElement('p')\n        hint.className = 'gz-question-hint'\n        hint.innerHTML = 'Please include names and all pieces you plan to glaze during this session. \u003cstrong\u003eMaximum 2 pieces per booking.\u003c\/strong\u003e'\n        question.appendChild(hint)\n        card.appendChild(question)\n\n        \/\/ Qty + Register row\n        var actions = document.createElement('div')\n        actions.className = 'gz-actions'\n\n        var qty = document.createElement('div')\n        qty.className = 'gz-qty'\n\n        var minus = document.createElement('button')\n        minus.className = 'gz-qty-btn'\n        minus.textContent = '\\u2212'\n        minus.disabled = slotQty[key] \u003c= 1;\n        (function(k) {\n          minus.addEventListener('click', function() {\n            if (slotQty[k] \u003e 1) { slotQty[k]--; render() }\n          })\n        })(key)\n\n        var val = document.createElement('div')\n        val.className = 'gz-qty-val'\n        val.textContent = slotQty[key]\n\n        var plus = document.createElement('button')\n        plus.className = 'gz-qty-btn'\n        plus.textContent = '+'\n        plus.disabled = slot.spaces_left !== null \u0026\u0026 slotQty[key] \u003e= slot.spaces_left;\n        (function(k) {\n          plus.addEventListener('click', function() { slotQty[k]++; render() })\n        })(key)\n\n        qty.appendChild(minus)\n        qty.appendChild(val)\n        qty.appendChild(plus)\n        actions.appendChild(qty)\n\n        \/\/ Register button — uses \/cart\/add.js to attach glazing answer\n        var btn = document.createElement('button')\n        btn.className = 'gz-register-btn'\n        btn.textContent = 'Register';\n\n        (function(slotData, qtyKey, ta) {\n          btn.addEventListener('click', function() {\n            var glazing = ta.value.trim()\n            if (!glazing) {\n              ta.classList.add('error')\n              ta.focus()\n              ta.scrollIntoView({ behavior: 'smooth', block: 'center' })\n              return\n            }\n\n            btn.disabled = true\n            btn.textContent = 'Adding\\u2026'\n\n            \/\/ Extract variant ID from cart URL: \/cart\/VARIANT_ID:QTY\n            var variantId = slotData.register_url.replace('QTY', slotQty[qtyKey])\n            variantId = variantId.match(\/\\\/cart\\\/(\\d+):\/)?.[1]\n\n            if (!variantId) {\n              btn.disabled = false\n              btn.textContent = 'Register'\n              return\n            }\n\n            fetch('\/cart\/add.js', {\n              method: 'POST',\n              headers: { 'Content-Type': 'application\/json' },\n              body: JSON.stringify({\n                id: parseInt(variantId),\n                quantity: slotQty[qtyKey],\n                properties: { 'What are you glazing?': glazing }\n              })\n            })\n            .then(function(res) {\n              if (!res.ok) throw new Error('Failed')\n              window.location.href = '\/cart'\n            })\n            .catch(function() {\n              btn.disabled = false\n              btn.textContent = 'Register'\n              alert('Something went wrong adding to cart. Please try again.')\n            })\n          })\n        })(slot, key, textarea)\n\n        actions.appendChild(btn)\n        card.appendChild(actions)\n      }\n\n      slotsList.appendChild(card)\n    })\n\n    wrap.appendChild(slotsList)\n    root.appendChild(wrap)\n  }\n\n})()\n\u003c\/script\u003e","brand":"4CATS","offers":[{"title":"Default Title","offer_id":43420375056474,"sku":null,"price":12.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1451\/3756\/files\/clay_wheel_glazing_01_800x800_3a7ffa6f-f3a1-4cbd-bf65-6a0974c5f4e0.jpg?v=1768504708","url":"https:\/\/4cats.com\/products\/book-glazing","provider":"4Cats","version":"1.0","type":"link"}